如何在模板中创建当前链接?
我想创建一个语言切换器,它应该链接到varios语言中的当前页面,因此所有参数都应该与语言环境相同。
答案 0 :(得分:7)
我最终为此推出了自己的功能。我虽然起初它被包含在FrameworkBundle
的某个地方,但没有找到任何关于它的内容。这是我采取的步骤。
首先,我创建了一个Twig扩展函数,它将输出与用户当前访问的路径相同的路径(包括参数和查询字符串)。我把这一步留给了你。如果您不知道如何创建Twig扩展,可以从Symfony2的优秀教程中查看this link。如果你需要,我可以帮助你。
下一步是创建将切换当前路由的语言环境的函数本身。此函数需要Request
和Router
个对象作为依赖项。在我个人的案例中,我将此功能放在名为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>
答案 2 :(得分:1)
<a href="{{ path(app.request.get('_route'), {'_locale': 'en'}) }}">English</a>