Laravel備忘録~初心者時代に引っかかったとこまとめ~

この記事は[2019年近畿大学AdventCalender](https://qiita.com/advent-calendar/2019/kindai)の17日目の記事になります。

## はじめに

この記事は、PHPのwebアプリケーションフレームワークLaravelの環境構築や実際の開発の際に発生した問題を備忘録的にまとめたものです。基本的に実体験に基づくお話と、筆者の理解の低さから初歩的課題がいっぱいです。筆者は永遠の初心者です。~~すっごい簡素でごめんなさい~~

## 環境構築編

Laravelでの開発をしていくにあたって、開発環境の選択肢はいくつかあります。自分で必要なDB等を用意する、公式推奨のHomesteadを利用する、最近だとDockerを利用して作るといったものもあります。 当時の環境構築の際に採用したものとその際に出てきたの課題点をお話します。

最初にお断りとして、本記事では環境構築において出てきた不具合や課題を挙げますが、**作っていただいたサービス等そのものを否定するような意思は無い**ことをこの場で明記させていただきます。

### Laradock(Dockerでの環境構築サービス)
[Laradock](https://laradock.io/)は、Docker-composeを用いてLaravelで必要なソフトをイメージとして建て環境を構築するタイプのものです。webサーバコンテナやDB、メールサーバーなど、開発に利用するソフトを一括で建てれる優れものです。

筆者はLaradockを2018年の12月頃に触り始めました。いろいろな人のQiita記事やはてブ記事を参考にしてチュートリアル開始まで進めました。

#### 発生した問題「migrationができない」
色々な記事を元に構築を進めてきていましたが、最初のデータベースのマイグレーション`php artisan migrate`にてエラーが発生。内容としてはLaravel側がDB(当時はMySQLを利用)にアクセスできないというものでした。調べていくと、**PHPとMySQL間で利用している認証方式にズレがあった**というのが原因でした。具体的には、当時MySQL最新バージョンで取り扱っていたログイン認証方式が`caching_sha2_password`というもので、PHPの最新バージョンで取り扱っていたMySQL接続のログイン認証方式が`mysql_native_password`というものであり、PHP側が未対応なところが原因でした。


対策として、**MySQL側の設定を`mysql_native_password`に戻す**ことでこの問題は解消されます。

ただ、当時の筆者はMySQLの細かい設定を扱えるほどのスキルも無く、Laradockでの利用を断念。他の環境構築方法を探すことにしました。。。


### Homestead(公式推奨)

[Homestead](https://readouble.com/laravel/6.x/ja/homestead.html)は、Vagrantという仮想環境を用意できるアプリケーションをベースに、Laravelをすぐに始めるために必要な環境が整った仮想環境になります。実際、vagrantの準備ができてすぐにLaravel公式チュートリアルの実施はできました。

#### 発生した問題「新しいプロジェクトがうまく作れない」
チュートリアルは無事完了し、そのまま同じ仮想環境の中で新規プロジェクトを建てたとき、**新規プロジェクトを作った際に、参照するデータベースの設定が反映されていない**というものでした。これに関しては具体的な原因も判明できておらず、推測ではありますが、環境設定をするyamlファイルでの書き漏らしがあり得るかもしれません。

新規プロジェクトのたびに一から作り直しは手間が掛かるのでHomesteadでの利用は断念しました。


### Docker(現在メイン)
何度かの環境構築断念を経て、今度はシンプルに`nginx`、`MySQL`、`PHP`環境だけを揃えたDocker環境での構築をしました。
[こちら](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)の記事が大変参考になり、Homesteadのときのように簡単に環境の準備ができ、Laradockの様にローカル環境を汚さないのでとても重宝してます。次に書く開発編での問題は基本的にこの環境を元にしています。


## 開発編

実際の開発で発生した問題を少し。

### ヘルパ関数どこいった?(Laravel6.x)
結論から言えば**Laravelのバージョンの違いに依る関数の名称変更**が原因です。
公式以外のチュートリアルをやろうとして、[こちらの記事](https://qiita.com/yumgoo17/items/e40e02b3fc3275bd7f23)から参考にしてチュートリアルを実施していました。記事の方ではLaravelのバージョンは5.5を指定してましたが、筆者は最新の6.1でチュートリアルを実施しました。その結果、ヘルパ関数を呼び出すソースが正常に動作しませんでした。~~バージョン合わせてやれよって声はまったくもってその通りです...~~

対策として、ヘルパ関数自体の呼び出し方が変わったので[こちら](https://readouble.com/laravel/6.x/ja/helpers.html)のLaravel6のヘルパ関数一覧から対応する関数を探して置き換えることになります。

Laravelはバージョン間での仕様変更が結構大きく、その影響を受けてる結果として過去のチュートリアルがうまく動作しないことがよくあります。公式さんも5.2でチュートリアルを出したっきり新しいものがありませんし、正しくバージョンをあわせる、バージョンの違いを正しく把握するといった情報集めで問題発生を回避できると思います。

### 初デプロイ!されど動かず...(AWS EC2 とDocker)
先に話していたDocker環境での開発をしており、AWS サービスのEC2サーバにDockerを入れて稼働させる試みをしました。
EC2の環境構築は割愛。実施した流れは
1. ベースとなる`docker-compose.yaml`、必要な`Dockerfile`をgitにてクローン
2. `docker-compose`にてビルド
3. ソース部を別途クローン

この流れでdockerコンテナを立ち上げっぱなしで行ける!!...そう思っていた時期が私にもありました。

最初に発生した問題はDBの役割のコンテナがlogファイルの保存されているディレクトリへ権限の関係でアクセスできないというもの。
`ビルド時に対応するディレクトリをDBコンテナが作ってしまう`ことでその場は一旦解決しました。
**...が、それだけじゃない。**

同様の要因で今度はnginxのコンテナがlogファイル見れないエラーを吐き始めました。
同じ様に対処する前に少し調べると、ec2内のdockerではマウントしたディレクトリで生成されるファイルは基本的に`owner`名義で生成され、一般ユーザ側から見ると`root`名義になります。root名義になってしまったファイルは一般ユーザからは確認・操作ができないため、先のようなlogファイル見れないエラーが出る原因となってました。

対策としては、`対応するファイルの権限をchownコマンド等を用いて変更`し、一般ユーザでも触れる様にすることとなります。

#### ~~やるなよ!!絶対だぞ!!!~~
~~当時の自分は、chownコマンドでのファイルの権限変更が煩わしかったので、`sudo chmod 777`でゴリ押しました。もちろん、セキュリティ面ではぜったいやってはいけない手段ですし、これを読んでる人も是非この手段は避けて欲しいところです。~~

## おわりに
今回は、備忘録兼体験談でLaravel関係で起こったあれこれをまとめました。筆者が未熟者につき、情報の表現や真偽に多少の齟齬がある可能性もあるため、`参考程度`に思ってくれると幸いです。

最後に、文字ばっかりのこの記事を見てくださり、ありがとうございました。お疲れさまです。


## 参考文献
- MySQL8.0 認証方式を変更する(Laravel5) https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917
- 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4
- Laravel5 チュートリアル ブログもどきを作る(1) DB設定・マイグレーション https://qiita.com/yumgoo17/items/e40e02b3fc3275bd7f23
- Laravel 6.x ヘルパ https://readouble.com/laravel/6.x/ja/helpers.html
- dockerでvolumeをマウントしたときのファイルのowner問題　https://qiita.com/yohm/items/047b2e68d008ebb0f001