【问题标题】:Zend Framework - "Invalid controller specified"Zend Framework - “指定的控制器无效”
【发布时间】:2012-01-29 08:47:34
【问题描述】:

我在实时服务器上设置 Zend Framework 应用程序时遇到问题。它在本地主机上工作正常。

我拥有该应用程序的实时服务器地址是:

http://www.domainname.com/new/

一切正常,直到我尝试通过 URL http://www.domainname.com/new/admin 访问我的管理模块,然后我收到以下错误。

有什么想法吗?

An error occurred
Page not found
Exception information:

Message: Invalid controller specified (index)
Stack trace:

#0 /data/www/www.domainname.com/public_html/new/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 /data/www/www.domainname.com/public_html/new/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#2 /data/www/www.domainname.com/public_html/new/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#3 /data/www/www.domainname.com/public_html/new/index.php(27): Zend_Application->run()
#4 {main}  

Request Parameters:

array (
  'module' => 'admin',
  'controller' => 'index',
  'action' => 'index',
)  

index.php 中的包含路径设置正确(库和其他所有内容均已加载),此处为 index.php 文件:

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

set_include_path('library');

// Define upload path
if (!defined('UPLOAD_PATH'))
        define('UPLOAD_PATH', realpath(dirname(__FILE__)) . '/upload/');

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap()
            ->run();

Bootstrap.php 文件:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype(){
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
    }

    protected function _initTimeZone(){
        $date = $this->getOption('date');
        date_default_timezone_set($date['timezone']);
    }

    protected function _initLayoutHelper(){
        $this->bootstrap('frontController');
        Zend_Controller_Action_HelperBroker::addHelper(
            new Jakub_Controller_Action_Helper_LayoutLoader());
    }

    protected function _initFlashMessenger(){
        $flashMessenger = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');

        if ($flashMessenger->hasMessages()) {
            $view = $this->getResource('view');
            $view->messages = $flashMessenger->getMessages();
        }
    }

    protected function _initAuth(){
        $this->bootstrap('session');
        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) {
            $view = $this->getResource('view');
            $view->user = $auth->getIdentity();
        }

        return $auth;
    }
}

Application.ini 文件:

[production]
webhost = "http://www.domainname.com/new"

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

includePaths.library = APPLICATION_PATH "/../library"

date.timezone = "Europe/Bratislava"

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

appnamespace = "Application"
autoloadernamespaces.nette = "Nette_"
autoloadernamespaces.jakub = "Jakub_"

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

resources.view[] =
resources.view.helperPath.App_View_Helper = APPLICATION_PATH "/views/helpers"

resources.modules[] =

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/default/"
resources.layout.layout = default

admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts/base/"
admin.resources.layout.layout = default

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
webhost = "http://domainname"

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    在您的管理模块文件夹中,检查 IndexController.php 是否存在于“控制器”子目录中。

    如果是,则打开 IndexController.php 并确保类声明确实声明了类“IndexController”(常见的复制+粘贴陷阱)

    编辑:控制器名称应该是 Admin_IndexController,而不仅仅是 IndexController

    【讨论】:

    • 控制器中的一切都很好,它存在,名称是“class Admin_IndexController”。
    • 文件名为indexController.php,应用程序在本地主机上运行正常,所以问题可能出在路径或某些配置上。
    • 类名应该是IndexController,而不是Admin_IndexController。
    • 其实我原来的评论是错误的——应该是Admin_IndexController
    • 文件名应该是IndexController.php(注意第一个大写)。在 Windows 上它可以工作。在 Unix 上,文件系统区分大小写,因此会失败。
    【解决方案2】:

    在您的 application.ini 中尝试:

    resources.frontController.moduleControllerDirectoryName = "controllers"
    

    我的模块应用程序的 application.ini 中也有这个:

    resources.frontController.params.prefixDefaultModule = ""
    

    每个模块也有自己的引导程序吗?

    <?php
    
    class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {
        //put your code here
    }
    

    【讨论】:

      【解决方案3】:

      我使用的是同事准备的身份验证控制器,我遇到了同样的问题,我在控制器的重定向中发现了问题。

      if (!$this->_acl->isAllowed(Zend_Registry::get('user_role'), $module . ':' . $controller, $action)) {
      $request->setModuleName('default')->setControllerName('authentication')->setActionName('login');}
      

      这基本上检查您是否已登录以及您是否有权访问指定的控制器,如果没有,它会将您重定向到(在这种情况下)default/authenticaion/index 不幸的是,重定向参数未显示在错误消息中。 我意识到我没有准备好重定向到的控制器,所以在某些情况下它可能是同样的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多