2016-06-14 41 views
0

我有以下路由定義symfony的路由,使用值從請求的默認

my_route: 
    path:    /actual-path/ 
    defaults: 
     _controller: MyBundle:MyController:detail 
     id:    application_id 
    requirements: 
     methods:  GET 
     id:    \d+ 

控制器需要一個叫做$id參數。

但我不希望在URL中使用的$id,我想用一個值是在$request->attributes->get('application_id')

可有將注入兩個參數(application_idapplication)到請求的監聽器對象作爲路由過程之前的屬性,所以這個值就在那裏。 (它也很容易注入到RequestContext)。

有沒有一種方法可以使用我的路由中的RequestRequestContext對象的屬性值作爲默認值?


現在我可以簡單地在我的控制器中執行$request->attributes->get('application_id')。但是這種控制器將在幾種情況下使用。在其他情況下,$id將通過url傳遞。我發現在路由器中設置id比在控制器中建立if-else子句更清潔。

+0

Controller :: myAction(Request $ request,$ application_id)會做你想做的。控制器解析器將使用參數名稱自動將數據從請求對象中拉出。你的問題有點混亂。如果這個id不存在於url中,那麼只需讓你的監聽器添加到application_id中。無論如何,我懷疑你的路線定義需要更多的工作。 – Cerad

+0

事情是,我無法更改控制器:action,因爲這是一個通用操作(位於供應商目錄中)。所以控制器期待'id',但Request中的值是'application_id'。所以基本上,我需要在路由配置中進行某種映射。 – DoppyNL

+0

我想你可以用表達式來完成它:http://symfony.com/doc/current/book/routing.html#completely-customized-route-matching-with-conditions。否則,添加另一個內核監聽器來執行此操作。 – Cerad

回答

0

似乎不可能在請求對象中的變量之間進行「映射」,並且您的路由/控制器操作需要您需要的參數。我認爲這會是一件好事,否則它會變得非常複雜。

我用解決方案來擴展控制器,並在那裏建立一個小型開關。

基本上,如果路由指定了id === null,它將執行回退到請求對象中的application_id。否則它將使用提供的值。我只需要在不能使用回退的路由上設置id的要求。

所有這些都沒有運行額外的Listener,這可能在處理時間(對於每個請求)中有點「昂貴」。路線

例子:

my_route: 
    path:    /actual-path/ 
    defaults: 
     _controller: MyBundle:MyController:detail 
     id:    null 
    requirements: 
     methods:  GET 

my_other_route: 
    path:    /other-path/{id} 
    defaults: 
     _controller: MyBundle:MyController:detail 
    requirements: 
     methods:  GET 
     id:    \d+ 

以及如何在控制器來處理這個問題:

// fallback to system id 
    if ($id === null) { 
     $id = $request->attributes->get('administration_id', null); 
    } 

因爲您擴展控制器/動作,你也可以在更改參數的名稱行動(只要類型不變)。

我沒有這樣做,因爲我可以很容易地在提供的ID和從另一個方法中的偵聽器回退之間進行切換。

+0

請注意,您可以使用您的現有偵聽器。用戶可以在不同的時間收聽不同的事件。但是,無論對你而言,都是好的。 – Cerad