【问题标题】:How do you include a Controller plugin (Zend Framework)如何包含控制器插件(Zend 框架)
【发布时间】:2013-05-28 10:23:54
【问题描述】:

我将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);

我尝试了所有这些以及更多。如果我能理解包含课程的科学性,我可以从那里弄清楚。

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

【问题讨论】:

  • 您的 application.ini 中有任何与自动加载器相关的内容吗?
  • 没有自动加载器的东西:phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class= " Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 1 resources.view[] = resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

标签: zend-framework plugins path include


【解决方案1】:

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

class Application_Plugin_Session extends Zend_Controller_Plugin_Abstract
{
    ...
}

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

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

resources.frontController.plugins[]  = "Application_Plugin_Session"

或在引导类中:

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

(不要两者都做,因为它们做同样的事情)。

【讨论】:

  • 感谢您的回复。我尝试了您的建议,但仍然收到致命错误:第 117 行的 .....\Zend\Application\Resource\Frontcontroller.php 中找不到 Class 'Application_Plugin_Session'。我的问题是我应该将 Session.php 文件放在哪里包括在内?我尝试了应用程序/控制器/插件、应用程序/插件和应用程序/../library/Plugin。后来因为ini文件有这个:includePaths.library = APPLICATION_PATH "/../library"。
  • 文件应该在application/plugins/Session.php - 你能试试吗?
【解决方案2】:

天哪!我想到了。 我在这里找到了答案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”,路径是“plugins”,带有一个S!!所以我将 YourClassNameHere.php 文件放在 application/plugins 中,现在一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多