我正在覆盖create()
Eloquent方法,但当我尝试调用它时,我得到Cannot make static method Illuminate\\Database\\Eloquent\\Model::create() non static in class MyModel
。
我这样调用create()
方法:
$f = new MyModel();
$f->create([
'post_type_id' => 1,
'to_user_id' => Input::get('toUser'),
'from_user_id' => 10,
'message' => Input::get('message')
]);
在MyModel
课程中我有这个:
public function create($data) {
if (!Namespace\Auth::isAuthed())
throw new Exception("You can not create a post as a guest.");
parent::create($data);
}
为什么这不起作用?我应该改变什么才能使它发挥作用?
答案 0 :(得分:31)
如错误所示:方法Illuminate\Database\Eloquent\Model::create()
是静态的,不能被重写为非静态方法。
所以实现它
class MyModel extends Model
{
public static function create($data)
{
// ....
}
}
并通过MyModel::create([...]);
如果auth-check-logic确实是模型的一部分,或者更好地将其移动到Controller或Routing部分,您也可以重新考虑。
<强>更新强>
这种方法在版本5.4。*之后不起作用,而是遵循this answer。
public static function create(array $attributes = [])
{
$model = static::query()->create($attributes);
// ...
return $model;
}
答案 1 :(得分:1)
可能是因为你要覆盖它而在父类中它被定义为static
。
尝试在函数定义中添加单词static
:
public static function create($data)
{
if (!Namespace\Auth::isAuthed())
throw new Exception("You can not create a post as a guest.");
return parent::create($data);
}
当然,您还需要以静态方式调用它:
$f = MyModel::create([
'post_type_id' => 1,
'to_user_id' => Input::get('toUser'),
'from_user_id' => 10,
'message' => Input::get('message')
]);