2015-04-15 19 views
0

我想有多個路由只有在URI內一條路徑「的一部分」,但加載不同類型的內容。Symfony2的 - 根蛞蝓爲不同的內容類型

例如,我想有使用CMS創建的網頁通過/page-slug-here被加載。不過,我也希望產品通過/product-slug-here被加載,通過/category-slug-here加載類,通過/brand-slug-here裝品牌等

做什麼用的Symfony2實現這一目標,而無需進行復雜的(和低效)鏈的最佳/最動態的方式控制器轉發到下一個動作,當他們各自的內容無法找到?

我也想避免,檢查每一個類型的內容,一個動作。

回答

1

您可以攔截請求並使用您自己的路由器偵聽器執行您的魔術。

我沒有測試它自己,但我只是想給你點到正確的方向。

在你service.xml文件,你可以添加類似的東西:

<parameters> 
     <parameter key="my.router_listener.class">MyBundle\Listener\RouterListener</parameter> 
    </parameters> 

    <services> 
     <service id="my.router_listener" class="%my.router_listener.class%"> 
      <argument type="service" id="doctrine.orm.entity_manager" /> 
      <tag name="kernel.event_subscriber" priority="33" /> 
     </service> 
    </services> 

這裏的優先級是很重要的。 32是默認路由器。你想成爲它。 http://symfony.com/doc/current/reference/dic_tags.html

然後創建這樣的服務:

class DynamicRouterListener extends RouterListener 
{ 
    private $entityManager; 

    public function __construct(EntityManager $entityManager) 
    { 
     //... 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     $path = $request->getPathinfo(); 

     // Some magic here 
     if(// magic is true) { 
      $request->attributes->set('_controller', 'MyBundle:MyController:myAction'); 
     } 
    } 
} 

路由器默認的,那隨之而來的,將看到_ controller參數已經存在,並會跳過匹配到dafult規則。

+0

謝謝,這比使用控制器動作決定轉發請求的位置要好得多,並且不需要對404進行任何額外的處理。我想在此基礎上進行構建,這是使全局路由不會冒險發生衝突的最佳方式或需要一系列的數據庫查詢,將有一個'Route'實體與每種類型的內容有關?他們可以通過批量獲取(並在生產中緩存)用於我的路由器事件偵聽器使用的服務,這將處理檢查請求的URI是否存在? – Adam

+0

@亞當我認爲這是一個設計問題。當然,您可以創建儘可能多的偵聽器作爲您想要的對象類型,但問題是您將擁有多少類型以及將來有可能如何更改?如果,正如你在帖子中提到的那樣,你有三種類型,那麼我會建議在一個類中處理它。只要保持小。 –

-1

我不認爲你可以,不能完全或不冒衝突。

你需要的東西,會告訴你指的是哪件事路由器,也可以不以任何方式知道這是否是一個產品,一個頁面或一個品牌。至少,您需要手動避免名稱衝突。

您可以設置3條路線,與匹配模式,就像這樣:

/** 
* @Route("/{page-slug}") 
* 
* 
* @Method("GET") 
*/ 
public function pageAction(PageClass $page) 
{ 
    ... 
} 

,但你不能決定它試圖先匹配路由器內;所以,在發生碰撞的情況下,你基本上已經擰緊了。

+0

這正是作者不想做的。 –

+0

嗯,我把更多的思想放在裏面,你說得對。我將編輯答案 – Jean

+0

謝謝,但如前所述,使用控制器操作轉發其他操作是我試圖避免的。 – Adam