Laravelでよく出るエラーと対処法まとめ!初心者向け完全ガイド
生徒
「Laravelを使っていると、画面が真っ白になったり、エラーメッセージが出て困ってしまいます。どう対処すればいいですか?」
先生
「Laravelのエラーは、最初は怖く見えますが、パターンを覚えれば原因をすぐに特定できるようになりますよ。よく出るエラーとその対処法を一緒に見ていきましょう!」
生徒
「エラーメッセージって英語で書いてあって、何が書いてあるのか全然わかりません。」
先生
「大丈夫です。よく出るエラーはだいたい決まっています。意味と対処法をセットで覚えていきましょう!」
1. Laravelのエラーとは?まず基本を知ろう
Laravelとは、PHPというプログラミング言語で作られたWebアプリケーションを開発するためのフレームワーク(開発をサポートする便利な道具箱のようなもの)です。初心者がLaravelを学び始めると、必ずといっていいほどエラー画面に出会います。
エラーとは、プログラムが正しく動かないときにシステムが出してくれる「警告メッセージ」のことです。料理でいえば、「塩を入れ忘れましたよ」と教えてくれる親切なお知らせのようなものです。エラーを怖がらず、「何が問題なのか」を読み解く練習をしていきましょう。
Laravelには開発中に役立つデバッグ機能があります。デバッグとは、バグ(プログラムの不具合)を見つけて直す作業のことです。.envファイルという設定ファイルでAPP_DEBUG=trueにしておくと、エラーの詳細が画面に表示されて原因を特定しやすくなります。
2. 500 Internal Server Error(内部サーバーエラー)の原因と対処法
「500 Internal Server Error」は、Laravelを使っていると非常によく見かけるエラーです。これはWebサーバー(Webページを届ける機械)の内部で何か問題が起きたことを示しています。原因はさまざまですが、特に多いのが設定ミスやコードの記述ミスです。
まず確認すべきなのがストレージのパーミッション(権限)です。パーミッションとは、ファイルやフォルダに対して「読み書きしてよいか」を決めるルールのことです。Laravelはログ(記録)やキャッシュ(一時保存データ)をstorageフォルダに書き込むため、このフォルダへの書き込み権限がないと500エラーになります。
ターミナル(パソコンに命令を文字で打ち込む画面)で以下のコマンドを実行すると権限を付与できます。
// ターミナルで実行するコマンド(PHPではなくシェルコマンド)
chmod -R 775 storage
chmod -R 775 bootstrap/cache
また、.envファイルの設定漏れも500エラーの原因になります。.envファイルとは、データベースのパスワードやアプリの名前などをまとめた設定ファイルです。設定を変更したあとは必ず下記コマンドでキャッシュをクリアしましょう。
// 設定キャッシュをクリアするコマンド
php artisan config:clear
php artisan cache:clear
3. Class not found エラーの原因と対処法
「Class 'App\Http\Controllers\SampleController' not found」のようなエラーは、Laravelがクラス(プログラムの設計図)を見つけられないときに発生します。クラスとは、関連する処理をひとまとめにしたプログラムの部品のことです。
このエラーの原因として最も多いのが、オートロード(自動読み込み)の設定が更新されていないことです。Laravelでは、Composerというツールがクラスの場所を管理しています。新しいクラスを作ったり移動させたりしたあとは、以下のコマンドを実行して情報を更新する必要があります。
// オートロードを再生成するコマンド
composer dump-autoload
また、名前空間(namespace)のミスも原因になります。名前空間とは、クラスの住所のようなもので、プログラムファイルの先頭に「このクラスはどこに属しているか」を宣言するものです。ファイルの場所とnamespaceの記述が一致しているか確認しましょう。
たとえばコントローラー(処理を担当するファイル)の先頭部分は以下のようになっていなければなりません。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class SampleController extends Controller
{
public function index()
{
return view('sample.index');
}
}
4. SQLSTATE エラー(データベース接続エラー)の原因と対処法
「SQLSTATE[HY000] [2002] Connection refused」や「SQLSTATE[HY000] [1045] Access denied」といったエラーは、データベース(データを保存する場所)への接続に失敗しているときに表示されます。
データベースとは、ユーザー情報や投稿内容などのデータを整理して保存しておく「大きな表計算ソフト」のようなものです。Laravelはこのデータベースに繋いでデータのやり取りをします。
まず確認するのは.envファイルのデータベース設定です。以下の項目が正しく入力されているかチェックしてください。
// .envファイルのデータベース設定例
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_username
DB_PASSWORD=your_password
DB_DATABASEにはデータベースの名前、DB_USERNAMEにはログインするユーザー名、DB_PASSWORDにはパスワードを入れます。これらが間違っていると接続に失敗してエラーになります。設定を変更したあとは必ずphp artisan config:clearを実行してください。
また、そもそもデータベースのサーバー(MySQLなど)が起動していない場合もあります。MAMPやXAMPPなどの開発環境ツールを使っている場合は、MySQLが起動しているかどうか確認しましょう。
5. TokenMismatchException(CSRFトークンエラー)の原因と対処法
フォームを送信したときに「419 Page Expired」または「TokenMismatchException」というエラーが出ることがあります。これはCSRFトークンという仕組みが原因です。
CSRFトークンとは、「本物のユーザーからの送信かどうか」を確認するための合言葉のようなものです。悪意のある第三者が偽のフォームを使って不正な操作をするのを防ぐためにLaravelが自動で付けてくれる安全機能です。
フォームのHTMLに@csrfという記述が入っていないと、このエラーが発生します。Laravelのbladeテンプレート(HTMLを書くためのLaravel専用のファイル形式)でフォームを作るときは必ず以下のように書きます。
<form method="POST" action="/submit">
@csrf
<input type="text" name="name">
<button type="submit">送信</button>
</form>
@csrfを書くだけで、Laravelが自動的にトークンを埋め込んでくれます。フォームを作るときの必須ルールとして覚えておきましょう。また、セッション(ユーザーの状態を一時保存する仕組み)の有効期限が切れた場合もこのエラーが出るため、ページを再読み込みして再度送信すると解決することもあります。
6. View not found エラーの原因と対処法
「View [sample.index] not found.」というエラーは、コントローラーからビュー(画面表示用のファイル)を呼び出そうとしたが、該当するファイルが見つからないときに発生します。
ビューとはユーザーに見せる画面のことで、Laravelではresources/viewsフォルダの中にHTMLを記述した.blade.phpという拡張子のファイルを置きます。
このエラーが出たときは以下の点を確認してください。まずファイルが正しい場所にあるかどうかです。たとえばview('sample.index')と書いた場合、resources/views/sample/index.blade.phpというファイルが存在しなければなりません。ドットはフォルダの区切りを意味します。
次にファイル名のスペルミスです。大文字と小文字の違いでもエラーになることがあるため、ファイル名とコード内の名前が完全に一致しているかどうか確認しましょう。
7. Laravelのログを使ったエラー調査方法
エラー画面に何も表示されない、あるいはエラーの原因がよくわからないときは、ログファイルを確認するのが効果的です。ログとはプログラムが動いた記録のことで、エラーが起きたときにその詳細が書き込まれます。
Laravelのログファイルはstorage/logs/laravel.logに保存されています。このファイルをテキストエディタで開いて一番下を確認すると、最新のエラー内容が書かれています。
また、コード内で自分でログを記録することもできます。原因を調べたい箇所に以下のように書くと、ログファイルにメッセージが出力されます。
<?php
use Illuminate\Support\Facades\Log;
// 変数の中身をログに出力して確認する
$user = '田中太郎';
Log::info('ユーザー名を確認: ' . $user);
// エラー時にログを残す
Log::error('ここでエラーが発生しました');
Log::info()は情報として記録、Log::error()はエラーとして記録します。どこで問題が起きているか確認したいときに非常に便利な方法です。プロの開発者もよく使うテクニックですので、ぜひ身につけておきましょう。
8. dd()関数を使ったデバッグの方法
Laravelにはdd()という非常に便利なデバッグ関数があります。ddは「Dump and Die(中身を表示して止まれ)」の略で、変数の中に何が入っているかを画面に表示してプログラムをその場で止めてくれます。
プログラムが期待通りに動かないとき、「この変数には何が入っているんだろう?」と確認したい場面が多くあります。そういうときにdd()を使うと一目で中身を確認できます。
<?php
public function index()
{
$users = User::all(); // データベースから全ユーザーを取得
dd($users); // ここで中身を表示してプログラムを停止
return view('users.index', compact('users'));
}
実行すると画面にデータの内容が色分けして表示されます。確認が終わったら必ずdd()の行を削除してから本番公開しましょう。dd()を残したままにすると、その画面でプログラムが止まったままになってしまいます。
似た関数にdump()があります。こちらは中身を表示してもプログラムを止めないため、複数箇所の中身を順番に確認したいときに使います。状況によって使い分けると効率よくデバッグできます。