【问题标题】:How to create route for example.com/username in Symfony and preserve all old URLs如何在 Symfony 中为 example.com/username 创建路由并保留所有旧 URL
【发布时间】:2018-02-02 11:18:18
【问题描述】:

目标:

我想要 Facebook、Twitter 等用户名 URL:example.com/Username

问题

如果我添加了/register 等网址,则无法访问

   * @Route("/{user}", name="user_profile")

当然我可以有/user/username,但我需要/username

实现这个的正确方法是什么?

一个想法是为 404 页面添加一个事件侦听器,它检查 URL 是否为 example.com/abc 并检查用户名是否存在。但这似乎是一个糟糕的 hack。

小问题:

如何以专业的方式制作像 Facebook 一样的www.example.com/username 路由,而不与/register 等发生冲突?

【问题讨论】:

标签: php symfony routing routes


【解决方案1】:

首先,您需要定义如何处理路径冲突,例如/register/login/impressum,以及与这些路径冲突的用户名(例如“注册”、“登录”和“印象” )。您可能希望拥有一个不允许使用的用户名黑名单,因为它们会与您的预定义路径发生冲突。

为了解决实际问题,您可以为/{username} 创建一个“catchall”路由(可能对使用正则表达式的{username} 部分有一些限制)所有其他路由之后。

当您在 symfony 项目中请求路径时,symfony 将按照定义的顺序检查路由。所以如果你最后定义你的用户配置文件路由(在 routing.yml 文件的底部),它只会在所有其他路由不匹配请求时使用。 这意味着,如果您有一个名为“注册”的用户,他将无法打开他的个人资料页面,因为注册页面的 /register 路由将首先匹配请求。

在 Symfony 标准版中路由是这样的:

app:
    resource: '@AppBundle/Controller/'
    type: annotation

您无法使用注释处理路线位置,除非您在 routing.yml 文件中写入多个条目。为了确保用户配置文件路由是最后一个,您可能应该删除此操作的注释并使用 yml 创建路由,如下所示:

app:
    resource: '@AppBundle/Controller/'
    type: annotation

user_profile:
    path: /{user}
    defaults:
        _controller: App:User:profile

【讨论】:

  • 感谢 Tobias,这正是我想要的!不过需要注意的是,它只在开发环境中工作,在 prod 上它给了我一个 404。通过 ./bin/console 缓存清除缓存后:clear --no-warmup --env=prod; ./bin/console cache:warmup --env=prod 效果不佳。我不得不通过 rm -rf app/cache/* 手动清除缓存,然后它就起作用了。我现在会接受您的回答,再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2016-10-10
  • 1970-01-01
  • 2015-12-20
  • 2013-07-26
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多