5

我有小问题,我有控制器扩展 AbstractActionController,我需要在任何操作之前调用一些函数,例如 indexAction 我认为 preDispatch() 在任何操作之前调用但是当我在 $this->view->test 中尝试此代码时没有什么。

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;
 }
}
4

3 回答 3

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 中的调度事件的更多信息。

于 2012-12-28T14:11:31.457 回答
6

您最好在模块类上执行此操作,并使用 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
  }
}
于 2012-07-04T09:26:39.543 回答
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';
于 2012-07-04T19:40:44.027 回答