web-dev-qa-db-ja.com

Twig / Symfony 2の演算子のインスタンス?

私はこのような混合配列(携帯電話番号とエンティティ)を持っています:

_$targets = array();

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

私のTwigテンプレートでは、targetCustomerの場合はgetMobile()を呼び出すか、実際に数値の場合は数値を出力する必要があります( string)。

Twigにinstanceof演算子のようなものはありますか?

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

\ 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') %}
38
valdas.mistolis

ここでは、instanceof演算子をtwig with Extension:

1)必要な場所に拡張ファイルを作成します

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

\ Twig_Extensionを使用すると、フィルタリング、機能など、さまざまなことができますが、ここでテストを作成します。

そこで、関数getTests()を実装し、その中に新しい\ Twig_SimpleTestを作成します。

最初のarugmentは作成するテストの名前であり、2番目のarugmentは呼び出し可能です。 (function(){}にすることができます)。

<?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)次にそれをtwigこのように使用します

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

AdrienBraultからのソース=> https://Gist.github.com/adrienbrault/7045544

19
Zombkey

PHP 5.5.0なので、次の方法でクラス名を比較できます。

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

このスニペットは、クラス名を厳密に比較する必要がある特定の場合に役立ちます。インターフェイスの実装を確認したり、継承を確認したりする必要がある場合は、上記のtwig拡張機能を作成することをお勧めします。

2
Roman

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

1
Hamham

別の解決策:

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

class B extends A {}
class C extends A {}

次に、twig:

{{ 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 %}
0
Nico

Symfony4.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テンプレート

0
Garri Figueroa