我想有一个这样的url:
www.mysite.com/my-super-blog-post
代替这个:
www.mysite.com/7
其中'7'是News对象的id属性。
当我看到Symfony文档时,我认为我需要使用这行代码:
$this->generateUrl('blog_show', array('slug' => 'my-blog-post'), UrlGeneratorInterface::ABSOLUTE_URL);
正确吗?我不明白的是我需要在哪里使用那行代码?在我的newscontroller。php文件中?
或者你可以给我一个链接来阅读解决方案。
使用Symfony 3.2
好了,我自己找到解决办法了。这就是我所做的。
首先从symfony文档中读取。使用convertparameter实现起来真的很容易http://symfony.com/doc/current/best_practices/controllers.html#using-the-paramconverter
实现后:
安装StofDoctrineExtensionBundle 在composer.json"需要":{"stof/doctrine-extensions-bundle":"~ 1.1"}
不要忘记更新appKernel.php文件
<?php
// app/AppKernel.php
public function registerBundles()
{
return array(
// …
new StofDoctrineExtensionsBundleStofDoctrineExtensionsBundle(),
// …
);
}
然后我配置配置。yml文件:
# app/config/config.yml
# StofDoctrineExtensionsBundle configuration
stof_doctrine_extensions:
orm:
default:
sluggable: true
然后我添加一个属性到我的新闻实体:
private $slug;
然后我更新我的News.orm.yml文件鼻涕虫:类型:字符串长度:255独特:假gedmo:鼻涕虫:分隔符:_风格:骆驼字段:——标题
然后我做
doctrine:generate:entites myBundle:News
还有' doctrine:schema:update——force
这在我的News表中创建了一个字段。因为这个字段可能不是空的,所以我手工输入了一些值,这样News表的每一行都有一个有效的
然后在我的NewsController中,我使用这行代码:
$this->generateUrl('myroute_news_show_one_by_id', array('slug' => $news->getSlug()), UrlGeneratorInterface::ABSOLUTE_URL);
return $this->render('MyBundle:News:single_post.html.twig', [
'news' => $news,
'tags' => $arrTagNames
]);`
在我的Twig模板中,我创建了一个链接来显示一个新闻:
<a href="{{ path('myroute_show_one_by_id', {'slug': news.slug}) }}">{{news.title}}</a>
我希望这能帮助到别人
如果有人使用这篇旧文章作为向url添加slugs的参考,那么这个功能将被纳入Symfony 4。这篇文章Symfony 4从DB路由展示了如何简单地使用
use SensioBundleFrameworkExtraBundleConfigurationParamConverter;
/**
* @Route("/page/{slug}")
* @ParamConverter("page")
*/
public function showAction(Page $page)
{
}
它在我的测试项目中工作得很好。希望这对大家有所帮助!