扩展/覆盖Eloquent create方法 - 不能使静态方法非静态

时间:2013-10-16 12:56:25

标签: php laravel laravel-4 eloquent

我正在覆盖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);
}

为什么这不起作用?我应该改变什么才能使它发挥作用?

2 个答案:

答案 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')
]);