Symfony 2 @Route注释区分大小写

时间:2013-06-24 12:15:49

标签: php symfony routing annotations

我正在尝试创建一个带有该路线注释的网址。

问题是我可以写任何大小,不同的网址。

@Route("/{staat}/", name="showStaats",requirements={"location" = "berlin|bayern|brandenburg"})

可以从www.example.com/berlinwww.example.com/Berlin下访问此网址。

但是,我只能在www.example.com/berlin下才能实现。

2 个答案:

答案 0 :(得分:2)

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

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

(?i:berlin|bayern|brandenburg)

答案 1 :(得分:1)

您有"/{staat}/",但您的要求设置为"location" = ...,这些要求应该匹配,所以这可能是导致问题的原因。

如果您不想对路由中的状态列表进行硬编码,则可以使用状态列表注入服务包含参数。请参阅文档中的How to use Service Container Parameters in your Routes,了解如何执行此操作。

如果您只是想检查一下,该状态是否全部都是低级的,您可以尝试以下要求:

staat: "[a-z-]+"

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

您还可以创建custom Router Loader,以编程方式创建路由,例如通过从数据库或文件中获取状态列表。

修改

正如我在评论中写的那样,我会将params列表添加为Service Container参数,例如: %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 / annotation的路由,但它仍然比在注释中填充16个状态的列表更好,更不用说它更容易维护。