2011-12-05 68 views
5

在symfony的1.4,你可以定義一個自定義路由類,在那裏你重寫URL的生成與定製邏輯,例如:自定義路由類

custom: 
    class: sfDoctrineRouteCollection 
    options: 
    model:    Custom 
    prefix_path:   /custom/category/:category_id 
    column:    id 
    route_class:   CustomDoctrineRoute 

class CustomDoctrineRoute extends sfDoctrineRoute 
{ 
    public function generate($params, $context = array(), $absolute = false) 
    { 
    if (!isset($params['category_id'])) { 
     $params['category_id'] = sfContext::getInstance()->getRequest()->getParameter('category_id'); 
    } 

    return parent::generate($params, $context, $absolute); 
    } 

} 

這樣寫url_for('custom_show', array('id'=> $object['id']))並沒有理會上下文相關的參數(CATEGORY_ID)。

你如何處理這個是symfony2?

+0

在這裏我已經通過覆蓋UrlGenerator解決了類似的問題:http://stackoverflow.com/questions/8877806/symfony2-use-object-to-set-route-parameters – Dziamid

回答

3

我能想到2種方法。第一個,也是最簡單的,就是用自己的擴展Router類,並告訴symfony的使用你的類在parameters.yml或config.yml:

parameters: 
    router.class: Company\CoreBundle\Routing\MyCustomRouter 

有一個更強大(讀:複雜的)解決方案允許您通過覆蓋或擴展整個路由器服務來定義更多的路由器類的依賴關係。有一個叫做BeSimpleI18nRoutingBundle的軟件包,你可以看看它是如何完成的。

具體來說,請注意CompilerPass他們在哪裏用自己的默認router服務替代。然後你必須在你自己的路由器類中實現RouterInterface。在這個特定的包中,他們inject the original default router(在編譯器通過重命名後)。