我想使用 ID 和喜好标题创建一个类似以下的链接:/favours/20201/This_is_a_favour
。
我已经设置了如下链接:
<h3><?php echo $this->Html->link($favour['Favour']['title'], array('controller'=>'favours','action'=>'view',$favour['Favour']['id'], Inflector::slug($favour['Favour']['title']))); ?></h3>
到目前为止 Controller 的操作是:
function view ( $id, $title )
{
$favour = $this->Favour->find('first', array(
'conditions' => array('Favour.title' => $title)
));
if (empty($favour))
{
$this->cakeError('error404');
}
$this->set(compact('favour'));
}
Router::connect('/favours/:id/:favourName',array('controller'=>'favours','action'=>'view'),
array(
'favourName'=>'[A-Za-z0-9\._-]+',
'pass'=>array('favourName')
),
array('id' => '[0-9]+')
);
但是我现在得到了 404?
注意:我不想使用 sluggable 插件或在数据库中存储 slugs!
最佳答案
首先您需要在routes.php
中设置您的路线:
Router::connect('/favours/:id',
array('controller' => 'favors', 'action' => 'view'),
array('id' => '[0-9]+', 'pass' => array('id')));
Router::connect('/favours/:id/:slug',
array('controller' => 'favors', 'action' => 'view'),
array(
'id' => '[0-9]+',
'slug' => '[A-Za-z0-9\._-]+',
'pass' => array('id', 'slug')
));
然后我建议向您的 Favor 模型添加一个方法来处理 :slug
参数的创建,因为您必须从不同的地方使用它,并且您可能想要更改稍后它到底是如何工作的:
public static function slug(array $favour) {
// good enough for now, might want to change this later
return Inflector::slug($favour['title']);
}
然后,每当您创建链接时,请像这样操作:
array('controller' => 'favours', 'action' => 'view',
'id' => $favour['Favour']['id'], 'slug' => Favour::slug($favour['Favour']))
您的 Controller 操作如下所示:
public function view($id, $slug) {
$favour = $this->Favour->find('first', array('conditions' => array('Favour.id' => $id)));
if (!$favour) {
$this->cakeError('error404');
}
if (Favour::slug($favour['Favour']) != $slug) {
$this->redirect(array('id' => $id, 'slug' => Favour::slug($favour['Favour'])));
}
$this->set(compact('favour'));
}
关于php - CakePHP 在 URL 中同时使用 ID 和标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7718606/