[英]How to create route for example.com/username in Symfony and preserve all old URLs
目标:
我想要Facebook,Twitter等用户名网址: example.com/Username
问题 :
如果我添加,则无法访问/register
等URL
* @Route("/{user}", name="user_profile")
当然我可以有/user/username
,但我需要这个案例/username
。
实现这个的正确方法是什么?
一个想法是为404页面添加一个事件监听器,检查URL是否为example.com/abc
并检查用户名是否存在。 但这似乎是一个糟糕的黑客。
简短的问题:
如何以专业的方式制作像Facebook这样的路线www.example.com/username
,而不与/registe
r等冲突?
首先,您需要定义如何处理路径冲突,例如/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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.