ThinkPHP 解決模板文件大小寫問題

以前使用TP3.1時,沒有注意$this->display()默認解析的模板文件大小問題。現在使用TP3.2,在windows下開發沒什麼毛病,昨晚放在測試服務器上(阿里雲CentOS LAMP),竟然報找不到模板文件錯誤。我的情況是:

  • windows下define(‘APP_DEBUG’, true) ‘URL_CASE_INSENSITIVE’ =>true。沒問題。
  • windows下define(‘APP_DEBUG’, true) ‘URL_CASE_INSENSITIVE’ =>false。沒問題。
  • windows下define(‘APP_DEBUG’, false) ‘URL_CASE_INSENSITIVE’ =>true。沒問題。
  • windows下define(‘APP_DEBUG’, false) ‘URL_CASE_INSENSITIVE’ =>false。沒問題。
  • linux下define(‘APP_DEBUG’, true) ‘URL_CASE_INSENSITIVE’ =>true。報錯找不到模板文件。
  • linux下define(‘APP_DEBUG’, true) ‘URL_CASE_INSENSITIVE’ =>false。報錯找不到模板文件。
  • linux下define(‘APP_DEBUG’, false) ‘URL_CASE_INSENSITIVE’ =>true。報錯找不到模板文件。
  • linux下define(‘APP_DEBUG’, false) ‘URL_CASE_INSENSITIVE’ =>false。報錯找不到模板文件。

試了網上說的各種(主要是在Application和ThinkPHP中修改URL_CASE_INSENSITIVE),對我都沒用。就暫時在控制器中搜索所有$this->display(),改爲$this->display(__FUNCTION__)。刪除Application/Runtime。算是暫時用着。

然後開始找資料,論壇上有人提供了修改ThinkPHP中parseTemplate()的代碼,但是我複製 粘貼後報語法錯誤,然後開始注意ThinkPHP/Library/Think/View.class.php的display()方法。

display()方法中調用了fetch()方法來解析獲取模板內容,fetch()方法中調用了parseTemplate()方法來獲取模板文件,parseTemplate()方法中通過$template = CONTROLLER_NAME . $depr . ACTION_NAME;來處理模板文件名爲空(即display()放參數爲空)下的定位規則,看到這兒,猜測ACTION_NAME是導致模板文件找不到的原因,在controller中var_dump(ACTION_NAME),果然是小寫的。
ThinkPHP/Library/Think/View.class.php/display()

ThinkPHP/Library/Think/View.class.php/fetch()

ThinkPHP/Library/Think/View.class.php/parseTemplaate()

然後在ThinkPHP中找到ACTION_NAME的定義,ThinkPHP/Library/Think/Dispatcher.class.php的dispatch()通過define(‘ACTION_NAME’, self::getAction($varAction));定義了ACTION_NAME的值,getAction()中通過return strip_tags(strtolower($action));的strtolower()把得到的操作/方法名轉爲小寫返回了,把strtolower刪了。

ThinkPHP/Library/Think/Dispatcher.class.php/dispatch()

ThinkPHP/Library/Think/View.class.php/getAction()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章