Сервис звонков для всех контроллеров сайта - PullRequest
0 голосов
/ 06 февраля 2019

Symfony 4: есть ли способ вызвать сервис на всех контроллерах сайта?Вместо вызова службы во всех методах контроллеров (слишком много дублирования кода).Поставить сервис в AbstractController?(моя потребность: если конкретная таблица пуста в маршруте приложения, она должна быть redirectToRoute)

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Обычный способ добиться этого в Symfony - это прослушиватель событий Kernel.У меня есть один для события onKernelRequest, чтобы можно было регистрировать все веб-хуки - если запрос к маршруту / URL веб-хука.

services.yml:

App\Subscribers\WebhookLoggingListener:
    arguments:
        # some arguments my listener needs
    tags:
       - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

ЭтоЗатем вызывается для каждого запроса действия контроллера и выполняет:

public function onKernelRequest(GetResponseEvent $event): void
{
    if (!$event->isMasterRequest()) {
        // don't do anything if it's not the master request
        return;
    }

    $request = $event->getRequest();

    if (!$this->isWebHook($request)) {
        return;
    }

    $this->logWebhookData($request);
}

Здесь я вижу, является ли это не webhook, и возвращаю.IsWebHook / logWebhookData можно заменить, если вам необходимо выполнить какие-либо проверки в базе данных, кэше или в любом другом месте.

Более подробная информация о прослушивателях событий ядра доступна на страницах документации Symfony .

0 голосов
/ 06 февраля 2019

Вы можете расширить AbstractController

 class DefaultController1 extends MyController
    {
        public function default()
        {
             $this->logger ...
        }
    }

    class DefaultController2 extends MyController
    {
        public function default()
        {
             $this->logger ...
        }
    }

    class MyController extends AbstractController
    {
        public $logger;

        public function __construct(LoggerInterface $logger)
        {
            $this->logger = $logger;
        }
    }
...