####名前空間の記述ミスの探し方を書いた記事です。
##はじめに
現在「PHPフレームワークLaravel入門 第2版」でLaravelを学んでいます。
Eloquentのモデルのスコープクラスを作成・使用の際に発生したClass not foundエラーの解決で得られたものを自身の振り返りも兼ねて記事にしてみました。
コードの中でClass名を書くと、Laravelはどのようにuseやnamespace部分(名前空間)を見に行くのか、その繋がりを図を用いて紹介したいと思います。
書いたコードの繋がりが分かれば理解しやすい!
タイプミスや名前の指定ミスを調べる際の確認箇所としてお役立ていただけたら幸いです。
おかしなところがありましたらご指摘ください。
##Class not foundが出たコード
<?php
namespace laravelapp;
use laravelapp\app\Scopes\ScopePerson;
protected static function boot()
{
parent::boot();
static::addGlobalScope(new ScopePerson);
}
###エラーメッセージ
Error
Class 'laravelapp\app\Scopes\ScopePerson' not found
laravelapp\Person::boot
C:\Users\user\laravelapp\app\Person.php:34
34行目:static::addGlobalScope(new ScopePerson);
出ているエラーは__「 ScopePersonクラスが見つからないよ! 」__というもの。
エラーが出た時の頭の中は、use laravelapp\app\Scopes\ScopePerson;
で場所はしているし、たしかにその位置に ScopePerson.php が存在しているし、ファイル名をコピペしているからタイプミスは考えにくい。「 どうして??? 」な状態。
とはいえ、Laravelさんが「 見つからない 」というのだから、ちゃんとScopePersonクラスまでご案内するのが私の役目。
そこで ScopePersonクラス に絡むところをいろいろ触ってどういう風にLaravelが呼び出されたクラスを見に行っているのか確認して得られたのが以下の流れです。
各文法の中で"クラス名"を入れるところに、文字列が入力されればそれをクラス名として認識し、Laravelは入力したクラスのファイルを探しに行きます。
しかし、
まだこれで呼び出し・読み込み完了ではありません。
__ScopePerson__のファイルが発見されて開かれるところまできたので、
これで呼び出し・読み込み完了かと思いきや、まだチェックされます。
チェックされるのは開いた__ScopePerson.php__の冒頭のnamespace
です。
ここでnamespace
の役割についての解説を挟みます。
namespace
は__自身の所属(存在位置)の表明__です。
これは、__ScopePersonクラス__を使用するためだけのチェックではなく、クラスやコントローラーを__呼び出す__という動きをLaravelにさせたときに__呼び出された側が表明しているnamespace
を確認__することで、間違ったクラスやコントローラーを呼び出しだしていないか確認するという全体に共通する仕組みです。
私はここの誤りでClass not foundとなっていました。
ここの流れが分かるようになることで、コードを書くときに適切な名前空間を指定することができるようになり、__Class not found__が出てもどこを確認したら良いかが分かるようになりました。また、名前空間を書き込む際も自信を持って記述することもできるようになりました。
参考にしていただける方がいらっしゃいましたらと思い作成した記事でした。そして初投稿です。(^^)
最後までご覧いただきありがとうございました!