Eloquent Laravel模型的__construct

时间:2015-05-28 09:45:00

标签: php laravel eloquent

我有一个自定义设置器,我在我的模型上使用__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中,$this->student_id(这是从数据库中提取的模型的属性)返回null。 当我在我的二传手中dd($this)时,我注意到我的#attributes:[]是一个空数组。
因此,在__construct()被触发之后才会设置模型的属性。如何在构造方法中设置$directory属性?

2 个答案:

答案 0 :(得分:52)

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

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

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

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

经验法则是,在扩展课程时要始终记住,检查您是否未覆盖现有方法以使其不再运行(这对于魔法__construct尤其重要,__get等方法)。您可以检查原始文件的来源,看它是否包含您要定义的方法。

答案 1 :(得分:1)

我永远不会雄辩地使用构造函数。雄辩的人有办法实现自己想要的。我会在事件监听器中使用boot方法。看起来像这样。

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

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

这是您可以使用的所有模型事件...

  • 已检索
  • 创建
  • 创建
  • 更新
  • 已更新
  • 保存
  • 保存
  • 删除
  • 已删除
  • 恢复
  • 已恢复