Страница 1 из 1

Solid на примере ящика с продуктами

Добавлено: 2019.10.17, 10:25
Chelobaka
Здравствуйте,

Возник вопрос по архитектуре.
Есть 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 вместо того что бы добавить в конструктор класса и установить в аттрибут.

Re: Solid на примере ящика с продуктами

Добавлено: 2019.10.17, 10:33
ElisDN

Код: Выделить всё

$box = new Box($id, $items);
$box->addItem($item);
$box->removeItem($id);
$box->save();

Re: Solid на примере ящика с продуктами

Добавлено: 2019.10.17, 10:47
Chelobaka
ElisDN писал(а): 2019.10.17, 10:33

Код: Выделить всё

$box = new Box($id, $items);
$box->addItem($item);
$box->removeItem($id);
Да, но вопрос в контексте yi2 и AR.
Box - AR model
BoxItem аналогично.

То есть id заранее нет.

Re: Solid на примере ящика с продуктами

Добавлено: 2019.10.17, 11:12
ElisDN
Тогда la-haute-societe/yii2-save-relations-behavior само все id куда надо проставит.

Re: Solid на примере ящика с продуктами

Добавлено: 2019.10.17, 14:12
anton_z
А я бы так сделал, если нужно создать с элементами без всяких 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();
				}
				
			}
					
		)
	
	}

}