Skip to content

Les Objets de Données (DTO)

La couche Data regroupe des objets simples, souvent appelés DTO (Data Transfer Objects). Leur rôle est de transporter des données structurées et typées d'un point A (un Mapper ou un Repository) à un point B (un template Blade), sans porter de logique métier complexe.

Concept et utilité

Contrairement aux tableaux associatifs natifs de PHP ou de WordPress, les objets Data offrent :

  • Contrat de données strict : Vous savez exactement quelles propriétés sont disponibles (ex: $data->title existera toujours).
  • Auto-complétion : Votre IDE reconnaît les propriétés, ce qui réduit les erreurs de frappe et accélère le développement.
  • Immuabilité : En utilisant la propriété readonly (PHP 8.2+), vous garantissez que la donnée ne sera pas modifiée accidentellement entre sa récupération et son affichage.
  • Typage fort : Chaque propriété possède un type défini (string, int, ou même un autre objet comme Image), ce qui sécurise le rendu dans Blade.

Structure d'une classe Data

Ces classes sont volontairement légères. Elles utilisent généralement la promotion de propriété dans le constructeur pour rester concises.

php
namespace App\View\Data;

use App\Support\Types\Image;
use App\Support\Types\Link;

readonly class ExampleData
{
    public function __construct(
        public string $title,
        public string $content,
        public Image $image, // Utilisation d'objets de support typés
        public Link $link,
    ) {}
}

Intégration dans le flux de travail

Les objets de données sont le point final de la préparation des données. Ils font le lien entre la logique technique et l'interface utilisateur.

Utilisation dans Blade

Grâce à cette structure, le code dans vos templates devient extrêmement propre et facile à lire :

bladehtml
<div class="card">
    @if($card->image->url)
        <img src="{{ $card->image->url }}" alt="{{ $card->image->alt }}">
    @endif

    <h3>{{ $card->title }}</h3>
    <p>{{ $card->excerpt }}</p>

    <a href="{{ $card->button->url }}" target="{{ $card->button->target }}">
        {{ $card->button->title }}
    </a>
</div>

Comparaison : Tableau vs Objet Data

CaractéristiqueTableau Associatif ($data['title'])Objet Data ($data->title)
TypageFaible (mixte)Fort et explicite
Erreursundefined index silencieux ou fatalErreur de type immédiate et claire
LisibilitéDifficile à deviner sans var_dumpDocumentation par le code (IDE)
SécuritéModifiable n'importe oùImmuable (readonly)

Recommandations

  1. Utilisation de Types Support : Pour des éléments récurrents comme les images ou les liens, utilisez des types de support (App\Support\Types\Image) au sein de vos DTO pour uniformiser la manipulation des médias WordPress.
  2. Pas de méthodes complexes : Si vous avez besoin de transformer la donnée (ex: formater une date), faites-le dans le Mapper avant de remplir l'objet Data. L'objet Data ne doit faire qu'exposer la donnée finale.