我在运行Xampp 1.7.1软件包的Windows机器上使用Zend Framework v1.11.0。我的项目目录结构如下。
/
|- /data
| |- /logs
| |- /uploaded-files
| |- /tmp
|- /htdocs
|- /include
| |- /Controllers
| |- /Zend
|- /templates
我的index.php中有以下代码,位于htdocs:
<?php
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('../include/Controllers');
$controller->dispatch();
?>
我得到的错误如下:
注意:Zend_Loader :: Zend_Loader :: registerAutoload从1.8.0开始不推荐使用,将在2.0.0时删除;在第266行的C:\ xampp \ htdocs \ myproject \ include \ Zend \ Loader.php中使用Zend_Loader_Autoloader
致命错误:C:\ xampp \ htdocs \ myproject \ include \ Zend \ Controller \ Dispatcher \ Standard.php中未捕获的异常'Zend_Controller_Dispatcher_Exception',消息'指定了无效的控制器(错误)':248堆栈跟踪:
#0 C:\ xampp \ htdocs \ myproject \ include \ Zend \ Controller \ Front.php(954):Zend_Controller_Dispatcher_Standard-&gt; dispatch(Object(Zend_Controller_Request_Http),Object(Zend_Controller_Response_Http))
#1 C:\ xampp \ htdocs \ myproject \ htdocs \ index.php(8):Zend_Controller_Front-&gt; dispatch()
在第248行的C:\ xampp \ htdocs \ myproject \ include \ Zend \ Controller \ Dispatcher \ Standard.php中抛出#2 {main}
我的.htaccess文件位于myproject / htdocs中:
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
在我的apache httpd.conf中,我定义了以下VirtualHost:
<VirtualHost myproject:80>
ServerName myproject
DocumentRoot "c:/xampp/htdocs/myproject/htdocs"
<Directory "c:/xampp/htdocs/myproject/htdocs">
AllowOverride None
Options All
</Directory>
php_value include_path ".;c:/xampp/htdocs/myproject/include;c:/xampp/php/PEAR"
php_value magic_quotes_gpc off
php_value register_globals off
</VirtualHost>
这里可能出现什么问题?
请帮助 谢谢
答案 0 :(得分:2)
首先;
Zend_Loader::registerAutoload();
已被弃用,这也是您第一次收到通知的原因
Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in C:\xampp\htdocs\myproject\include\Zend\Loader.php on line 266
在您的情况下,您的应用程序不知道什么是默认控制器名称及其默认操作 它抛出一个错误 并且错误处理程序取代它的位置,并且您的前端控制器再次尝试找到错误控制器,但它也找不到它 所以它显示了这个错误
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in C:\xampp\htdocs\myproject\include\Zend\Controller\Dispatcher\Standard.php:248 Stack trace:
好的,最后: 如果我负责,我该如何解决:
1-重新定义应用程序结构,使其类似于默认的ZF文件结构 2-您可以尝试设置默认控制器名称和操作名称,查阅文档或 导航到Zend / Controller / Front.php 你会找到像
这样的功能public function setDefaultAction($action)
{
$dispatcher = $this->getDispatcher();
$dispatcher->setDefaultAction($action);
return $this;
}
public function setDefaultAction($action)
{
$dispatcher = $this->getDispatcher();
$dispatcher->setDefaultAction($action);
return $this;
}
和许多其他的setter函数
并且不要忘记深入了解@ ZF flowchart http://devzone.zend.com/article/4601
我希望能帮到你
答案 1 :(得分:1)
消息指定的无效控制器(错误),表示调度程序正在查找名为ErrorController
的控制器类,但无法找到它。
在Zend_Controller_Front中将ErrorController
标志设置为 false 时,通常会调用throwExceptions
。在这种情况下,抛出的异常将被聚合并转发到 ErrorController 类。这是 ErrorHandler 插件提供的功能:名为Zend_Controller_Plugin_ErrorHandler
的类。
简而言之,您的代码中可能存在抛出异常的内容,但由于您没有错误控制器,因此调度程序失败。更改前端控制器中的throwExceptions
标志,创建错误控制器或禁用插件应该可以让您查看实际错误的来源。
答案 2 :(得分:0)
我知道这已经太晚了,这可能对遇到像我这样的错误的其他人有用。
对于第一个错误:替换此代码。
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
这一个
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
并稍微更改您的目录结构并使用以下代码
在IndexController.php
文件夹
index
$controller = Zend_Controller_Front::getInstance();
$controller->setDefaultModule('index');
$controller->addModuleDirectory('PATH_TO_MODULES')->dispatch();
而不是使用此
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('../include/Controllers');
$controller->dispatch();
你的导演结构看起来像这样
application
modules
index
controllers
IndexController.php
views