我正在尝试使用此处找到的kernel.request事件
我的示例的简化版本是重定向用户,除非他们已经在重定向的页面上。我看到的问题是我得到一个没有任何样式的页面 - 似乎我的样式和 js 也可能被重定向。
这是代码
服务.yml
services:
app.RequestListener:
class: App'EventListener'RequestListener
arguments: [ @security.context ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: redirectUser }
请求侦听器.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'))));
}
}
阅读了我提供的链接中的部分后 - 听起来这是正确的使用事件。有没有办法让它工作?
在执行重定向之前,请尝试检查以下条件:
if ($event->getRequest()->attributes->get('_route')[0] !== '_') {
}
这是我最终采用的解决方案。它通过确保令牌不为 null 来避免检查路由的需要。为了防止无限循环,我添加了对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'))));
}
}
}