2014-12-03 131 views
0

我正在使用Cakephp 2 我一直在重新考慮我的代碼使用Html-> url()函數而不是硬編碼Web地址。對於那些不熟悉的人,我傳遞一個包含控制器和動作名稱的混合$ url變量。Cakephp生成小寫的URL與大寫控制器名稱

我的直覺告訴我,我應該根據文件名和根據控制器內部函數名稱的動作定義控制器。 即: 路由到AdminsController ::指數()我會說

$this->Html->url(array(
    'controller'=>'Admins' 
    ,'action'=>'index' 
)); 

應該生成我的URL

http://example.com/admins/index 

不幸的是,它產生了對我來說是

http://example.com/Admins/index 

*注意大寫「A」在管理員中。

最純粹的我拒絕通過其變形的名稱來識別控制器,因爲那麼使用url helper函數有什麼優勢?爲什麼我不能自己寫郵件呢?

url函數不應該使inflecting控制器名稱? 是不是小寫字母/駱駝情況是變形過程的一部分? 有什麼辦法可以強制這種行爲?

感謝

回答

0

如果定義在routes.php文件下列路線,您將有你好看小寫網址:

Router::connect('/admins/index', array(
    'controller' => 'Admins', 
    'action' => 'index' 
)); 

編輯:其他的建議,你也可以考慮定義自定義路由會自動小寫動作和控制器時,解析路線網址: http://book.cakephp.org/2.0/en/development/routing.html#custom-route-classes

編輯2:剛剛得到另一個想法。你可以將Html helper包裝成一個自定義的執行你想要的東西。

在View /助手/ CustomHtmlHelper.php:

<?php 
App::uses('HtmlHelper','View/Helper'); 

class CustomHtmlHelper extends HtmlHelper { 

public function url($url = null, $full = false) 
{ 
    if(is_array($url)) { 
     if(isset($url['controller']) { 
      $url['controller'] = strtolower($url['controller']); 
     } 
     if(isset($url['action']) { 
      $url['action'] = strtolower($url['action']); 
     } 
    } 
    return parent::url($url, $full); 
} 

在控制器/ AppController的。php:

public $helpers = array('Html' => array('className' => 'CustomHtml')); 

我還沒有測試,所以可能會出現代碼錯誤。但這是這個想法。

+0

我必須爲我的所有控制器做到這一點? – isick 2014-12-04 17:51:23

+0

我想是的..但我編輯我的答案,以分享其他可能的解決方案。 – PGBI 2014-12-04 18:30:16

+0

CustomHelper似乎是最好的解決方案。謝謝! – isick 2014-12-08 17:18:19

0

如果你希望使用的HtmlHelper,你需要總是格式化你的行動/控制器和插件這樣的:

$this->Html->url(array(
    'controller'=>'admins' 
    ,'action'=>'index' 
)); 

或:

$this->Html->url(array(
    'controller'=>'controllers' 
    ,'action'=>'some_other_action' 
)); 

蛋糕會照顧一切。只要通過小寫的下劃線版本即可。如果你的動作是(在上面的例子中是someOtherController()),則包括

在你的URL中是一樣的 - 你訪問/ admins /,而不是/ Admins/- 幫助器的工作方式是一樣的。

+0

我在說我希望能夠用大寫字母來編寫控制器名稱。 'controller'=>'Admins'並讓它仍然呈現小寫url – isick 2014-12-04 17:44:54

+0

然後,您將需要創建自定義路由以在生成url之前對其進行操作。這是食譜如何做到這一點。或者您可以創建一個幫助程序來接受大寫的控制器名稱作爲默認HTML幫助程序的包裝,並將該小寫版本推遲到HTML幫助程序。 – 2014-12-05 18:23:26