Twig: Accès dynamique aux propriétés de l'objet

Créé le 5 avr. 2010  ·  17Commentaires  ·  Source: twigphp/Twig

obj['prop'] ne renverra la valeur que si obj est un tableau et il n'y a aucun moyen d'obtenir la propriété de l'objet si nous avons son nom dans une variable : obj[propName] renverra null

Commentaire le plus utile

Tu pourrais essayer
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Tous les 17 commentaires

vous pouvez utiliser la notation par points qui vérifiera à la fois les tableaux et les objets, donc obj.name cherchera d'abord un obj['name'] puis obj->name et last obj->getName() ceci est également expliqué plus loin dans la documentation sous le chapitre Twig pour les designers.

Je pense que le problème d'artyv concerne l'accès dynamique aux propriétés des objets par opposition à l'accès simple aux décalages/propriétés. Voir mon exemple de code.

/* 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 a raison, le nom de la propriété que je dois obtenir est dans une autre variable, j'ai donc besoin de l'équivalent de ce code php :
$obj->{$propName}
car $obj est un objet simple et il n'implémente pas ArrayAccess

Cette fonctionnalité ne sera pas incluse dans Twig. Twig est un système de modèles, pas un langage complet. Les propriétés dynamiques sont clairement hors de portée de Twig.

Je suppose que le composant sérialiseur peut être utilisé pour convertir des instances stdClass imbriquées en tableaux imbriqués.

Je pense qu'en transcrivant simplement une stdClass dans un tableau, elle serait convertie. Pourquoi le rendre plus difficile qu'il ne l'est déjà :)

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

@henrikbjorn : oui le type casting fonctionne, mais cela ne fonctionne pas de manière récursive, c'est pourquoi je suggérais le composant sérialiseur. Évidemment, si vous savez que vous n'avez pas de structure profondément imbriquée, il vous suffit évidemment de convertir en un tableau et vous avez terminé.

J'ai eu le même problème et je l'ai résolu à l'aide d'un filtre. Je sais que ce n'est pas la bonne façon de faire les choses mais cela semble sûrement la plus propre.

En gros ça se résume à ça :

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

Et vous pouvez l'utiliser comme suit :

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

Les propriétés dynamiques sont clairement hors de portée de Twig.

Pourquoi? J'essaie de développer quelque chose comme symfony datagrid et j'aimerais utiliser quelque chose comme ceci :

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

Je ne vois pas de meilleure solution que d'implémenter quelque chose comme la méthode Twig_Template::getAttribute dans ma grille de données. J'aime à quel point c'est universel.

Parce que c'est un cas limite et parce que vous pouvez facilement créer une fonction qui fait ce que vous voulez assez facilement (non testée) :

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

Usage:

row|array_get(name)

Oui, pour les tableaux, c'est facile. Le problème est que je dois également implémenter l'accès aux getters d'objets, etc., qui sont déjà implémentés dans Twig (mais il n'y a aucun moyen d'utiliser ce code).

Bonnes nouvelles! Depuis la 1.2, vous pouvez maintenant obtenir un attribut dynamique sur une variable via la nouvelle fonction attribute (voir c609060).

C'est bien de voir qu'un support a été ajouté pour cela. Je viens juste de commencer avec Twig. Serait-il difficile de changer la syntaxe en quelque chose comme

{{ object.{property} }} ou {{ object.{method}(attrs) }}

Je pense que c'est un peu plus propre que {{ attribute(object, method, arguments) }}

Peut-être pourriez-vous m'orienter dans la bonne direction ? Je n'ai pas encore parcouru tout le code source.

@rspenc29 : Je ne veux pas le rendre "plus propre" car je veux que vous y réfléchissiez à deux fois avant de l'utiliser dans un modèle. Ceci est à utiliser avec prudence car la plupart du temps, c'est une odeur que vous faites quelque chose dans un modèle qui devrait être fait ailleurs.

aucun problème. Je vais me débrouiller.

asd dédié

Tu pourrais essayer
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Cette page vous a été utile?
0 / 5 - 0 notes