Tutoriel Vidéo PHP Les Collections Laravel

Télécharger la vidéo Télécharger les sources

Les Collections sont un type de classe qui permet de représenter une série de donnée et permettent d'apporter une solution plus objet au traitement des tableaux.

Pourquoi ne pas utiliser les tableaux ?

Avant de vouloir rajouter un nouveau concept dans notre application il est important de comprendre les problèmes que pose l'utilisation des tableaux.

La composition des fonctions

La lisibilité des fonctions n'est pas évidente lorsqu'elles sont enchaineées.

array_values(
    array_map(function ($eleve) {
        return $eleve['name'];
    }, array_filter($eleves, function ($eleve) {
        return $eleve['note'] >= 10;
    }))
)

Certaines fonctions comme uasort() ne peuvent pas être utilisées directement car attendent des paramètres passés par référence (ce qui force la création de variables intermédiaires).

Le manque de cohérence des fonctions

Ce n'est plus à démontrer mais l'ordre des paramètres n'est pas uniforme.

uasort ( array &$array , callable $value_compare_func ) : bool
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
array_map ( callable $callback , array $array1 [, array $... ] ) : array

Mutation ou pas ?

Enfin, certaines fonctions altère le tableau original (array_splice et array_shift par exemple) alors que d'autre non, ce qui peut induire en erreur dans certaines situations.

Les Collections

Les collections permettent de corriger ces différents problématiques :

  • La pluspart des méthodes retournent une nouvelle collection ce qui simplifie la composition et
  • L'ordre des argument peut être unifié
collect($eleves)
  ->filter(function($eleve) {
    return $eleve['note'] >= 10;
  })
  -> map(function($eleve) {
    return $eleve['name']
  })
  ->values()
  ->toArray();

Même si il est possible de développer son propre système de collection il peut être intéréssant de se reposer sur une librairie existante pour gagner du temps (surtout si on veut un code bien testé).

tightenco/collect

Laravel dispose d'un système de Collection plutôt complet mais n'offre pas de package séparé du framework. Mais une personne s'est motivé pour séparer les collections dans un package dédié.

Cette classe offre une centaine de méthodes et dispose d'un système original de Higher Order Messages.

collect($eleves)
  -> map(function($eleve) {
    return $eleve['name']
  })
  ->values()
  ->toArray();

// Peut être racourci
collect($eleves)
  ->map->name
  ->values()
  ->toArray();