[解決済み] ターゲットクラスのコントローラが存在しない - 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
のルートで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)
...
関連
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】警告。数値でない値に遭遇しました
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] PHP product.php?id=1 のような URL を作成する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Notice: 非オブジェクトのプロパティを取得しようとしているエラー
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み】新しいPHPMailerはPHPMailerAutoload.phpが必要?
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み】In_arrayが動作しない。
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。