我想添加一个由用户数据重定向的进程。
例如,它是一个积分系统。
如果用户没有点,则强制重定向到静态页面。
我的想法是添加进程来构造普通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));
}
}
}