php - 在每个 URL 之前执行功能,然后在 Symfony 2.6 中重定向

标签 php symfony

我想在处理每个 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/

相关文章:

使用 liip imagine_filter 的 Symfony 5 Mailer 嵌入图像

php - Silex + Doctrine ORM 在@MappedSuperclass 上设置时不会触发事件

java - 对于具有多个参数的单操作 Java 程序来说,理想的 Web 服务协议(protocol)是什么?

javascript - 使用 PHP 在升序和降序日期之间切换 onclick

php - 看到别人的帖子

java - 在 Java 中不断检查和读取 PHP 文件以了解数据库更改的最简单/最有效的方法?

Symfony2 应用程序在 kernel.request 和 kernel.controller 之间总是有 3 秒的等待

php - 如何在 Latte 中注册过滤器(以前称为助手)?

php - 将数组存储为 JSON 时,为什么从角色数组中删除项目会中断?

symfony - Symfony Finder会忽略以点开头的文件