Symfony 4:是否可以在网站的所有控制者中调用服务? 代替所有控制器方法中的呼叫服务(太多的代码重复)。 将服务放在AbstractController中? (我的需要:如果特定路由在应用程序路由中为空,则必须为redirectToRoute)
答案 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的内核事件监听器的更多详细信息。