web-dev-qa-db-fra.com

Laravel 5.5 Exception MassAssignment

Je suis la série de tutoriels Laravel From Scratch. Je suis actuellement en train de créer un système de commentaires pour votre système d'articles. Mais j'ai un problème, je ne sais pas vraiment ce que l'erreur dit en ce moment.

L'erreur:

Illuminate\Database\Eloquent\MassAssignmentException
body

Le modèle de commentaire:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

Le modèle de poste:

<?php

namespace App;

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    public function addComment($body)
    {
        $this->comments()->create(compact('body'));
    }
}

Le chemin que j'ai fait:

Route::post('/posts/{post}/comments', 'CommentsController@store');

Le contrôleur de commentaires:

<?php

namespace App\Http\Controllers;

use App\Post;

class CommentsController extends Controller
{
    public function store(Post $post)
    {
        $post->addComment(request('body'));

        return back();
    }
}

Merci d'avance!

4
Dion Pool

Explication de cette erreur

Ceci est une fonctionnalité de sécurité de Laravel. Il est conçu pour vous protéger contre la manipulation de formulaire lors de l’utilisation d’attributions en masse.

Par exemple sur un formulaire d'inscription: Lorsque vous avez une colonne is_admin dans votre base de données, un utilisateur peut simplement manipuler votre formulaire pour définir is_admin sur true sur votre serveur, et donc dans votre base de données. Cette fonctionnalité de sécurité empêche cela en utilisant une liste blanche pour définir des champs sécurisés.


Comment résoudre ce problème

Vous devez définir une propriété $fillable sur votre modèle. Sa valeur doit être un tableau contenant tous les champs pouvant être assignés en masse (comme un nom d'utilisateur, une adresse électronique, ...). 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    # This property!
    protected $fillable = ['body'];

    // ...
}

Voir "Affectation en masse" dans la documentation: https://laravel.com/docs/5.5/eloquent#mass-assignment

11
festie

L'affectation en masse se produit lorsque vous envoyez un tableau à la création du modèle, en définissant en gros un groupe de champs sur le modèle en une seule fois, plutôt que l'un après l'autre, comme ce que vous avez fait ici:

public function addComment($body)
{
    $this->comments()->create(compact('body'));
}

Vous devez ajouter le champ que vous remplissez au tableau remplissable dans le modèle Comments.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{

    protected $fillable = ['body'];

    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

Comme le dit la documentation: 

Vous pouvez également utiliser la méthode create pour enregistrer un nouveau modèle dans un seul fichier ligne. L'instance de modèle insérée vous sera renvoyée à partir du fichier méthode. Cependant, avant de le faire, vous devrez spécifier soit un Attribut remplissable ou gardé sur le modèle, comme tous les modèles Eloquent protéger contre l'affectation en masse par défaut.

J'espère que cela vous aide.

0
Asur