【问题标题】:CakePHP Routes.php for Slugs用于蛞蝓的 CakePHP Routes.php
【发布时间】:2013-12-14 18:50:54
【问题描述】:

我正在尝试让我的 CakePHP 应用程序使用 slugs 而不是 ids。我已经阅读了几个教程和关于它的 CakePHP 书,但我一定错过了一些简单的东西。

我的表格有一个“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

但是,如果我将所有内容从“slug”更改为“id”,那么 URL:

mycakeapp/items/id-value

效果很好

有人可以帮助我吗?提前致谢。

【问题讨论】:

    标签: cakephp routes cakephp-2.0


    【解决方案1】:

    好吧,阅读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() 将异常消息设置给会话。简单。 :)

    【讨论】:

    • 确实是 ItemExists,我应该抓住它。谢谢!
    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2016-06-02
    • 2021-04-04
    • 2014-04-02
    • 2016-07-22
    • 2011-02-09
    相关资源
    最近更新 更多