it-swarm.com.de

Laravel 5.5 MassAssignmentException

Ich folge der Laravel Aus der Scratch-Tutorialserie. Ich bin gerade dabei, dass Sie ein Kommentarsystem für Ihr Artikelsystem erstellen. Aber ich habe ein Problem, ich weiß nicht wirklich, was der Fehler an diesem Punkt sagt.

Der Fehler:

Illuminate\Database\Eloquent\MassAssignmentException
body

Das Kommentarmodell:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

Das Postmodell:

<?php

namespace App;

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

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

Die Route, die ich gemacht habe:

Route::post('/posts/{post}/comments', '[email protected]');

Der Kommentar-Controller:

<?php

namespace App\Http\Controllers;

use App\Post;

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

        return back();
    }
}

Danke im Voraus!

4
Dion Pool

Erklärung zu diesem Fehler

Dies ist eine Sicherheitsfunktion von Laravel. Es soll Sie vor Formmanipulationen bei der Verwendung von Massenzuweisungen schützen.

Beispiel für ein Anmeldeformular: Wenn sich in Ihrer Datenbank eine is_admin-Spalte befindet, kann ein Benutzer einfach Ihr Formular bearbeiten, um is_admin auf true auf Ihrem Server und somit in Ihrer Datenbank festzulegen. Dieses Sicherheitsfeature verhindert dies, indem es eine Whitelist verwendet, um sichere Felder zu definieren.


Wie kann ich das beheben?

Sie müssen eine $fillable-Eigenschaft für Ihr Modell festlegen. Der Wert muss ein Array sein, das alle Felder enthält, die massenzuweisbar sind (wie Benutzername, E-Mail-Adresse, ...). 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

    // ...
}

Siehe "Massenzuordnung" in den Dokumenten: https://laravel.com/docs/5.5/eloquent#mass-assignment

11
festie

Bei der Massenzuweisung wird ein Array an die Modellerstellung gesendet. Dabei werden im Wesentlichen mehrere Felder des Modells in einem einzigen Durchgang festgelegt, und nicht eines nach dem anderen.

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

Sie müssen das Feld, das Sie ausfüllen, zu dem ausfüllbaren Array in Comments.php model hinzufügen: 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{

    protected $fillable = ['body'];

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

Wie in der Dokumentation heißt es: 

Sie können die create-Methode auch verwenden, um ein neues Modell in einem einzelnen .__ zu speichern. Linie. Die eingefügte Modellinstanz wird Ihnen von .__ zurückgegeben. Methode. Zuvor müssen Sie jedoch entweder ein .__ angeben. Füllbares oder geschütztes Attribut im Modell, wie bei allen Eloquent-Modellen standardmäßig gegen Massenzuordnung schützen.

Hoffe das hilft dir.

0
Asur