网站所有控制者的呼叫服务

时间:2019-02-06 10:50:02

标签: php service controller symfony4

Symfony 4:是否可以在网站的所有控制者中调用服务? 代替所有控制器方法中的呼叫服务(太多的代码重复)。 将服务放在AbstractController中? (我的需要:如果特定路由在应用程序路由中为空,则必须为redirectToRoute)

2 个答案:

答案 0 :(得分:0)

您可以扩展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;
        }
    }

答案 1 :(得分:0)

在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。

有关Symfony docs pages的内核事件监听器的更多详细信息。