我需要有symfony 2的动态路由,其中一个slug参数被添加到url并且与数据库中的页面相关。每个页面都有一个自己的slug,其内容存储在数据库中。我阅读了文章Advanced Routing,但这是旧版的symfony。对于新版本,似乎ParamConverter做了类似的工作。这是实现基于学说的路由的正确方法,还是应该编写真正的自定义路由器类?
答案 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
的字段,则查找将失败并抛出异常。就像我说的,这将处理大多数基本用例。如果您需要更深入地转换请求参数,您可以随时编写自己的。