我正在尝试创建一个带有路由注释的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个状态的列表要好,更不用说它更容易维护了。