用于Slugs的CakePHP Routes.php

时间:2013-11-28 16:42:06

标签: cakephp routes cakephp-2.0

我试图让我的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

工作得很好

有人能帮助我吗?提前谢谢。

1 个答案:

答案 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()将异常消息设置为会话。简单。 :)