基于原则的自定义符号路由


Custom symfony routing based on doctrine

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

我会使用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的字段,则查找将失败,并引发异常。正如我所说,这将处理大多数基本用例。如果您需要对请求参数进行更深入的转换,您可以随时编写自己的参数。