我想要一个像这样的网址:
www.mysite.com/my-super-blog-post
而不是这一个:
www.mysite.com/7
其中'7'是我的新闻对象的id属性。
当我看到Symfony文档时,我想我需要使用这行代码:
$this->generateUrl('blog_show', array('slug' => 'my-blog-post'), UrlGeneratorInterface::ABSOLUTE_URL);
是不是?我不明白的是我需要在哪里使用那行代码?在我的NewsController.php文件中?
或许你可以给我一个关于解决方案的链接。
答案 0 :(得分:4)
编辑我使用Symfony 3.2
好的,我自己找到了解决方案。这就是我所做的。
首先从symfony doc中读取此内容。使用ConvertParamater实现http://symfony.com/doc/current/best_practices/controllers.html#using-the-paramconverter
非常简单实施后:
安装StofDoctrineExtensionBundle
在composer.json
中“require”:{ “stof / doctrine-extensions-bundle”:“~1.1” }
不要忘记更新appKernel.php文件
<?php
// app/AppKernel.php
public function registerBundles()
{
return array(
// …
new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
// …
);
}
然后我配置config.yml文件:
# app/config/config.yml
# Stof\DoctrineExtensionsBundle configuration
stof_doctrine_extensions:
orm:
default:
sluggable: true
然后我向我的新闻实体添加了一个slug属性:
private $slug;
然后我更新我的News.orm.yml文件 毛坯: type:string 长度:255 独特:错误 gedmo: 毛坯: 分隔器: _ 风格:骆驼 字段: - 标题
然后我做
doctrine:generate:entites myBundle:News
还有`doctrine:schema:update --force
这在我的新闻表中创建了一个slug字段。因为这个字段可能不是null,所以我手动输入了一些值,因此我的News表的每一行都有一个有效的slug
然后在我的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>
我希望这可以帮助别人
答案 1 :(得分:0)
万一有人使用此旧文章作为向URL添加块的参考,此功能已包含在Symfony 4中。该文章Symfony 4 routing from DB显示了如何简单地使用
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
/**
* @Route("/page/{slug}")
* @ParamConverter("page")
*/
public function showAction(Page $page)
{
}
在我的测试项目中,它的运行非常漂亮。希望这对某人有帮助!