2017-02-21 2 views
4

Ich verwende Eloquent Modelle innerhalb Laravel 5.4 In der Dokumentation, ich sehe:Laravel/Eloquent empfiehlt, eine Eigenschaft zu überschreiben?

Sie auch die Methode erstellen verwenden kann, ein neues Modell in einer einzigen Linie zu speichern. Die eingefügte Modellinstanz wird von der Methode an Sie zurückgegeben. Bevor Sie dies jedoch tun, müssen Sie entweder ein befüllbares oder überwachtes Attribut für das Modell angeben, da alle Eloquent-Modelle standardmäßig vor einer Massenzuweisung schützen.

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Flight extends Model 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['name']; 
} 

Allerdings ist die $ ausfüllbare Eigenschaft bereits in einem Zug von allen Modellen verwendet definiert:

trait GuardsAttributes 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = []; 

... 

Die PHP-Dokumentation ist klar Traits Eigenschaften:

Wenn ein Merkmal definiert eine Eigenschaft, dann kann eine Klasse keine Eigenschaft mit demselben Namen definieren, andernfalls wird ein Fehler ausgegeben. Es ist ein E_STRICT, wenn die Klassendefinition kompatibel ist (gleiche Sichtbarkeit und Anfangswert) oder sonst schwerwiegender Fehler.

Ist die Laravel-Dokumentation falsch über die empfohlene Implementierung?

+1

sind beide falsch. Sie haben die Klasse "A" und Sie verwenden eine Eigenschaft innerhalb dieser Klasse. Eigenschaft = Sprache unterstützte Kopie einfügen. Die Klasse 'A' darf nicht' protected $ fillable' enthalten - und das nicht, weil Ihre Klasse 'A'' Illuminate \ Database \ Eloquent \ Model' ist. So weit, so gut - aber jetzt erweitern Sie das 'Model' und Sie können die' protected $ fillable' Eigenschaft überschreiben. Vererbungsregeln ermöglichen dies. Ihre Frage gilt, aber auch beide Auszüge aus der Dokumentation. – Mjh

Antwort

4

Sie können Merkmaleigenschaften nicht in derselben Klasse überschreiben, wie in der PHP-Dokumentation vorgeschlagen.

Laravel fordert Sie jedoch auf, dies in einer untergeordneten Klasse zu überschreiben (Ihre Modellklasse, die die Eloquent-Modellklasse erweitert, und das Merkmal ist in der Eloquent-Modellklasse und nicht in Ihrer Modellklasse enthalten). Das ist eine absolut gültige Sache!

Verwandte Themen