修补/扩展路径Url Generator以便重写url以用连字符替换所有空格

时间:2014-06-06 15:09:05

标签: symfony url-rewriting routing extend slug

我有这样的路线:

user:
    path: /u/{id}/{name}
    defaults: { _controller: AcmeMyBundle:User:user, name: '' }
    requirements:
        id: '[0-9]+'

{name}只是为用户和SEO提供了一个漂亮的网址。我不会在我的应用程序中使用{name},因为{id}完成了这项工作。 {name}通常由多个单词组成(第一个+姓氏等),生成的网址如下所示:

http://my.project/u/12/Firstname%20LastName

我在带有路径的树枝模板('用户',{id:user_id,名称:用户名})中生成网址,或者使用带有$ this-> get('路由器&#)的php生成网址39;) - >生成(...)

我想避免使用%20并用连字符替换所有空格,以使链接看起来像这样:

http://my.project/u/12/Firstname-LastName

它看起来更具可读性,我读到的地方谷歌更像是连字符......

最好的方法是路由生成器会这样做。只需用连字符替换alle空格。我现在不需要任何其他东西,它不会影响任何东西,因为它{name}或其他一些描述性参数仅用于SEO,它们不用于应用程序。 {id}是重要的参数

我无法通过某些参数找到一种方法,所以我只是打开 vendor / symfony / symfony / src / Symfony / Component / Routing / Generator / UrlGenerator.php 并添加"%20"以及 encodedChars 的空格:

protected $decodedChars = array(
    # ...
    '%2A' => '*',
    '%7C' => '|',
    # replace spaces with hyphen
    '%20' => '-',
    ' '   => '-' 
);

它正在运作,但我对这个解决方案感觉不舒服,因为我正在修补symfony的核心。 后来我可能希望每个默认值小写{name}或其他一些参数。

这有更好的方法吗?我觉得管理这些东西的最好方法是,如果可以定义一些" postSlugify" routing.yml中的参数...

我可以在我的用户实体中创建函数getName()和getNameSluggified()以及其他实体中类似的东西但是应该有一种自动化方法,而不会在每个实体中创建许多类似的函数。

1 个答案:

答案 0 :(得分:0)

因为它适合你,这里是完整的答案:

您可以使用Doctrine Sluggable extension

 class Foo
 {
     // your attributes
     // in the folowing "fields", you cas use several fields
    /**
    * @Gedmo\Slug(fields={"name", "bar"})
    * @ODM\String
    */
     private $slug;

  // some stuff
}

如果您更改字段属性,则需要刷新slug。 Here is the topic我发现了令人耳目一新的slu ..

您可以使用this documentation page在命令行工具中实现此功能。