首先我想为标题不清楚道歉,但我不能'吨想不出更好的方式把它反映的实际问题,如果你能帮助我一个更好的阅读实际的问题后,我会apreciate it。
我有一个项目,我的客户可以请求我的应用程序的演示(将其视为SaaS),因此脚本创建它的新实例,在客户尝试应用程序并做任何他想做的事情之前,他必须做一个简短的设置(设置语言,区域,时区等),然后将数据保存在数据库中,他可以做他自己的事情。 但是在每次访问应用程序时,脚本都必须检查此实例是否已完成设置(在这种情况下客户被重定向到主页)(客户被重定向到设置)。 这里是问题出现的地方,我想在一个地方进行检查并在用户可以访问的每条路线上生效,否则我将不得不以symfony方式进行,这意味着自动装配自定义服务并使用方法我所拥有的每个控制器上的这项服务都是耗时的......
我认为这次检查的最佳位置是内核类,但我无法弄清楚如何在那里使用EntityManager,这样我就可以构建一个自定义查询...
有什么想法吗?有更好的方法吗?(请告诉我如何以及为什么)谢谢
答案 0 :(得分:2)
您正在寻找的答案是事件订阅者:)。你想“我想把这段代码放在我的内核中”是正确的。好吧,当内核处理请求时,它会调度允许您运行代码的“事件”(即挂钩)。
在您的情况下,您应该在kernel.request事件上创建一个事件订阅者。在执行控制器之前,每个请求都会调度此事件。在这里,您可以做任何您需要的逻辑。而且,如果需要,您甚至可以重定向用户。它看起来像这样:
public function onKernelRequest(GetResponseEvent $event)
{
$isSetup = false; // replace with your real logic
if (!$isSetup) {
// By setting the response, the controller will never be called
$event->setResponse(new RedirectResponse(
// this assume you've injected the router
// is redirects to some "finish_setup" route
$this->router->generate('finish_setup');
));
}
}
如果安装了MakerBundle,您甚至可以在Symfony 4中引导事件订阅者类,运行:
php bin/console make:subscriber
干杯!