Astuces avec Eloquent et MassAssignmentException

Dans ce tutoriel nous allons simplifier notre code avec Eloquent et résoudre le problème de MassAssignmentException.

Simplification de notre code

Lors de la création d'un utilisateur avec new nous pouvons passer en premier paramètre du constructeur un tableau d'attributs.

$utilisateur = new App\Utilisateur([
    'email' => request('email'),
    'mot_de_passe' => bcrypt(request('password')),
]);

Nous pouvons également directement appeler la fonction statique create de Eloquent pour automatiquement enregistrer notre utilisateur en base de données sans avoir à faire un $utilisateur->save() manuellement.

Route::post('/inscription', function () {
    $utilisateur = App\Utilisateur::create([
        'email' => request('email'),
        'mot_de_passe' => bcrypt(request('password')),
    ]);

    return "Nous avons reçu votre email qui est " . request('email') . ' et votre mot de passe est ' . request('password');
});

MassAssignmentException

Si nous retestons notre formulaire avec ces changements, nous obtenons une erreur MassAssignmentException pour le champ email. Cette erreur est une sécurité de Laravel par défaut lorsque nous utilisons des tableaux PHP pour spécifier notre attributs. Laravel exige que nous indiquions explicitement les colonnes autorisées à être remplies de cette manière.

Pour indiquer les colonnes autorisées à Laravel, nous devons créer dans notre modèle Utilisateur, un attribut $fillable (« remplissable » en français).

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Utilisateur extends Model {
    protected $fillable = ['email'];
}

Une fois que le tableau $fillable existe, Laravel va accepter d'envoyer nos données à la base de données mais nous allons obtenir une deuxième erreur, elle aussi liée au MassAssignmentException mais moins explicite : constraint failed en SQL. En effet, en regardant la requête effectuée par Laravel, la colonne mot_de_passe n'est pas présente. Une fois que le tableau $fillable existe, Laravel va automatiquement et silencieusement supprimer les champs non autorisés (comme mot_de_passe) et la base de données va donc refuser l'insertion car la colonne mot_de_passe est obligatoire.

Pour résoudre cette seconde erreur, nous avons simplement à ajouter mot_de_passe aux champs autorisés.

protected $fillable = ['email', 'mot_de_passe'];

Normalement, tout fonctionne à nouveau après cette modification.

Dans le prochain tutoriel, nous allons passer aux requêtes de type SELECT et afficher la liste de nos utilisateurs sur une page.