2010-12-07 44 views
0

我有一個名爲DesignersController的控制器,index方法列出它們,view方法接受設計器名稱作爲參數並按名稱檢索它。我知道視圖和控制器不應該共享邏輯......但我還能如何做到這一點?

所以/designers將列出所有的設計師和/designers/view/designer-name將顯示該設計師。

現在,如果一個設計器名稱有一個空格,它需要在URL中轉義。我有邏輯轉義非轉義空格:

private $space_escape_char = '-'; 

function escapeSpaces($str) 
{   
    return str_replace(" ",$this->space_escape_char,$str);  
} 

function unescapeSpaces($str) 
{   
    return str_replace($this->space_escape_char," ",$str);  
} 

現在在Controller需求view方法訪問此所以當它通過一個名稱,如「富酒吧」可以翻譯成「富酒吧」。

的index.ctp視圖文件也需要訪問它,所以當它列出了所有的設計者它可以給鏈接到每個人,並且能夠逃脫每個名字:

<?php foreach ($designers as $designer): ?>  

<div> 
<?php 
    echo $this->Html->link(
     $designer['Designer']['name'], 
     array(
      'controller' => 'designers', 
      'action' => 'view', 
      escapeSpaces($designer['Designer']['name']) 
     ) 
    ); 
?> 
</div> 

<?php endforeach; ?> 

什麼是最好的如何處理這個沒有代碼重複?

回答

3

你在這裏做的是將設計師的名字轉換成slu,子,但手動。您可以改爲使用行爲(如this Sluggable Behavior)來自動存儲設計師名字的slu。聲。之後,您可以在任何需要URL名稱的URL安全版本的地方參考$designer['Designer']['slug']。這個slug作爲模型數據的一部分存儲在數據庫中,所以你甚至可以查詢它。

+2

http://www.42pixels.com/blog/slugs-ugly-bugs-pretty-urls - 這是一種使用自定義路由的方法,它使用動態創建的slu to映射到特定的Model :: id值。比在數據庫中儲存slu Better更好。 – 2010-12-07 23:45:41

3

如果這是一個常見的事件,我會建議在用戶數據庫條目中存儲一個URL slug。計算一次,並從那裏重新使用它。爲什麼重新計算每次都是一樣的東西?

+0

+1。 – RobertPitt 2010-12-07 18:04:25

+0

謝謝,直到現在我還不知道什麼是「slu」「。 – 2010-12-07 18:42:49

5

通常的做法是將實體的主要ID放在URL中,並在關鍵字/可用性的URL中包含名稱/標題(在您的案例設計器名稱中)。

例如

/designers/view/13/designer-name/ 

控制器將只關心13,搜索ID 13的設計者數據庫它不會使用designer-name可言。

這是它在Stackoverflow上完成的方式。

它還可以防止/設計人員/查看/ john-smith12/

相關問題