繁体   English   中英

Symfony 2 @Route注释区分大小写

[英]Symfony 2 @Route annotation case-sensitive

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

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

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

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

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

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

您可以将不区分大小写的修饰符添加到要求regexp中,如下所示:

(?i:berlin|bayern|brandenburg)

您有"/{staat}/" ,但是您的需求设置为"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种状态列表更好,而且更易于维护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM