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

gre*_*emo 14 symfony twig

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

$targets = array();

$targets[] = '+32647651212';
$targets[] = new Customer();
Run Code Online (Sandbox Code Playgroud)

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

instanceof在Twig中有类似操作符的东西吗?

<ul>
{% for target in targets %}
   <li>{{ target instance of MyEntity ? target.getMobile : target }}</li>
   {% else %}
       <li>Nothing found.</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

val*_*lis 37

在\ 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;
}
Run Code Online (Sandbox Code Playgroud)

然后使用喜欢

{% if value is instanceof('DateTime') %}
Run Code Online (Sandbox Code Playgroud)


Zom*_*key 18

这里有一个使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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 }
Run Code Online (Sandbox Code Playgroud)

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

{{ myvar is instanceof('\\OC\\YourBundle\\Entity\\YourEntityOrWhatEver') }}
Run Code Online (Sandbox Code Playgroud)

来自Adrien Brault => https://gist.github.com/adrienbrault/7045544


小智 8

我的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

3)然后使用valdas.mistolis答案的相同代码:

{% if value is instanceof('DateTime') %}
Run Code Online (Sandbox Code Playgroud)

4)感谢 valdas.mistolis 和 symfony 文档,我得到了自己的解决方案: Twig Extension 模板


Rom*_*man 5

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

{{ constant('class', exception) is constant('\\Symfony\\Component\\HttpKernel\\Exception\\HttpException') }}
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*nko -6

default在 Twig 中使用过滤器,如下所示:

{{ target.mobile|default(target) }}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这就是他所要求的。 (3认同)