从Zend Controller插件中获取View对象

时间:2011-02-05 14:52:11

标签: zend-framework plugins zend-view front-controller

在我的控制器中,我有一个postDispatch来整合我的FlashMessenger消息:

public function postDispatch()
{       
    $messages = $this->_helper->getHelper ( 'FlashMessenger' )
        ->getMessages ();

    if ( $this->_helper->getHelper ( 'FlashMessenger' )
        ->hasCurrentMessages () )
    {
        $messages = array_merge ( $messages, $this->_helper->getHelper ( 'FlashMessenger' )
            ->getCurrentMessages () );
        $this->_helper->getHelper ( 'FlashMessenger' )
            ->clearCurrentMessages ();
    }

    $this->view->alert = $messages;
}

我想把它变成一个Controller插件。

更新:我意识到为什么我需要这个 - 我希望在JSON上下文调用时以JSON方式传递我的flash消息。除非将消息添加到View对象,否则我不会收到消息。

我能够将消息放入数组中,但我不知道如何将它们传递给视图:

class Plugin_FlashMessenger extends Zend_Controller_Plugin_Abstract
{
    public function postDispatch($request)
    {
        $flashmessenger = Zend_Controller_Action_HelperBroker::getStaticHelper ( 'FlashMessenger' );

        $messages = $flashmessenger->getMessages ();
        if ( $flashmessenger->hasCurrentMessages () )
        {
            $messages = array_merge ( $messages, $flashmessenger->getCurrentMessages () );
            $flashmessenger->clearCurrentMessages ();
        }

        // THIS LINE IS WRONG. HOW DO I SEND $messages TO THE VIEW?
        $this->view->alert = $messages;
    }
}

奖金问题 - 这是实现这一目标的正确方法吗?谢谢!

3 个答案:

答案 0 :(得分:12)

我在寻找同样的事情时发现了你的帖子。基于this thread,有两种简单的方法可以实现它。

一个:如果您的视图在引导过程中初始化(resources.view[] =位于您的application.ini中),则可以直接调用:

$view = Zend_Controller_Front::getInstance()
        ->getParam('bootstrap')
        ->getResource('view');

二:如果您的视图在bootstrap期间未初始化:

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
if (null === $viewRenderer->view) {
    $viewRenderer->initView();
}
$view = $viewRenderer->view;

答案 1 :(得分:1)

我认为这是错误的做法。 FlashMessenger从一个请求到下一个请求几乎没有通知;可在视图中找到。

因此,flashmessenger已经是一个控制器动作帮助器(出于上述目的)为什么你要在此基础上构建另一个帮助器? :)

因此,您的问题实际上是在视图中获取消息。为此,已经有了一个视图助手。来自noumenal。太棒了。

答案 2 :(得分:0)

如果您只想在所有控制器中获得此功能,您可以扩展Zend_Controller_Action并创建一个包含发布调度代码的新类。