Разширяване/замяна на метода за създаване на 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