[Laravel 8.x]「routes\api.php」にルートを定義すると、「Target class [○○○Controller] does not exist.」が発生する。

Laravel

Laravel 8.xとたわむれてみた。たまにはAPIとかつくってみるのもよかろうということでやってみた。このエラーはLaravel 7.xから8.xへアップデートすると発生しない。

準備

まずはroutes\api.phpに以下を追加。便宜上、ここからはTaskControllerとしよう。

Route::get('/tasks', 'TaskController@index');

で、TaskControllerとかを追加して、以下を書く。

    public function index() {
        return Tasks::all();
    }

ブラウザでアクセス

APIはhttp://localhost/api/taskみたいな感じでアクセスするといいらしい。
アクセスすると、以下のエラーが発生する。

Illuminate\Contracts\Container\BindingResolutionException
Target class [TaskController] does not exist.

なんでやねん!

推察してみる

エラーの内容からTaskControllerを呼ぶ必要があると認識しているようなので、URLやルートの設定は問題ないと思われる。ということは、コントローラの場所か…

マニュアルを読んでみる

参照)https://readouble.com/laravel/8.x/ja/routing.html

use App\Http\Controllers\TaskController;

Route::get('/task', [TaskController::class, 'index']);

Laravel 7.xより前なら‘TaskController@index’という感じで書いてたけど、8.xから上記の書き方が推奨されるのだろうか…

試してみた

上記に変更してみたら動いた。
他にも方法がないか調べてみたら、‘TaskController@index’という書き方をするのであれば、app/Providers/RouteServiceProvider.phpを変更する。

-    // protected $namespace = 'App\\Http\\Controllers';
+    protected $namespace = 'App\\Http\\Controllers';

コメントを外すだけです。

まとめ

ルーティングの書き方は、どちらのやり方が良いのかは、わからないけど、Laravel 8.xのマニュアルには‘TaskController@index’という書き方は見当たらないのでそのうち使えなくなるのかもしれない。

コメント

タイトルとURLをコピーしました