雄辩的拉拉维尔模型上的__construct

2022-08-30 12:21:16

我有一个自定义 setter,我正在模型上的方法中运行它。__construct

这是我想要设置的属性。

    protected $directory;

我的构造函数

    public function __construct()
    {
        $this->directory = $this->setDirectory();
    }

二传手:

    public function setDirectory()
    {
        if(!is_null($this->student_id)){
            return $this->student_id;
        }else{
            return 'applicant_' . $this->applicant_id;
        }
    }

我的问题是,在我的 setter 中,(这是从数据库中提取的模型的属性)正在返回 。当我从我的 setter 内部时,我注意到 my 是一个空数组。
因此,模型的属性在触发后才会设置。如何在构造方法中设置属性?$this->student_idnulldd($this)#attributes:[]__construct()$directory


答案 1

您需要将构造函数更改为:

public function __construct(array $attributes = array())
{
    parent::__construct($attributes);

    $this->directory = $this->setDirectory();
}

第一行 () 将在代码运行之前运行 Eloquent 自己的构造方法,这将为您设置所有属性。此外,对构造函数方法签名的更改是继续支持Laravel期望的用法:parent::__construct()Model$model = new Post(['id' => 5, 'title' => 'My Post']);

经验法则实际上是在扩展类时始终记住,检查您是否没有覆盖现有方法,使其不再运行(这对于 magic 、 等方法尤其重要)。您可以检查原始文件的源,以查看它是否包含您正在定义的方法。__construct__get


答案 2

我永远不会在雄辩中使用构造函数。雄辩有办法完成你想要的。我将引导方法与事件侦听器一起使用。它看起来像这样。

protected static function boot()
{
    parent::boot();

    static::retrieved(function($model){
         $model->directory = $model->student_id ?? 'applicant_' . $model->applicant_id;
    });
}   

以下是您可以使用的所有模型事件:、、和 。retrievedcreatingcreatedupdatingupdatedsavingsaveddeletingdeletedtrashedforceDeletedrestoringrestoredreplicating


推荐