如何生成忽略额外传递参数的路由

时间:2014-09-05 00:47:51

标签: symfony twig symfony-2.5 symfony-routing

假设我有一个控制器操作的以下路由注释:

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

我想使用twig为此生成网址:

{{ 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 个答案:

答案 0 :(得分:1)

解决方案#1 您只需添加if子句

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

也许不是最优雅但应该有用。

解决方案#2

使用问号分割网址并获取第一个字符串

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

解决方案#3 或者您可以通过扩展RoutingExtension类的twig来覆盖url函数。

Symfony\Bridge\Twig\Extension\RoutingExtension

可以找到path的{​​{3}}示例,但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

答案 1 :(得分:0)

我猜不是,你需要一个preg_replace过滤器,这不是原生定义的