2013-11-28 175 views
0

我想讓我的CakePHP應用程序使用slu instead而不是ids。我已經閱讀了幾篇教程和CakePHP的書,但是我一定錯過了一些簡單的東西。S Cake CakePHP Routes.php

我的表格中有一個「slug」字段,我想用URL代替默認的id。

我改變了我的看法上述ItemsController此:

public function view($slug = null) { 
    if (!$this->Item->exists($slug)) { 
     throw new NotFoundException(__('Invalid item')); 
    } 

    $this->set('item', $this->Item->findBySlug($slug)); 
} 

,並將此我routes.php文件

Router::connect(
'/items/:slug', 
array('controller' => 'items', 'action'=>'view'), 
array('pass'=>array('slug')) 
); 

然而,我仍然得到「無效的項目,請求的地址沒有找到......」當進入:

mycakeapp/items/slug-value 

但是,如果我改變一切,從「塞」到「身份證」,那麼網址:

mycakeapp/items/id-value 

工作得很好

有人能幫助我嗎?提前致謝。

回答

3

那麼,請閱讀文檔Model::exists()

如果具有特定ID的記錄存在,則返回true。

如果沒有傳遞$ id,它會調用Model :: getID()來獲取當前的 記錄ID,然後對當前的配置數據源執行Model :: find('count')以確定是否存在持續存儲在 的記錄。

它期望一個ID不是一個slu。。

這裏是從模型方法的適當例子,以顯示一個藝術家:

public function view($id = null, $options = array()) { 
    $defaults = array(
     'contain' => array(
      /* ... */ 
     ), 
     'conditions' => array(
      'OR' => array(
       $this->alias . '.' . $this->primaryKey => $id, 
       $this->alias . '.slug' => $id 
      ) 
     ) 
    ); 

    $artist = $this->find('first', Hash::merge($defaults, $options)); 

    if (empty($artist)) { 
     throw new NotFoundException(__('Invalid Artist')); 
    } 

    return $artist; 
} 

的控制器嘗試/捕捉異常並通過調用會話而設置異常消息給會話> setFlasH()。簡單。 :)

+0

事實上,這是ItemExists,我應該抓住了。謝謝! – user2856332

相關問題