![](/img/trans.png)
[英]cakephp: seo friendly url routing - avoid the url parameter passed
[英]CakePHP friendly seo url
我想让我的网址友好。 www.example.com/posts/view/1
更改为www.example.pl/:slug-:id
。 一切正常,但可能我在路由方面做错了,因为在点击paginator中的url后,url是正确的,它看起来像www.example.pl/:slug-:id
,但是它出现了错误
"The requested address 'www.example.pl/:slug-:id' was not found on this server."
我不知道出了什么问题。 这是我的代码:
Router::connect(
'/:slug-:id',
array(
'controller' => 'posts',
'action' => 'view'
),
array(
'pass' => array('slug' , 'id'),
'id' => '[0-9]+'
)
);
在paginator视图中:
echo $this->Html->link($ad['Post']['title'], array(
'controller' => 'posts',
'action' => 'view',
'slug' => Inflector::slug($post['Post']['title'],'-'),
'id'=>$post['Post']['id'])
);
我解决了这个问题。
它太简单了,我会在你的routes.php中给我一个来自我的项目的例子
Router::connect(
'/:slug-:id',
array('controller'=>'posts','action'=>'view'),
array('pass'=>array('slug','id'),'slug'=>'[a-zA-Z0-9 -]+','id'=>'[0-9]+')
);
您在视图中的链接应该是这样的。
$this->Html->link(__('link desu'),array('controller'=>'posts','action'=>'view','id'=>$post['Post']['id'],'slug'=>$post['Post']['slug']));
和你的PostsController.php
public function view($slug,$id){
$this->Post->id = $id;
// ....
}
快速提示:尝试在PostModel中创建一个数组,以避免每次在视图中创建它。 例如:
post.php中
class Post extends AppModel{
// ....
public function afterFind($results,$primary = false){
foreach ($results as $key => $value) {
if(isset($value[$this->alias]['id'])){
$results[$key][$this->alias]['url'] = array(
'controller'=>'posts',
'action'=>'view',
'id'=>$results[$key][$this->alias]['id'],
'slug'=>$results[$key][$this->alias]['slug']
);
}
// ....
}
return $results;
}
}
}
所以你可以像你那样在你的视图中调用它
$this->Html->link(__('link desu'),$post['Post']['url']);
这可能是路线上正则表达式的一个问题。 你的slug包含连字符-
你也可以用它来分隔slu and和id。 即:
example.com/my-slug-has-hyphens-1
正则表达式不够聪明,不知道“最后”连字符将slug与id分开。
要测试这是否是问题,请尝试使用类似'/:slug__:id',
的路由,看它是否有效。
我解决了这个问题。 在帖子控制器中我的视图功能是错误的。 这是正确的:
function view($id = null, $slug = null) {
$this->Post->id = $this->params['post'];
$this->set('post', $this->Post->read());
在问题中路线如下:
Router::connect(
'/:slug-:id',
array(
'controller' => 'posts',
'action' => 'view'
),
array(
'pass' => array('slug' , 'id'), # <-
'id' => '[0-9]+'
)
);
这意味着post函数将收到:
public function view($slug, $id)
如编辑问题所示,代码期望id是第一个参数。 最简单的解决方案就是按照预期的顺序指定传递的参数:
...
'pass' => array('id', 'slug'), # <-
Router::connect(
'/:slug/:id',
array(
'controller' => 'posts',
'action' => 'view'
),
array(
'pass' => array('slug' , 'id'),
'id' => '[0-9]+'
)
);
以上代码将创建正确的链接,如www.example.com/posts/view/title/1
echo $this->Html->link($post['Post']['title'], array('controller' => 'posts', 'action' => 'view', Inflector::slug($post['Post']['title'],'-'),$post['Post']['id']));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.