13

Eloquent メソッドをオーバーライドしていますcreate()が、呼び出そうとすると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

おそらく、それをオーバーライドしていて、親クラスで として定義されているためですstaticstatic関数定義に次の単語を追加してみてください。

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 に答える