загрузка услуг в пределах класса контроллера - PullRequest
0 голосов
/ 12 июня 2018

Меня недавно попросили очистить наш унаследованный код Symfony и проверить, будет ли при этом улучшена производительность.

Первое, что я заметил, это то, что почти на каждом контроллере сервисы будутбыть загруженным через

 public function someAction(Request $request){

     $someService = $this->get(someService::class);
     ... there are plenty of them 

 }

Мой вопрос: не лучше ли вместо этого использовать инъекцию зависимостей в конструкторе Controller?

  public function __construct(SomeService1 $someService1, SomeService2 ...)

файл service.yml уже имеет autowire: trueатрибут включен.Ранее я провел некоторое исследование SO, но после слов я более запутан и не уверен, какой из них является рекомендуемым подходом.

Моя версия Symfony - 3.3.17

1 Ответ

0 голосов
/ 12 июня 2018

Если вы расширите базовый класс AbstractController, вы не сможете получить доступ к услугам напрямую из контейнера через $this->container->get() или $this->get().Вместо этого вы должны использовать внедрение зависимостей для извлечения служб: проще всего это сделать с помощью аргументов метода действия с подсказкой типа :

Не использовать $this->get() или $this->container->get() для извлеченияуслуги из контейнера.Вместо этого используйте внедрение зависимостей.

Если вам нужна служба в контроллере, просто введите подсказку в аргументе с его именем класса (или интерфейса).Symfony автоматически передаст вам необходимую вам услугу:

use Psr\Log\LoggerInterface;
// ...

/**
 * @Route("/lucky/number/{max}")
 */
public function number($max, LoggerInterface $logger)
{
    $logger->info('We are logging!');
    // ...
}

Начиная с версии 3.3, контроллеры импортируются отдельно, чтобы убедиться, что службы могут быть введены в качестве аргументов действия, даже если вы не расширяете базовый класс контроллера:

# services.yml
services:
    # ...

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

Не получая сервисы непосредственно из контейнера, вы можете сделать ваши сервисы приватными, что имеет несколько преимуществ .

Нет времени выполнения влияние на производительность при использовании любой из этих функций.Однако в среде dev наблюдается некоторое снижение производительности.Самое главное, что ваш контейнер, вероятно, будет перестраиваться чаще при изменении классов обслуживания.

Ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...