我想在处理每个 URL 之前检查一些用户元值。在此过程中,我想跳过一些特殊的 URL,例如登录、登录,当然还需要获取当前用户。
注意:我想检查其他功能并在它传递到 Controller 之前重定向。不想更改响应但请求。希望这是正确的事件。
我目前正在 Hook kernel.request
事件并做这样的事情
创建订阅者
profile_check_subscriber:
class: BBT\MainBundle\EventListener\ProfileCheckSubscriber
arguments: ['@user_manager', '@router.default']
tags:
- { name: kernel.event_subscriber }
然后在 ProfileCheckSubscriber 类中
class ProfileCheckSubscriber implements EventSubscriberInterface {
/**
* @var UserManager
*/
private $userManager;
/**
* @var Router
*/
private $router;
public function __construct(UserManager $userManager, Router $router)
{
$this->userManager = $userManager;
$this->router = $router;
}
public static function getSubscribedEvents()
{
return array(
'kernel.request' => 'onKernelRequest'
);
}
public function onKernelRequest( GetResponseEvent $event)
{
$request_uri = $event->getRequest()->getRequestUri();
$logout_url = $this->router->generate('fos_user_security_logout');
//don't proceed on these urls
$check_url_array = array(
$logout_url,
$this->router->generate('user_welcome'),
$this->router->generate('fos_user_registration_confirmed'),
$this->router->generate('fos_user_registration_register'),
$this->router->generate('fos_user_security_check'),
$this->router->generate('fos_user_security_login')
);
if( $event->getRequest()->getMethod() !== 'GET' )
return;
if( $event->getRequest()->isXmlHttpRequest() )
return;
if( in_array( $request_uri, $check_url_array ) )
return;
if( false !== strpos( $request_uri, 'f/f_edit' ) )
return;
if( false !== strpos( $request_uri, 'register' ) )
return;
if( 'anon.' == $this->userManager->current_user || false == $this->userManager->current_user )
return;
//good to process
$forced_profile_page_url = $this->router->generate('user_forced_pages', array('page_type' => 'profile_picture'));
$profile_fields_url = $this->router->generate('user_profile_edit');
$profile_image_check = $this->userManager->getSingleMeta('force_profile_image_set');
$profile_fields_check = $this->userManager->getSingleMeta('force_profile_fields_set');
if( true == $profile_image_check && $request_uri != $forced_profile_page_url ){
$event->setResponse(new RedirectResponse( $forced_profile_page_url ));
} elseif( true == $profile_fields_check && $request_uri != $profile_fields_url && $request_uri !== $forced_profile_page_url ) {
$event->setResponse(new RedirectResponse( $profile_fields_url ));
}
}
}
这里 userManager
是我的客户,其中 current_user
由安全 token 检索。
如果我使用 kernel.response
并使用 FilterResponseEvent
而不是 GetResponseEvent
但无法在 内核上运行,此代码将完美运行。 request
因为它找不到当前登录的用户。
我不确定 kernel.request
是如何弄乱 session 的。
更新: 抱歉,伙计们,回到绘图板。设置优先级并没有得到用户。所以还是拿不到用户。尝试了优先级 0 和 50。没有运气!
最佳答案
你有没有试过改变监听kernel.controller
的事件?
public function onKernelController(FilterControllerEvent $event)
{
$user = $this->tokenStorage->getToken()->getUser();
/* all your logic */
$redirectUrl = /** something **/
$event->setController(function() use ($redirectUrl) {
return new RedirectResponse($redirectUrl);
});
}
http://symfony.com/doc/current/components/http_kernel/introduction.html#the-kernel-controller-event
关于php - 在每个 URL 之前执行功能,然后在 Symfony 2.6 中重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31911424/