[Laravel]フレームワークの全体像を大雑把に理解する

## 概要
この記事は「**これからフレームワークを触ってみよう**」という方を対象に、**最低限の情報量で大まかに全体像を掴む**ことを目的としたものです。
Laravelフレームワークの解説している記事や本は世の中に沢山ありますが、独学だと必要な情報を取捨選択できず全体像を把握しづらいことがままあると思います。
用語等はざっくり説明します。実作業はほぼ記載してません。詳しい解説は参考リンクor他の記事をご参考ください。

この記事を読んで、**全体像がどうなっていて、どういう情報が必要か**というのが漠然とわかるようになっていたら嬉しいです。

## フレームワークの概念

Laravelは、**MVC**の構成で作られた**フレームワーク**です。
[MVCパターンについて - Laravel学習帳](https://laraweb.net/surrounding/922/)

#### Q. **MVC**って何？
**[デザインパターン](https://techacademy.jp/magazine/9195)**の一つ。
M(Model)：**データの処理**を行う担当
V(View)：**ブラウザに表示**する画面を担当
C(Controller)：**MとVをつなぐ**役割
[MVCフレームワークって一体何？わかりやすく解説します！](https://se-shine.net/what-mvc/)

#### Q. そもそもなぜフレームワークが必要なの？
・色々面倒なことをやってくれるクラスやメソッドが豊富に用意されてる
・規則で決まってるのでコードが書きやすい/読みやすい/統一される/保守しやすい。
[php開発者がフレームワークを使用するメリット・デメリット | アサインナビ マガジン](https://assign-navi.jp/magazine/engineer/php/e112.html)

## 環境構築
まずは環境構築を行います。
「laravel インストール mac/windows」などで**ググって頑張って**ください！笑
プロジェクトを作成し、Laravelの初期ページが見られるようになればゴールです。
<img width="1440" alt="スクリーンショット 2019-06-29 15.16.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/4d87f741-c43d-60cd-3b96-5dcec77fe198.png">


## 実装の流れ

基本的に、実装の流れは以下になります。

1. **マイグレーション**でデータベースのテーブルを作成する
2. **シーディング**でテーブルに初期データを投入する
3. **Model**にデータの処理を書く
4. **Controller**でModelとViewをつなぐ処理を書く
5. **View**で表示画面を作成する
6. **ルーティング**でリクエストの行き先を書く

次のセクションで実際にファイルを見ながら解説します。

## ファイルを開く
エディタでプロジェクトディレクトリを選択して開きます。
まず、フレームワークをインストールした時に現れる沢山のファイル。。。（拒絶反応😱！）

今の所、**6つのディレクトリ**を覚えてください。
これさえ覚えておけば開発できます。
<img width="1440" alt="スクリーンショット 2019-06-29 15.04.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/b7fa1c29-2a9a-b464-24f4-57efdb2674ce.png">

MVCの概念と一緒に理解すると分かりやすいです。
![MVC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/37a475e3-fe35-e81a-2c57-a25f510fa386.png)
#### ① マイグレーションファイル

- {project_dir}/database/migrations

migrationsフォルダ内にある、 `日付から始まるphpファイル`はマイグレーションファイルです。
**マイグレーション**とは、データベースに**テーブルを作成/編集する処理**のことです。

#### ② シーダーファイル

- {project_dir}/database/seeds

seedsフォルダ内にある、`xxxSeeder.php`というファイルはシーダーファイルです。
**シーディング**とは、**初期データを投入する処理**のことです。

#### ③ Model

- {project_dir}/app

appフォルダ直下にある、`大文字から始まるphpファイル`は**Model**のファイルです。

#### ④ Controller

- {project_dir}/app/Http/Controllers

Controllersフォルダ内にある、`xxxController.php`というファイルは**Controller**のファイルです。

#### ⑤ View

- {project_dir}/resources/views 

viewsフォルダ内にある`xxx.blade.php`というファイルは**View**のファイルです。

#### ⑥ ルーティングファイル

- {project_dir}/routes

routesフォルダ内にある、`xxx.php`というファイルはルーティングファイルです。
**ルーティング**とは、**リクエストの行き先を振り分ける処理**のことです。
最初の頃は`web.php`というファイルを特によく利用すると思います。

## 実装する

このあたりまで頭に入れてから、掲示板などのCRUD機能のあるアプリをチュートリアルなどで実際に作ってみると処理の流れが理解しやすいと思います。

[CRUDアプリの作成（一覧表示）-Laravel学習帳](https://laraweb.net/tutorial/2791/)
[PHPフレームワークLaravel5.5チュートリアル、CRUD一回り作ってみる – 名古屋のWebシステム開発　iNet Solutions](https://www.inet-solutions.jp/technology/laravel-tutorial/)

## 雑談

ここからは枝葉の話なので読まなくても大丈夫です。

#### 教材について

**[Laravelの公式ドキュメント](https://readouble.com/laravel/)**はよくまとまっており、読みやすいと思います。
この記事含め、ブログの記事などは情報が古かったり間違っている場合があるのであくまで公式などの一次ソースを正とする習慣をつけるのが**Good**です。

また、個人的には**動画**の教材をお勧めします。
動画だと、記事では分からない**前提や暗黙知**を目で見ることができて迷う時間が減るからです。
[独学でも！初心者に役立つLaravelの学習サイト12選 | TechAcademyマガジン](https://techacademy.jp/magazine/11551)
私も新しい言語や技術を独学する際にはドットインストールやUdemyにお世話になりました。

#### 環境構築について

これは心がけのようなものですが、環境構築は**うまくいくことの方が少ない**と思っていいです。(こう思っていた方が精神的に負担が少ないです。笑)
PCの数だけいろんな環境があるので、なかなか記事や動画の通りにいきません。
なので、エラーが出ても慌てずに、エラー文をコピーして検索してみたり、詳しい人に聞いてみたりするのが良いと思います。
環境構築で挫折するのはもったいないです。

ちなみに、そういう環境構築嫌悪勢のために**Vagrant**や**Docker**といった環境ごとまるっと用意してくれるものもあります。
個人的には公式で提供されている**Homestead**がオススメです。興味があればどうぞ。
[Laravel Homestead 5.5 Laravel](https://readouble.com/laravel/5.5/ja/homestead.html)
[【Laravel超入門】開発環境の構築（VirtualBox + Vagrant + Homestead + Composer） - Qiita](https://qiita.com/7968/items/97dd634608f37892b18a)

話は変わりますが、プロジェクト作成部分についての補足です。
Laravelは最新バージョンでも良いのですが、**LTS(Long Term Support:安定版)**を指定してプロジェクトを作成すると、フレームワークによる思わぬ不具合を引き起こすのを防ぐことができます。
記事執筆時点(2019/5/23)の最新のLTSのバージョンは5.5です。
以下のように、`composer`コマンドでバージョンを指定してプロジェクトを作成できます。

```bash
$ composer create-project --prefer-dist laravel/laravel PROJECT_NAME "5.5.*"
```


**Composer**とはPHPの**パッケージ管理ツール**で、必要なファイルをまとめてダウンロードしたり削除したりなどの管理を行ってくれます。
パッケージ管理ツールは言語ごとに存在し、Rubyだとbundler、Pythonだとpipenv、Node.jsだとnpmなんかがあります。
[バージョン管理ツール、パッケージ管理ツールの種類をまとめました - Qiita](https://qiita.com/akkey2475/items/5b2813e62303a9c75813)

ちなみに、`laravel new`コマンドでプロジェクトを作成することもできますが、バージョンが指定できなかったり不具合があったり機能が貧相なのであえて使う必要はないと思います。

#### フレームワークについて

これまで説明してきたマイグレーションやModelのファイルなど各ファイルの作成等は`php artisan`コマンドで可能です。
以下のコマンドで一覧を確認することができます。

```bash
$ php artisan list
```

データベースに関してですが、マイグレーションやシーディングを使わずに自分でデータベースにアクセスしてテーブル作成やデータ投入することも可能ですが、これらの機能があることによって後々便利な面が出てきます。

実装の流れに関しては、同じMVCのフレームワークである`Ruby on Rails`も同様の流れで実装します。
歴史的にはLaravelがRailsのやり方に倣って後発で生まれました。
どちらか一つ覚えておけばもう一つもすぐ理解できると思います。

#### エディタについて

エディタは**VS Code**がオススメです。
以前はAtomやSublimeTextが主流でしたが、VS Codeが出てからはその機能のバランスの良さからかなり市場を席巻した感じがします。

## 最後に
記事に間違いや不明な点がある場合は遠慮なくご指摘ください。