Методы грубой абстракции PHP

это мой первый вопрос после нескольких лет поиска здесь хороших ответов. Я перекодирую одну из своих работ, пытаясь использовать более глубокий уровень подхода ООП, но я не знаю, правильно ли то, что я делаю.

То, что я пытаюсь сделать, - это простое создание продукта, но достаточно абстрактное, чтобы другим кодерам не нужно было знать, что использовать db или как проверять данные о продукте. Простой метод create($attr), например.

Это базовая схема кода.

abstract class Crud_model_abstract {

 # private vars
 # getter for private vars
 # setter for private vars
 # some basic methods
}

class Product_model_crud extends Crud_model_abstract {

 # private vars
 # getter for private vars
 # setter for private vars
 # CRUD methods (using phpactiverecord.com lib)
}

Затем некоторые классы для категории, бренда и т. д. с той же структурой, что и Product_model_crud.

Теперь мой вопрос заключается в следующем: должен ли я создать другую модель, которая составляет фактический продукт (добавить категорию в ее таблицу, затем бренд в ее таблицу.... затем создать продукт и сохранить его), а затем вызвать эту модель из контроллера, передающего параметры , или я должен вместо этого преобразовать эту большую модель (тот, который составляет продукт) в контроллер.

Я считаю, что должен создать большую модель, но на данный момент я ни в чем не уверен. Я прочитал ооооочень много материала о хороших практиках в ООП, и у меня есть сомнения на каждом этапе пути :D

Что я понимаю (поправьте меня, если я ошибаюсь), так это то, что в моем коде должно быть достаточно слоев, чтобы сделать его более чистым и конкретным. Но в некоторых случаях я не вижу, когда хватит.

Может быть, это глупый вопрос (конечно!!), но я больше не знаю, что, черт возьми, я делаю!! Спасибо!!


person gdi    schedule 16.06.2012    source источник
comment
Мне трудно понять вашу проблему   -  person Galen    schedule 16.06.2012
comment
Вопрос в том, насколько глубоко я должен углубляться в абстракцию. Должен ли я создать модель, которая создает весь объект (создает категорию, бренд и т. д.), или вся эта логика должна быть внутри встроенного контроллера.   -  person gdi    schedule 17.06.2012
comment
Прочтите еще одну статью об ООП: advantexllc. com/blog/post.cfm/ :) Кстати, вы рассматривали возможность использования Doctrine/Propel/phpactiverecord/anything_else?   -  person biziclop    schedule 17.06.2012
comment
@biziclop спасибо за ссылку, на самом деле я использую phpactiverecord, как я упоминал в коде   -  person gdi    schedule 17.06.2012


Ответы (1)


Просто используйте одну модель для вставки продуктов. Например:

class Products extends abstractClass {

public function addProduct($params) {
 // Insert
}

public function getProduct($id) {
 // Get a product
}

public function editProduct($id, $params) {
 // Edit
}

}

Ваш абстрактный класс будет указывать, какие методы необходимо включить в ваш дочерний класс. Я думаю, вы слишком много продумываете весь сценарий.

Затем вы должны сделать:

$product = new Products();
$product->addProduct(array('id' => 5, 'name' => 'Dog toy'));
person David    schedule 16.06.2012
comment
Да, но addProduct нужно будет создать категорию, если она не существует (вызов метода addCategory для метода Catagory), а затем addProducts — это не просто добавление продукта, поэтому мне нужен еще один слой - person gdi; 17.06.2012
comment
@gdi Создайте новый класс, расширяющий абстрактный класс для управления категориями. - person David; 17.06.2012
comment
да, но у меня должна быть модель, которая делает всю работу? Я имею в виду модель, которая вызывает метод создания категории, а затем создает объект с возвращенным идентификатором категории. Или это нужно делать в контроллере? код будет примерно таким: $cat-›create('blabla'); $prod-›create('blabla', $cat-›id); вопрос где эту логику реализовать, в новой модели или в контроллере? - person gdi; 17.06.2012
comment
Родительский абстрактный класс должен охватывать продукты и категории. Создайте 2 подкласса, один для продуктов, один для категорий. Вы можете передать идентификатор или название категории в один из параметров при создании товара. Контроллер будет только для вызова модели. - person David; 17.06.2012
comment
так что я думаю правильно, мне нужны 3 модели, одна для продукта, одна для категории и одна, где я просто вызываю две предыдущие, чтобы выполнить задачу? и все это запускается контроллером, который содержит параметры для создания материалов? - person gdi; 17.06.2012
comment
Мне бы 2 модели, вы бы их вызывали из контроллера. Таким образом, внутри контроллера у вас будет $category->create('dogs');, а после этого у вас будет $product->add('lab', $categoryID); или любые другие параметры, которые вы хотите иметь для добавления продукта. - person David; 17.06.2012
comment
Но не чище ли вместо этого использовать всю эту логику в модели? - person gdi; 17.06.2012
comment
Логика реализована в модели, вы просто вызываете их из контроллера. Ознакомьтесь с принятым ответом здесь: stackoverflow.com/questions/2621725/ - person David; 17.06.2012