Здравствуйте,
Возник вопрос по архитектуре.
Есть BOX в котором хранятся продукты. Box_item.
Box_item не может существовать без BOX, то есть в моделе box_item есть аттрибут box_id.
Box не может существовать без box_item. То есть без продуктов. Аттрибут item.
Box содержит произвольное кол-во продуктов.
Верно ли я понимаю что для добавления/удаления продуктов box_item из box нужен отдельный класс (BoxItemManager) который за это отвечает (Единство ответственности)
При создании этого класса BoxItemManager нужно ли в конструктор передавать box_id? Или лучше передавать этот параметр в методе:
BoxItemManager->addItem(Box $box,BoxItem $box_item);
Проблема конструктора в том, что я не могу заранее предопределить класс для работы с box_item. То есть в классе для работы с Box где я буду вызывать добавление продуктов мне придется его создавать через new вместо того что бы добавить в конструктор класса и установить в аттрибут.
Solid на примере ящика с продуктами
Re: Solid на примере ящика с продуктами
Код: Выделить всё
$box = new Box($id, $items);
$box->addItem($item);
$box->removeItem($id);
$box->save();
Последний раз редактировалось ElisDN 2019.10.17, 11:15, всего редактировалось 1 раз.
Re: Solid на примере ящика с продуктами
Да, но вопрос в контексте yi2 и AR.ElisDN писал(а): ↑2019.10.17, 10:33Код: Выделить всё
$box = new Box($id, $items); $box->addItem($item); $box->removeItem($id);
Box - AR model
BoxItem аналогично.
То есть id заранее нет.
Re: Solid на примере ящика с продуктами
Тогда la-haute-societe/yii2-save-relations-behavior само все id куда надо проставит.
Re: Solid на примере ящика с продуктами
А я бы так сделал, если нужно создать с элементами без всяких with related behaviors, у них подход какой-то не тот по-моему.
Код: Выделить всё
$box = new Box();
$box->create($items);
class Box extends ActiveRecord
{
public function create($attributes, array $items_data) : void
{
$this->setAttributes($attributes);
self::getDb()->transaction(function() {
if (!$this->save()) {
throw new DomainException();
}
foreach($items_data as $item_data) {
$item = new BoxItem(['box_id' => $this->id]);
$item->setAttributes($item_data);
if (!$item->save()) {
throw new DomainException();
}
}
)
}
}