Zend插件使用什么目录?

时间:2010-06-25 18:54:03

标签: php zend-framework

假设我的ini文件中有以下内容:

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)我在application / plugins目录中有一个AuthPlugin.php类

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

5 个答案:

答案 0 :(得分: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 = ...时发生)。这可以通过在初始化frontController资源之前将_initAutoloader方法放在bootstrap.php的顶部或通过从任何其他_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

答案 1 :(得分:0)

我认为在/ application / plugins /

但你也可以为它设置另一个目录。

答案 2 :(得分:0)

由于应用程序将在注册Autoloader后从配置文件引导自身,因此应将AuthPlugin.php(应包含AuthPlugin类)放在include路径中。

答案 3 :(得分:0)

我在zf 1.11中遇到完全相同的问题。在插件加载之前,似乎自动加载器不存在:s

答案 4 :(得分:0)

我意识到这是一个老问题,但我一直在寻找解决方案来解决自动加载库外的插件并最终弄明白了。一般来说,我一直在编写通用插件,以便在许多不同的项目中使用,并使它们在库中保持有意义,只要你遵循标准的ZF命名约定,它们都会自动加载。最近,我正在编写一个项目特定的插件,我想把它保存在我的应用程序目录中,但是如何自动加载?我从来没有发现使用“application / plugins”目录。希望这可能会让其他人受益:

如果您使用的是模块化目录结构,那么您可以使用“application / module_name / plugins”而不是使用“application / plugins”目录。然后,您可以利用Module Resource Autoloader,这是ZF的一个非常有用和未被充分利用的部分。如果你在引导程序中设置它,默认情况下它被设置为自动加载一大堆东西,包括表单,模型和(我今天发现的)插件。您还可以定义自己的自定义资源类型。例如,下面是项目中引导程序的_initAutoloader函数,该函数具有默认和管理模块以及管理模块中包含的自定义“vo”资源类型:

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