Symfony 4: Есть ли способ вызвать службу во всех контроллерах веб-сайта? Вместо вызова сервиса во всех методах контроллеров (слишком много дублирования кода). Поместите службу в AbstractController? (мне нужно: если конкретная таблица пуста в маршруте приложения, это должен быть redirectToRoute)
Просто: я не хочу писать это во всех своих контроллерах: $foo = $this->getDoctrine()->getRepository(Bar::class)->findAll(); if (!$foo) { return $this->redirectToRoute('foo'); }






Вы можете расширить 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;
}
}
Обычный способ сделать это в Symfony — использовать прослушиватель событий ядра. У меня есть один для события 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);
}
Здесь я смотрю, является ли нет веб-перехватчиком, и возвращаюсь. isWebHook/logWebhookData можно заменить, если вам нужно выполнить какие-либо проверки в базе данных, кеше или во всем, что вам нужно.
Дополнительные сведения о прослушивателях событий ядра доступны на странице Страницы документации Symfony.
Можете ли вы объяснить, что «конкретная таблица пуста В МАРШРУТЕ ПРИЛОЖЕНИЯ» - таблица в маршруте? .. | Вы можете использовать прослушиватели, например, событие onKernelController должно подойти для этого