開発でLaravelを利用する

## はじめに

この記事は社内の開発メンバ向けに書いているものです。
当然ですが業務上の内容については一切触れません。
<hr>
### 目次
1. フルスタックフレームワークに分類されるWAF
2. Laravelのバージョンと選び方
3. Laravelの開発環境について
4. 既存のLaravelプロジェクトを利用できるようにするための手順

<hr>

# フルスタックフレームワークに分類されるWAF
Laravelは一般的にフルスタックフレームワークに分類されるWeb Application Framework(WAF)です。
他のPHPフレームワークと比較しても、非常に尖った特徴がたくさんあります。

そんなLaravelのWAFとしての特徴をいくつかあげると…。

- RDBMS内のデータを利用する際にSQLを意識せずに操作が可能なORM（Eloquent）が利用できる。
- HTTPリクエストのに対するBefore/Afterフィルタの実装が簡単にできる（ミドルウェア）。
- 簡潔で自由度の高いテンプレートエンジン（Blade）を標準装備している。
- 強力なサービスコンテナが存在する。
- 依存注入DIがサポートされており、上手く書けば簡潔なソースコードを書くことができる。
- 高品質なコンソールアプリケーションを作成することができる。
- フレームワークはオブジェクト指向で作られており、他言語出身者でも扱いやすい。
- PSR-2準拠のフォーマットで書かれており、ソースコードが読みやすい。

<hr>

# Laravelのバージョンと選び方

~~執筆時点(2019/05/03)のLaravelの最新バージョンは5.8です。~~
現在(2019/10/13時点)の最新バージョンは6です。

Laravelには大きく２種類のバージョンが存在します。

- 一般リリースバージョン（半年のバグフィックス対応/1年のセキュリティフィックス対応）
- LTSリリースバージョン（2年のバグフィックス対応/3年のセキュリティフィックス対応）

開発で利用するべきバージョンの選び方が悩ましいところです。
最新のLTSリリースバージョンのセキュリティフィックス期間が十分にある場合は迷わずLTSバージョンを利用することをお勧めします。
もしも開発後にすぐサポート切れとなる場合は、最新版の一般リリースバージョンを採用し、LTSバージョンリリース後にアップグレードすることも検討すると良いでしょう。

<hr>

# Laravelの開発環境について

LaravelはPHPのフレームワークであるため、WEBサーバで公開し、ブラウザで動作確認をすることでしょう。
Laravelには、標準で開発用のWEBサーバ機能が搭載されています。(コマンド`$ php artisan serve`)
こちらのサーバで開発を進めても構いませんが、別にDBや必要なライブラリを導入する必要があり、ホストマシン環境がぐちゃぐちゃになりがちです。
開発する機能が限定される場合は、開発用のWEBサーバで開発を進めても良いと思います。

ただし、実際にはもっとリッチな開発環境を検討することも多いと思います。
そこで私のおすすめする開発環境を２つ紹介します。

### 開発環境1: `Laradock`（ララドック）おすすめ

[Laradock公式ページはこちら](https://laradock.io/)

Laradockとは、Laravel向けに特化させた開発用のDocker環境です。
近年は本番環境へのデプロイはDockerコンテナで済ますということが一般的になってきました。
この開発環境を利用することで、本番により近い環境で開発できる点が魅力です。
なお、Windows OSであればHyper-VやVirtualBoxを利用して環境を準備する必要があります。

LaradockではWEBアプリケーションを作成する際のミドルウェア類（DBやNginxなど）が、Docker Composeでオーケストレーションされるようになっており、サクッと環境構築できるのが魅力です。
また、チーム開発をするような局面で、追加するべきのLinuxディストリビューションパッケージを、Dockerfile形式かDockerイメージで共有することも可能です。

ただし、Docker環境を構築可能なOSやマシンを利用しなくてはならないため、従来の（旧来の？）PHP技術者の方やDockerアレルギーな方にとっては敷居が高く感じるかもしれません。

自力でLaravelの環境構築ができる方はもちろん、後述のHomestead環境を動かすことができる程度の知識をお持ちであれば、迷わずこちらを選ぶことをおすすめします。

### 開発環境2: Homestead（ホームステッド）
HomesteadはVagrantを利用したLaravelの開発環境です。

オールインワンのLinux VMで、内部にDBなどのミドルウェアが準備されており、一般的なWEBアプリケーションを作成するのであればこちらで構いません。
Laradockと比較すると、よりWEBアプリケーションの開発経験が少ない人や、既に手元PCにVirtualBoxがインストール済みの方におすすめです。
導入手順はLaravelの公式ドキュメントにありますので、そちらを参照してください。

Laradockとは異なり、チームと新規のLinuxディストリビューションパッケージを共有する場合は、チームメンバの各Homesteadでパッケージインストールが必要となります。
また、本番環境は別途自力で整える必要があるため、実はこちらの方が必要となる求められるスキルレベルは高いかもしれません。（Laravelの開発だけやって"本番デプロイなんて知らない"って人なら大丈夫です。）

<hr>

# 既存のLaravelプロジェクトを利用できるようにするための手順
※ゼロからプロジェクトを立ち上げる場合は、公式ドキュメントを参照してください。

Laravel はComposerで依存関係が管理されています。
ここでは既に存在するLaravelで作成されたプロジェクトを、利用できるようにするための手順です。

### ▼前提条件

1. Composerが使える

    Laravelでは、パッケージ依存管理ツールであるComposerを利用します。
    composerが実行できる必要があります。
    `$ composer`コマンドまたは、`$ php /path/to/composer.phar`のどちらかで動かすことができればよいでしょう。

2. プロジェクトのソースコードが手元に用意する

    既存の
    弊社の場合はGitで管理されていることがほとんどです。
    この場合はGitの利用環境も用意してください。
    Windowsをお使いの場合、[Git for Windows](https://gitforwindows.org/)か[SourceTree](https://ja.atlassian.com/software/sourcetree)があればよいでしょう。

### ▼手順
Composerは`$ composer`で呼び出せて、プロジェクトのソースコードは`/path/to/project`にあるものとします。

1. <b>プロジェクトディレクトリに移動する</b>

    `$ cd /path/to/project`
    この時、`composer.json`と`composer.lock`が存在していればこのまま<b>手順２</b>に進み、なければ探して存在するディレクトリまで`cd`しましょう。

2. <b>依存関係を取得する</b>

    `$ composer install`
    このコマンドで依存関係が取得できます。
    （当然、依存関係のリポジトリまでUnreachableな場合は失敗します。）
    かなり時間がかかることもありますが、静観してお待ちください。

3. <b>LaravelのArtisanが動作するか確認する</b>

    Laravelで作成されたプロジェクトには、artisanという拡張子の無いファイルが存在します。
    以下のコマンドでartisanが動作するか確かめます。

    ```
    $ php artisan
    Laravel Framework (Laravelのバージョン)
    
    Usage:
      command [options] [arguments]
    
    Options:
      -h, --help            Display this help message
      -q, --quiet           Do not output any message
    ...
    ...
    ...
     vendor
      vendor:publish         Publish any publishable assets from vendor packages
     view
      view:clear             Clear all compiled view files
    $ _
    ```

4. <b>DB設定やプロジェクト固有の環境設定を行う</b>

    大抵の場合、`/path/to/project/.env`ファイルに環境設定を行います。
    もし.envファイルがない場合、.env.exampleをひな形として利用していることが多いです。
    ここはプロジェクトごとに必要な設定項目が変わりますので、プロジェクトのメンバに確認しましょう。

5. <b>データベースのマイグレーションと(あれば)DB初期値の投入</b>

    LaravelではDBのマイグレーション機能がデフォルトで用意されています。
    マイグレーションは以下のコマンドで実行することができます。

    ```
    $ php artisan migrate
    ```

    マイグレーションファイルの書き方に問題がある場合、中途半端な状態にマイグレーションされることがあります。
    そのような状況下ではDB内の全テーブルを削除し、テーブルをすべて作り直すのが簡単です。
    `:fresh` をつけてマイグレーションをやり直しましょう。

    ```
    $ php artisan migrate:fresh
    ```

    Laravelプロジェクト内にDBに初期値が準備されている場合、以下のコマンドで初期値をDBに反映させます。

    ```
    $ php artisan db:seed
    ```

    また、DBマイグレーション時にオプション `--seed` を指定することで、マイグレーション後に自動的に初期値投入まで行うことも可能です。

    ```
    $ php artisan migrate:fresh --seed
    ```

6. <b>その他必要な情報をプロジェクトメンバから聞き出す</b>
    
    Redis等必要なミドルウェアであったり、AWSの設定だったり…。
    この辺りの必要な情報はプロジェクトメンバに共有してもらってください。