我有一点问题,我有控制器扩展AbstractActionController,我需要在任何动作之前调用一些函数,例如indexAction我认为preDispatch()在任何动作之前被调用但是当我在$ this->视图中尝试这个代码时 - >测试没什么。
class TaskController extends AbstractActionController
{
private $view;
public function preDispatch()
{
$this->view->test = "test";
}
public function __construct()
{
$this->view = new ViewModel();
}
public function indexAction()
{
return $this->view;
}
}
答案 0 :(得分:13)
当我希望这样做时,我使用定义的onDispatch
方法:
class TaskController extends AbstractActionController
{
private $view;
public function onDispatch( \Zend\Mvc\MvcEvent $e )
{
$this->view->test = "test";
return parent::onDispatch( $e );
}
public function __construct()
{
$this->view = new ViewModel();
}
public function indexAction()
{
return $this->view;
}
}
另外,请查看http://mwop.net/blog/2012-07-30-the-new-init.html以获取有关如何在ZF2中使用调度事件的其他信息。
答案 1 :(得分:7)
您最好在模块类上执行此操作,并使用EventManager来处理mvc事件,如下所示:
class Module
{
public function onBootstrap( $e )
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'), 100 );
}
public function preDispatch()
{
//do something
}
}
答案 2 :(得分:2)
在一行中:
public function onBootstrap(Event $e)
{
$e->getTarget()->getEventManager()->attach('dispatch', array($this, 'someFunction'), 100);
}
最后一个数字是重量。作为减去相等的职位。
以下事件已预先配置:
const EVENT_BOOTSTRAP = 'bootstrap';
const EVENT_DISPATCH = 'dispatch';
const EVENT_DISPATCH_ERROR = 'dispatch.error';
const EVENT_FINISH = 'finish';
const EVENT_RENDER = 'render';
const EVENT_ROUTE = 'route';