在控制器 ZF2 外部使用 toRoute()
Using toRoute() outside controller ZF2
我想要的:
如果没有设置会话,我想重定向到zf2.localhost/authUser/index
当我在 CreatorController 中使用 toRoute
时,一切正常。
但是,我想在几个文件中使用这个方法。当我尝试在 SessionServiceController 中调用 toRoute
时,出现以下错误。
Error:
Url plugin requires that controller event compose a router; none found
你能告诉我我做错了什么吗?
代码:
CreatorController (zf2.localhost/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';
}
}
}
SessionServiceController:
<?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 listeners 的版本,你可以将其用作你自己的灵感(或者你可能会发现你只是想将那个项目用于你正在做的事情)
我想要的:
如果没有设置会话,我想重定向到zf2.localhost/authUser/index
当我在 CreatorController 中使用 toRoute
时,一切正常。
但是,我想在几个文件中使用这个方法。当我尝试在 SessionServiceController 中调用 toRoute
时,出现以下错误。
Error: Url plugin requires that controller event compose a router; none found
你能告诉我我做错了什么吗?
代码:
CreatorController (zf2.localhost/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';
}
}
}
SessionServiceController:
<?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 listeners 的版本,你可以将其用作你自己的灵感(或者你可能会发现你只是想将那个项目用于你正在做的事情)