如何包含一个控制器插件(Zend框架)



我用MVC代替ASP.NET,它的分配比这更简单。我所要做的就是在项目中包含一个控制器plugin

我有一个类定义在session.php:

   class session extends Zend_Controller_Plugin_Abstract{
        //Code
    }

文件结构如下
/应用程序
,/配置
,
/控制器/插件才能
,,/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);

我尝试了所有这些,还有更多。如果我能理解包含类的科学,我就能从那里弄清楚。

我得到的错误总是类'blah'没有找到在x行

问题是您正在声明类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());

天哪!我想明白了。我在这里找到了答案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());
}

如果没有_initautolload(),这绝对不能工作;接下来我有我的课。命名规范太大了

class Plugin_YourClassNameHere extends Zend_Controller_Plugin_Abstract
    {
        //Code
    }

这个类在一个名为YourClassNameHere.php的文件中。这就是我被困住的地方。我该把文件放在哪里?事实证明,我在.....phpPEARZendApplicationModule中找到了一个autolloader .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 ',路径是'plugins' + S!!所以我把YourClassNameHere.php文件在应用程序/插件,现在一切都工作!

最新更新