【问题标题】:Symfony2 character between parameters in route路由中参数之间的 Symfony2 字符
【发布时间】:2016-02-08 12:14:05
【问题描述】:

所以我有这条路线

path: /view/{category}-{subcategory}

我正在尝试在我的树枝中渲染这条路线

href="{{ path('my_route', {category: cat.slug, subcategory: sub.slug }) }}"

但是 symfony 向我抛出了这个错误

在渲染模板期间抛出异常(“路径“my_route”的参数“category”必须匹配“[^/-]++”(给定“food-cheap”))

当我设置真实参数时,它不应该自动生成- 字符吗?如果我将- 更改为/ 它可以工作,但我不想使用斜杠,因为它不是category 中的URI。

如果我使用它,它也可以工作

requirements: category: ".*"

但是使用 slugs(因为它是重点)作为参数,太疯狂了。

例如 category: something subcategory: super-size

URI 应该是 /view/something-super-size 但 Symfony2 这么说

category = something-super

subcategory = size

因为所有东西都有-,并且它不知道在正则表达式模式中停止在哪里。

我发现了一个奇怪的行为......

如果我手动输入网址

http://localhost/view/something-super-size

它正确地进入它的控制器,没有问题并且没有使用要求所以问题可能出在{{ path() }}方法...

【问题讨论】:

  • 当然不是!生成路由路径由您决定。 Symfony 不会生成任何- 字符。您的正则表达式应该是:^\/view\/(\w+\-\w+) 或只是 /view/{slug} 并在树枝中:path('my_route', {category: cat.slug ~ "-" ~ sub.slug })
  • 使用我的答案,破折号是使用path 方法自动生成的。

标签: symfony


【解决方案1】:

要使您的路线使用破折号作为分段分隔符,请像这样声明您的路线:

my_route:
    path: /view/{category}-{subcategory}
    defaults:
        _controller: YourBundle:Controller:method
    requirements:
        category: "[a-zA-Z1-9\-_\/]+"

现在使用时,破折号将自动添加到您的参数之间
href="{{ path('my_route', {category: cat.slug, subcategory: sub.slug }) }}"

编辑

更准确地说,使用给定的正则表达式,破折号将被视为 uri 段分隔符,而不是参数的一部分。
参数是完整的(不包含-),当你使用path方法生成url时,参数之间会自动添加-。正则表达式只是让它工作。

See it in action

【讨论】:

  • 我认为类别不应该匹配[a-zA-Z1-9\-_\/]+,因为-是两个表达式之间的分隔符
  • 试过了,它可以工作,在模板中生成 url 时,破折号会自动添加到参数之间,并且可以使用 /view/1-2 之类的东西访问。见prntscr.com/a0jevh
  • @chalasr 是的,但它应该检测{category} 作为参数,而- 只是一个URL 元素,如破折号/。它将破折号检测为 URI 分隔符,为什么不 -requirements 像你说的那样工作,这就是为什么我用.* 代替category 但是......我认为使用它是不正确的,因为- 不是参数的一部分
  • 正如您在我的屏幕截图中看到的那样,- 不是参数的一部分,只是参数之间的分隔符,并且完全由 path 方法自动生成,完全符合您的需要(除非我误解了你的问题),默认情况下与/ 相同。试试看,您的类别参数将保持不变,并且不会包含-。这个替代方案解决了这个问题stackoverflow.com/questions/7706887/…
  • 好吧,我已经尝试过了,例如,我给出了这个类别:something 和一个子类别 super-size 使用你的答案,我在我的请求中得到这个 category = something-super subcategory = 'size' 你可以自己测试一下。我的 URI 参数是 SLUGS,而不是 id,因此路由无法评估参数是什么以及分隔符是什么......因为在分隔符中,所有内容的值中都有一个“-”
猜你喜欢
  • 2015-01-07
  • 2014-06-21
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2014-11-23
相关资源
最近更新 更多