Какой патерн применить для взаимодействия из одного места взависимости от конфига (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}}';
}
создаем модель, потом взависимости от полученых параметров, подгружаем ту или иные данные. Как лучше сделать, какой паттерн применим.

21 Авг 2019 в 07:03
137 +1
0
Ответы
1

Для решения данной задачи можно использовать паттерн Стратегия (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);

Таким образом, вы сможете легко добавлять новые стратегии для работы с данными о заказах и использовать их в нужных местах вашего приложения, сохраняя при этом принцип открытости/закрытости и упрощая разработку и поддержку кода.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 96 424 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир