Как генерировать маршруты, игнорируя дополнительные переданные параметры
Допустим, у меня есть следующие аннотации маршрута для действия контроллера:
* @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, и это не определено изначально