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