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.