我有一个自定义设置器,我在我的模型上使用__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
属性?
答案 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;
});
}
这是您可以使用的所有模型事件...