[英]Symfony 2 @Route annotation case-sensitive
我正在尝试创建带有路线注释的网址。
问题是我可以写任何大,小或不同的URL。
@Route("/{staat}/", name="showStaats",requirements={"location" = "berlin|bayern|brandenburg"})
可以从www.example.com/berlin
和www.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.