Какой патерн применить для взаимодействия из одного места взависимости от конфига (YII2)? Подскажите какой патерн применить. Задача такая. Есть сущьность Orders. Но заказы могут быть как на продажу так и на покупку. Эти свойства хронятся в разных таблицах, всего три таблицы Заказы, данные покупки, данные продажы. Получается, что когда мы хотим отобразить наш заказ мы создаем модель order а потом взависимости от типа подтягиваем данные. Таким образом мы можем создать универсальный способ, отоброжать данные во вьюхе. Где взависимости от типа мы используем тот или иной метод, обращаясь к той или иной таблице.... сейчас это выглядит такclass Order extends ActiveRecord { const TYPE_SELL = 1; const TYPE_BUY = 2; private $_params = null; private function setParams() { $this->_params = array(); if ($this->type == self::TYPE_BUY) { //$Source = Order_requests::find()->where( ['id' => $this->source_id] )->one(); } else { $Source = Certificate::find()->where( ['id' => $this->source_id] )->one(); } foreach ($Source as $key => $val) { $this->_params[$key] = $val; //get data from certificate model by source_id } } function getParam($key) { if (is_null($this->_params)) { $this->setParams(); } return isset($this->_params[$key]) ? $this->_params[$key] : null; } /** * @inheritdoc */ public static function tableName() { return '{{%orders}}'; } создаем модель, потом взависимости от полученых параметров, подгружаем ту или иные данные. Как лучше сделать, какой паттерн применим.
Для решения данной задачи можно использовать паттерн Стратегия (Strategy).
Суть паттерна заключается в определении семейства алгоритмов, инкапсуляции каждого из них и обеспечении их взаимозаменяемости. Таким образом, можно определить различные стратегии для работы с данными о заказах (например, стратегию для работы с данными о продажах и стратегию для работы с данными о покупках), и в зависимости от типа заказа использовать соответствующую стратегию.
Пример реализации паттерна Стратегия для данной задачи:
Создание интерфейса стратегии:interface OrderDataStrategy { public function getData($sourceId); }Реализация конкретных стратегий:class SellOrderDataStrategy implements OrderDataStrategy { public function getData($sourceId) { return Certificate::find()->where(['id' => $sourceId])->one(); } } class BuyOrderDataStrategy implements OrderDataStrategy { public function getData($sourceId) { return Order_requests::find()->where(['id' => $sourceId])->one(); }Использование стратегии в классе Order:class Order extends ActiveRecord { private $_dataStrategy; public function __construct($dataStrategy) { $this->_dataStrategy = $dataStrategy; } public function getData($sourceId) { return $this->_dataStrategy->getData($sourceId); } /** * @inheritdoc */ public static function tableName() { return '{{%orders}}'; } }Использование класса Order с заданной стратегией:$order = new Order(new SellOrderDataStrategy()); $data = $order->getData($sourceId);
Таким образом, вы сможете легко добавлять новые стратегии для работы с данными о заказах и использовать их в нужных местах вашего приложения, сохраняя при этом принцип открытости/закрытости и упрощая разработку и поддержку кода.
Для решения данной задачи можно использовать паттерн Стратегия (Strategy).
Суть паттерна заключается в определении семейства алгоритмов, инкапсуляции каждого из них и обеспечении их взаимозаменяемости. Таким образом, можно определить различные стратегии для работы с данными о заказах (например, стратегию для работы с данными о продажах и стратегию для работы с данными о покупках), и в зависимости от типа заказа использовать соответствующую стратегию.
Пример реализации паттерна Стратегия для данной задачи:
Создание интерфейса стратегии:interface OrderDataStrategy {public function getData($sourceId);
}Реализация конкретных стратегий:class SellOrderDataStrategy implements OrderDataStrategy {
public function getData($sourceId) {
return Certificate::find()->where(['id' => $sourceId])->one();
}
}
class BuyOrderDataStrategy implements OrderDataStrategy {
public function getData($sourceId) {
return Order_requests::find()->where(['id' => $sourceId])->one();
}Использование стратегии в классе Order:class Order extends ActiveRecord {
private $_dataStrategy;
public function __construct($dataStrategy) {
$this->_dataStrategy = $dataStrategy;
}
public function getData($sourceId) {
return $this->_dataStrategy->getData($sourceId);
}
/**
* @inheritdoc
*/
public static function tableName() {
return '{{%orders}}';
}
}Использование класса Order с заданной стратегией:$order = new Order(new SellOrderDataStrategy());
$data = $order->getData($sourceId);
Таким образом, вы сможете легко добавлять новые стратегии для работы с данными о заказах и использовать их в нужных местах вашего приложения, сохраняя при этом принцип открытости/закрытости и упрощая разработку и поддержку кода.