如何使用自定义函数 Twig-symfony
How use a custom function Twig-symfony
我们有一个 Symfony 3.4 项目,带有 FOSUserBundle 的 twig 模板和身份验证系统。
它是多域的,管理客户和供应商数据主要很好用,但现在我在用户注册时遇到一个问题,我不知道如何解决。
我需要根据域,它可以在注册时显示一个或另一个树枝模板。
搜索文档并找到如何编写自定义 twig 扩展
https://symfony.com/doc/3.4/templating/twig_extension.html
这是我的函数,几乎与示例中的函数一样
<?php
// src/AppBundle/Twig/AppExtension.php
namespace AppBundle\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class AppExtension extends AbstractExtension
{
public function getFunctions()
{
return [
new TwigFunction('server', [$this, 'serverName']),
];
}
public function calculateArea(int $width, int $length)
{
return $width * $length;
}
public function serverName()
{
$serverName = "$_SERVER[SERVER_NAME]";
return $serverName;
}
}
问题是,如何在 Twig 中使用我的函数?我需要它基于它连接的域,它向我们展示了一个注册表或类似这样的东西:
{% extends "@FOSUser/layout.html.twig" %}
{% block fos_user_content %}
{% if serverName == "xxxxx"%}
{% include "@FOSUser/Registration/register_content_cliente.html.twig" %}
{% else %}
{% include "@FOSUser/Registration/register_content_proveedor.html.twig" %}
{% endif %}
{% endblock fos_user_content %}
不是这样的:
{{ serverName }}
{{ server }}
{% serverName %}
{% server %}
就像 php 一样,你必须使用 ()
调用一个函数,所以 serverName()
server()
,就像这样是您在 AppExtension::getFunctions()
(第一个参数)中调用的函数。
您可能想用所谓的 test 替换该函数。然后你可以这样做:
{% if 'example.com' is serverName %}
{% endif %}
代码可能类似于:
class AppExtension extends AbstractExtension
{
public function getTests()
{
return [
new TwigTest('serverName', [$this, 'isServerName']),
];
}
public function isServerName(string $serverName)
{
return $serverName === $_SERVER[SERVER_NAME];
}
}
或者,在您的模板中,您始终可以访问带有变量 app.request
的请求,您可以使用 Symfony 的 Request 对象上的一种方法来询问当前服务器名称。例如,您可以使用 Request::getHost()
进行比较:
{% if app.request.host == 'example.com' %}
{% endif %}
不需要功能或测试或其他 twig 扩展。
我们有一个 Symfony 3.4 项目,带有 FOSUserBundle 的 twig 模板和身份验证系统。
它是多域的,管理客户和供应商数据主要很好用,但现在我在用户注册时遇到一个问题,我不知道如何解决。
我需要根据域,它可以在注册时显示一个或另一个树枝模板。
搜索文档并找到如何编写自定义 twig 扩展 https://symfony.com/doc/3.4/templating/twig_extension.html
这是我的函数,几乎与示例中的函数一样
<?php
// src/AppBundle/Twig/AppExtension.php
namespace AppBundle\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class AppExtension extends AbstractExtension
{
public function getFunctions()
{
return [
new TwigFunction('server', [$this, 'serverName']),
];
}
public function calculateArea(int $width, int $length)
{
return $width * $length;
}
public function serverName()
{
$serverName = "$_SERVER[SERVER_NAME]";
return $serverName;
}
}
问题是,如何在 Twig 中使用我的函数?我需要它基于它连接的域,它向我们展示了一个注册表或类似这样的东西:
{% extends "@FOSUser/layout.html.twig" %}
{% block fos_user_content %}
{% if serverName == "xxxxx"%}
{% include "@FOSUser/Registration/register_content_cliente.html.twig" %}
{% else %}
{% include "@FOSUser/Registration/register_content_proveedor.html.twig" %}
{% endif %}
{% endblock fos_user_content %}
不是这样的:
{{ serverName }}
{{ server }}
{% serverName %}
{% server %}
就像 php 一样,你必须使用 ()
调用一个函数,所以 serverName()
server()
,就像这样是您在 AppExtension::getFunctions()
(第一个参数)中调用的函数。
您可能想用所谓的 test 替换该函数。然后你可以这样做:
{% if 'example.com' is serverName %}
{% endif %}
代码可能类似于:
class AppExtension extends AbstractExtension
{
public function getTests()
{
return [
new TwigTest('serverName', [$this, 'isServerName']),
];
}
public function isServerName(string $serverName)
{
return $serverName === $_SERVER[SERVER_NAME];
}
}
或者,在您的模板中,您始终可以访问带有变量 app.request
的请求,您可以使用 Symfony 的 Request 对象上的一种方法来询问当前服务器名称。例如,您可以使用 Request::getHost()
进行比较:
{% if app.request.host == 'example.com' %}
{% endif %}
不需要功能或测试或其他 twig 扩展。