😓

PHP8.1 × Laravel9でハマったところ

2022/11/05に公開

完全修飾したクラス名の指定方法

こんな初歩的な…というところですが、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 の先頭の appApp にする必要があります。
つまり、以下のようにする必要があります。ディレクトリ名は 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