Laravel 超初心者講座～ディレクトリ構造について～

Laravel初心者向けの内容です。
本記事は、普段LaravelやVue.jsを使っているWeb系エンジニアが「Laravelをこれから触ってみたい」、「まずは簡単な掲示板を作れるようになりたい」と考えている方へ向けまとめた記事です。
とにかくわかりやすく短時間で読めることに重点を置いているため、細かい説明等は割愛していきますのでご了承ください。

Laravelの全体像を掴んでいただくため、今回はディレクトリ構造（フォルダの構成）について解説していきます。

## Laravelのディレクトリ構造
まずLaravelアプリケーションのディレクトリ構造は下記のようになっています。
下記ディレクトリについて、1つ1つざっくりと解説していきます。

```
application
 -app
 -bootstrap
 -config
 -database
 -public
 -resources
 -routes
 -storage
 -tests
 -vendor
 -.env
```
#### app ディレクトリ 
`主にここにアプリケーションの処理を書いていく`
このディレクトリは、「コントローラー」や「モデル」などアプリケーションを作っていく上でメインとなる処理を記載します。最も使用するのがこのappディレクトリです。
このディレクトリ配下には重要度の高いものがたくさんあるので詳細は後述します。

#### bootstrap ディレクトリ
`初期起動時の処理`
このディレクトリは、アプリケーションを立ち上げた際にデフォルトで生成されたファイルが配置されています。基本的にこのディレクトリ内のファイルを変更することはありません。はじめはあまり気にしなくて大丈夫です。

#### config ディレクトリ
`各種設定`
このディレクトリは、アプリケーション全体の設定ファイルが配置されています。必要に応じて設定のオプションをカスタマイズします。

#### database ディレクトリ
`データベース関連`
このディレクトリは、データベースに関連する次の３つが設置されています。
【 マイグレーション（migrations） 】
　テーブルの作成や変更などで使用する。
【 シーダー（seeds） 】
　テーブルにデータを自動で流す際に使用する。
【 ファクトリー（factories） 】
　シーダーを使って大量のデータを流す際に使用する。

#### public ディレクトリ
`画面に描画される関連ファイル`
このディレクトリには、リクエストを受けた際の窓口となるindex.phpファイルがあります。また、「画像」、「JavaScript」、「CSS」などのファイルもここに配置されています。

#### resources ディレクトリ
`画面に描画される関連ファイルの元となるコード`
このディレクトリには、フロント（画面に表示されるもの）側に関連する下記４つが配置されています。
【 js 】
　コンパイル*¹する前のJavaScriptファイルが配置されています。コンパイル*¹後に前述したpublicディレクトリ配下に反映されます。publicディレクトリを直接更新する場合は使用しません。
【 lang 】
　言語ファイルが配置されています。デフォルトでは英語のみ。
【 sass 】
　cssにコンパイル*¹する前のsassファイルが配置されています。コンパイル*¹後に前述したpublicディレクトリ配下に反映されます。publicディレクトリを直接更新する場合は使用しません。
【 views 】
　`MVCのV`にあたる。コンパイル*¹する前のhtmlファイルが配置されています。Laravelでは「.html」でなく「.blade.php」という拡張子でファイルを作成することでそのファイル内で、変数やif文、for文などPHPの処理が使用できるようになります。コンパイル*¹後に後述のstorageディレクトリ配下に反映されます。

:::note info
※1 コンパイルとは、プログラミング言語で書かれたソースコードを、コンピュータが直接実行可能な形式に変換すること。
:::

#### routes ディレクトリ
`ルート定義`
このディレクトリには、ルートが定義されています。webサービスでいえば「https://〇〇〇.com/△△」というURLにアクセスがあった場合に、どの処理へ飛ぶのかが一覧で定義されています。デフォルトで「web.php」、「api.php」、「console.php」、「channels.php」という４つのファイルがありますが、Webサービスでは基本的に「web.php」にルートを定義します。APIを作成したい場合は「api.php」に定義します。「console.php」、「channels.php」は今は気にしなくて大丈夫です。

#### storage ディレクトリ
`倉庫`
このディレクトリには、「app」、「framework」、「logs」が配置されています。今はlogs配下にログが出力されるファイルがあることを覚えておきましょう。エラーログもここに出力されます。

#### tests ディレクトリ
`テスト関連`
このディレクトリには、自動テストなどを行う際に使用するファイルを配置します。

#### vendor ディレクトリ
`Laravelの便利機能たち`
このディレクトリには、Laravelフレームワークが持っている便利機能の処理が書かれているファイル群が配置されています。
これらはコンポーザー*²によって管理されています。直接いじらず必要な機能を呼び出して使用します。
様々なファイルで呼び出される「Illuminate」はvender/laravel/framework/src/Illuminateに配置されています。
ここに関してはいきなり理解するのは難しいので徐々に理解を深めていきましょう。

:::note info
※2「コンポーザー（Composer）は、Laravelの様々な便利機能（パッケージやライブラリなど）のバージョンや依存関係の管理を行ってくれる機能のことです。
:::

#### .env ファイル
`環境変数`
このファイルは、アプリケーションの根幹となる重要な設定を記載するファイルです。
データベースにアクセスするためのパスワードや暗号化するためのキーなど機密情報の設定もここに記載します。このファイルは外部に漏れないよう細心の注意が必要です。

次にappディレクトリ配下の構造について解説していきます。

## app ディレクトリについて
前述したappディレクトリの配下の構造は下記のようになっています。
アプリケーションのメインとなる重要なディレクトリなので解説していきます。

```
app
 -Console
 -Exceptions
 -Http
 -Library
 -Models
 -Providers
 -Rules
 -Services
```

#### Console ディレクトリ
`コマンド群`
コマンドを自作するとここに生成されます。バッチ処理などコマンドで実行したい処理がある場合に利用します。

#### Exceptions ディレクトリ
`例外処理の設定`
エラーが起きた際の出力先や出力方法を設定できます。デフォルトではログに出力されます。

#### Http ディレクトリ
`アプリケーションの中心部`
アプリケーションへのリクエストがあった際に実行される処理を記載する。
今は下記2つを覚えておこう。
【 コントローラー（Controllers） 】
　`MVCのC`にあたる。アプリケーションの司令塔としての役割を担います。ユーザーからの要求（リクエスト）に対して、モデルなどから情報を取得し、必要な形に処理し、画面や値などといった何かしらの返答（レスポンス）を送ります。
【 リクエスト（Requests） 】
　フォームに入力された値など、送られてきた値に対してバリデーションや加工を行う。

#### Models ディレクトリ
`データベースとの架け橋`
　`MVCのM`にあたる。DBからデータを取得、DBへデータを登録、DBのデータを更新・削除など、DBとのやりとりをする処理はここに記載しましょう。Laravel5以降ではModelsディレクトリはデフォルトでは無く自身で作成することが多かったがLaravel8から復活しました。

#### Providers ディレクトリ
`サービスコンテナへのサービスの登録`
様々な処理をサービスコンテナへ登録し管理します。今は気にしなくて大丈夫です。

#### 他のディレクトリ
デフォルトではありませんが、appディレクトリの配下には上記以外にもEvents、Mail、Rulesなど良く使用するディレクトリがあるので、必要に応じて都度覚えていきましょう。

以上がLaravelのディレクトリ構造となります。

## まとめ
今回はディレクトリ構造をざっくりと解説しました。
なんとなく全体像がイメージつきましたでしょうか？
次回はLaravelで簡単な掲示板を作りながら、アプリケーションの処理の流れを追っていきたいと思います。