😓
PHP8.1 × Laravel9でハマったところ
完全修飾したクラス名の指定方法
こんな初歩的な…というところですが、Google検索のトップページには出てこなかった気がするので初学者向けに書きます。
web.phpにルーティング先のコントローラーを登録して、そこのエントリーポイントを叩くと・・・
<?php
use Illuminate\Support\Facades\Route;
Route::get('/page2', [app\Http\Controllers\Page2Controller::class, 'index']);
↓ GET: http://localhost/page2
Target class [app\Http\Controllers\Page2Controller] does not exist.
エラーになってしまいました。
どう解決するのかとういうと、 app\Http\Controllers\Page2Controller
の先頭の app
を App
にする必要があります。
つまり、以下のようにする必要があります。ディレクトリ名は app
だったので気づきにくかったです。(TypeScript脳)
<?php
use Illuminate\Support\Facades\Route;
Route::get('/page2', [App\Http\Controllers\Page2Controller::class, 'index']);
なぜ?
以下にコードを示します。
Page2Controller.php
<?php
declare(strict_types = 1);
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Dice;
class Page2Controller extends Controller
{
/** インデックス */
public function index(Request $request)
{
return view('page2');
}
}
名前空間の宣言で、冒頭が App
となっているからだと思われます。
これを宣言側と使う側で合わせないと認識できず、クラスが見つからないとエラーになるようです。
とはいえ https://www.php.net/manual/ja/language.namespaces.rationale.php のドキュメントには以下のような記述があるのが不思議ではありますね。。。
注意: 名前空間の名前は、大文字小文字を区別しません。
Discussion