Blog technique Wizaplace

Un dump orienté objet dans Twig

Par Matthieu le 24 February 2017

La fonction dump() de Twig est très utile pour savoir ce que contient une variable. Mais dumper un objet est une source récurrente de confusion pour les développeurs front.

En effet les propriétés, souvent privées, de l’objet vont être affichées, mais cela ne représente pas pour autant les données réellement utilisables dans Twig.

Problème

Par exemple la classe suivante :

<?php
namespace Wizaplace;
class Product
{
    private $stockQuantity;

    public function isInStock() : bool
    {
        return $this->stockQuantity > 0;
    }
}

Les développeurs backend conseillent souvent aux développeurs front de dumper les objets pour savoir comment récupérer les données qui vont bien, mais voici ce qu’on obtient en dumpant un Product :

Wizaplace\Product {#762 ▼
  -stockQuantity: 3
}

C’est bien sympa, mais {{ product.stockQuantity }} ne marchera pas (vu que la propriété est privée). Il faudra plutôt utiliser product.inStock ou product.isInStock(), mais difficile de le deviner avec le dump.

Solution

Pour résoudre ce problème, nous avons créé une fonction Twig qui affichera les méthodes des objets plutôt que leur propriétés.

Pour l’utiliser, il suffit d’utiliser d() plutôt que dump() : {{ d(product) }}. Voici ce qui est alors affiché :

Wizaplace\Product
    isInStock() : bool

On voit alors clairement les méthodes disponibles et leurs types de retour (vive PHP 7). La suite du template est plus facile à écrire :


{{ product.inStock ? 'En stock' : 'Hors stock' }}

Implémentation

Le code de cette extension Twig est disponible en open-source et peut donc être utilisée très simplement dès maintenant.

Le code est sommaire, mais nous avons préféré être pragmatiques et prendre des raccourcis afin d’obtenir une solution utile tout de suite, pouvoir la tester, et itérer ensuite en fonction de l’utilisation. Ça ne nous empêche pas d’avoir des idées pour la suite : affichage du commentaire de chaque méthode, prise en compte des typages dans la phpdoc, affichage récursif des méthodes, etc.

N’hésitez pas à participer au projet si cette fonctionnalité vous est aussi utile qu’à nous.