【问题标题】:Laravel/Eloquent advises to override a trait property?Laravel/Eloquent 建议覆盖 trait 属性?
【发布时间】:2017-07-10 22:24:09
【问题描述】:

我在 Laravel 5.4 中使用 Eloquent 模型 在文档中,我看到:

您也可以使用 create 方法将新模型保存在单个 线。插入的模型实例将从 方法。但是,在这样做之前,您需要指定一个 与所有 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 GuardsAttributes
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [];

...

PHP 文档对 Traits 属性很清楚:

如果一个 trait 定义了一个属性,那么一个类就不能定义一个属性 同名,否则报错。如果是 E_STRICT 类定义是兼容的(相同的可见性和初始值) 否则会出现致命错误。

Laravel 文档中关于 adivsed 的实现是否有误?

【问题讨论】:

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

标签: php laravel eloquent traits laravel-5.4


【解决方案1】:

您不能像 PHP 文档建议的那样覆盖同一类中的 trait 属性。

然而,Laravel 要求您在子类中覆盖它(您的模型类扩展了 Eloquent 模型类,并且特性包含在 Eloquent 模型类中,而不是您的模型类中)。这是一件非常有效的事情!

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多