我试图让我的CakePHP应用程序使用slugs而不是id。我已经阅读了几本关于它的教程和CakePHP书籍,但我必须遗漏一些简单的东西。
我的表格中有一个“slug”字段,我想用它来代替默认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
但是,如果我将所有内容从“slug”更改为“id”,则输入URL:
mycakeapp/items/id-value
工作得很好
有人能帮助我吗?提前谢谢。
答案 0 :(得分:3)
好的,请阅读Model::exists()的文档。
如果存在具有特定ID的记录,则返回true。
如果未传递$ id,则调用Model :: getID()以获取当前值 记录ID,然后在当前执行Model :: find('count') 配置数据源以确定是否存在记录 持久存储。
它希望id不是slug。
以下是显示艺术家的模型方法的正确示例:
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()将异常消息设置为会话。简单。 :)