Php 网站所有控制器的呼叫服务

Php 网站所有控制器的呼叫服务,php,service,controller,symfony4,Php,Service,Controller,Symfony4,Symfony 4:是否有办法在网站的所有控制器中调用服务? 而不是在控制器的所有方法中调用服务(代码重复太多)。 将服务放在抽象控制器中?(我的需要:如果应用程序路由中的特定表为空,则它必须是redirectToRoute)您可以扩展AbstractController class DefaultController1 extends MyController { public function default() { $th

Symfony 4:是否有办法在网站的所有控制器中调用服务? 而不是在控制器的所有方法中调用服务(代码重复太多)。
将服务放在抽象控制器中?(我的需要:如果应用程序路由中的特定表为空,则它必须是redirectToRoute)

您可以扩展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
事件准备了一个日志,以便能够记录所有webhook—如果请求是到webhook路由/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


有关内核事件监听器的更多详细信息,请访问。

能否解释“应用程序路由中的特定表为空”-路由中的表|您可以使用监听器,例如onKernelController事件应该适合这样做:我不想在我所有的控制器中都写这个:$foo=$this->getdoctor()->getRepository(Bar::class)->findAll();if(!$foo){return$this->redirectToRoute('foo');}