はじめに
こんにちは、プログラミングを始めて約3年のエンジニアのkeitaMaxです。
今回は、Class "Lib\UsePost" not found
というエラーがでてしまって困った話をします。
困ったこと
Laravelプロジェクト直下にLib
というディレクトリを作成し、'UsePost.php'というファイルを作成したのですが、
これをコントローラから読み込もうとしたときにClass "Lib\UsePost" not found
となってしまい読み込むことができなくて困ってしまいました。
最初に実装した内容
最初に実装した内容としては、PostController
とUsePost
を以下のように実装しました。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Lib;
class PostController extends Controller
{
public function count():int
{
$usePost = new Lib\UsePost;
$count = $usePost;
return $count";
}
}
<?php
namespace Lib;
class UsePost
{
function count():int
{
return 1;
}
}
ファイルの構成としては以下のような感じで作成しました。
src/
├── app/Http/Controllers/PostController.php
├── lib/UsePost.php
解決策
この記事に書いてありました。
composer.json
のautoload
に今回作成したlib
ディレクトリを追加し、composerを読み込みなおします。
具体的には、composer.json
を以下のように修正しました。
"autoload": {
"psr-4": {
"App\\": "app/",
"Lib\\": "lib/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
変更したら以下のコマンドでcomposerの再読み込みを行いました。
composer dump-autoload
これで冒頭に困っていたClass "Lib\UsePost" not found
は消えて動くようになりました。
なぜエラーがでていたのか
今回作成したファイルがLaravelのオートロード機能で読み込まれていなかったことが原因でした。
オートロード機能とは、ファイルを自動で読み込んでくれることによってrequire
をいちいちファイルの冒頭に書かなくてもよくなるというものです。
以下のサイトで詳しく紹介されていましたので、ここを読んでみるとわかりやすかったです。
Laravelだとcomposer.json
に書かれているファイルを読み込むという仕様でしたので、今回は新しく自分でフォルダを作成したために、オートロード機能で読み込まれずにClass "Lib\UsePost" not found
が出てしまっていました。
また、PHPのオートローダ機能については以下の公式サイトを読みました。
おわりに
私自身、Laravelはオートローダ機能をあまり理解していないて今まで使用してしまっていたので、今回はいい機会になったかなと思います。
Laravelの機能について知らないことがまだまだたくさんあるので、これからはどのようにその機能が実装されていて、それによってどのようなメリットを得られているかなど、深く考えていこうと思いました。
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!
参考文献