Я часто сталкиваюсь с маршрутами, которые требуют 2+ (иногда 4+) параметров для создания маршрута. Это нормально, пока мне нужно сгенерировать маршрут только в паре мест. Но я часто ловлю себя на том, что воспроизводю список параметров во многих местах, как в Twig, так и в PHP (контроллеры и службы). Параметры часто представляют собой нечто большее, чем идентификатор записи.
Например, скажем, у меня есть следующий маршрут:
/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
})
Это достаточно плохо в одном месте, но ужасно, когда вы начинаете справляться с этим повсюду, и еще хуже, когда кто-то решает, что больше не хочет включать идентификатор.
Вопрос: есть ли способ добавить многоразовый метод, скажем, product_path($product)
, который можно использовать как в Twig, так и в контроллерах/сервисах? Или расширить Router или UrlGenerator, чтобы определить, как сущность/объект следует использовать для генерации маршрута?
Я могу сделать сервис для этого, а затем расширение Twig, но это кажется обычным делом и требует много работы/кода.
Одна идея заключается в том, где я мог бы что-то вроде:
path('product_view', { product: product })
$this->generateUrl('product_view', ['product': product]);
Оттуда он мог выяснить, как сгенерировать URL. Конечно, я написал логику, но мне нужно было только передать маршрутизатор.