代码之家  ›  专栏  ›  技术社区  ›  Julian

Zend框架:如何从Zend_controller_插件中注入控制器属性

  •  3
  • Julian  · 技术社区  · 16 年前

    我写了一个插件,需要在当前正在调度的控制器上设置一个属性。例如,如果我的插件是:

    class Application_Plugin_Foo extends Zend_Controller_Plugin_Abstract
    {
        public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
            // Get an instance of the current controller and inject the $foo property
            // ???->foo = 'foo';
        }
    }
    

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

    非常感谢任何帮助!

    2 回复  |  直到 15 年前
        1
  •  3
  •   David Weinraub    13 年前

    不能直接从前端控制器插件直接访问操作控制器。是调度器实例化了控制器对象,但他似乎没有将其保存在任何可访问的地方。

    但是,可以从任何注册的操作助手访问控制器。因为动作助手有 preDispatch 胡克,你可以在那里打针。

    所以,在 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';
        }
    }
    

    然后在中注册助手的实例 application/Bootstrap.php :

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

    而且,一如既往,一定要包括 My_ 作为中的自动加载器命名空间 configs/application.ini :

    autoloaderNamespaces[] = "My_"
    

    然后,在控制器中,作为公共成员变量直接访问该值:

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

    preDispatch() 钩子,我相信它会在每次行动中被调用,甚至是内部 forward() .

        2
  •  1
  •   chelmertz user1604064    16 年前

    通过请求参数

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

    在一个 Zend_Controller_Action::xxxAction() : $this->getParam('yourParam');


    通过 Zend_Controller_Action_Helper_Abstract

    MWOP的博客中提到了另一种方法,但它采用的是动作助手的形式: A Simple Resource Injector for ZF Action Controllers . 他的例子可以让你访问 Zend_Controller_Action 作为 $this->yourParam