2010-09-08 86 views
0

我在模塊目錄中的plugins目錄中有這個插件。因此,它是在application/modules/admin/plugins/LayoutPlugin.php如何使用模塊加載插件

<?php 
class LayoutPlugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $layout = Zend_Layout::getMvcInstance(); 
     $view = $layout->getView(); 

     $view->whatever = 'foo'; 
    } 
} 

我想用它來發送變量佈局視圖。碰巧,我每次嘗試Zend_Controller_Front::getInstance()->registerPlugin(new LayoutPlugin());時都會得到Fatal error: Class 'LayoutPlugin' not found引導程序。

如何在模塊內加載插件?

回答

1

模塊白手起家設置默認模塊自動加載,因此,如果您重命名你的類Admin_Plugin_LayoutPlugin ZF應該能找到它。

請記住,無論您是否在管理模塊中,管理員引導程序(如所有引導程序)都將運行,因此如果您的意圖是爲管理員頁面分配一些額外變量,在註冊插件之前需要確保admin是當前模塊。

1

我知道這是一個古老的問題,但這總是困擾着我。我不知道ZF 2是否做了什麼來解決它(我還沒有機會玩它),但我寫了一個插件加載器插件來處理這個ZF 1!

問題是,即使在設置模塊自動加載器並將插件保存在模塊的插件文件夾中時,它也只會設置自動加載(無論如何都是交叉模塊),而不是註冊。這意味着你可以在你的application.ini行實例化的插件,但它會自動載入,併爲每個模塊註冊。

無論如何,這裏有一個可能的解決方案來確保模塊插件僅註冊到活動模塊。或者,您可以循環訪問模塊插件目錄中的所有文件,而不是提供類映射,但這會感覺很難受,並且可能很慢。

<?php 

class BaseTen_Controller_Plugin_ModulePluginLoader extends Zend_Controller_Plugin_Abstract { 

    private $_pluginMap; 

    public function __construct(array $pluginMap) { 
     $this->_pluginMap = $pluginMap; 
    } 

    public function routeShutdown(Zend_Controller_Request_Abstract $request) { 
     $module = $request->getModuleName(); 

     if(isset($this->_pluginMap[$module])) { 

      $front = Zend_Controller_Front::getInstance(); 

      foreach($this->_pluginMap[$module] as $plugin) { 
       $front->registerPlugin(new $plugin()); 
      } 
     } 
    } 
} 

因爲我們需要一個類映射傳遞給構造函數,我們需要顯式實例化,並與一的application.ini在線註冊這個插件和前端控制器,而不是:

public function _initPluginLoader() { 
    $front = Zend_Controller_Front::getInstance(); 
    $front->registerPlugin(new BaseTen_Controller_Plugin_ModulePluginLoader(array(
     'default' => array(
      'Plugin_Foo', 
      'Plugin_Bar', 
      ... 
     ), 
     'foo' => array(
      'Foo_Plugin_Foo', 
      'Foo_Plugin_Bar', 
      ... 
     ) 
    ))); 
} 

最早插件可以運行在routeShutdown,否則我們不會知道活動模塊。這意味着,使用這種方法註冊的其他插件只能從dispatchLoopStartup開始運行。大多數情況下,我們可能對preDispatchpostDispatch掛鉤感興趣,但值得注意。