Symfony 2链接到当前页面

时间:2012-04-04 12:09:17

标签: php symfony twig routes

如何在模板中创建当前链接?

我想创建一个语言切换器,它应该链接到varios语言中的当前页面,因此所有参数都应该与语言环境相同。

3 个答案:

答案 0 :(得分:7)

我最终为此推出了自己的功能。我虽然起初它被包含在FrameworkBundle的某个地方,但没有找到任何关于它的内容。这是我采取的步骤。

首先,我创建了一个Twig扩展函数,它将输出与用户当前访问的路径相同的路径(包括参数和查询字符串)。我把这一步留给了你。如果您不知道如何创建Twig扩展,可以从Symfony2的优秀教程中查看this link。如果你需要,我可以帮助你。

下一步是创建将切换当前路由的语言环境的函数本身。此函数需要RequestRouter个对象作为依赖项。在我个人的案例中,我将此功能放在名为RoutingHelper服务的专用服务中。然后我的Twig扩展功能使用此服务。这里我添加到依赖容器中的服务定义:

acme.helper.routing:
    class: Application\AcmeBundle\Helper\RoutingHelper
    scope: "request"
    arguments:
        request: "@request"
        router: "@router"

我服务的构造函数:

protected $request;
protected $router;

public function __construct($request, $router)
{
    $this->request = $request;
    $this->router = $router;
}

$ locale参数是要切换到的新语言环境。这里的功能是:

public function localizeCurrentRoute($locale)
{
    $attributes = $this->request->attributes->all();
    $query = $this->request->query->all();
    $route = $attributes['_route'];

    # This will add query parameters to attributes and filter out attributes starting with _
    $attributes = array_merge($query, $this->filterPrivateKeys($attributes));

    $attributes['_locale'] = $locale;

    return $this->router->generate($route, $attributes);
}

基本上,它执行其他人到目前为止所做的事情,但它也处理参数和查询字符串。方法filterPrivateKeys将从路由属性中删除私有属性。这些属性是以下划线开头的属性,不应传递回路由生成器。这是它的定义:

private function filterPrivateKeys($attributes)
{
    $filteredAttributes = array();
    foreach ($attributes as $key => $value) {
        if (!empty($key) && $key[0] != '_') {
            $filteredAttributes[$key] = $value;
        }
    }

    return $filteredAttributes;
}

最后,我可以在Twig视图中创建切换区域设置的链接:

{% block language_bar %}
        <a href="{{ localize_route('en') }}"> English </a>
        <a href="{{ localize_route('fr') }}"> Français </a>
{% endblock %}

修改

这是我的twig扩展服务定义:

acme.twig.extension:
    class: Application\AcmeBundle\Twig\Extension\AcmeExtension
    arguments:
      container: "@service_container"
    tags:
      -  { name: twig.extension }

在枝条扩展功能中,我有这个电话:$routingHelper = $this->container->get('acme.helper.routing');

这应解决发生范围扩大的异常,因为twig扩展不在请求范围内。

<强>更新

现在可以使用Symfony 2.1以比以前更简单的方式使用区域设置切换器。实际上,2.1版本的Symfony为路由引入了一个新参数,使其更多更容易做区域设置切换器。这里的代码全都在树枝上

{% set route_params = app.request.attributes.get('_route_params') %}

{# merge the query string params if you want to keep them when switching the locale #}
{% set route_params = route_params|merge(app.request.query.all) %}

{# merge the additional params you want to change #}
{% set route_params = route_params|merge({'_locale': 'fr'}) %}

{{ path(app.request.attributes.get('_route'), route_params) }} 

它仍然是几行twig代码,但可以包含在Twig块中以便于重用。从Symfony社区获得了对上述代码的信任。

希望这就是你要找的东西。

的问候,
马特

答案 1 :(得分:1)

<a href="{{ path(app.request.attributes.get('_route')) }}">Current page</a>

类似的问题:language switching without changing the current page

答案 2 :(得分:1)

<a href="{{ path(app.request.get('_route'), {'_locale': 'en'}) }}">English</a>