Symfony:在我的文章url中生成slug url而不是news id

时间:2016-09-04 13:35:02

标签: routing doctrine symfony slug

我想要一个像这样的网址:

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文件中?

或许你可以给我一个关于解决方案的链接。

2 个答案:

答案 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)
{
}

在我的测试项目中,它的运行非常漂亮。希望这对某人有帮助!