Twig: Динамический доступ к свойствам объекта

Созданный на 5 апр. 2010  ·  17Комментарии  ·  Источник: twigphp/Twig

obj ['prop'] вернет значение, только если obj является массивом и нет способа получить свойство объекта, если у нас есть его имя в переменной: obj [propName] вернет null

Самый полезный комментарий

Вы могли бы попробовать
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Все 17 Комментарий

вы можете использовать точечную нотацию, которая будет проверять как массивы, так и объекты, поэтому obj.name сначала будет искать obj ['name'], затем obj-> name и последний obj-> getName (), это также объясняется далее в документации в разделе Twig для дизайнеров.

Я думаю, что проблема artyv связана с динамическим доступом к свойствам объекта, а не с простым доступом к смещениям / свойствам. См. Мой пример кода.

/* php */
$obj = new stdClass;
$obj->foo = "bar";
$template->render(array('obj, $obj));

/* twig */
{% set prop as "foo" %}
{{ obj.foo }} 
// outputs "bar" 

{{ obj.$prop }} 
// (pseudo-code)
// would compile down to {{ obj.foo }} and output "bar"

jwpage правильно, имя свойства, которое мне нужно получить, находится в другой переменной, поэтому мне нужен эквивалент этого php-кода:
$ obj -> {$ propName}
потому что $ obj - простой объект и не реализует ArrayAccess

Эта функция не будет включена в Twig. Twig - это система шаблонов, а не полноценный язык. Динамические свойства явно выходят за рамки Twig.

Я предполагаю, что компонент сериализатора можно использовать для преобразования вложенных экземпляров stdClass во вложенные массивы.

Я думаю, просто приведя тип stdClass в массив, он будет преобразован. Зачем делать сложнее, чем есть сейчас :)

[~] php -r '$class = new stdClass;$class->prop = "hejsa";print_r((array) $class);'      
Array
(
    [prop] => hejsa
)

@henrikbjorn : да, приведение типов работает, однако оно не работает рекурсивно, поэтому я предлагал компонент сериализатора. очевидно, если вы знаете, что у вас нет глубоко вложенной структуры, тогда, очевидно, просто приведите к массиву, и все готово.

У меня была такая же проблема, и я решил ее с помощью фильтра. Я знаю, что это неправильный способ делать что-то, но он определенно кажется самым чистым.

В основном это сводится к следующему:

function twig_get_filter()
{
    $params = func_get_args();
    $object = array_shift($params);
    $field = implode('', $params);
    return $object->$field;
}

И использовать его можно следующим образом:

{{ object|get(text, '_', language, '_', type) }}

Динамические свойства явно выходят за рамки Twig.

Почему? Я пытаюсь разработать что-то вроде symfony datagrid, и я хотел бы использовать что-то вроде этого:

{# columns #}
{% for name, column in grid.columns %}
<td>{{ column.render(row[name])|raw }}</td>
{% endfor %}

Я не вижу лучшего решения, чем реализовать что-то вроде метода Twig_Template :: getAttribute в моем сетке данных. Мне нравится, насколько это универсально.

Потому что это крайний случай и потому что вы можете легко создать функцию, которая довольно легко делает то, что вы хотите (непроверено):

function twig_array_get_function($array, $name)
{
    return $array[$name];
}

Использование:

row|array_get(name)

Да, для массивов это просто. Проблема в том, что мне нужно реализовать также доступ к получателям объектов и т.д., что уже реализовано в Twig (но нет способа использовать этот код).

Хорошие новости! Начиная с версии 1.2, вы можете получить динамический атрибут переменной с помощью новой функции attribute (см. C609060).

Приятно видеть, что для этого добавлена ​​поддержка. Я только начинаю работать с Twig. Насколько сложно было бы изменить синтаксис на что-то вроде

{{объект. {свойство}}} или {{объект. {метод} (attrs)}}

Я думаю, что это немного чище, чем {{атрибут (объект, метод, аргументы)}}

Может быть, вы могли бы указать мне правильное направление? Я еще не просмотрел весь исходный код.

@ rspenc29 : Я не хочу делать его «чище», так как хочу, чтобы вы дважды подумали, прежде чем использовать это в шаблоне. Это следует использовать с осторожностью, так как в большинстве случаев это запах того, что вы делаете что-то в шаблоне, что должно быть сделано в другом месте.

нет проблем. Я разберусь.

asd посвященный

Вы могли бы попробовать
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Была ли эта страница полезной?
0 / 5 - 0 рейтинги