【问题标题】:symfony2 special routes wildcard nothing elsesymfony2 特殊路由通配符没有别的
【发布时间】:2013-03-22 10:26:41
【问题描述】:

问题:

需要有这样的网址:

wall:
pattern:  /{username}/

但是..它匹配每个网址,例如 /Messages/、/Settings/

唯一想到的解决方案是检查该用户是否存在......如果没有重定向到真实的 /Settings ?但它为每一页选择一个,我不喜欢它。

还有其他方法吗? + 我可能还需要拒绝使用路由模式注册用户?怎么样?

不,我不想在 URL 中添加类似的东西 /User/{username}

【问题讨论】:

  • 这似乎是不可能的。考虑到有一天您可能会创建名为“sales”的页面,并且您的用户数据库可能包含名为“sales”的用户。您需要在模式中添加一些前缀(或后缀),以便能够将普通页面与用户配置文件区分开来。
  • hm...但是可以说我会关心它...我该如何解决我今天的问题?
  • 好的,我想我在这里看到了一个可能的模式。每个“页面”都以大写字母开头,所以您能否将用户名限制为仅小写,至少以小写字符开头?
  • hm... 是的,我想我可以将所有正常页面的第一个 leeter 设为大写(/Messages、/Settings、)AND 用户名,如 /james /trki / jperovic 我会喜欢这样的,但是......我能以某种方式将它转换成路线吗?因为如果用户输入 server.com/JPEROVIC 会发生什么?路由文件能否以某种方式将其转换为 server.com/jperovic?
  • 我认为没有办法进行这种转换。您可以在注册期间静默执行转换吗?

标签: symfony match routes


【解决方案1】:

根据我的评论,这可能是一种解决方法:

pages:
    pattern: /{page}/
    requirements:
        page: "(Messages|Settings|SomeOtherPage|YetAnotherPage)"
wall:
    pattern:  /{username}/

基本上,它要求页面(设置、消息等)以大写字母 ([A-Z]) 开头,页面名称的其余部分并不重要。

对于用户个人资料页面,它们应明确以小写字符 ([a-z]) 开头。

我不知道这是否满足您的要求...

编辑:

这实际上是@tomas.pecserke 的简化解决方案。我刚刚编辑了路由,因此所有页面都在单个路由中枚举。

【讨论】:

  • hm...起初:InvalidArgumentException:“用户名”的路由要求必须是字符串。 + .即使这项工作似乎可以要求用户输入像 /jperovic 这样的小写地址?
  • 我认为......我什至不必提出要求。我可以将所有页面路由放在前面。然后会出现 {username} 路线,很容易有 /Trki 或 /trki 它与页面不匹配 + 当我创建新页面时,我只会“使用此用户名注册新用户”。你说什么?
  • 我已经编辑了路线,但在这种情况下,您在路线要求中列出了所有可能的页面。这有点不太灵活,但它可以完成工作。这个解决方案实际上是@tomas.pecserke 在他的回答中给出的简化...
  • 至于InvalidArgumentException,我认为你需要引用正则表达式
  • 你是对的,但是当我添加墙路由的要求并且在 /Messages 路由后面时它仍然匹配它..所以我删除了要求...墙仍然在消息路由后面,当我访问 /Messages 它可以工作..所以我将注册用户名“Messages”等我只有几页没问题,......然后这应该很好用吧?因为我会有唯一的名字。但是我仍然想问一下您的带有模式 /{page} 和枚举所有页面的路由页面有什么好处?
【解决方案2】:

我强烈建议不要使用这种方法。您应该明确地为路线添加前缀。但是如果一定要这样的话,可以先指定其他路由。 RouteMatcher 选择第一个匹配模式的路由。

# src/Acme/DemoBundle/Resources/routing.yml
account:
    pattern: /account
    defaults: # ...
some_other_route:
    pattern: /some_other_route
    defaults: # ...
wall:
    pattern: /{username}/
    defaults: # ...
    # you can set requirements
    requirements:
        username: [a-z0-9]+ # regular expression

【讨论】:

  • hm.. 是的,我会把它们放在前面.. 对于其他人来说,reg exp 必须被引用
猜你喜欢
  • 2014-06-21
  • 2015-08-24
  • 2016-02-29
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多