Size: a a a

2021 March 12

В

Виктор in Yii Framework 3
Alexander Borisov
Ну у меня вот один из последних юзкейсов. Куча документов с разными типами. Надо генерировать pdf для каждого типа по-разному. Соответственно локатор с ключами-типами и значения - хендлеры
Я для таких случаев использую фабрики. В фабрику передаю тип сущности или сущность и в ответ получаю ее обработчик.
источник

AB

Alexander Borisov in Yii Framework 3
Виктор
Я для таких случаев использую фабрики. В фабрику передаю тип сущности или сущность и в ответ получаю ее обработчик.
А чем это отличается от локатора? 🙂
источник

В

Виктор in Yii Framework 3
В общем, смысл тот же, реализация чуть разная)
источник

В

Виктор in Yii Framework 3
Alexander Borisov
А чем это отличается от локатора? 🙂
В концепции, они сильно разные
источник

AB

Alexander Borisov in Yii Framework 3
Виктор
В концепции, они сильно разные
Т.е. ты ручками в фабрике создаешь обработчик, а не получаешь его из контейнера?
источник

DS

Dmitriy S in Yii Framework 3
Alexander Borisov
Т.е. ты ручками в фабрике создаешь обработчик, а не получаешь его из контейнера?
Стандартной фабрикой с контейнером решается
public function getPDF(Factory $factory) 
{
     $handler = $factory->create(FirstTypePDFHandler::class);
}
источник

AB

Alexander Borisov in Yii Framework 3
Dmitriy S
Стандартной фабрикой с контейнером решается
public function getPDF(Factory $factory) 
{
     $handler = $factory->create(FirstTypePDFHandler::class);
}
А если скаляры в конструкторе?
источник

DS

Dmitriy S in Yii Framework 3
Alexander Borisov
А если скаляры в конструкторе?
Так должно работать
$factory->create(FirstTypePDFHandler::class, ['someparam' => 42]);
источник

AB

Alexander Borisov in Yii Framework 3
Я про то, что сервисы конфижатся в одном месте. Туда захочется пропихнуть значение из $params
источник

СП

Сергей Предводителев... in Yii Framework 3
М... а инжектор тут не поможет?
источник

AB

Alexander Borisov in Yii Framework 3
Но да, вариант нормальный 🙂 В symfony контейнер как фабрика не используется, забыл про него
источник

DS

Dmitriy S in Yii Framework 3
Alexander Borisov
Я про то, что сервисы конфижатся в одном месте. Туда захочется пропихнуть значение из $params
Отнаследовать фабрику и сконфижить ее дефинишины в конфиге контейнера
источник

В

Виктор in Yii Framework 3
Alexander Borisov
Т.е. ты ручками в фабрике создаешь обработчик, а не получаешь его из контейнера?
Сервис локатор в том виде, что по ссылке на новость ларки, приводит к неявным зависимостям у класса, что резко снижает его стабильность. Я предпочитаю под каждый такой случай писать отдельную фабрику, которая возвращает только объекты одного определенного интерфейса. Это помогает в вопросах типизации и делает все участвующие в этой связке классы более стабильными.
источник

В

Виктор in Yii Framework 3
Даже если создание объекта сводится к чему-то вроде $factory->create(FirstTypePDFHandler::class, ['someparam' => 42]);, я все равно предпочту написать под это свою фабрику.
источник

AB

Alexander Borisov in Yii Framework 3
Виктор
Сервис локатор в том виде, что по ссылке на новость ларки, приводит к неявным зависимостям у класса, что резко снижает его стабильность. Я предпочитаю под каждый такой случай писать отдельную фабрику, которая возвращает только объекты одного определенного интерфейса. Это помогает в вопросах типизации и делает все участвующие в этой связке классы более стабильными.
Ну да, берется базовый локатор и у него переопределяется метод get:
```
public function get(string $id): GeneratorInterface
{
   return parent::
get($id);
}

```
источник

В

Виктор in Yii Framework 3
Alexander Borisov
Ну да, берется базовый локатор и у него переопределяется метод get:
```
public function get(string $id): GeneratorInterface
{
   return parent::
get($id);
}

```
это ты к чему?
источник

AB

Alexander Borisov in Yii Framework 3
Виктор
это ты к чему?
К тому что после этого уже нет никаких неявных зависимостей
источник

AB

Alexander Borisov in Yii Framework 3
Или я тебя не правильно понял
источник

DS

Dmitriy S in Yii Framework 3
Виктор
Даже если создание объекта сводится к чему-то вроде $factory->create(FirstTypePDFHandler::class, ['someparam' => 42]);, я все равно предпочту написать под это свою фабрику.
Это сама механик, а там делается своя фабрика и вызывается
$handlerFactory->createFor($document);
источник

В

Виктор in Yii Framework 3
Alexander Borisov
К тому что после этого уже нет никаких неявных зависимостей
В принципе да, если ты зависишь от некоего класса с методом get, определяющим возвращаемое значение, внутренняя реализация этого класса для использующего его сервиса действительно неважна, хоть от контейнера наследуйся. Просто в предложенной тобой реализации те же самые проблемы будут на другом уровне, на уровне твоего сервис локатора, т.к. он теперь зависит (даже хуже: наследуется) от непойми чего.
источник