为什么Zend Framework找不到我的控制器插件

时间:2010-08-24 05:53:52

标签: zend-framework plugins controller

我正在尝试编写控制器插件来检查身份验证。 我创建了一个插件类,放入Application目录,Application.php并在Bootstrap.php中注册。但是有一个错误:致命错误:未找到类“身份验证”。 Zend Framework在哪里寻找插件,如何告诉它它在哪里?

//Application/Authentication.php
class Authentication extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) {
            return;
        }

        self::setDispatched(false);
        // handle unauthorized request...
    }
}


        //bootstrap
    protected function _initAutoloader()
    {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
        'basePath' => APPLICATION_PATH,
        'namespace' => ''));

        $autoLoader = Zend_Loader_Autoloader::getInstance();
        $autoLoader->registerNamespace('Common_');

        return $moduleLoader;              
    }



    protected function _initPlugins()
    {
        $controller = Zend_Controller_Front::getInstance();
        $controller->registerPlugin(new Authentication());
        $controller->dispatch();        
    }

谢谢。

1 个答案:

答案 0 :(得分:0)

我知道这个问题真的很老了,但我会留下答案,万一有人像我一样偶然发现这里。这是(从版本1到1.8及以上)如何注册插件:

ZF遵循命名标准:A_B解析为A / B.php。对于插件,ZF会自动查看“库的路径”,这意味着它可以查看库的目录(Zend库所在的目录)。所以插件应该如下:library / Something / Whatever.php ...那是一个场景。然后,您在application.ini中所要做的就是添加以下内容:

autoloaderNamespaces[] = "Something_"
resources.frontController.plugins.Whatever = "Something_Whatever"

翻译成您的案例将是:

autoloaderNamespaces[] = "Common_"
resources.frontController.plugins.Authentication = "Common_Authentication"

你的图书馆结构应该是:

library/Common/Authentication.php

希望这对任何在这里磕磕绊绊的人都有帮助!

- 关于你的帖子/问题

之所以没有“找到”这个类是因为它没有加载自动加载。一个原因可能是您以某种方式违反了命名约定(您的身份验证文件不在目录Common_下,或者Authentication类的文件名不是Common_Authentication ...)。快速解决方法是:

//bootstrap
    protected function _initAutoloader()
    {
        require_once 'Common/Authentication.php';           
    }

有了这个addes,_initPlugins()就可以毫无问题地执行了。 :)