Size: a a a

2020 August 09

СП

Сергей Предводителев... in Yii Framework 3
Что не очень правильно
источник

СП

Сергей Предводителев... in Yii Framework 3
Может всё таки классы-инъекции (например, csrf). Удобно же: весь код в одном месте + можно прямо в конфиге указать: добавь csrf.
источник

СП

Сергей Предводителев... in Yii Framework 3
и решается проблема с рр, что передаётся сервис во view.
источник

DS

Dmitriy S in Yii Framework 3
Сергей Предводителев
и решается проблема с рр, что передаётся сервис во view.
Если ты под сервисом имеешь в виду инъекцию, то она передается во viewRenderer, а не во вью
источник

СП

Сергей Предводителев... in Yii Framework 3
Dmitriy S
Если ты под сервисом имеешь в виду инъекцию, то она передается во viewRenderer, а не во вью
“Передавай туда объект сервиса Currency и его уже юзай в лейауте. $currencyService->getRate()" вот это имел в виду.
источник

СП

Сергей Предводителев... in Yii Framework 3
Можно будет в лейаут передать сразу $rate.
источник

DS

Dmitriy S in Yii Framework 3
Сергей Предводителев
“Передавай туда объект сервиса Currency и его уже юзай в лейауте. $currencyService->getRate()" вот это имел в виду.
Оно так же тожно у тебя работает как и $layoutParameters
источник

DS

Dmitriy S in Yii Framework 3
Только обертка лишняя
источник

СП

Сергей Предводителев... in Yii Framework 3
Dmitriy S
Оно так же тожно у тебя работает как и $layoutParameters
Нет, параметры вычисляются только перед выводом и передаются уже результаты вычислений во втюху
источник

СП

Сергей Предводителев... in Yii Framework 3
На примере валюты я сделаю такой класс:

class CurrencyRateInjection implements InjectionInterface
{
   private CurrencyService $service;
   public function __construct(CurrencyService $service)
   {
       $this->service = $service;
   }
   ...
   public function getParams(): array
   {
       return ['rate' => $this->service->getRate()];
   }
}


И у меня во вью пойдёт переменная $rate.
источник

СП

Сергей Предводителев... in Yii Framework 3
Или CsrfInjection  - во вью идёт переменная $csrf и регистрируется мета-тег тут же.
источник

СП

Сергей Предводителев... in Yii Framework 3
И конфигурация через params.php красиво:

'viewRenderer' => [
 'viewBasePath' => '@views',
 'layout' => '@views/layout/main',
 'contentInjections' => [
   CsrfInjection::class,
 ],
 'layoutInjections' => [
   UserInjection::class,
   CurrencyRateInjection::class,
 ],
],
источник

DS

Dmitriy S in Yii Framework 3
Я поставлю себе пр завтра и гляну как там еще можно решить это все без сервис-локатора
источник

СП

Сергей Предводителев... in Yii Framework 3
Dmitriy S
Я поставлю себе пр завтра и гляну как там еще можно решить это все без сервис-локатора
А разве это сервис-локатор? Я ведь беру контейнер через ContainerInterface и из него получаю экземпляры этих классов.
источник

DS

Dmitriy S in Yii Framework 3
Сергей Предводителев
А разве это сервис-локатор? Я ведь беру контейнер через ContainerInterface и из него получаю экземпляры этих классов.
ContainerInterface - это и есть сервис-локатор
источник

СП

Сергей Предводителев... in Yii Framework 3
Ясн... Пойду ещё погуглю, так р не осознал до конца этот момент
источник

СП

Сергей Предводителев... in Yii Framework 3
Правильно я понимаю, что как только я получаю зависимость не через инъекцию, как правило в конструкторе, это уже сервис локатор?
источник

DS

Dmitriy S in Yii Framework 3
Сергей Предводителев
Ясн... Пойду ещё погуглю, так р не осознал до конца этот момент
Любой вызов $container->get() внутри пользовательского кода - это  использование контейнера в виде сервис-локатора, это допускается только в сервис-провайдерах и в некоторых компонентах фреймворка, во всех остальных кейсах использовать сервис-локатор нежелательно, вместо этого используем внедрение зависимостей через конструтор или через метод
источник

СП

Сергей Предводителев... in Yii Framework 3
Понятно.. теперь бы понять почему нежелательно, что в этом плохого?
источник

DS

Dmitriy S in Yii Framework 3
источник