2012-07-03 78 views
6

我有小問題,我有控制器擴展AbstractActionController,並且我需要在任何動作之前調用一些函數,例如indexAction我認爲preDispatch()在任何動作之前調用,但是當我在$這個 - >查看 - >測試什麼都沒有。preDispatch不起作用

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

回答

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

而且在同一行:

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'; 
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

謝謝魔鬼我發現這在谷歌上,我忘記了有關調度父母... – Ismael