DiC и SL в yii2
- Cacatuidae
- Сообщения: 65
- Зарегистрирован: 2017.01.08, 17:39
DiC и SL в yii2
Подскажите, почему в yii2 есть SL (ServiceLocator), хотя на самом деле это полноценный DiC
Ведь он умеет создавать объект со всеми зависимостями через рефлексию класса
Ведь он умеет создавать объект со всеми зависимостями через рефлексию класса
- Cacatuidae
- Сообщения: 65
- Зарегистрирован: 2017.01.08, 17:39
Re: DiC и SL в yii2
Если не путаю, то паттерн SL не предусматривает такой возможности, а DiC как раз - да.
Мне непонятно почему он называется yii\di\ServiceLocator, а не yii\di\DiC например)
Вопрос задаю потому - вдруг чего ни так понял в этих двух паттернах
Мне непонятно почему он называется yii\di\ServiceLocator, а не yii\di\DiC например)
Вопрос задаю потому - вдруг чего ни так понял в этих двух паттернах
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: DiC и SL в yii2
SL не оговаривает такой возможности, но и не противоречит её наличию.
Нравится Yii? Давайте сделаем его лучше!.
- Cacatuidae
- Сообщения: 65
- Зарегистрирован: 2017.01.08, 17:39
Re: DiC и SL в yii2
Сам не может. yii\di\ServiceLocator вызывает именно yii\di\Container через метод Yii::createObject. А там уже контейнер парсит всё через рефлексию.Cacatuidae писал(а): ↑2017.01.08, 17:54Ведь он умеет создавать объект со всеми зависимостями через рефлексию класса
Последний раз редактировалось ElisDN 2017.01.09, 10:59, всего редактировалось 2 раза.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: DiC и SL в yii2
Так SL по сути не оговаривает, как именно достаются из контейнера объекты. Оговариваются две вещи: объекты там и достаются соответствующими методами, контейнер доступен глобально.
Нравится Yii? Давайте сделаем его лучше!.
Re: DiC и SL в yii2
В Yii1 был только SL с фабрикой Yii::createComponent. В Yii2 добавили DIC и поместили его вызов в метод Yii::createObject. В итоге имеем и DIC Yii::$container, и SL Yii::$app, работающий через DIC. В этом теперь и вся путаница: имеется два похожих инструмента, но с разными настройками.Cacatuidae писал(а): ↑2017.01.09, 00:37Получается так, что в данном случае в yii SL повторяет концепт DiC?
Технической разницы между Yii::$app->get(...) и Yii::$container->get(...) почти нет. Только контейнер в Yii2 умеет сам парсить конструкторы. Но при желании можно "научить" и SL делать иньекции и превратить его в контейнер по примеру Pimple, определив все компоненты анонимками и прописав все иньекции вручную:
Код: Выделить всё
'components' => [
'db' => [...],
'session' => [...],
'cart.session' => [...],
'cart.storage.session' => function() {
return new SessionStorage(
Yii::app->get('cart.session'),
'cartSessionKey'
);
},
'cart' => function() {
return new Cart(
Yii::app->get('cart.storage.session')
);
},
],
Если все начнут дёргать Yii::$container->get(...) отовсюду по манере Yii::$app->get(...), то это будет использование контейнера как Service Locator.
- Cacatuidae
- Сообщения: 65
- Зарегистрирован: 2017.01.08, 17:39
Re: DiC и SL в yii2
Теперь понял.
Такой контроллер будет считаться за DiC
Все остальное, включая настройки через конфигурацию - это SL.
Такой контроллер будет считаться за DiC
Код: Выделить всё
class CommandController extends Controller
{
protected $parser;
public function __construct($id, Module $module, Parsers $parser, array $config = [])
{
$this->parser = $parser;
parent::__construct($id, $module, $config);
}
public function actionCommandRun()
{
var_dump($this->parser->canRun);
}
}
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: DiC и SL в yii2
Нет. DIC — это Dependency Container. Если его вызывать явно он, по сути становится Service Locator, но контейнером быть сам по себе не перестаёт. Что при этом происходит, так это нарушение инверсии зависимостей или Dependency Inversion. Inversion и Injection начинаются на одну и ту же букву, отсюда путаница на тему, что значит DI в конкретном случае.
Нравится Yii? Давайте сделаем его лучше!.
Re: DiC и SL в yii2
Это контроллер, в который из DIС прилетел $parser.Cacatuidae писал(а):Такой контроллер будет считаться за DiC
DIC - это Dependency Injection Container. Штука, которая инъектит зависимые объекты и настройки друг в друга.
- Cacatuidae
- Сообщения: 65
- Зарегистрирован: 2017.01.08, 17:39
Re: DiC и SL в yii2
Немного разобрался в этом. Вроде
Вдруг у кого есть возможность глянуть, такой подход https://github.com/Cacatuidae/yii2-sl-e ... er/IpRange
Не оверхед?
В файле https://github.com/Cacatuidae/yii2-sl-e ... tstrap.php настраиваются все зависимости для работы модуля
С помощьу этого, избавился везде в модуле от прямого создания объектов через new ClassName();
Вдруг у кого есть возможность глянуть, такой подход https://github.com/Cacatuidae/yii2-sl-e ... er/IpRange
Не оверхед?
В файле https://github.com/Cacatuidae/yii2-sl-e ... tstrap.php настраиваются все зависимости для работы модуля
С помощьу этого, избавился везде в модуле от прямого создания объектов через new ClassName();
Re: DiC и SL в yii2
В DI есть такое понятие - корень компоновки. Контейнер можно использовать явно только в этом самом корне. У каждого модуля может быть свой корень компоновки. Вы создали свой с помощью отдельного автозагружаемого компонента приложения. С точки зрения DI все нормально. Но вам придется помимо самого модуля подключать еще и компонент в конфигурации приложения.
По поводу кода на gihub. В контроллере вы используете uploadModel:
У вас это одновременно сервис и форма. Нарушение SRP. Надо разделить. Сначала принять и валидировать форму, потом вызвать сервис для сохранения файла.
По поводу кода на gihub. В контроллере вы используете uploadModel:
Код: Выделить всё
$fileAttribute = $this->uploadModel->getFileAttribute();
$this->uploadModel->{$fileAttribute} = UploadedFile::getInstance($this->uploadModel, $fileAttribute);
if($this->uploadModel->validate()) {
try {
$this->uploadModel->saveFile();
Re: DiC и SL в yii2
Еще одно: статические фабрики - враги DI. Определите интерфейс и внедрите его в свой контроллер. Напишите реализацию, в которой будет данный вызов.
Код: Выделить всё
public function actionMethod($method)
{
$params = ArrayHelper::merge(Yii::$app->request->getQueryParams(), Yii::$app->request->post());
$object = MethodFactory::factory($method, ['params' => $params]);
return $object->run();
}
- Cacatuidae
- Сообщения: 65
- Зарегистрирован: 2017.01.08, 17:39
Re: DiC и SL в yii2
В Yii это штатная ситуация, когда подключается бустрап модуля.
Нарушение даже если метод проксирует запрос на storage ?
https://github.com/Cacatuidae/yii2-sl-e ... el.php#L74
На счет фабрики согласен. Сейчас чтобы поменять фабрику, потребуется править код в контроллере.
Re: DiC и SL в yii2
В zf2/3 и symfony в одном месте модуль/бандл подключил и все - там и bootstrap и компоновка. Но это лирика).Cacatuidae писал(а): ↑2017.01.15, 17:49 В Yii это штатная ситуация, когда подключается бустрап модуля.
Я думаю да. У вас форма - это сервис который валидирует данные И сохраняет файл в хранилище. Желательно чтобы таких явных "И" было как можно меньше. Это основной критерий проверки SRP.Cacatuidae писал(а): ↑2017.01.15, 17:49 Нарушение даже если метод проксирует запрос на storage ?
https://github.com/Cacatuidae/yii2-sl-e ... el.php#L74
В самом использовании формы как сервисе ничего плохого нет. Очень хорошо использовать для инжекции всяких сервисов/репозиториев для заполнения данными выпадающих списков и валидации.
Re: DiC и SL в yii2
немного разная концепция - в yii модули "ленивые" и являются скорее частью слоя контроллеров, т.к. инициализируются при реквесте. поэтому то, что нужно проинициализировтаь всегда выносится в bootstrap. В симфони же и зенде модули являются именно бутстрапом, и контроллерами отношения не имеет. (речь идет о Module.php, а не о модуле как логической единице)anton_z писал(а): ↑2017.01.15, 18:20В zf2/3 и symfony в одном месте модуль/бандл подключил и все - там и bootstrap и компоновка.Cacatuidae писал(а): ↑2017.01.15, 17:49 В Yii это штатная ситуация, когда подключается бустрап модуля.
- Cacatuidae
- Сообщения: 65
- Зарегистрирован: 2017.01.08, 17:39
Re: DiC и SL в yii2
Вынес статичную фабрику в класс https://github.com/Cacatuidae/yii2-sl-e ... actory.phpanton_z писал(а): ↑2017.01.15, 18:20 Я думаю да. У вас форма - это сервис который валидирует данные И сохраняет файл в хранилище. Желательно чтобы таких явных "И" было как можно меньше. Это основной критерий проверки SRP.
В самом использовании формы как сервисе ничего плохого нет. Очень хорошо использовать для инжекции всяких сервисов/репозиториев для заполнения данными выпадающих списков и валидации.
И отдельный контроллер для данного метода https://github.com/Cacatuidae/yii2-sl-e ... roller.php
А вот на счет разделение формы загрузки и сохранения файла, то тут я не понимаю как это реализовать правильно.