2013-06-24 39 views
0

我試圖創建一個帶有路由註釋的URL。Symfony 2 @Route註釋區分大小寫

問題是我可以寫任何大的,小的或不同的URL。

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

此網址可無論是從www.example.com/berlinwww.example.com/Berlin進行訪問。

但是,我認爲只有在www.example.com/berlin之下才能達到。

回答

1

你有"/{staat}/",但你的需求設置"location" = ...,這些應該匹配,所以也許這是你的問題的原因。

如果您不想對路由中的狀態列表進行硬編碼,則可以使用狀態列表注入服務包含器參數。請參閱文檔中的How to use Service Container Parameters in your Routes以瞭解如何執行此操作。

如果你只是要檢查,該州是否是全是小寫字母,你可以嘗試以下要求:

staat: "[a-z-]+" 

這應該僅匹配小寫字符和破折號(如「薩克森 - 安哈特」) 。但我不完全確定這是否會工作,因爲路由器的正則表達式檢測有點古怪。

您還可以創建一個custom Router Loader,它將以編程方式創建路線,例如,通過從數據庫或文件中獲取狀態列表。

編輯

正如我在評論中寫道我想補充則params的列表作爲服務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 /註釋的路由,但它仍然比在註釋中填充16個狀態列表更好,更不用說更易於維護。

+0

我有機會成@路線(「/ {location} /」,name =「showStaats」,requirements = {location:「[az - ] +」location「=」berlin | bayern | brandenburg「}),因此它不起作用 – Vico

+0

在你的註釋中再次出現一個小錯誤(你的兩個要求之間缺少一個逗號)。我認爲你不能同時適用這兩個要求,一會覆蓋另一個。您應該使用我鏈接的服務容器參數方法,因爲您有一個固定的狀態列表。我會在我的答案中添加一個示例... – dbrumann

1

回答這個問題:「如何使不區分大小寫的路由需求」:

您可以添加不區分大小寫的修飾符需求正則表達式,像這樣:

(?i:berlin|bayern|brandenburg)