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

Обсуждаем, как правильно строить приложения
Ответить
Аватара пользователя
Chelobaka
Сообщения: 202
Зарегистрирован: 2018.06.01, 09:54

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

Сообщение Chelobaka » 2019.10.17, 10:25

Здравствуйте,

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

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN » 2019.10.17, 10:33

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

$box = new Box($id, $items);
$box->addItem($item);
$box->removeItem($id);
$box->save();
Последний раз редактировалось ElisDN 2019.10.17, 11:15, всего редактировалось 1 раз.

Аватара пользователя
Chelobaka
Сообщения: 202
Зарегистрирован: 2018.06.01, 09:54

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

Сообщение Chelobaka » 2019.10.17, 10:47

ElisDN писал(а):
2019.10.17, 10:33

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

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

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

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN » 2019.10.17, 11:12

Тогда la-haute-societe/yii2-save-relations-behavior само все id куда надо проставит.

anton_z
Сообщения: 440
Зарегистрирован: 2017.01.15, 15:01

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

Сообщение anton_z » 2019.10.17, 14:12

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

}

Ответить