Twig / Symfony 2中的运营商实例?

时间:2012-05-28 17:02:20

标签: symfony twig

我有一个像这样的混合阵列(手机号码和实体):

$targets = array();

$targets[] = '+32647651212';
$targets[] = new Customer();

在我的Twig模板中,如果getMobile()target,我必须致电Customer,或者如果它实际上是一个数字(string),则只需打印该号码。

Twig中有instanceof运算符吗?

<ul>
{% for target in targets %}
   <li>{{ target instance of MyEntity ? target.getMobile : target }}</li>
   {% else %}
       <li>Nothing found.</li>
</ul>

9 个答案:

答案 0 :(得分:36)

在\ Twig_Extension中,您可以添加测试

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;
}

然后使用

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

答案 1 :(得分:15)

这是使用Extension:

在twig中执行 instanceof 运算符的好方法

1)在您想要的地方创建您的扩展文件

(例如:src / OC / YourBundle / Twig / InstanceOfExtension.php)

使用\ Twig_Extension你可以做很多事情,过滤,功能,但现在我们将创建一个测试。

所以我们实现了函数getTests(),并在其中创建了一个新的\ Twig_SimpleTest

第1个arugment是你创建的测试的名称,而seconde是可调用的。 (可以是函数(){})。

<?php

namespace OC\YourBundle\Twig;

class InstanceOfExtension extends \Twig_Extension {

    public function getTests() {
        return array(
            new \Twig_SimpleTest('instanceof', array($this, 'isInstanceOf')),
         );
     }

    public function isInstanceOf($var, $instance) {
        $reflexionClass = new \ReflectionClass($instance);
        return $reflexionClass->isInstance($var);
    }
}

2)在services.yml

中注册

(例如:src / OC / YourBundle / Resources / config / services.yml)

services:

    [...may you have other services ...]

    app.twig_extension:
        class: OC\YourBundle\Twig\InstanceOfExtension
        public: false
        tags:
          - { name: twig.extension }

3)然后在像这样的树枝中使用它

{{ myvar is instanceof('\\OC\\YourBundle\\Entity\\YourEntityOrWhatEver') }}

Adrien Brault的来源=&gt; https://gist.github.com/adrienbrault/7045544

答案 2 :(得分:1)

没有ReflectionClass的其他解决方案:

/**
 * @param $object
 * @param $class
 * @return bool
 */
public function isInstanceOf($object, $class)
{
    return is_a($object, $class, true) ? true: false;
}

检查http://php.net/manual/fr/function.is-a.php

答案 3 :(得分:1)

从PHP 5.5.0开始,您可以使用以下方式比较类名:

auto

在需要严格比较类名的特定情况下,此片段可以提供帮助。如果您需要检查接口的实现或检查继承,最好创建上述的树枝扩展。

答案 4 :(得分:0)

另一种解决方案:

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 ... }}

OR

{% if a.isInstanceOfB %}
    ... do something for B instance ...
{% else %}
    ... do something for C instance ...
{% endif %}

答案 5 :(得分:0)

我的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文档,我得到了自己的解决方案: Twig Extension templating

答案 6 :(得分:0)

另一个通过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;
    }
}

嫩枝

{% if form.vars.data is gallery %}
    This is a Gallery 
{% elseif  form.vars.data is article %}
    This is an Article
{% endif %}

答案 7 :(得分:-4)

像这样使用default filter in Twig

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

答案 8 :(得分:-8)

相当古老,但我在这里看不到更有可能实现这个目标:

Enity:

public function __toString()
{
    return 'NameOfYourEntity';
}

嫩枝:

{{ entity }}