Laravel/Eloquent建议覆盖trait属性?

9
我正在使用Laravel 5.4中的Eloquent模型。 在文档中,我看到:
“您还可以使用create方法在单个行中保存新模型。该方法将返回已插入的模型实例给您。但是,在执行此操作之前,您需要在模型上指定fillable或guarded属性,因为默认情况下所有Eloquent模型都会保护免受大规模分配攻击。”
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

然而,$fillable属性已在所有模型中使用的trait中定义:

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

...

关于Traits属性,PHP文档已经明确说明:

如果一个Trait定义了一个属性,则类不能定义一个同名的属性,否则会发生错误。如果类的定义与Trait的属性兼容(具有相同的可见性和初始值),则会产生E_STRICT错误,否则将导致致命错误。

Laravel文档对建议实现有误吗?


2
两者都没有错。你有一个类 A,并在其中使用了一个 trait。Trait = 语言辅助复制粘贴。类 A 不能包含 protected $fillable - 它确实没有,因为你的类 AIlluminate\Database\Eloquent\Model。到目前为止一切正常 - 但现在你正在扩展 Model,并且可以覆盖 protected $fillable 属性。继承规则允许这样做。你的问题是合理的,但文档中的两个摘录也是如此。 - Mjh
1个回答

12

根据PHP文档建议,您无法在同一类中覆盖trait属性。

然而,Laravel要求您在子类中覆盖此属性(即扩展Eloquent模型类的模型类,并将trait包含在Eloquent模型类中,而不是在您的模型类中)。这是完全有效的做法!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接