1. ホーム
  2. php

[解決済み] ターゲットクラスのコントローラが存在しない - Laravel 8

2022-02-14 02:23:25

質問

以下は私のコントローラーです。

<?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 のルートでPostmanを使用すると、以下のようなエラーが発生しました。

ターゲットクラス [ApiRegisterController] が存在しない。


更新しました。

回答いただいたおかげで、修正できました。私はこのルートには完全修飾クラス名を使うことにしましたが、回答にあるように他の選択肢もあります。

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

解決方法は?

Laravel8を使用しています。Laravel 8 を新規にインストールした場合、ルートが読み込まれるルートグループに適用される名前空間プレフィックスが存在しません。

以前のLaravelのリリースでは RouteServiceProvider には $namespace プロパティがあります。このプロパティの値は、コントローラのルート定義と action ヘルパー/ URL::action メソッドを使用します。Laravel 8.xでは、このプロパティは null をデフォルトで使用します。これは、Laravel."によって自動的な名前空間接頭辞が行われないことを意味します。 Laravel 8.x ドキュメント - リリースノート

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

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 プロパティに設定する必要があります。 RouteServiceProvider をリリースノートに、コメントを RouteServiceProvider は、あなたのルートに何の影響も与えません。現在のところ、アクションに URL を生成するための名前空間プレフィックスを追加するためだけのものです。したがって、この変数を設定することはできますが、それ自体ではこれらの名前空間プレフィックスを追加することはできません。

この情報は、アップグレードガイドに掲載されました

Laravel 8.x Docs - アップグレードガイド - ルーティング

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

繰り返しになりますが、これはいくら強調してもしきれません。 重要 の部分は、ルートグループの名前空間を設定することで、たまたまメンバー変数 $namespace を直接指定します。

更新してください。

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

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

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

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