Symfony:在我的文章url中生成鼻涕虫url,而不是新闻id



我想有一个这样的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)
{
}

它在我的测试项目中工作得很好。希望这对大家有所帮助!

最新更新