在控制器ZF2外部使用toRoute()


Using toRoute() outside controller ZF2

我想要什么:

如果会话未设置,我想重定向到zf2.localhost/authUser/index

当我在CreatorController中使用toRoute时,一切都正常。

但是,我想在几个文件中使用这种方法。当我尝试在SessionServiceController中调用toRoute时,我会收到以下错误。

错误:Url插件要求控制器事件组成一个路由器;没有找到

你能告诉我我做错了什么吗?

代码:

CreatorController(zf2localhost/creator/index)

   <?php
    namespace Creator'Controller;
    use Zend'View'Model'ViewModel;
    use Zend'Mvc'Controller'AbstractActionController;
    use Creator'Controller'SessionServiceController;
    class CreatorController extends AbstractActionController{
        public function __construct(){
            $this -> sessionService = new SessionServiceController();
        }
        public function indexAction(){
            if($this-> sessionService ->checkSession()){
                echo 'Witam';
            }
        }
    }

会话服务控制器

<?php
namespace Creator'controller;
use Zend'Mvc'Controller'AbstractActionController;
use Zend'Session'Container;
use Creator'Controller'SessionServiceController;
class SessionServiceController extends AbstractActionController {
    const CONTAINER_SESSION_ID = 'usr_id';
    public function __construct(){
        $this -> session_id = new Container( self::CONTAINER_SESSION_ID);
    }
    public function checkSession(){
        if (empty($this ->session_id->usr_id)){
            //$this->redirect()->toUrl("zf2.localhost/authUser/index");
            return $this->redirect()->toRoute('creator/default',
                array('controller'=>'authUser', 'action'=>'index'));
        }  
        if (!empty($this ->session_id->usr_id)){
            return true;
        }   
    }
}

如果不想直接实例化控制器,请使用ServiceManager。要使toRoute工作,Url帮助程序需要一个路由器实例。当从ControllerManager调用控制器时,这通常由ControllerPluginManager处理。

但是,除此之外,这种逻辑可能是错误的。如果您正在检查经过身份验证的用户,您可能希望在加载控制器之前,在事件中加载并使用zend的身份验证服务。我想最好的地方是ON_ROUTE事件循环中的某个地方,但我无法与您的特定应用程序对话。

您将知道用户是否在请求链的早期登录,没有理由启动控制器。看一眼ZfcUser(https://github.com/ZF-Commons/ZfcUser),它已经有了auth-redirect监听器的版本,您可以将其用作自己的灵感来源(或者您可能会发现您只想将该项目用于您正在做的事情)