目标:
我想要用户名URL,例如Facebook,Twitter等:example.com/Username
问题:
如果添加,则无法访问/ register等URL.
* @Route("/{user}", name="user_profile")
当然,我可以有/ user / username,但是对于这种情况,我需要/ username.
实施此方法的正确方法是什么?
一种想法是为404页添加事件侦听器,该事件侦听器检查URL是否为example.com/abc并检查用户名是否存在.但这似乎是一个坏习惯.
简短问题:
如何使www.example.com/username之类的路线像Facebook,以专业的方式与/ register等冲突?
解决方法:
首先,您需要定义如何处理/ register,/ login,/ impressum之类的路径以及与这些路径(例如“ register”,“ login”和“ impressum”)冲突的用户名的冲突.您可能想要一个不允许的用户名黑名单,因为它们与您的预定义路径冲突.
为了解决实际的问题,您可以在所有其他路由之后为/ {username}创建一个“ catchall”路由(也许使用正则表达式对{username}部分有一些限制).
当您在symfony项目中请求路径时,symfony将按照定义的顺序检查路径.因此,如果您最后定义了用户配置文件路由(位于routing.yml文件的底部),则仅当所有其他路由均不符合请求时,才使用该路由.
这意味着,如果您的用户名类似于“ register”,则他将无法打开其个人资料页面,因为注册页面的/ register路由将首先与请求匹配.
在Symfony Standard Edition中,路由如下所示:
app:
resource: '@AppBundle/Controller/'
type: annotation
您不能使用注释处理路线位置,除非您在routing.yml文件中写入了多个条目.为了确保用户个人资料路由是最后一条,您可能应该删除此操作的注释,并使用yml创建路由,如下所示:
app:
resource: '@AppBundle/Controller/'
type: annotation
user_profile:
path: /{user}
defaults:
_controller: App:User:profile