これが私のコントローラーです:
<?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 によって名前空間のプレフィックスが自動的に追加されることはありません。」action
URL::action
null
Laravel 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 を生成するための名前空間プレフィックスを追加するためだけのものです。したがって、この変数を設定することはできますが、それだけではこれらの名前空間プレフィックスは追加されません。ルート グループに名前空間を追加するときは、この変数を使用するようにする必要があります。RouteServiceProvider
RouteServiceProvider
この情報はアップグレードガイドに記載されています
Laravel 8.x ドキュメント - アップグレード ガイド - ルーティング
アップグレード ガイドで示されている重要な部分は、ルート グループに名前空間を定義することです。$namespace
変数を単独で設定すると、アクションへの URL の生成にのみ役立ちます。
繰り返しになりますが、これは強調しすぎることはありませんが、重要な部分はルート グループの名前空間を設定することです。この例では、メンバー変数を直接参照することによってこれを行っています$namespace
。
アップデート:
バージョン 8.0.2 以降の Laravel 8 の新規コピーをインストールした場合は、ルート グループはグループの名前空間にこのメンバー変数を使用するように設定されているため、メンバー変数のlaravel/laravel
コメントを解除して古い方法に戻すことができます。protected $namespace
RouteServiceProvider
// protected $namespace = 'App\\Http\\Controllers';
コメントを解除すると、ルートに割り当てられたコントローラーに名前空間プレフィックスが追加される唯一の理由は、ルート グループがこの変数を名前空間として使用するように設定されているためです。
...
->namespace($this->namespace)
...