我经常发现自己的路由需要 2+(有时是 4+)参数来生成路由。只要我只需要在几个点生成路线,这就可以了。但是我经常发现自己在许多地方复制参数列表,包括Twig和PHP(控制器和服务)。参数通常不仅仅是记录 ID。
例如,假设我有以下路由:
/product/{id}/{category_slug}/{category_sub_slug}/{product_slug}
要在 Twig 中生成它,我需要像这样的东西:
path('product_view', {
id: product.id,
category_slug: product.subCategory.category.slug,
category_sub_slug: product.subCategory.slug,
product_slug: product.slug
})
这在 1 个地方已经够糟糕的了,但是一旦你开始在任何地方应对它,当有人决定他们不想再包含 ID 时,情况就更糟了。
问:有没有办法添加一种可重用的方法,比如product_path($product)
可以在 Twig 和控制器/服务中使用的方法?或者扩展路由器或 UrlGenerator 以确定如何使用实体/对象生成路由?
我可以做一个服务来做这件事,然后做一个Twig扩展,但似乎是一件很常见的事情,需要完成很多工作/代码。
一个想法是我可以这样的地方:
path('product_view', { product: product })
$this->generateUrl('product_view', ['product': product]);
从那里它可以弄清楚如何生成URL。当然,逻辑是我写的,但我只需要传递路由器。
我认为最简单的解决方案是创建一个自定义服务和 twig 扩展,就像你所说的那样,使用你自己的 twig 函数。
经过一些小调查,path
twig 函数使用UrlGenerator
类,正确覆盖它似乎比创建自定义服务/树枝函数更困难。