Laravel 8 使用時に「ターゲットクラスコントローラが存在しません」というエラーが発生する 質問する

Laravel 8 使用時に「ターゲットクラスコントローラが存在しません」というエラーが発生する 質問する

これが私のコントローラーです:

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        dd('aa');
    }
}

スクリーンショットに見られるように、クラスは存在し、正しい場所にあります。

ここに画像の説明を入力してください

私のapi.phpルート:

Route::get('register', 'Api\RegisterController@register');

register私がルートを走ったとき郵便配達員、次のエラーが発生しました:

ターゲットクラス [Api\RegisterController] が存在しません。

どうすれば修正できますか?


回答のおかげで、修正できました。このルートには完全修飾クラス名を使用することにしましたが、回答に記載されているように他のオプションもあります。

Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');

ベストアンサー1

Laravel 8 を使用しています。Laravel 8 を新規インストールすると、ルートがロードされるルート グループに名前空間プレフィックスが適用されません。

「Laravel の以前のリリースでは、 にはプロパティRouteServiceProviderが含まれていました。このプロパティの値は、コントローラーのルート定義とヘルパー/メソッド$namespaceの呼び出しに自動的にプレフィックスとして追加されました。Laravel 8.x では、このプロパティはデフォルトで追加されます。つまり、Laravel によって名前空間のプレフィックスが自動的に追加されることはありません。」actionURL::actionnullLaravel 8.x ドキュメント - リリースノート

名前空間プレフィックスを使用しない場合、ルート内でコントローラーを参照するときには、コントローラーの完全修飾クラス名を使用する必要があります。

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');

従来の方法を好む場合:

App\Providers\RouteServiceProvider:

public function boot()
{
    ...

    Route::prefix('api')
        ->middleware('api')
        ->namespace('App\Http\Controllers') // <---------
        ->group(base_path('routes/api.php'));

    ...
}

宣言された名前空間が必要なルート グループに対してこれを実行します。

プロパティ$namespace:

リリース ノート$namespaceには設定するプロパティについて記載されており、コメントにも記載されていますが、これはルートには影響しません。これは現在、アクションへの URL を生成するための名前空間プレフィックスを追加するためだけのものです。したがって、この変数を設定することはできますが、それだけではこれらの名前空間プレフィックスは追加されません。ルート グループに名前空間を追加するときは、この変数を使用するようにする必要があります。RouteServiceProviderRouteServiceProvider

この情報はアップグレードガイドに記載されています

Laravel 8.x ドキュメント - アップグレード ガイド - ルーティング

アップグレード ガイドで示されている重要な部分は、ルート グループに名前空間を定義することです。$namespace変数を単独で設定すると、アクションへの URL の生成にのみ役立ちます。

繰り返しになりますが、これは強調しすぎることはありませんが、重要な部分はルート グループの名前空間を設定することです。この例では、メンバー変数を直接参照することによってこれを行っています$namespace

アップデート:

バージョン 8.0.2 以降の Laravel 8 の新規コピーをインストールした場合は、ルート グループはグループの名前空間にこのメンバー変数を使用するように設定されているため、メンバー変数のlaravel/laravelコメントを解除して古い方法に戻すことができます。protected $namespaceRouteServiceProvider

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

コメントを解除すると、ルートに割り当てられたコントローラーに名前空間プレフィックスが追加される唯一の理由は、ルート グループがこの変数を名前空間として使用するように設定されているためです

...
->namespace($this->namespace)
...

おすすめ記事