使用Zend框架时出现未捕获的异常'Zend_Controller_Dispatcher_Exception'错误

时间:2010-11-27 18:54:39

标签: php zend-framework

我在运行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>

这里可能出现什么问题?

请帮助 谢谢

3 个答案:

答案 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