2011-12-05 70 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(在编译器通过重命名后)。