13

我重写了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);
}

为什么这不起作用?我应该改变什么才能让它工作?

4

2 回答 2

43

正如错误所说:该方法Illuminate\Database\Eloquent\Model::create()是静态的,不能被覆盖为非静态的。

所以将其实现为

class MyModel extends Model
{
    public static function create($data)
    {
        // ....
    }
}

并通过调用它MyModel::create([...]);

您还可以重新考虑 auth-check-logic 是否真的是模型的一部分,或者更好地将其移动到控制器或路由部分。

更新

这种方法从 5.4.* 版本开始不起作用,而是遵循这个答案

public static function create(array $attributes = [])
{
    $model = static::query()->create($attributes);

    // ...

    return $model;
}
于 2013-10-16T13:05:17.357 回答
2

可能是因为您正在覆盖它并且在父类中它被定义为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')
]);
于 2013-10-16T13:00:15.013 回答