「Non-static method」ってなんやねん。。
Laravelで開発をしているのですが、謎のエラーが出ました。
エラー内容から何となく分かりますが、とりあえずまとめてみました。
目次
Non-static methodエラーって何?
ざっくり言うと、「staticメソッドがない」って言ってます。
もっと言うと、「staticにアクセスできない」って言ってます。
Non-static methodが発生する事例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use DB; use App\Models\Sample; class SampleController extends Controller { public function sample(Request $req) { Sample::execute(); } } |
「SampleController」を定義します。
本コントローラーからモデル「Sample」の「execute」メソッドを呼び出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class Sample extends Model { public function execute($query, $params) { // 何かしらの処理 } } |
モデル「Sample」です。
何が問題か?
上記は、コントローラーからモデルのメソッドをstaticに呼び出しているのが問題です。
Laravelではstaticにアクセスする際、モデル側のメソッド名に「scope」と付けます。
これにより、コントローラーからモデルのメソッドにstaticにアクセスできます。
Non-static method対応策
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class Sample extends Model { public function scopeExecute($query, $params) { // 何かしらの処理 } } |
モデル「Sample」を上記のように修正します。これでOK!!
おすすめ書籍
僕はLaravelの勉強をするのに以下の書籍を購入しました。おすすめですよ!
まとめ
「scope」って付けるのはいいですが、なんかメソッド名が一致していないのでモヤっとしませんか?
元々Javaエンジニアだったので、この書き方には違和感しかありません。
まあ、原因が分かったので良しとしましょう。