我正在尝试使用找到here
的kernel.request事件我的示例的简化版本是重定向用户,除非它们已经在重定向页面上。我看到的问题是我得到的页面没有任何样式 - 看起来我的样式和js也可能被重定向。
这是代码
services.yml
services:
app.RequestListener:
class: App\EventListener\RequestListener
arguments: [ @security.context ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: redirectUser }
requestListener.php
class requestListener
{
public function redirectUser()
{
if($event->getRequest()->getPathInfo() != '/') {
//app_frontend_home_index goes to '/'
$event->setResponse(new RedirectResponse($this->router->generate('app_frontend_home_index')));
}
}
}
我也尝试了这个设置?test = dont_redirect,一旦设置了它就不应该重定向
public function redirectUser()
{
if(is_null($event->getRequest()->get('test'))) {
//app_frontend_home_index goes to '/'
$event->setResponse(new RedirectResponse($this->router->generate('app_frontend_home_index', array('test' => 'dont_redirect'))));
}
}
在阅读了我提供的链接中的部分后 - 听起来这是正确使用的事件。有没有办法让它发挥作用?
答案 0 :(得分:0)
在执行重定向之前,请尝试检查以下条件:
if ($event->getRequest()->attributes->get('_route')[0] !== '_') {
}
答案 1 :(得分:0)
这是我最终选择的解决方案。它通过确保令牌不为空来避免检查路由的需要。为了防止无限循环,我在检查GET参数时添加了。为了完成这个例子,我展示了如何检查用户是否已成为会员的时间比试用时间长 - 如果是这样,他们将其重定向到定价页面。
希望这证明对某人有用 - 如果有任何差距或改进空间,请随时告诉我。
public function __construct(SecurityContext $securityContext, Router $router, $trialDays)
{
$this->securityContext = $securityContext;
$this->router = $router;
$this->trialDays = $trialDays;
}
/**
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
*/
public function checkTrial(GetResponseEvent $event)
{
if(!is_null($this->securityContext->getToken()) &&
($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY') ||
$this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED'))) {
$memberDays = (int)$this->securityContext->getToken()->getUser()->getCreatedAt()->diff(new \DateTime)->format('%d');
if($memberDays > $this->trialDays &&
is_null($event->getRequest()->get('redirected'))) {
$event->setResponse(new RedirectResponse($this->router->generate('app_frontend_pricing_index', array('redirected' => 'true'))));
}
}
}