Twig: Dynamischer Zugriff auf Objekteigenschaften

Erstellt am 5. Apr. 2010  ·  17Kommentare  ·  Quelle: twigphp/Twig

obj['prop'] gibt nur einen Wert zurück, wenn obj ein Array ist und es keine Möglichkeit gibt, die Objekteigenschaft zu erhalten, wenn wir ihren Namen in einer Variablen haben: obj[propName] gibt null zurück

Hilfreichster Kommentar

Du könntest es versuchen
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Alle 17 Kommentare

Sie können die Punktnotation verwenden, die sowohl nach Arrays als auch nach Objekten sucht, sodass obj.name zuerst nach einem obj['name'] sucht, dann nach obj->name und zuletzt obj->getName() dies wird auch in der Dokumentation weiter erläutert unter dem Kapitel Zweig für Designer.

Ich denke, das Problem von artyv betrifft den dynamischen Zugriff auf Objekteigenschaften, im Gegensatz zum einfachen Zugriff auf Offsets/Eigenschaften. Siehe meinen Beispielcode.

/* 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 ist richtig, der Eigenschaftsname, den ich abrufen muss, befindet sich in einer anderen Variablen, also brauche ich ein Äquivalent dieses PHP-Codes:
$obj->{$propName}
weil $obj ein einfaches Objekt ist und ArrayAccess nicht implementiert

Diese Funktion wird nicht in Twig enthalten sein. Twig ist ein Vorlagensystem, keine voll funktionsfähige Sprache. Dynamische Eigenschaften liegen eindeutig außerhalb des Anwendungsbereichs von Twig.

Ich denke, die Serializer-Komponente kann verwendet werden, um verschachtelte stdClass-Instanzen in verschachtelte Arrays zu konvertieren.

Ich denke, indem ich nur eine stdClass in ein Array umwandele, würde sie umgewandelt werden. Warum es schwieriger machen, als es ohnehin schon ist :)

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

@henrikbjorn : Ja, Typcasting funktioniert, aber es funktioniert nicht rekursiv, weshalb ich die Serializer-Komponente vorgeschlagen habe. offensichtlich, wenn Sie wissen, dass Sie keine tief verschachtelte Struktur haben, dann offensichtlich einfach in ein Array umwandeln und Sie sind fertig.

Ich hatte das gleiche Problem und habe es mit einem Filter gelöst. Ich weiß, es ist nicht der richtige Weg, aber es scheint sicherlich der sauberste zu sein.

Im Grunde läuft es darauf hinaus:

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

Und Sie können es wie folgt verwenden:

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

Dynamische Eigenschaften liegen eindeutig außerhalb des Anwendungsbereichs von Twig.

Wieso den? Ich versuche, so etwas wie Symfony Datagrid zu entwickeln und möchte so etwas verwenden:

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

Ich kann keine bessere Lösung sehen, als etwas wie die Twig_Template::getAttribute-Methode in meinem Datagrid zu implementieren. Ich mag, wie universell es ist.

Weil es ein Randfall ist und weil Sie ganz einfach eine Funktion erstellen können, die das macht, was Sie wollen (ungetestet):

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

Verwendungszweck:

row|array_get(name)

Ja, für Arrays ist es einfach. Das Problem ist, dass ich auch den Zugriff auf Getter von Objekten usw. implementieren muss, was bereits in Twig implementiert ist (aber es gibt keine Möglichkeit, diesen Code zu verwenden).

Gute Nachrichten! Ab 1.2 können Sie jetzt über die neue Funktion attribute ein dynamisches Attribut für eine Variable abrufen (siehe c609060).

Gut zu sehen, dass dafür Unterstützung hinzugefügt wurde. Ich fange gerade mit Twig an. Wie schwer wäre es, die Syntax in etwas wie zu ändern?

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

Ich denke, es ist ein bisschen sauberer als {{attribut(object, method, arguments) }}

Vielleicht könnten Sie mich in die richtige Richtung weisen? Ich habe noch nicht den ganzen Quellcode durchgesehen.

@rspenc29 : Ich möchte es nicht "sauberer" machen, da Sie es sich zweimal

Kein Problem. Ich werde es herausfinden.

asd gewidmet

Du könntest es versuchen
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen