2010-06-25 23 views
6

比方說,我在我的ini文件如下:Zend插件使用什麼目錄?

resources.frontController.plugins.auth = AuthPlugin 

應該在哪裏AuthPlugin類放在哪裏?比方說,我想在控制器/插件下。

更新:

根據以下建議,我仍然有麻煩。讓我是確切什麼我目前有:

1)中的application.ini

includePaths.library = APPLICATION_PATH "/../library" 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" 
resources.view[] = 
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 
resources.frontController.plugins.authplugin.class = "AuthPlugin" 

2)主要部分我bootstrap.php中沒有什麼(我有很多在那裏的東西,但仍然得到什麼也沒有錯誤):

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
} 

3)我在應用程序中的AuthPlugin.php類/ plugins目錄

class AuthPlugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
     { 
      // code here 
     } 
} 

我收到以下錯誤:

Fatal error: Class 'AuthPlugin' not found in C:\[my dir structure here]\Application\Resource\Frontcontroller.php on line 111 

我假設我在這裏丟失了一些明顯的東西。提前致謝。 Zend Framework的1.10

回答

3

這是我在我的應用程序配置註冊了一個名爲Foo_Plugin_SuperDuperPlugin插件:

resources.frontController.plugins.superduperplugin.class = "Foo_Plugin_SuperDuperPlugin" 

插件位於
APPLICATION_PATH/plugins/Foo_Plugin_SuperDuperPlugin.php並且從這裏自動載入,因爲Resource Module Autoloader在(推薦)位置自動查找插件類型資源。如果我想從
APPLICATION_PATH/controllers/plugins/Foo_Plugin_SuperDuperPlugin.php加載該插件,那麼我將使用自動加載器註冊一個新的資源加載器,並定義一種名爲'plugin'的資源和這些插件資源的路徑。所以在我的bootstrap.php

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Loader_Autoloader_Resource(
     array(
      'basePath'  => APPLICATION_PATH, 
      'namespace'  => 'Foo', 
      'resourceTypes' => array(
       'plugin' => array(
        'path'  => 'controllers/plugins', 
        'namespace' => 'Plugin', 
       ) 
      ) 
     ) 
    ); 
} 

,然後我需要確保SuperDuperPlugin註冊之前該方法自舉(在這個例子中,發生在應用程序配置讀resources.frontcontroller.plugins.superduperplugin.class = ...)。這可以通過將_initAutoloader方法放置在bootstrap.php的頂部,或者在frontController資源初始化之前通過從其他_init方法調用$this->bootstrap('autoLoader');來實現。

更新:嘗試添加這對您的引導:

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Loader_Autoloader_Resource(
     array(
      'basePath'  => APPLICATION_PATH, 
      'resourceTypes' => array(
       'plugin' => array(
        'path'  => 'controllers/plugins', 
        'namespace' => '', 
       ) 
      ) 
     ) 
    ); 
} 

,甚至留下過的命名空間。或者:將appnamespace = "Foo"添加到您的配置中,並將該類重命名爲Foo_Plugin_AuthPlugin

+0

那我一定是做錯了什麼,因爲我無法得到這個工作。我正在更新原始問題並提供更多詳細信息。 – 2010-06-29 19:35:03

+0

我已經更新了我的答案。 – jah 2010-06-29 20:25:26

+0

我能得到它與資源追加的工作,但我終於沒有得到它一個基本的工作需要「控制器/ AuthPlugin.php」; (或其他任何目錄)放入_initAutoloader()方法中。 – 2010-06-29 20:53:58

0

我覺得在/應用/插件/

但你也可以設置它的另一個目錄。

+0

謝謝,但似乎並沒有工作。這可能是因爲我的自動加載不適合這種類型,但無法找到我的AuthPlugin類,無論是將它放在應用程序/插件還是控制器下。 – 2010-06-25 19:00:22

+0

你是否也通過註冊引導了插件? – streetparade 2010-06-25 19:01:39

+0

resources.frontController.pluginDirectory = APPLICATION_PATH「/插件」 – streetparade 2010-06-25 19:03:49

0

由於應用程序將在註冊Autoloader後從配置文件引導自己,因此應該在包含路徑中放置AuthPlugin.php(應該包含AuthPlugin類)。

+0

我試過這個,但我無法得到它的工作。我用更多的信息更新了描述。也許你可以發現我錯過的東西。 – 2010-06-29 19:44:38

0

嗯我有在ZF 1.11完全相同的問題。看起來在插件加載之前,自動加載器並不存在:s

0

我意識到這是一個老問題,但我一直在尋找解決方案來自動加載庫外的插件,並最終想通出來。一般來說,我一直在編寫通用插件來跨越許多不同的項目,並將它們保存在圖書館中,只要遵循標準的ZF命名約定即可自動加載。最近,我正在編寫一個特定於項目的插件,我想將它保存在我的應用程序目錄中的某個位置,但是如何自動加載?我從來沒有發現使用「應用程序/插件」目錄工作。如果你使用的是模塊化的目錄結構,然後,而不是使用「應用程序/插件」目錄下,你可以使用「應用程序/ MODULE_NAME /插件」

:但願這可能有益於別人。然後,您可以利用Module Resource Autoloader,這是ZF的一個大量有用和未被充分利用的部分。如果你在引導程序中設置它,默認情況下它會自動加載一大堆東西,包括表單,模型和(我今天發現的)插件。您也可以定義自己的自定義資源類型。例如下面是從自舉其中有一個默認和管理模塊和包含的管理模塊中的自定義「沃」資源型項目的_initAutoloader功能:

public function _initAutoLoader() { 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 

    $defaultLoader = new Zend_Application_Module_Autoloader(
     array(
      'namespace' => '', 
      'basePath' => APPLICATION_PATH . '/modules/default' 
     ) 
    ); 

    $adminLoader = new Zend_Application_Module_Autoloader(
     array(
      'namespace' => 'Admin', 
      'basePath' => APPLICATION_PATH . '/modules/admin', 
     ) 
    ); 

    $adminLoader->addResourceTypes(
     array(
      'vo' => array(
       'path'  => 'models/vo', 
       'namespace' => 'Vo', 
      ) 
     ) 
    ); 

    $autoloader->pushAutoloader($defaultLoader); 
    $autoloader->pushAutoloader($adminLoader); 
} 

這裏我有兩個模塊,默認和管理。假設以下目錄結構:

application/default/forms/FooForm.php 
application/default/models/FooModel.php 
application/default/plugins/FooPlugin.php 
application/admin/forms/FooForm.php 
application/admin/models/FooModel.php 
application/admin/models/vo/FooVo.php 
application/admin/plugins/FooPlugin.php 

我可以在任何自動載入模塊只是通過實例的每個類的對象:

new Form_FooForm(); 
new Model_FooModel(); 
new Plugin_FooPlugin(); // or add plugin to application.ini 
new Admin_Form_FooForm(); 
new Admin_Model_FooModel(); 
new Admin_Vo_FooVo(); // custom resource type 
new Admin_Plugin_FooPlugin(); // or add plugin to application.ini 
相關問題