我正在尝试创建一个带有该路线注释的网址。
问题是我可以写任何大小,不同的网址。
@Route("/{staat}/", name="showStaats",requirements={"location" = "berlin|bayern|brandenburg"})
可以从www.example.com/berlin
和www.example.com/Berlin
下访问此网址。
但是,我只能在www.example.com/berlin
下才能实现。
答案 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个状态的列表更好,更不用说它更容易维护。