Php Symfony 2@Route annotation区分大小写

Php Symfony 2@Route annotation区分大小写,php,symfony,routing,annotations,Php,Symfony,Routing,Annotations,我正在尝试创建一个带有路由注释的url 问题是,我可以写任何URL大,小或不同 @Route("/{staat}/", name="showStaats",requirements={"location" = "berlin|bayern|brandenburg"}) 可以从www.example.com/berlin和www.example.com/berlin下访问此URL 然而,我想,只有在www.example.com/berlin下才能实现,因为您有“/{statat}/”,但是您的

我正在尝试创建一个带有路由注释的url

问题是,我可以写任何URL大,小或不同

@Route("/{staat}/", name="showStaats",requirements={"location" = "berlin|bayern|brandenburg"})
可以从
www.example.com/berlin
www.example.com/berlin
下访问此URL

然而,我想,只有在
www.example.com/berlin
下才能实现,因为您有
“/{statat}/”
,但是您的需求集
“location”=…
,这些应该匹配,所以可能这就是您问题的原因

如果不想硬编码路由中的状态列表,可以将状态列表注入服务容器参数。有关如何做到这一点,请参见文档中的

如果您只想检查该状态是否为小写,您可以尝试以下要求:

staat: "[a-z-]+"
这应该只匹配小写字符和破折号(例如“sachsen anhalt”)。但我不完全确定这是否会起作用,因为路由器的正则表达式检测有点古怪

您还可以创建一个将以编程方式创建路由的,例如通过从数据库或文件获取状态列表

编辑

正如我在评论中所写,我将添加参数列表作为服务容器参数,例如包含状态列表的
%my_demo.states%
。但是,我不确定这是否适用于注释。因此,这里有一个快速的解决方法,如何让它工作

app/config/config.yml
中添加
%my_demo.states%
参数:

my_demo:
    states: ["berlin", "brandenburg", "sachsen-anhalt", ... ]
在你的
app/config/routing.yml
中应该有如下内容:

my_demobundle:
    resource: "@MyDemoBundle/Controller/"
    prefix:   /
    type:     annotation
type:annotation
@MyDemoBundle
是相关部分。在这条路线之前添加以下路线,以确保其优先:

showStaats:
    path:     /{state}
    defaults: { _controller: MyDemoBundle:State:index }
    requirements:
        state: %my_demo.states%
这将添加一个路由,该路由将在使用状态列表作为参数的注释之前应用。这有点粗糙,因为您混合了基于yml/注释的路由,但它仍然比在注释中塞满16个状态的列表要好,更不用说它更易于维护。

您有
“/{stat}/”
,但是您的需求集
“location”=…
,这些应该匹配,也许这就是你问题的原因

如果不想硬编码路由中的状态列表,可以将状态列表注入服务容器参数。有关如何做到这一点,请参见文档中的

如果您只想检查该状态是否为小写,您可以尝试以下要求:

staat: "[a-z-]+"
这应该只匹配小写字符和破折号(例如“sachsen anhalt”)。但我不完全确定这是否会起作用,因为路由器的正则表达式检测有点古怪

您还可以创建一个将以编程方式创建路由的,例如通过从数据库或文件获取状态列表

编辑

正如我在评论中所写,我将添加参数列表作为服务容器参数,例如包含状态列表的
%my_demo.states%
。但是,我不确定这是否适用于注释。因此,这里有一个快速的解决方法,如何让它工作

app/config/config.yml
中添加
%my_demo.states%
参数:

my_demo:
    states: ["berlin", "brandenburg", "sachsen-anhalt", ... ]
在你的
app/config/routing.yml
中应该有如下内容:

my_demobundle:
    resource: "@MyDemoBundle/Controller/"
    prefix:   /
    type:     annotation
type:annotation
@MyDemoBundle
是相关部分。在这条路线之前添加以下路线,以确保其优先:

showStaats:
    path:     /{state}
    defaults: { _controller: MyDemoBundle:State:index }
    requirements:
        state: %my_demo.states%
这将添加一个路由,该路由将在使用状态列表作为参数的注释之前应用。这有点粗糙,因为您正在混合使用基于yml/注释的路由,但它仍然比在注释中塞满16个状态的列表要好,更不用说它更易于维护了。

回答了“如何满足不区分大小写的路由要求”的问题:

您可以向requirement regexp添加不区分大小写的修饰符,如下所示:

(?i:berlin | bayern | brandenburg)

回答“如何制定不区分大小写的路由要求”的问题:

您可以向requirement regexp添加不区分大小写的修饰符,如下所示:


(?i:berlin | bayern | brandenburg)

我有机会将其放入@Route(“/{location}/”,name=“showstatats”,requirements={location:[a-z-]+“location”=“berlin | bayern | brandenburg”)。因此它不起作用。您的注释中又出现了一个小错误(两个需求之间缺少一个逗号)。我不认为您可以同时应用这两个要求,一个要求可能会覆盖另一个要求。您应该使用我链接的服务容器参数方法,因为您有一个固定的状态列表。我将在我的答案中添加一个示例…我有机会将其放入@Route(“/{location}/”,name=“showstatats”,要求={location:[a-z-]+“location”=“柏林|拜仁|勃兰登堡”})。注释中又出现了一个小错误(两个需求之间缺少逗号)。我认为你不能同时满足两个要求,一个可能会覆盖另一个。您应该使用我链接的服务容器参数方法,因为您有一个固定的状态列表。我将在我的答案中添加一个示例。。。