你如何包含一个Controller插件(Zend Framework)

时间:2013-06-01 20:22:49

标签: zend-framework plugins path include

我将MVC用于ASP.NET,并且比这更简单。 我想要做的就是在项目中包含一个控制器plugin

我在session.php中定义了一个类:

   class session extends Zend_Controller_Plugin_Abstract{
        //Code
    }

文件结构如下所示 /应用
/ CONFIGS
器/控制器
/插件
/session.php
/布局
/型号
/视图

我已经抓取了网络,没有人提供如何做到这一点的简单探索。 我尝试了什么:

application.ini
resources.frontController.plugins.route = "Application_Controllers_Plugins_Session"
resources.frontController.plugins.route = "Application/Controllers/Plugins/Session"
resources.frontController.plugins[]  = "Controllers_Plugins_Session"
resources.frontController.plugins[]  = "Controllers/Plugins/Session"

Bootstrap.php : 
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Application_Controllers_Plugins_SessionPlugin(), 1);

我尝试了所有这些以及更多。如果我能理解包括课程的科学,我可以从中找到答案。

我得到的错误总是在第x行的blah中找不到Class'blah'

2 个答案:

答案 0 :(得分:0)

问题在于您声明了类session,但后来尝试使用许多其他类名实例化该类。看起来您正在遵循标准资源自动加载器文件结构,并且由于您已声明了Application的appnamespace,因此您的插件类应声明为:

class Application_Plugin_Session extends Zend_Controller_Plugin_Abstract
{
    ...
}

(区分大小写)。它的文件名必须是Session.php(大写S)。然后应该正确自动加载。

然后你只需要在前端控制器上注册插件。您可以在application.ini中执行此操作:

resources.frontController.plugins[]  = "Application_Plugin_Session"

或在bootstrap类中:

$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Application_Plugin_Session());

(不要同时做两件事。)

答案 1 :(得分:0)

神圣的废话!我想到了。 我在这里找到了答案http://grover.open2space.com/content/autoloading-plugins-zend_application

好的,我的bootstrap.php(部分)看起来像这样:

protected function _initAutoload()
{
    $moduleLoader = new Zend_Application_Module_Autoloader(array(
    'namespace' => '',
    'basePath' => APPLICATION_PATH));
    return $moduleLoader;
}   

protected function _initPlugins() {
    $front = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new Plugin_YourClassNameHere());
}

如果没有_initAutoload(),这绝对是行不通的; 接下来我上课了。命名惯例很大。

class Plugin_YourClassNameHere extends Zend_Controller_Plugin_Abstract
    {
        //Code
    }

此类位于名为YourClassNameHere.php的文件中。现在这就是我被困住的地方。我在哪里放文件?事实证明,我在..... php \ PEAR \ Zend \ Application \ Module中找到了一个Autoloader.php文件。此文件不在您的项目中。此文件已定义插件的放置位置。 (其他的东西)。所以我发现了这个:

public function initDefaultResourceTypes()
    {
        $basePath = $this->getBasePath();
        $this->addResourceTypes(array(
            ........
            ,
            'model'   => array(
                'namespace' => 'Model',
                'path'      => 'models',
            ),
            'plugin'  => array(
                'namespace' => 'Plugin',
                'path'      => 'plugins',
            ),
            .......
           ,
        ));
        $this->setDefaultResourceType('model');
    }

请注意,插件命名空间是'Plugin',路径是'插件'WITH AN S !!所以我将YourClassNameHere.php文件放在application / plugins中,现在一切正常!