Twig/Symfony 2中运算符的实例?

Twig/Symfony 2中运算符的实例?,symfony,twig,Symfony,Twig,我有一个这样的混合数组(手机号码和实体): 在我的Twig模板中,如果target是Customer,我必须调用getMobile(),或者如果它实际上是一个数字(string),我必须打印该数字 Twig中是否有类似于instanceof操作符的东西 <ul> {% for target in targets %} <li>{{ target instance of MyEntity ? target.getMobile : target }}</li>

我有一个这样的混合数组(手机号码和实体):

在我的Twig模板中,如果
target
Customer
,我必须调用
getMobile()
,或者如果它实际上是一个数字(
string
),我必须打印该数字

Twig中是否有类似于
instanceof
操作符的东西

<ul>
{% for target in targets %}
   <li>{{ target instance of MyEntity ? target.getMobile : target }}</li>
   {% else %}
       <li>Nothing found.</li>
</ul>
    {targets%中的目标为%s}
  • {{MyEntity的目标实例?target.getMobile:target}
  • {%else%}
  • 什么也没找到
像这样使用:

{{ target.mobile|default(target) }}

在\Twig\u扩展中,您可以添加测试

public function getTests()
{
    return [
        'instanceof' =>  new \Twig_Function_Method($this, 'isInstanceof')
    ];
}

/**
 * @param $var
 * @param $instance
 * @return bool
 */
public function isInstanceof($var, $instance) {
    return  $var instanceof $instance;
}
然后使用like

{% if value is instanceof('DateTime') %}

很老了,但我在这里看不到实现这一点的更好的可能性:

性:

public function __toString()
{
    return 'NameOfYourEntity';
}
细枝:

另一个解决方案:

class A {
    ...
    public function isInstanceOfB() {
        return $this instanceof B;
    }
}

class B extends A {}
class C extends A {}
然后在你的树枝上:

{{ a.isInstanceOfB ? ... something for B instance ... : ... something for C instance ... }}


这里有一个很好的方法可以在带有扩展名的细枝中执行instanceof操作符:

1) 在需要的位置创建扩展文件 (例如:src/OC/YourBundle/Twig/InstanceOfExtension.php)

有了\Twig\u扩展,您可以做很多事情,如过滤、功能,但现在我们将创建一个测试

因此,我们实现函数getTests(),并在其中创建一个新的\Twig\u SimpleTest

第一个片段是您创建的测试的名称,第二个片段是可调用的。 (可以是函数(){})

3) 然后像这样用在树枝上
来源于Adrien Brault=>

其他不含反射类的溶液,带细枝过滤器:

首先,您需要一个TwigExtension类。然后,添加一个函数作为细枝过滤器或细枝函数

namespace-App\Twig;
使用Twig\Extension\AbstractExtension;
使用细枝\细枝过滤器;
使用细枝\细枝功能;
类TwigExtension扩展了AbstractExtension
/**
*@return array |\Twig_Filter[]
*/
公共函数getFilters()
{
返回[
新TwigFilter('is_instance_of',[$this,'isInstanceOf']))
];
}
/**
*@param$object
*@param$class
*@returnbool
*/
公共函数isInstanceOf($object,$class):bool
{
返回值为a($object,$class,true);
}
}
在细枝模板中:


{% if true is same as (object|is_instance_of('ClassName')) %}
   // do some stuff
{% endif %} 

选中

由于PHP 5.5.0,您可以在下一步比较类名:

{{ constant('class', exception) is constant('\\Symfony\\Component\\HttpKernel\\Exception\\HttpException') }}

在需要严格比较类名的特定情况下,此代码段会有所帮助。如果您需要检查接口的实现或检查继承,最好创建上面描述的细枝扩展。

我的Symfony 4.3解决方案

1) 在src/Twig文件夹中创建AppExtension类。(将自动检测该类)

2) 扩展AbstractExtension类:

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigTest;

class AppExtension extends AbstractExtension
{
    public function getTests()
    {
        return [
            new TwigTest('instanceof', [$this, 'isInstanceof'])
        ];
    }

    /**
     * @param $var
     * @param $instance
     * @return bool
     */
    public function isInstanceof($var, $instance) {
        return  $var instanceof $instance;
    }
}
3) 然后使用相同的valdas.mistolis代码回答:

{% if value is instanceof('DateTime') %}
4) 感谢valdas.mistolis和symfony文档,我有了自己的解决方案:

迭代Symfony表单时的另一个示例:

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigTest;
use App\Document\Embeded\Image;
use App\Document\Embeded\Gallery;
use App\Document\Embeded\Article;

class AppExtension extends AbstractExtension
{
    public function getTests()
    {
        return [
            new TwigTest('image', [$this, 'isImage']),
            new TwigTest('gallery', [$this, 'isGallery']),
            new TwigTest('article', [$this, 'isArticle']),
        ];
    }

    public function isImage($var) {
        return $var instanceof Image;
    }

    public function isGallery($var) {
        return $var instanceof Gallery;
    }

    public function isArticle($var) {
        return $var instanceof Article;
    }
}
小枝


我认为这不是他想要的。看起来\Twig\u Function\u方法已被弃用。我希望在当前版本的Twig中做到这一点-任何关于如何复制的指针?Twig_Filter_method for me\Twig_SimpleTest()有效(来自Zombkey的答案)这在Twig上下文中如何可用?这个答案对我有效,唯一不同的是使用@valdas.mistolisac的isInstanceOf方法,这个代码对我不起作用。你确定,它起作用了吗?你的小枝版本是什么?
{{ myvar is instanceof('\\OC\\YourBundle\\Entity\\YourEntityOrWhatEver') }}

{% if true is same as (object|is_instance_of('ClassName')) %}
   // do some stuff
{% endif %} 
{{ constant('class', exception) is constant('\\Symfony\\Component\\HttpKernel\\Exception\\HttpException') }}
namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigTest;

class AppExtension extends AbstractExtension
{
    public function getTests()
    {
        return [
            new TwigTest('instanceof', [$this, 'isInstanceof'])
        ];
    }

    /**
     * @param $var
     * @param $instance
     * @return bool
     */
    public function isInstanceof($var, $instance) {
        return  $var instanceof $instance;
    }
}
{% if value is instanceof('DateTime') %}
namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigTest;
use App\Document\Embeded\Image;
use App\Document\Embeded\Gallery;
use App\Document\Embeded\Article;

class AppExtension extends AbstractExtension
{
    public function getTests()
    {
        return [
            new TwigTest('image', [$this, 'isImage']),
            new TwigTest('gallery', [$this, 'isGallery']),
            new TwigTest('article', [$this, 'isArticle']),
        ];
    }

    public function isImage($var) {
        return $var instanceof Image;
    }

    public function isGallery($var) {
        return $var instanceof Gallery;
    }

    public function isArticle($var) {
        return $var instanceof Article;
    }
}
{% if form.vars.data is gallery %}
    This is a Gallery 
{% elseif  form.vars.data is article %}
    This is an Article
{% endif %}