2013-05-14 118 views
8

具體來說,我試圖在我的Module.php文件中使用FlashMessenger插件。在Zend Framework 2中,如何在控制器外部使用控制器插件

現在我Application/Module.php文件中的方法是這樣的:

public function checkAcl(MvcEvent $e) { 
    // code to determine route and role ... 

    if (!$e->getViewModel()->acl->isAllowed($userRole, $route)) { 
     $flashMessenger = $e->getController()->plugin('flashMessenger'); 
     $flashMessenger->addMessage('You must be logged in'); 

     // code to redirect to login page ... 
    } 
} 

但不工作,因爲$ E-> getController()返回一個字符串,而不是一個控制器對象。任何幫助直接訪問控制器或插件的讚賞。

回答

14

可以使用ControllerPluginManager從任何事件處理程序獲得以FlashMessenger的實例在Module.php像這樣:

public function myEventHandler(MvcEvent $e) { 
    $sm = $e->getApplication()->getServiceManager(); 
    $flash = $sm->get('ControllerPluginManager')->get('flashMessenger'); 
    $flash->addErrorMessage('test'); 
    // ... 
} 

很明顯,你可以爲任何控制器插件做到這一點。

0

或者,從而埃塞基耶爾解決方案的工作對我很好,你可以使用以下命令:

請確保您使用的類Module.php

use Zend\Mvc\Controller\Plugin\FlashMessenger; 

然後:

$flash=new FlashMessenger(); 
$flash->addErrorMessage("hello"); 

我目前正在使用Ezequiel的一個。

+1

注意這一點 - 當您調用hasMessages()或getMessages()時,FlashMessenger會將會話中的所有消息提取到本地FlashMessenger對象(請參閱FlashMessenger.php中的「getMessagesFromContainer」函數)。 如果您實例化一個新的FlashMessenger,並且與此同時,您的應用程序中的某些內容在Service Manager中的實例上調用了hasMessages或getMessages,那麼您新創建的實例將爲空。如果你碰巧是第一個使用上面的代碼,那麼任何未來的實例都將是空的(第一個實例獲取消息)。 –

+0

感謝提示@Mark T – Conti

相關問題