Symfony2中根据用户数据状态重定向过程的一种更简单的方法



我想添加一个由用户数据重定向的进程。
例如,它是一个积分系统。
如果用户没有点,则强制重定向到静态页面。

我的想法是添加进程来构造普通BaseController的函数。

class BaseController extends Controller
{
    public function __construct()
    {
        if ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
            $user    = $this->container->get('security.context')->getToken()->getUser();
            $manager = $this->container->get('doctrine')->getManager();
            if (! $manager->getRepository('MyUserBundle:User')->hasPoints($user))
                return new RedirectResponse($this->container->get('router')->generate('static_page_route'));
        }
    }

但是我不能用容器。

错误:在非对象

上调用成员函数get()

争论点:
1. 如何在构造函数中使用用户对象。
2. 是否有一种更简单的方法来重定向过程根据用户数据的状态(如点)?
(比如根据用户点的状态改变角色,虽然我还不知道ACL的细节)


添加例子:

public function onKernelRequest(GetResponseEvent $event){
    if (!$this->securityContext->getToken()) {
        return;
    }
    $isUser = $this->securityContext->isGranted('ROLE_USER');
    if (!$isUser) {
        return;
    }
    $user    = $this->securityContext->getToken()->getUser();
    $request = $event->getRequest();
    $_route  = $request->attributes->get('_route');
    if (! $user->hasPoints() && $_route != 'static_page_route') {
        // exit; <= page rendering is done even if process exit.
        //          Redirect process be called after rendering?
        $redirectUrl = $this->router->generate('static_page_route');
        $event->setResponse(new RedirectResponse($redirectUrl));     // <= `The page isn't redirecting properly` error now.
    }
}

一个解决方案:

<?php
namespace MyExampleBundleEventListener;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyBundleFrameworkBundleRoutingRouter;
use SymfonyComponentSecurityCoreSecurityContext;
use SymfonyComponentHttpKernelEventGetResponseEvent;
use SymfonyComponentHttpKernelHttpKernel;
class BeforeController {
    protected $securityContext;
    protected $router;
    public function setRouter(Router $router){
        $this->router = $router;
    }
    public function setSecurityContext(SecurityContext $securityContext){
        $this->securityContext = $securityContext;
    }
    public function onKernelRequest(GetResponseEvent $event){
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) { return; }
        if (! $this->securityContext->getToken()) { return; }
        if (! $this->securityContext->isGranted('ROLE_USER')) { return; }
        $user    = $this->securityContext->getToken()->getUser();
        $request = $event->getRequest();
        $_route  = $request->attributes->get('_route');
        if (! $user->hasPoints() && $_route != 'static_page_route') {
            $redirectUrl = $this->router->generate('static_page_route');
            $event->setResponse(new RedirectResponse($redirectUrl));
        }
    }
}

最新更新