Symfony 2@路由注释区分大小写


Symfony 2 @Route annotation case-sensitive

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

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

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

此URL既可以从www.example.com/berlin访问,也可以在www.example.com/Berlin下访问。

然而,我认为只有在www.example.com/berlin下才能实现。

回答"如何做出不区分大小写的路由要求"的问题:

您可以在需求正则表达式中添加不区分大小写的修饰符,如下所示:

(?i:berlin|bayern|brandenburg)

您有"/{staat}/",但您的需求集为"location" = ...,它们应该匹配,所以这可能是问题的原因。

如果您不想对路由中的状态列表进行硬编码,则可以注入一个带有状态列表的服务容器参数。请参阅文档中的"如何在路线中使用服务容器参数",了解如何执行此操作。

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

staat: "[a-z-]+"

这应该只匹配小写字符和短划线(例如"sachsen-anhalt")。但我不完全确定这是否有效,因为路由器的正则表达式检测有点古怪。

您还可以创建一个自定义的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

CCD_ 11和CCD_。在此路由之前添加以下路由,以确保其优先:

showStaats:
    path:     /{state}
    defaults: { _controller: MyDemoBundle:State:index }
    requirements:
        state: %my_demo.states%

这将添加一个路由,该路由将使用状态列表作为参数在注释之前应用。这有点粗糙,因为您混合了基于yml/annotation的路由,但它仍然比在注释中填充16个状态的列表要好,更不用说它更容易维护了。