Symfony 2 - 何时以及为什么路由参数会自动转换?

时间:2015-05-29 20:23:30

标签: symfony

我有这条路线:

pfs_platform_home:
path:      /{page}/{reset}
defaults:  { _controller: PFSPlatformBundle:Advert:index, page: 1, reset: true }
requirements:
    page: \d*
    reset: true|false

如果我在没有为 reset 指定任何内容的情况下使用链接,则路由器使用默认值,在我的indexAction中, reset 参数会自动转换为Boolean 。 即:

<li><a href="{{ path('pfs_platform_home') }}">Inicio</a></li>

但是当我这样做时,这次$ reset在我的indexAction中显示为字符串'false',而不是布尔值:

<a href="{{ path('pfs_platform_home', {'page': p, 'reset': 'false'}) }}">{{ p }}</a>

我错过了什么?

2 个答案:

答案 0 :(得分:1)

网址路径和参数始终是字符串。如果您有像

这样的网址
http://example.com/page/true?foo=2&bar=false

服务器无法知道true应该被解释为boolean,而foo应该是一个整数,bar也应该是布尔值。

如果您想处理网址参数,请务必将其作为字符串传递并处理。

稍后,您可以对其进行验证(例如is_numeric将告诉您字符串是否代表数字)或将其转换为其他类型。

您在此处遇到的是YAML对未加引号字符串的处理:

  • 如果字符串不包含在YAML中有意义的字符,则通常可以不加引号。

  • 但是:YAML中的true boolean true。因此,您的默认reset: true确实是一个布尔值。将其声明为reset: "true",它应该有效。 reset: true|false应该没问题,IMO(没有测试它,但这被视为正则表达式,因此它应该被解释为字符串。)

答案 1 :(得分:1)

您已经设置了参数的默认值:

pfs_platform_home:
path:      /{page}/{reset}
defaults:  { _controller: PFSPlatformBundle:Advert:index, page: 1, reset: true }
requirements:
    page: \d*
    reset: true|false

如果您不defaults: page,请查看1行,如果您不为reset提供价值,则默认为{{ 1}}。