开发者

why Zend Framework can't find my controller plugin

I'm trying to write controller plugin to check authentication. I created class of plugin, put in Application directory, Application.php and registered in Bootstrap.php. But there is an error: Fatal error: Class 'Authentication' not found. Where does Zend Framework look for plugins, how to tell it where it is?

//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 开发者_StackOverflowfunction _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();        
    }

Thank you.


I know the question is really old, but I´m leaving the answer in case someone else stumbles upon here like I did. Here is (from version 1 from 1.8 and up) how to register a plugin:

ZF follows the naming standard: A_B parses to A/B.php . For the plugin, ZF automatically looks into the "path to library", which means that it looks within the directory of your library (where your Zend library is). So the plugin should be as follows: library/Something/Whatever.php ... That´s one scenario. Then all you have to do in application.ini is add the following:

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

Translated to your case would be:

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

And your library structure should be:

library/Common/Authentication.php

hope this helps to anyone stumbling upon here!

--Regarding your post/question

The reason why it´s not "finding" the class it´s because it´s not loading with autoload. One reason might be that you're somehow violating the naming convention (Your Authentication file is not under directory Common_ , or the file name of Authentication class is not Common_Authentication ...). A quick fix would be to put:

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

with this addes, _initPlugins() will be able to execute without problem. :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜