如何在我的模板中创建指向当前的链接?
我想创建一个语言切换器,它应该链接到各种语言的当前页面,因此所有参数都应该与语言环境相同。
我最终为此推出了自己的功能。我虽然起初它被包含在某个地方,FrameworkBundle
但没有找到任何关于它的东西。这是我采取的步骤。
起初,我创建了一个 Twig 扩展函数,该函数将输出与用户当前正在访问的路径相同的路径(包括参数和查询字符串)。我把这一步留给了你。如果您还不知道如何创建 Twig 扩展,您可以从 Symfony2 上的一个很好的教程中查看此链接,以了解如何创建 Twig 扩展。如果您需要,我可以帮助您。
下一步是创建将切换当前路由的语言环境的函数本身。此函数将需要Request
和Router
对象作为依赖项。就我个人而言,我将此功能放在名为RoutingHelper
service 的专用服务中。然后,我的 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 %}
编辑:
这是我的树枝扩展服务定义:
acme.twig.extension:
class: Application\AcmeBundle\Twig\Extension\AcmeExtension
arguments:
container: "@service_container"
tags:
- { name: twig.extension }
在树枝扩展功能中,我有这个电话:$routingHelper = $this->container->get('acme.helper.routing');
这应该解决发生的范围扩大异常,因为树枝扩展不在请求范围内。
更新:
Symfony 2.1 现在可以以比以前更简单的方式拥有一个语言环境切换器。事实上,Symfony 的 2.1 版本引入了一个新的路由参数,使得进行区域切换变得更加容易。这里的代码,全部在树枝中
{% 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 社区的 stof 的学分,用于上面的代码。
希望这是您正在寻找的。
问候,
马特
<a href="{{ path(app.request.attributes.get('_route')) }}">Current page</a>
类似问题:语言切换不改变当前页面
<a href="{{ path(app.request.get('_route'), {'_locale': 'en'}) }}">English</a>