基于学说的自定义symfony路由

时间:2012-03-05 16:20:52

标签: php symfony routes doctrine-orm

我需要有symfony 2的动态路由,其中​​一个slug参数被添加到url并且与数据库中的页面相关。每个页面都有一个自己的slug,其内容存储在数据库中。我阅读了文章Advanced Routing,但这是旧版的symfony。对于新版本,似乎ParamConverter做了类似的工作。这是实现基于学说的路由的正确方法,还是应该编写真正的自定义路由器类?

1 个答案:

答案 0 :(得分:6)

我会使用ParamConverter,是的。 FrameworkExtraBundle附带的默认DoctrineParamConverter可以处理大多数简单的情况 - 也就是说,它知道如何通过与路径占位符同名的字段查找类型化对象:

// routing.yml
foo_route:
    pattern: /{slug}/
    defaults: { _controller: FooVendorBundle:Foo:view }

// FooVendorBundle/Controller/FooController.php
public function view(FooEntity $foo)
{
    // $foo will be an instance of FooEntity
}

通常,在控制器的参数列表中,您将拥有一个$slug变量,该变量将从路由捕获的{slug}的内容中填充。但是,使用ParamConverter,它会识别您正在请求FooEntity类,并将尝试通过捕获的slug值找到该实体,并使用该实体填充$foo变量。

默认的ParamConverter当然仅限于能够在实体上查找实际存在的属性:如果FooEntity没有名为slug的字段,则查找将失败并抛出异常。就像我说的,这将处理大多数基本用例。如果您需要更深入地转换请求参数,您可以随时编写自己的。