2010-10-01 178 views
3

注入控制器屬性我寫了需要設置,因此目前正被指派的控制器上的屬性插件。例如,如果我的插件是:Zend框架:如何從Zend_Controller_Plugin

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

任何幫助,不勝感激!

回答

3

的動作控制器不能直接訪問直接從前端控制器插件。實例化控制器對象的調度程序並不會將其保存在任何可訪問的位置。

但是,控制器是任何註冊動作助手訪問。由於行動助手有一個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_" 

The N,在控制器中,直接訪問該值作爲一個公共成員變量:

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

有一點需要注意:由於輔助使用preDispatch()掛鉤,我相信它會被要求每一個動作,甚至一個內部forward()

1

通過API瀏覽,我沒有找到一個方法來直接到達控制器(我猜控制器存在之前,執行這個循環)。我能找到的東西幾乎和訪問一樣容易,儘管語法有點不同。

通過請求參數

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的博客中提到的另一種方式,但德es行動助手的形式,而不是:A Simple Resource Injector for ZF Action Controllers。他的例子讓你訪問任何變量Zend_Controller_Action$this->yourParam

+0

似乎對ZF動作控制器的*簡單的資源噴油器*鏈接的內容被複制到@ DavidW的答案,但我強烈建議你閱讀原始頁面上的整個討論。還有很多有用的評論。 – chelmertz 2010-10-02 09:24:37

+1

在發佈此問題之前,我開始採用getParam()方法。我甚至認爲「擴展一個基本控制器」的方式,但也發現在這裏有許多不值得討論的缺陷。使用動作助手似乎是做我想做的事情的正確方式,但在閱讀了你提到的文章之後,我改變了主意,並將採用馬修所描述的「注入依賴」方式。看起來與一羣程序員一起工作最有效的方法。 – Julian 2010-10-03 18:55:49

+0

@ Julian我同意你的觀點,但如果沒有正確記錄,可能很難找到所有這些依賴關係來自哪裏。總而言之,這似乎是一個堅實的方法! – chelmertz 2010-10-03 21:52:07