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!
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.
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
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.