开发者

Zend Framework: How to inject a controller property from a Zend_Controller_Plugin

I wrote a plugin that needs to set a property on the controller that's currently being dispatched. For example, if my plugin is:

class Application_Plugin_Foo extends Zend_Contro开发者_如何学JAVAller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        // Get an instance of the current controller and inject the $foo property
        // ???->foo = 'foo';
    }
}

I want to be able to do this:

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
        {
            $this->view->foo = $this->foo;
        }
    }
}

Any help is greatly appreciated!


The action controller is not directly accessible directly from a front-controller plugin. It's the dispatcher that instantiates the controller object and he doesn't appear to save it anywhere accessible.

However, the controller is accessible from any registered action helpers. Since action helpers have a preDispatch hook, you could do your injection there.

So, in library/My/Controller/Helper/Inject.php:

class My_Controller_Helper_Inject extends Zend_Controller_Action_Helper_Abstract
{
    public function preDispatch()
    {
        $controller = $this->getActionController();
        $controller->myParamName = 'My param value';
    }
}

Then register an instance of the helper in application/Bootstrap.php:

protected function _initControllerInject()
{
    Zend_Controller_Action_HelperBroker::addHelper(
        new My_Controller_Helper_Inject()
    );
}

And, as always, be sure to include My_ as an autoloader namespace in configs/application.ini:

autoloaderNamespaces[] = "My_"

Then, in the controller, access the value directly as a public member variable:

public function myAction()
{
    var_dump($this->myParamName);
}

One thing to note: Since the helper uses the preDispatch() hook, I believe it will get called on every action, even an internal forward().


Browsing through the API, I didn't find a way to reach the controller directly (I'm guessing this loop is performed before the controller exists). What I could find is almost as easy to access, albeit with a bit different syntax.

Via request params

class Application_Plugin_Foo extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        $yourParam = 'your value';
        if($request->getParam('yourParam')) {
           // decide if you want to overwrite it, the following assumes that you do not care
           $request->setParam('yourParam', $yourParam);
        }
    }
}

And in a Zend_Controller_Action::xxxAction(): $this->getParam('yourParam');


Via Zend_Controller_Action_Helper_Abstract

There's another way mentioned in MWOP's blog, but it takes the form of an action helper instead: A Simple Resource Injector for ZF Action Controllers. His example would let you access any variable in Zend_Controller_Action as $this->yourParam.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜