自定义路线类

时间:2011-12-05 11:33:09

标签: symfony1 symfony

在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?

1 个答案:

答案 0 :(得分:3)

我可以想到两种方法。第一个,也是最简单的,是用你自己的方法扩展Router类,并告诉symfony在parameters.yml或config.yml中使用你的类:

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

有一个更强大(读取:复杂)的解决方案,它允许您通过覆盖或扩展整个路由器服务来定义路由器类的更多依赖项。有一个名为BeSimpleI18nRoutingBundle的捆绑包,您可以查看它是如何完成的。

具体来说,请注意他们用自己的服务替换默认router服务的CompilerPass。然后,您必须在自己的路由器类中实现RouterInterface。在这个特定的包中,他们inject the original default router(在编译器传递中重命名后)。