Php Zend插件使用哪个目录?

Php Zend插件使用哪个目录?,php,zend-framework,Php,Zend Framework,假设我的ini文件中有以下内容: resources.frontController.plugins.auth = AuthPlugin AuthPlugin类应该放在哪里?假设我想在控制器/插件下使用它 更新: 根据下面的建议,我仍然有困难。让我确切地说一下我目前拥有的: 1) application.ini的主要部分 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH

假设我的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什么都没有(我有很多东西在里面,但仍然没有得到错误):

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

我认为是在/application/plugins中/


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

由于应用程序在注册自动加载程序后将从配置文件中自动启动,因此您应该将AuthPlugin.php(其中应包含AuthPlugin类)放入在包含路径中。

这是我如何在我的应用程序配置中注册名为Foo_plugin_SuperDuperPlugin的插件:

resources.frontController.plugins.superduperplugin.class = "Foo_Plugin_SuperDuperPlugin"
插件位于
APPLICATION\u PATH/plugins/Foo\u Plugin\u SuperDuperPlugin.php
并从那里自动加载,因为会自动在该(推荐)位置查找插件类型资源。如果我想从加载插件,比如说,
APPLICATION\u PATH/controllers/plugins/Foo\u Plugin\u SuperDuperPlugin.php
。所以在我的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=…
时会发生这种情况)。这可以通过将
\u initAutoloader
方法放在bootstrap.php的顶部,或者通过调用
$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\u Plugin\u AuthPlugin
hmm我在zf 1.11中遇到了完全相同的问题。在插件加载之前,自动加载程序似乎并不存在:我意识到这是一个老问题,但我一直在寻找库外自动加载插件的解决方案,并最终找到了答案。一般来说,我一直在编写通用插件,以便在许多不同的项目中使用,并将它们保存在库中,只要您遵循标准的ZF命名约定,这些插件无论如何都会自动加载。最近,我正在编写一个特定于项目的插件,我想把它保存在我的应用程序目录中的某个地方,但是如何自动加载呢?我从未发现使用“application/plugins”目录是有效的。希望这能让其他人受益:

如果您使用的是模块化目录结构,那么您可以使用“application/module\u name/plugins”,而不是“application/plugins”目录。然后,您可以利用,这是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);
}
这里我有两个模块,default和admin。假设目录结构如下:

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

谢谢,但那似乎不起作用。这可能是因为我的自动加载对这种类型的类不起作用,但无论我将AuthPlugin类放在应用程序/插件还是控制器下,它都找不到。您是否也通过注册来引导插件?resources.frontController.pluginDirectory=application\u PATH”/plugins“我没有引导它(我认为它只需要在ini文件中)。pluginDirectory设置似乎没有帮助(我还以为我在某处读到这个ini设置是建议的,还没有实现)。我一定是做错了什么,因为我无法让它工作。我正在更新原始问题的更多细节。我可以让它与资源添加一起工作,但我最终让它与一个基本的require“controllers/AuthPlugin.php”(或我放入的任何目录)一起工作到_initAutoloader()中方法。我的意思是不能在上面(就使用Zend_Loader_Autoloader_资源而言)但是可以使用一个基本的require。使用require指令并没有什么错。不过,在我看来,您的类是一个命名问题——如果您希望从应用程序\路径/插件加载该类,则该类的命名肯定应该不同——它应该命名为Plugin \ AuthPlugin,并且可能还需要另一个前缀(ZF示例通常使用'My_uu',我在示例中使用'Foo_u',但这取决于前缀(或'namespace'))您的自动加载器已配置为搜索。我终于实现了此功能。实际上,我相信其他人指出的文档中存在一个问题。您必须使用名称空间,而我尝试不使用名称空间。谢谢。我尝试了此功能,但无法使其正常工作。我用更多信息更新了说明。也许您可以我错过了什么。
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