【问题标题】:application that works in Zend 1.11.2 doesn't work in 1.12.1在 Zend 1.11.2 中工作的应用程序在 1.12.1 中不工作
【发布时间】:2013-01-14 07:07:59
【问题描述】:

我尝试将应用程序从版本 1.11.2 迁移到 1.12.1。我只是将包含 1.11.2 的 Zend 文件夹替换为包含 1.12.1 的 Zend 文件夹。在 1.11.2 中运行的应用程序在 1.12.1 中无法运行,它无法加载类:

Fatal error: Class 'Plugin_AccessCheck' not found in 
C:\git_reps\mailable\application\Bootstrap.php on line 32

我在 application/plugin 文件夹中有包含插件的文件,它在 1.11.2 中运行。 请告诉我为什么我的应用程序在 1.12.1 中无法运行以及如何使应用程序运行在新版本中? 如果我关闭插件,它就找不到其他类,例如我的模型。

这是来自 application.ini 的片段:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.view.doctype = "HTML5"

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

autoloaderNamespaces[] = "Common_"
autoloaderNamespaces[] = "Shanty_"
resources.view.helperPath.Common_View_Helper_ = "Common/View/Helper/"


bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

appnamespace = ""

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0

这里是注册插件的代码:

/**
 * Init plugins
 */
protected function _initPlugins()
{
    $fc = Zend_Controller_Front::getInstance();     
    $applicationPart = getenv('APPLICATION_ENV_PART');      
    switch($applicationPart) {
        case 'subscribe':
            $fc->registerPlugin(new Plugin_SubscribeAccessCheck());
            return;             
            break;
        default:
            $fc->registerPlugin(new Plugin_AccessCheck());              
            break;      
    }   
}

当我在 BootStrap 中关闭插件时,它找不到其他文件,例如模型。

【问题讨论】:

  • 您能提供一些有关您的自动加载器设置的信息吗?
  • 你能解释一下你的意思吗?
  • Tim,我的应用程序在 Zend Framework 1.11.2 中工作,但在 1.12.1 中不工作。
  • 您使用什么方法迁移到 ZF 1.12?
  • 我只是将包含 1.11.2 的 Zend 文件夹替换为包含 1.12.1 的 Zend 文件夹。

标签: php zend-framework zend-autoloader


【解决方案1】:

如果@Marc 的建议不起作用,请尝试在 application.ini 中添加以下行:

resources.frontController.plugins.accessCheck = Plugin_AccessCheck

在 Bootstrap.php 中:

/**
 * @return Zend_Application_Module_Autoloader
 */
protected function _initAutoload()
{
    $autoloader = new Zend_Application_Module_Autoloader(array('namespace' => '', 'basePath' => APPLICATION_PATH));
    $autoloader->addResourceType('plugin', 'plugins', 'Plugin');
    return $autoloader;
}

如果文件位于以下路径中,则此方法有效: /app/application/plugins/AccessCheck.php

【讨论】:

  • 我更新了我的帖子,添加了用于注册插件的代码,它在 1.11.2 和更早的版本中运行。
  • 您的意思是 1.12.1 中的某些更改导致在以前版本中工作的应用程序不再工作了吗?
  • 为什么我需要 resources.frontController.plugins.accessCheck = Plugin_AccessCheck 如果我按照我在帖子中所写的那样在引导程序中注册它?
  • 你的函数“初始化插件”没关系!做同样的事情resources.frontController.plugins.accessCheck = Plugin_AccessCheck,但你必须在你的引导中添加我的_initAutoload ,否则zend不知道你的插件在哪里!
  • 我的插件在 application/plugins 文件夹中。我想知道为什么应用程序在以前的版本中工作,现在不工作。来自 bootstrap 的 application.ini 和框架在 1.11.2 中运行良好。你可能会看到我在 application.ini 中有:appnamespace = ""
【解决方案2】:

从错误中,php 无法自动加载类 Plugin_AccessCheck,我猜你的 lib 文件夹中有一个 Plugin 目录,其中包含一个名为 AccessCheck.php 的 php 文件

尝试添加

autoloaderNamespaces[] = "Plugin_"

到您的 application.ini 或手动为该文件执行包含

如果不是这种情况,则您错误地命名了您的类 Plugin_AccessCheck。可能的解决方案是将其移动到您的公共库 Common/Plugin/AccessCheck.php 并将类重命名为 Common_Plugin_AccessCheck

【讨论】:

  • 正如我在我的插件位于 application/plugins 文件夹而不是我的 lib 文件夹之前所写的那样,我认为这是在 Zend_Framework 中存储插件的奇怪方式。并且可以在 1.11.2 中加载它。
  • 即使我在 BootStrap 中关闭插件,我的模型类也无法在 Zend_Framework 1.12.1 中找到。
  • 如果你的插件在 application/plugins 中,你的类应该被命名为 Application_Plugin_WebAccess
  • 正如您在我的 application.ini 中看到的,我有:appnamespace = "",因此它允许使用 Plugin_AccessCheck。它在以前的版本中有效,但由于某种原因在 1.12.1 中无效。
  • 所以一个更好的问题是如何拥有一个空白的 appnamespace。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2020-02-26
  • 2017-04-25
  • 2014-12-30
相关资源
最近更新 更多