Zend框架“无效控制器”错误消息

时间:2009-12-14 10:27:24

标签: zend-framework

当我加载ZF网站的主页时,我收到一条消息“无效的控制器指定(错误)”,其中“错误”似乎是控制器的名称。

在我的bootstrap.php中我有以下片段,我在catch()中添加了prints语句:

// Dispatch the request using the front controller. 
try {   
    $frontController->dispatch();
}
catch (Exception $exception) {
    print $exception; exit;
    exit($exception->getMessage());
}

打印出来:

exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in /www/common/ZendFramework/library16/Zend/Controller/Dispatcher/Standard.php:241
Stack trace:
#0 /www/common/ZendFramework/library16/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 /www/site.com/htdocs/application/bootstrap.php(38): Zend_Controller_Front->dispatch()
#2 /www/site.com/htdocs/public/index.php(16): require('/www/site....')
#3 {main}

任何人都可以理解它发生了什么吗?我有一个预感,它与区分大小写和ZF的命名约定有关。

初始“无效控制器”消息来自下面的代码段

print $request->getControllerName();

        if (!$this->isDispatchable($request)) {
            $controller = $request->getControllerName();
            if (!$this->getParam('useDefaultControllerAlways') && !empty($controller)) {
                require_once 'Zend/Controller/Dispatcher/Exception.php';
                throw new Zend_Controller_Dispatcher_Exception('Invalid controller specified (' . $request->getControllerName() . ')');
            }
            $className = $this->getDefaultControllerClass($request);

        }

这一切都打印出“indexerrorInvalid controller specified(error)”所以看起来它首先尝试加载索引控制器,然后加载错误控制器时出现问题。

可能只是控制器文件的路径错了吗?

1 个答案:

答案 0 :(得分:1)

在您的情况下,前控制器正在尝试访问您网站的索引(主页),但由于您的控制器目录路径中出现了一些错误,他无法访问该网站要做到这一点,有一个名为"Zend_Controller_Plugin_ErrorHandler"的控制器插件(这个默认注册),所以它将请求转发给前端控制器也找不到的错误控制器,所以他告诉你这个错误所以检查控制器目录的路径我希望我能很好地解释一下:)

Okey,

跟着我: 这段代码应该在index.php文件中找到

<?php
error_reporting(E_ALL | E_STRICT);

define('APPLICATION_PATH' , realpath(dirname(__FILE__)) .'/../application' );

set_include_path(
    APPLICATION_PATH . '/../library'
    . PATH_SEPARATOR . get_include_path()
);

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();


try
{
    require '../application/bootstrap.php';
}
catch(Exception $exception)
{
    echo "<html><body> an exception occured while bootstrapping the application";

    if (defined('APPLICATION_ENVIRONMENT') && APPLICATION_ENVIRONMENT != 'production')
    {
        echo "<br/><br/>" . $excepion->getMessage() . "<br/>"
        . "<div align='left'>Stack Trace: "
        . "<pre> " . $exception->getTraceAsString() . "</pre></div>";
    }
    echo "</body></html";
    exit(1);
}

Zend_Controller_Front::getInstance()->dispatch();

我猜你现在有一个名为“Application”,“bootstrap”或“initlizer”的文件 什么名字应该看起来像

<?php

defined('APPLICATION_PATH')
    or define('APPLICATION_PATH' , dirname(__FILE__));

defined('APPLICATION_ENVIRONMENT')
    or define('APPLICATION_ENVIRONMENT', 'development');



$frontController = Zend_Controller_Front::getInstance();

$frontController->setControllerDirectory(APPLICATION_PATH . '/controllers');


$frontController->setParam('env' , APPLICATION_ENVIRONMENT);


Zend_Layout::startMvc(APPLICATION_PATH . '/layouts/scripts');


$view = Zend_Layout::getMvcInstance()->getView();
$view->doctype('XHTML1_STRICT');

unset($frontController);

你应该仔细检查这一行:

  $frontController->setControllerDirectory(APPLICATION_PATH . '/controllers');

它设置ControllerDirectory的路径