Расширить/переопределить метод создания 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);
}

Почему это не работает? Что я должен изменить, чтобы заставить его работать?


person Marwelln    schedule 16.10.2013    source источник


Ответы (2)


Как говорит ошибка: метод Illuminate\Database\Eloquent\Model::create() является статическим и не может быть переопределен как нестатический.

Поэтому реализуйте это как

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

и назовите это MyModel::create([...]);

Вы также можете переосмыслить, действительно ли логика проверки подлинности является частью модели или лучше перенести ее в часть контроллера или маршрутизации.

ОБНОВЛЕНИЕ

Этот подход не работает, начиная с версии 5.4.*, вместо этого следуйте этому ответу.

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

    // ...

    return $model;
}
person HenningCash    schedule 16.10.2013
comment
Я дал этому +1 за заявление о переосмыслении! Эта логика не принадлежит классу MyModel. - person DutGRIFF; 21.06.2015

Вероятно, потому что вы его переопределяете, а в родительском классе он определен как 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')
]);
person Glad To Help    schedule 16.10.2013