【发布时间】:2013-12-03 02:50:35
【问题描述】:
我正在尝试从 EventListener 重定向到控制器,但收到以下错误消息:
Unable to find controller "HRPortalSystemBundle:Home:login"
我肯定 HomeController 存在于 \HRPortal\SystemBundle\Controller 下,并且它确实有一个名为 loginAction() 的方法。这个动作也有一个效果很好的路由:
# routing.yml
login:
path: /login
defaults: { _controller: HRPortalSystemBundle:Home:login }
我的代码如下:
<?php
namespace HRPortal\SystemBundle\EventListener;
use HRPortal\SystemBundle\Controller\TokenAuthenticatedController;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpFoundation\Request;
class TokenListener
{
private $em;
private $userRepo;
private $session;
public function __construct($em, $session)
{
$this->session = $session;
$this->em = $em;
$this->userRepo = $em->getRepository('HRPortalSystemBundle:Users');
}
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
if ($controller[0] instanceof TokenAuthenticatedController) {
if($this->session->has('id') && $this->session->has('token')){
$sess_id = $this->session->get('id');
$sess_token = $this->session->get('token');
$user = $this->userRepo->findBy(array('id'=>$sess_id, 'token'=>$sess_token));
if($user == null){
throw new AccessDeniedHttpException('We could not find the user');
}else{
if($user->token != $sess_token){
throw new AccessDeniedHttpException('This action needs a valid token');
}
}
}else{
$request = new Request();
$resolver = new ControllerResolver();
$request->attributes->set('_controller', 'HRPortalSystemBundle:Home:login');
$event->setController($resolver->getController($request));
}
}
}
}
我也不确定 $resolver 是否正确使用,因为我猜这将是解决这个问题后的下一个问题。
提前致谢。
=== 编辑 ===
我已经完成了以下操作,现在它似乎找到了控制器。
$request = new Request();
$resolver = new ControllerResolver();
$request->attributes->set('_controller', 'HRPortal\SystemBundle\Controller\HomeController::loginAction');
$event->setController($resolver->getController($request));
但是,我收到以下错误消息:
Error: Call to a member function get() on a non-object in /usr/local/apache2/htdocs/hrportal/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php line 106
所以控制器和解析器似乎有问题。
【问题讨论】: