Laravel 主なエラーとその解決法

こんにちは。webチームの黒岩です。
今回は、自分に対してもそうですし、この記事を読んでくださった方にも備忘録として役に立つかもしれない、Laravelでよく見るエラー、およびその解決法を抜粋し、簡潔にお伝えしていきます。

以下のジャンルに分けて解説します。

  • プロジェクトの立ち上げ
  • マイグレーション
  • DB操作

プロジェクト立ち上げ編

プロジェクトを立ち上げて最初にページへ行く際に良く起きるエラーを二つほど紹介します。

ErrorException (E_WARNING) file_put_contents(/*****/storage/framework/views/************************.php): failed to open stream: Permission denied

プロジェクトを作っていざサーバーを起動、アクセスしてみると何やらこのようなエラーが・・。

これは/storageへの書き込み権限がないことが原因です。
以下のようなコマンドで権限を与えてあげましょう。

chmod 777 storage -R

dockerコンテナの中だとsudoをつけるとうまく行かない場合があるので注意です。
このエラーはプロジェクト立ち上げの際だけで起こるものではないので、先にパーミッション変更をしておくのがいいかもしれません。

No application encryption key has been specified

サーバーを起動してアクセスするとこのようなエラーが発生・・。

このエラーの原因は起動時に参照する「.env」ファイルの変数「APP_KEY」が空になっていたことが原因です。

プロジェクトフォルダにて、以下のコマンドを実行することで簡単に解決が可能です。

php artisan key:generate

APP_KEYとは、簡単にいうと、Laravelのプロジェクトのユーザー情報やセッション、パスワード設定などのデータを暗号化するために使うものです。

これがないと、暗号化できないためLaravelでは必須となっています。

盗聴されないためにも絶対に不可欠なものなので、本番用のプロジェクトのAPP_KEYは絶対に公開しないよう注意しましょう。

マイグレーション編

次にマイグレーションです。DBに接続さえできれば問題はほとんどないと言えるでしょうが、それ以外の問題にも少し触れていきます。

Illuminate\Database\QueryException : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = forge and table_name = migrations)

「SQLSTATE」とある通りDB関係のエラーなので原因をこれと言い切ることはできません。なので真っ先に確認することから説明します。まずは・・

laravelとDBの接続設定は問題ないか?
です。

.envやdocker-compose.ymlなど、DBの設定に間違いがないかを確認してみましょう。
DB名やポート番号、ホスト名等確認し、正しく直したらもう一度行ってみましょう。

PHP Fatal error: Cannot declare class Create****, because the name is already in use in app/database/migrations/20**_**_ **_******_create_********.php on line 0

同名のクラスがすでに使用されていると出力されています。ここだけ見ると同じ名前のテーブルが存在しているときに起こるんだな、そう考えると思います。

しかしこのエラーが出る要因はそれだけではありません。
マイグレーションのファイル名とファイル内で定義されているクラス名が一致していない場合にも起きることがあるようです。

クラス名またはファイル名のどちらか合わせたらもう一度やってみましょう。

DB操作編

コントローラーにて用意される関数、「store」、「edit」、「update」など。その中でエラーって何度も経験すると思います。その中で起きたくないであろうものを抜粋して紹介します。DB設定に問題はないものという前提で話をなるべく進めていきましょう。

The GET method is not supported for this route. Supported methods: POST.

form methodがPOSTじゃないときに起きるエラーだと思う人もいるでしょうが、実はそれだけではありません。

バリデーションに失敗して前の画面にリダイレクトされるということもあるので、フォームのtypeの確認とバリデーションがちゃんとできているかを確認するのがいいかもしれません。
只、バリデーションに関しては公式が用意している方法を用いればまず失敗することは無いでしょう。