CakePHP:使用变形器且没有id的友好URL

时间:2011-08-10 21:16:30

标签: php cakephp

我使用CakePHP构建了一个简单的投资组合,它的网址如下:domain.com/portfolio/82/This_is_an_item

我想要做的是从网址中删除ID。我该怎么做?

以下是视图的控制器代码:

function view ( $id, $slug )
{
    $post = $this->Portfolio->read(null, $id));

    $this->set(compact('post'));
}

这是链接生成器:

<?php echo $this->Html->link($post['Portfolio']['title'],
        array('admin' => false, 'controller' => 'portfolio', 'action' => 'view', $post['Portfolio']['id'], Inflector::slug($post['Portfolio']['title'])),
        array('title' => $post['Portfolio']['title'])); ?>

我猜我需要更改控制器方法来对标题进行某种查找?

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

我会将slug与标题一起保存在数据库中。这样你只需要创建一次。此外,您可能会或可能无法获得从slug到title的唯一链接,因此最好不要尝试。

为便于处理,您可以使用Sluggable行为,请参阅https://gist.github.com/338096(或仅限Google)。

<强>更新

如果你使用https://gist.github.com/338096中的缓慢行为(在app / model / behavior中保存为sluggable.php),你只需要做几个步骤:

在您的个人资料模型类中添加var $actsAs = array('Sluggable');

var $actsAs = array(
    'Sluggable' => array(
        'fields' => 'title',
        'scope' => false,
        'conditions' => false,
        'slugfield' => 'slug',
        'separator' => '-',
        'overwrite' => false,
        'length' => 256,
        'lower' => true
    )
);

如果要覆盖设置

在数据库中,在配置文件表中添加一列slug

保存配置文件时,它会自动添加填充字段,您不需要采取任何特殊操作。

答案 1 :(得分:1)

您可以完全消除id,但是您必须确保slug是唯一的(在unique验证规则中指定是一个选项)。保存帖子时,在“标题”字段上使用Inflector::slug()(如果您想保持标题的完整性,可能需要将其保存到'slug'字段:

$this->data['Portfolio']['slug'] = Inflector::slug($this->data['Portfolio']['title'])

function view ($slug ){
   $post = $this->Portfolio->find('first', array('conditions'=>array('Portfolio.slug'=>$slug))));
   $this->set(compact('post'));
}

和链接:

<?php echo $this->Html->link($post['Portfolio']['title'],
    array('admin' => false, 'controller' => 'portfolio', 'action' => 'view', $post['Portfolio']['slug']),
    array('title' => $post['Portfolio']['title']));