如果控制器为小写,则页面未找到错误,但如果Zend Framework应用程序中的第一个字母为大写,则会起作用

时间:2012-09-17 03:19:09

标签: php model-view-controller zend-framework

这很奇怪我在这个错误中已经被黑客攻击了一段时间。它似乎只出现在部署服务器上。我有一个名为holiday的完美工作控制器 - 这是控制器和视图的结构:

controllers
-> HolidaysController.php

<?php

class HolidaysController extends App_Controller_Action {

  public function indexAction() {
.....
  }
}

?>

我的观看文件位于

views/scripts/holidays/index.phtml

当我导航到website.com/holidays时,它会给我这个错误:

An error occurred
Page not found
Exception information:

Message: Action "index" does not exist and was not trapped in __call()
Stack trace:

#0 /home/bookitfa/bookings/library/Zend/Controller/Action.php(515): Zend_Controller_Action->__call('indexAction', Array)
#1 /home/bookitfa/bookings/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#2 /home/bookitfa/bookings/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#3 /home/bookitfa/bookings/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#4 /home/bookitfa/bookings/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#5 /home/bookitfa/bookings/public/index.php(29): Zend_Application->run()
#6 {main}  

Request Parameters:

array (
  'controller' => 'holidays',
  'action' => 'index',
  'module' => 'default',
)  

但是当我导航到website.com/Holidays时,它的作用有些奇怪。所有其他控制器工作正常,除非这个控制器名称的第一个字母大写,这个控制器似乎只能工作。这是为什么?这是一个基于zend框架的应用程序。我的所有网址都不合适。 编辑=======

奇怪的是,不管我保留了什么文件名,即HolidaysController.php或holidaysController.php - 在线我只能通过/假期访问它而不是/假期,这是一个非常严重的问题我在这里没有关于如何解决它的想法:(

1 个答案:

答案 0 :(得分:2)

Zend中的类名称区分大小写 - 在Linux上。

为什么呢?因为它只加载它需要的类文件,Linux上的文件名区分大小写。

你可能正在开发Windows,它不区分大小写。当询问文件“holidaysController.php”时,windows将返回HolidaysController.php,holidayscontroller.php或HoLiDaYsCoNtRoLlEr.php - 你明白了!它查找文件,然后只加载该文件。

在Linux(和Mac)上,这4个文件名都不同。即使您已根据文档命名该类(类的大写,操作的驼峰),您还需要使用相同的大小写调用路由器 - 否则将无法找到并加载该文件。

为什么会让人感到困惑:Zend试图小写以小写,因此它首先寻找“holidayController.php”(当你输入“Holiday”时)。混合的情况有点复杂:看this page上的黄色框:所以它找不到normlaised所以处理为混合情况,然后工作。当您输入“假日”时,它无法找到该文件,但由于它没有被标准化或来自它,它不需要寻找任何其他文件。它失败了。

您的选择:将“假期”作为该文件的路径,或将文件重命名为“holidayController.php”,您可以使用假日或假日运行。 (将该类保留为HolidayController - 该位不区分大小写。)