Повторное использование маршрутов Symfony со сложными/многими параметрами

Я часто сталкиваюсь с маршрутами, которые требуют 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. Конечно, я написал логику, но мне нужно было только передать маршрутизатор.


person Darryl Hein    schedule 03.01.2018    source источник


Ответы (1)


Я думаю, что самое простое решение - создать собственный сервис и расширение ветки, как вы сказали, с помощью собственной функции ветки.

После небольшого исследования path twig функция использует UrlGenerator class, и кажется, что переопределить его правильно сложнее, чем создать пользовательскую функцию службы/twig.

person Fabien Salles    schedule 04.01.2018