2013-11-28 3 views
0

Я пытаюсь заставить мое приложение CakePHP использовать слизни вместо ids. Я прочитал несколько учебников и книгу CakePHP об этом, но я должен пропустить что-то простое.CakePHP Routes.php для Slugs

В моей таблице есть поле «slug», которое я хочу использовать для URL вместо идентификатора по умолчанию.

Я изменил мой взгляд на это 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')) 
); 

Но я все еще получаю "Invalid позицию, запрашиваемый адрес не найден ..." при переходе к:

mycakeapp/items/slug-value 

Однако, если я изменю все от «слизняк» до «ид», то URL:

mycakeapp/items/id-value 

прекрасно работает

Может кто-нибудь мне помочь? Заранее спасибо.

ответ

3

Хорошо, прочитайте документацию для Model::exists().

Возвращает true, если существует запись с конкретным идентификатором.

Если $ ID не передается это вызывает Model :: GetId() для получения текущих идентификатора записи, а затем выполняет Model :: найти («Count») на данный момент сконфигурированного источник данных, чтобы убедиться в существовании запись в постоянное хранение.

Ожидает, что идентификатор не является слизью.

Вот правильный пример из модели метод для отображения художника:

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; 
} 

Контроллеры пытаются/перехватывает исключение и устанавливает сообщение об исключении на сессии по телефону session-> setFlasH(). Легко. :)

+0

Действительно, это был ItemExists, я должен был это понять. Благодаря! – user2856332

Смежные вопросы