【问题标题】:Zend framework "invalid controller" error messageZend 框架“无效控制器”错误信息
【发布时间】:2009-12-14 10:27:24
【问题描述】:

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

在我的 bootstrap.php 中,我有下面的 sn-p,我在 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 的命名约定有关。

最初的“无效控制器”消息来自下面的sn-p

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)”,所以看起来它正在尝试首先加载索引控制器,但不能,然后在加载错误控制器时出现问题。

会不会是控制器文件的路径不对?

【问题讨论】:

    标签: zend-framework


    【解决方案1】:

    在您的情况下,前端控制器正在尝试访问您网站的索引(主页),但他无法访问它,因为 您的控制器目录路径中有一些错误失败后为此,有一个名为"Zend_Controller_Plugin_ErrorHandler" 的控制器插件(默认情况下已注册),因此它将请求转发到前端控制器也找不到的错误控制器,所以他对您说这个错误所以检查你的控制器目录的路径我希望我能向你解释清楚:)

    好吧,

    跟我来: 此代码应在 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');
    

    它设置控制器目录的路径

    【讨论】:

    • 感谢您的评论。您知道这些路径将设置在哪里吗?我有 require_once 'Zend/Controller/Front.php';在 Initializer.php 中,这似乎是正确的
    • 我真的不知道你的 ZF 版本是什么,所以我会参考 ZF 快速入门 bit.ly/67TK8d 但如果你使用的是 ZF1.8 或更高版本,请检查你的配置文件并寻找类似的东西:resources.frontController .controllerDirectory = APPLICATION_PATH "/controllers" 资源.frontController.defaultControllerName = "index"
    • 当我对“defaultControllerName”运行文件搜索时,什么也没有出现。我想我正在使用 ZF 1.6。会不会是这些设置以不同的方式存储?
    • 我已经更新了上面的答案,所以在代码中搜索“$frontController->setControllerDirectory(APPLICATION_PATH .'/controllers');”不要搜索文件
    • 已修复 - IndexController 父文件夹的权限存在问题,只有服务器管理员才能修复。感谢您为我指明正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2012-01-18
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多