我正在尝试删除cakephp url中的动作并添加一个slu imp inflector,更清楚这是我的预期输出:
来自:example.com/posts/view/81/这是一个测试帖子
至:example.com/posts/This-is-a-test-post
这是我目前的代码:
这给了我这个输出:example.com/posts/view/这是一个测试帖子
控制器:
public function view($title = null) {
if (!$title) {
throw new NotFoundException(__('Invalid post'));
}
$post = $this->Post->findByTitle($title);
if (!$post) {
throw new NotFoundException(__('Invalid post'));
}
$this->set('post', $post);
}
view.ctp:
$this->Html->link($post['Post']['title'], array('action' => 'view', $post['Post']['title']));
我也试过这个,这个链接是我的参考CakePHP: Use post title as the slug for view method:
输出:example.com/posts/view/21/This-is-a-test-post
控制器:
function view($id) {
$this->Post->id = $id;
$this->set('post', $this->Post->read());
}
view.ctp
$this->Html->link($post['Post']['title'], array('action' => 'view', $post['Post']['id'], Inflector::slug($post['Post']['title'],'-')));
下面是我尝试但失败的其他链接,我也尝试修改routes.php但是无法制作正确的代码使其正常工作
want to remove action name from url CakePHP
How to remove action name from url in cakephp?
Remove action name from Url in cakephp?
感谢任何帮助/建议。
答案 0 :(得分:3)
使用Id和Named参数...
将新路线定义为 -
Router::connect('/posts/:id-:title',
array('controller' => 'posts',
'action' => 'view')
);
这个新定义的路由将匹配并解析包含id和title命名参数的所有url ..
重要提示:: 在routes.php结束后不要定义新路由。尝试在文件的中间定义..
echo $this->Html->link('Hi',array(
'controller' => 'posts',
'action' => 'view',
'id' => 4,
'title' => Inflector::slug('the quick brown fox')
));
答案 1 :(得分:1)
上面提供的解决方案将满足您的需求,但在阅读您的问题之后仍有一件事情在我脑海中浮现......在您的控制器中,您正在尝试使用标题阅读帖子我的意思是这会降低您的系统速度编程所以使用id并在db表中再增加一列用于slug(SEO标题),这将用于创建你的帖子网址。
For example:
Post title: This is a test post
Create seo title for this as: this-is-a-test-post-123
Stor seo title in DB as <this-is-a-test-post>
请参阅123是您的帖子ID现在更改您的控制器功能以获取基于ID的数据ie.123,我希望您从cing中轻松提取123 ......
注意:请记住,您还必须考虑this-is-a-123
字符串,因为
他们也有一个有123的帖子。
使用以下路线获取上述解决方案:
Router :: connect('/ posts / *',array('controller'=&gt;'posts','action'=&gt;'view'),array('pass'=&gt; array('title) “)));
现在在您的控制器中:
你将在$ post_title中获得字符串“this-is-a-test-post-123”
function view($post_title=null){
$temp = explode('-',$post_title);
$posts_id= end($temp);
$lastKey = end(array_keys($temp));
unset($temp[$lastKey]);
$seoTitle = implode("-",$temp);
//Now compare the above seoTitle with DB seo title for unique urls
}