PHP Template Engine Twig um instanceof (instance of) Test erweitern

Die Template Engine Twig von Sensio Labs bringt von Haus aus schon einige Tests wie definedempty oder auch iterable mit. Mit letzerem Test kann man ebenfalls bereits ermitteln, ob eine im Twig Template vorliegende Variable ein Array (oder bspw. ein foreach-fähiges Objekt) ist, jedoch fehlt die Möglichkeit herauszufinden zu welcher Klasse ein Objekt gehört, so wie dieses in PHP mittels instanceof möglch ist.

Gestoßen bin ich auf das „Problem“, als ich mir dynamisch die Spalten einer Tabelle über ein Propel Objekt ausgeben lassen wollte. Wer mit Propel arbeitet, weiß, dass Propel standardmäßig date Spalten als DateTime Objekt zurückgibt (was ich prinzipiell sehr gut finde). Jedoch kann man das DateTime Objekt nicht einfach ausgeben wie einen normale Integer oder String, denn dann erhält man diese schicke Exception:

An exception has been thrown during the rendering of a template („Object of class DateTime could not be converted to string“)

Als Lösung habe ich mir einen eigenen Twig Test instanceof geschrieben und die Variablen vor der Ausgabe darauf geprüft, ob diese eine DateTime Instanz sind. Diesen Test möchte ich Euch gerne zur Verfügung stellen, da ich bei meiner Recherche einen solchen Test nicht gefunden habe und mich dann auf der Twig Seite erstmal schlau lesen musste, wie Tests in Twig geschrieben werden.


Hier zunächst der Test. Dieser wird einfach im PHP Skript nach dem Instanziieren des Twig Objekts eingefügt:

// minimal example of getting twig environment when using it with slim framework
$app = new \Slim\Slim();
$view = $app->view(new \Slim\Views\Twig());
$twig = $view->getEnvironment();

// add twig test instanceof
$twig->addTest(
    new \Twig_SimpleTest(
        'instanceof',
        function ($var, $instance) {
            return $var instanceof $instance;
        }
    )
);

Dieses Beispiel nutzt Twig in Verbindung mit dem Slim Framework. Wenn Ihr Twig in einem anderen Framework eingebunden haben solltet, dann sehen die Zeilen 2-4 sicherlich anders aus (es ging hier nur ums Prinzig, wie man Twig via Slim einbindet und auch wieder an das Twig Objekt kommt).


Und so wird der neue Test dann im Twig Template benutzt:

<div>{{ value is instanceof('DateTime') ? value.format('d.m.Y') : value }}</div>

… oder in Langform:

{% if value is instanceof('DateTime') %}
    {{ value.format('d.m.Y') }}
{% else %}
    {{ value }}
{% endif %}

Das könnte dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte beachte die Hinweise zum Datenschutz