内核中的数据库检查
Database check inside kernel
首先,我想为标题不明确表示歉意,但我想不出更好的方式来反映实际问题,如果您在阅读实际问题后可以帮助我提供更好的标题,我会欣赏一下。
我有一个项目,我的客户可以在其中请求我的应用程序演示(将其视为 SaaS),因此脚本创建了它的一个新实例,在客户试用该应用程序并做任何他想做的事情之前,他必须做一个简短的设置(设置语言、地区、时区等),之后数据保存在数据库中,他就可以做他的事了。
但是在每次访问应用程序时,脚本都必须检查此实例是否已完成设置(在这种情况下,客户被重定向到主页)或没有(客户被重定向到设置)。
这就是问题出现的地方,我想只在一个地方做这个检查并在用户可能访问的每条路线上生效,否则我将不得不以 symfony 的方式进行,这意味着自动装配自定义服务并使用方法我拥有的每个控制器上的这项服务非常耗时...
我认为此检查的最佳位置是内核 class 但我不知道如何在那里使用 EntityManager 因此我可以构建自定义查询...
有什么想法吗?有没有更好的方法来做到这一点?(请让我知道如何以及为什么)谢谢
您正在寻找的答案是事件订阅者:)。你认为 "I want to put this code in my kernel" 是正确的。好吧,当内核处理请求时,它会调度 "events"(即挂钩),允许您 运行 代码。
根据您的情况,您应该在 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,您甚至可以 bootstrap Symfony 4 中的事件订阅者 class,通过 运行ning:
php bin/console make:subscriber
干杯!
首先,我想为标题不明确表示歉意,但我想不出更好的方式来反映实际问题,如果您在阅读实际问题后可以帮助我提供更好的标题,我会欣赏一下。
我有一个项目,我的客户可以在其中请求我的应用程序演示(将其视为 SaaS),因此脚本创建了它的一个新实例,在客户试用该应用程序并做任何他想做的事情之前,他必须做一个简短的设置(设置语言、地区、时区等),之后数据保存在数据库中,他就可以做他的事了。 但是在每次访问应用程序时,脚本都必须检查此实例是否已完成设置(在这种情况下,客户被重定向到主页)或没有(客户被重定向到设置)。 这就是问题出现的地方,我想只在一个地方做这个检查并在用户可能访问的每条路线上生效,否则我将不得不以 symfony 的方式进行,这意味着自动装配自定义服务并使用方法我拥有的每个控制器上的这项服务非常耗时...
我认为此检查的最佳位置是内核 class 但我不知道如何在那里使用 EntityManager 因此我可以构建自定义查询...
有什么想法吗?有没有更好的方法来做到这一点?(请让我知道如何以及为什么)谢谢
您正在寻找的答案是事件订阅者:)。你认为 "I want to put this code in my kernel" 是正确的。好吧,当内核处理请求时,它会调度 "events"(即挂钩),允许您 运行 代码。
根据您的情况,您应该在 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,您甚至可以 bootstrap Symfony 4 中的事件订阅者 class,通过 运行ning:
php bin/console make:subscriber
干杯!