Как генерировать маршруты, игнорируя дополнительные переданные параметры

Допустим, у меня есть следующие аннотации маршрута для действия контроллера:

* @Route("/post/{post_id}/", name="post.view")
* @Route("/post/", name="post.current_view")

И я хочу использовать веточку для генерации URL для этого:

{{ url(basePath~'view', {'post_id':post.postId}) }}
//basePath will either be "post." or "post.current_"

То, что я сейчас получаю, это:

domain.com/post/1/
domain.com/post/?post_id=1

Однако я хочу, чтобы был сформирован второй маршрут, игнорирующий любые переданные ему параметры "EXTRA", чтобы я мог получить только:

domain.com/post/

Кто-нибудь знает, если это то, что может быть достигнуто изначально? Я знаю, что мог бы исправить пользовательскую функцию ветки, которая использует маршрутизатор, а затем я могу сгенерировать маршруты и убрать строку запроса, но я хочу избежать этого, если где-то есть простое переключение, которое я пропустил.

2 ответа

Решение

Решение №1: вы можете просто добавить условие if

{% if BasePath == 'post.' %}
    {{ url(BasePath~'view', {'post_id':post.postId}) }}
{% elseif BasePath == 'post.current_' %}
    {{ url(BasePath~'view') }}
{% endif %}

может быть, не самый элегантный, но должен работать.

Решение № 2

разделение URL с вопросительными знаками и получение первой строки

{% set myUrl = url(basePath~'view', {'post_id':post.postId}) %}
{{ myUrl|split("?")|first }}

Решение №3 Или вы можете переопределить функцию url, расширив класс RoutingExtension для ветки.

Symfony\Bridge\Twig\Extension\RoutingExtension

можно найти пример здесь с path но url должно быть таким же.

Вы должны переопределить эту функцию

 public function getUrl($name, $parameters = array(), $schemeRelative = false)
    {
        return $this->generator->generate($name, $parameters, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
    } 

ваша функция может выглядеть так:

public function getUrl($name, $parameters = array(), $schemeRelative = false)
{
   $yourUrl = parent::getUrl($name, $parameters = array(), $schemeRelative = false);
   return strstr($yourUrl, '?' , true);
}

что идентифицирует это удаляет все после знака вопроса.

Чтобы переопределить класс по умолчанию, вы должны добавить к параметрам

twig.extension.routing.class: MyNamespace\MyRoutingExtension

Я думаю, нет, вам нужен фильтр preg_replace, и это не определено изначально

Другие вопросы по тегам