Twig: Acceso dinámico a las propiedades del objeto

Creado en 5 abr. 2010  ·  17Comentarios  ·  Fuente: twigphp/Twig

obj ['prop'] devolverá valor solo si obj es una matriz y no hay forma de obtener la propiedad del objeto si tenemos su nombre en una variable: obj [propName] devolverá nulo

Comentario más útil

Tu podrías intentar
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Todos 17 comentarios

puede usar la notación de puntos que verificará tanto las matrices como los objetos, por lo que obj.name buscará primero un obj ['nombre'] luego obj-> nombre y último obj-> getName () esto también se explica más adelante en la documentación en el capítulo Twig para diseñadores.

Creo que el problema de artyv está relacionado con el acceso a las propiedades de los objetos de forma dinámica en lugar de simplemente acceder a las compensaciones / propiedades. Vea mi código de ejemplo.

/* 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 es correcto, el nombre de la propiedad, que necesito obtener está en otra variable, por lo que necesito el equivalente de este código php:
$ obj -> {$ propName}
porque $ obj es un objeto simple y no implementa ArrayAccess

Esta función no se incluirá en Twig. Twig es un sistema de plantillas, no un lenguaje con todas las funciones. Las propiedades dinámicas están claramente fuera del alcance de Twig.

Supongo que el componente serializador se puede usar para convertir instancias stdClass anidadas en matrices anidadas.

Creo que con solo encasillar un stdClass en una matriz, se convertiría. ¿Por qué hacerlo más difícil de lo que ya es :)

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

@henrikbjorn : sí, la conversión de tipos funciona, sin embargo, no funciona de forma recursiva, por lo que estaba sugiriendo el componente serializador. obviamente, si sabe que no tiene una estructura profundamente anidada, obviamente simplemente envíe a una matriz y listo.

Tuve el mismo problema y lo resolví usando un filtro. Sé que no es la forma correcta de hacer las cosas, pero seguramente parece la más limpia.

Básicamente se reduce a esto:

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

Y puedes usarlo de la siguiente manera:

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

Las propiedades dinámicas están claramente fuera del alcance de Twig.

¿Por qué? Estoy tratando de desarrollar algo como Symfony datagrid y me gustaría usar algo como esto:

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

No puedo ver ninguna solución mejor que implementar algo como el método Twig_Template :: getAttribute en mi cuadrícula de datos. Me gusta lo universal que es.

Porque es un caso de borde y porque puede crear fácilmente una función que hace lo que quiere con bastante facilidad (sin probar):

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

Uso:

row|array_get(name)

Sí, para las matrices es fácil. El problema es que tengo que implementar también el acceso a captadores de objetos, etc.que ya está implementado en Twig (pero no hay forma de cómo usar este código).

¡Buenas noticias! A partir de la versión 1.2, ahora puede obtener un atributo dinámico en una variable a través de la nueva función attribute (consulte c609060).

Es bueno ver que se ha agregado soporte para esto. Recién estoy comenzando con Twig. ¿Qué tan difícil sería cambiar la sintaxis a algo como

{{objeto. {propiedad}}} o {{objeto. {método} (atributos)}}

Creo que es un poco más limpio que {{atributo (objeto, método, argumentos)}}

¿Quizás podrías indicarme la dirección correcta? Aún no he revisado todo el código fuente.

@ rspenc29 : No quiero hacerlo "más limpio", ya que quiero que lo piense dos veces antes de usar esto en una plantilla. Esto debe usarse con precaución ya que la mayoría de las veces, es un olor que está haciendo algo en una plantilla que debería hacerse en otro lugar.

No hay problema. Lo descubriré.

asd dedicado

Tu podrías intentar
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Chrysweel picture Chrysweel  ·  30Comentarios

alpha-and-omega picture alpha-and-omega  ·  20Comentarios

ninsuo picture ninsuo  ·  13Comentarios

JimiC picture JimiC  ·  15Comentarios

dnizetic picture dnizetic  ·  18Comentarios