Вопрос по twig, symfony – Экземпляр оператора в Twig / Symfony 2?

12

У меня есть смешанный массив, подобный этому (мобильные номера и объекты):

$targets = array();

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

В моем шаблоне Twig мне нужно позвонитьgetMobile() еслиtarget этоCustomer или просто напечатайте число, если это действительно число (string).

Есть ли что-то вродеinstanceof оператор в Twig?

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

Ваш Ответ

7   ответов
-8

Довольно старый, но я не вижу здесь еще одной хорошей возможности добиться этого:

Enity:

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

Twig:

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

ИЛИ ЖЕ

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

использованиеdefault filter in Twig как это:

{{ target.mobile|default(target) }}
Я не думаю, что это то, что он просит.
0

Другое решение без 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

Как это можно использовать в контексте Twig?
С помощью функции ветки или фильтра ветки вы можете сделать это. Это то же самое, что первый ответ, также используяreturn $var instanceof $instance;  , ты можешь использоватьis_a, Пример:public function getFilters() { return [new \Twig_SimpleFilter('is_instance_of', [$this, 'isInstanceOf'])]; } public function isInstanceOf($object, $class) { return is_a($object, $class, true) ? true: false; }
34

В \ 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') %}
для меня \ Twig_SimpleTest () работал (из ответа Zombkey)
Twig_Filter_Method
Похоже, что \ Twig_Function_Method устарела. Я собираюсь сделать это в текущей версии Twig - есть какой-нибудь указатель на то, как его повторить?
12

Здесь хороший способ сделатьinstanceof оператор в ветке с расширением:

1) Create your extention file where you want

(например: src / OC / YourBundle / Twig / InstanceOfExtension.php)

С \ Twig_Extension вы можете делать много вещей, фильтровать, определять, но теперь мы создадим тест.

Поэтому мы реализуем функцию getTests (), и внутри нее создаем новый \ Twig_SimpleTest

Первый фрагмент - это название теста, который вы создаете, а второй - вызываемый. (может быть функцией () {}).

<?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) Register it in 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) Then use it in twig like this

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

Источник от Adrien Brault = & gt;https://gist.github.com/adrienbrault/7045544

Этот ответ работал для меня, единственное, что я сделал по-другому, - это использование метода isInstanceOf @ valdas.mistolis
1

Начиная с PHP 5.5.0, вы можете сравнивать имена классов следующим образом:

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

Этот фрагмент может помочь в особых случаях, когда вам нужно строгое сравнение имен классов. Если вам нужно проверить реализацию интерфейса или проверить наследование, лучше создать расширение ветки, описанное выше.

Похожие вопросы