我有这样的路线:
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()以及其他实体中类似的东西但是应该有一种自动化方法,而不会在每个实体中创建许多类似的函数。
答案 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在命令行工具中实现此功能。