Laravelのディレクトリ構造と、お役立ちTips

#Laravelのディレクトリ構造
Laravelを触り始めて一ヶ月が経ちましたが、Laravelで作るアプリがどう生成されているのか、よくわからないファイルやディレクトリだらけでした。

ですので、これから始める方のためになれば、そして自分の索引として活用できたらなと思い、ディレクトリ構造を、勉強になった記事と一緒に、ある程度わかりやすくまとめてみました。

**Composer 1.5.2/Laravel5系(5.5)/PHP7.1環境でlaravel new ~~した場合に生成されるファイルたちです。**

##直下ファイル
####**`.env`**
環境設定ファイル。1環境<=>1envファイル。
DB NAMEやらHOSTのIP,PORT,PASSWORDなど、動作環境、環境変数に関する記述をする。
[PHP dotenv (phpdotenv) 環境変数を本番、検証、開発環境毎に分ける](http://blog.infosuite.jp/php-dotenv/)
####**`.gitattributes,.gitignore`**
git利用に関する記述。アプリケーション内の特定ファイルをgitでバージョン管理したくない場合、.gitignoreに詳細を記載したりする。
[Laravel Recipes日本語版 | Gitを使ってプロジェクトを管理する](http://recipes.laravel.jp/recipe/95)
####**`artisan`**
artisanコマンドについての記述
####**`composer.json`**
composerの利用に関するもの。周辺技術パッケージのバージョン参照などに困ったらここに書いてある。
[composer.json、composer.lockって何なの？という人向けのまとめ](https://qiita.com/masarufuruya/items/23131a465b7e9c8f3060)

composer.json=>***`composer update`***の時に読み込む。
composer.lock=>***`composer install`***の時に読み込む。
####**`package.json`**
[npm](https://team-lab.github.io/skillup-nodejs/2/4.html)(Node.jsで書かれたJavaScriptのパッケージ管理ツール)で利用するプログラム。
####**`phpunit.xml`**
[PHPUnit](https://thinkit.co.jp/article/1186/1)(ユニットテスト)に関する記述。
####**`server.php`**
ビルトインサーバー起動時に使用されるプログラム。
####**`webpack.mix.js`**
JavaScriptパッケージ管理ツール[webpack](https://ics.media/entry/12140)に関する記述。
####**`yarn.lock`**
[yarn](https://qiita.com/morrr/items/558bf64cd619ebdacd3d)というフロントエンドパッケージマネージャに関する自動生成ファイル。

## メインディレクトリ群
#**<font color="RoyalBlue">app</font>**
アプリケーションのプログラム部分、いわば主軸になるもの。アプリ開発時において、ここをメインにスクリプトファイルを追加していく。
####**Console**
---
コンソールプログラム群。
`php artisan make:command data_init`
などとすると、自分でartisanコマンドを追加作成でき、ここに生成されます。
#####- *`Kernel.php`* 
＝＞作ったコマンドを登録するファイル。
####**Exception**
---
例外処理に関する記述。
[Laravel 5.3 エラーとログ](https://readouble.com/laravel/5.3/ja/errors.html)
#####- *`Handler.php`* 
＝＞**report**(例外をログするか、外部サービスに送信するために使う)と**render**(例外をブラウザーに送り返すHTTPレスポンスへ変換)の、二つのメソッドで構成されている。
####**Http**
---
アプリケーションにアクセスした時に実行される処理をまとめたところ。Laravelの心臓部。
#####- **Controllers**
**[MVCアーキテクチャ](http://ossforum.jp/node/613)**の根幹。Webページの具体的な処理が記述されます。
全体を統制し、Modelでデータのやり取りをしたり、Viewを呼び出す処理をします。
[MVC、本当にわかってますか？](https://qiita.com/tshinsay/items/5b1724baf32b8b5113c2)
#####- **Middleware**
コントローラーが動く前か後に、アプリケーションへ送信されたHTTPリクエストをフィルタリングする、特定の処理を行う仕組み。
アクセスがあった時に毎度何かを実行するための機能。
[Laravel5のミドルウェアの使い方](https://qiita.com/sogawa@github/items/c6ac3e9f46447aa32668)

#####- *`Kernel.php`*
あるミドルウェアをアプリケーションの全リクエストで実行したい場合は、このファイルの**$middleware**プロパティへ追加する。

**【デフォルトのグローバルミドルウェア[Webグループ]】**

**CheckForMaintenanceMode**
=>メンテナンスモードかどうかをチェックする。メンテナンスモードだったら503を返す。

**EncryptCookies**
=>クッキー暗号化。

**AddQueuedCookiesToResponse**
=>クッキーを使わなければいらないもの

**StartSession**
=>セッションを使わなければいらないもの

**ShareErrorsFromSession**
=>セッションに**errors**という名前で登録された内容をすべてのビューで共有している

**VerifyCsrfToken**
=>[CSRF(クロスサイトリクエストフォージェリ)](https://www.trendmicro.com/ja_jp/security-
intelligence/research-reports/threat-solution/csrf.html)チェック。

**SubstituteBindings**
*Route Model Binding*(今までモデルのIDを受け取っていた箇所で、代わりにIDに対応するモデルのインスタンスを受け取れる) を実行する機能（Laravel5.3から追加）

他に、apiグループもあります。
気になる方は以下の記事、参照ください。

[[Laravel]ミドルウェアを整理してLaravelを軽くする](https://qiita.com/kurikazu/items/0c57f050f5dfef02b23e)

これらを整理すると、アプリケーションがかなり軽くなるみたいです。
####**Providers**
---
ビューにビジネスロジックをもたせたいとき、ビューコンポーザ機能(ビューレンダリングの際の、自動実行処理)を利用するための、プロバイダと呼ばれるプログラムが配置される。
#####- **ServiceProvider**
bootメソッド(**アプリケーションが実行される前に割り込んで実行される、ブートストラップ処理**)に関する記述
####*`User.php`*
---
ユーザー認証に関する、Userモデルのスクリプトファイル
モデルはデフォルトだと``php artisan make:model ~~``した時にこの階層(app直下)に生成される。Laravelはモデルの置き場所がデフォルトだと、ありません。言葉の定義の問題だそうです。
以下が、そのモデルディレクトリがない理由です。
>[Laravel 5.3 ディレクトリ構造](https://readouble.com/laravel/5.3/ja/structure.html)
>Laravelを学習し始めるとき、多くの開発者はmodelsディレクトリが存在しないことに戸惑います。しかし、意図的にこのディレクトリを用意していません。多くの別々の人達にとって、その意味合いは様々なため、"models"という言葉の定義は曖昧であることに私達は気づきました。ある開発者たちはすべてのビジネスロジックを総称してアプリケーションの「モデル」と呼び、一方で別の人達はリレーショナルデータベースに関連するクラスを「モデル」として参照しています。
>このため、私達はEloquentモデルをデフォルトではappディレクトリ下へ設置することを選択し、開発者自分が選んだどこか別の場所へ設置してもらうことにしました。

#**<font color="RoyalBlue">bootstrap</font>**
アプリケーション実行時に、同時に行われる最初の処理がまとめられている。
####**cache**
---
初期処理のパフォーマンス最適化のため、ルートやサービスのキャッシュファイルが保存されるフォルダ。
####*`app.php`*
---
初期起動やオートローディングの設定
#**<font color="RoyalBlue">config</font>**
アプリケーションの全設定ファイルがまとまっている。
[Laravel 5.3 設定](https://readouble.com/laravel/5.3/ja/configuration.html)
#####*`app.php`*
->アプリ主要情報、タイムゾーンや地理情報の設定。
#####*`auth.php`*
->認証設定
#####*`broadcasting.php`*
->[イベントブロードキャスト](https://readouble.com/laravel/5.3/ja/broadcasting.html)の設定
#####*`cache.php`*
->キャッシュ設定
#####*`database.php`*
->データベース使用設定。
#####*`filesystems.php`*
->[ファイルストレージ](https://readouble.com/laravel/5.4/ja/filesystem.html)などの設定
[それはそれは素晴らしい『Laravel』のファイルシステムについて語りたい](https://liginc.co.jp/355887)
#####*`mail.php`*
->メールサーバーの設定
[洗練された『Laravel』のメール送信機能を使ってみる](https://liginc.co.jp/369690)
#####*`queue.php`*
->[ジョブキュー](http://tech.voyagegroup.com/archives/495474.html)の設定
#####*`services.php`*
->MailgunやSparkPostなどの[APIベースドライバ](https://readouble.com/laravel/5.3/ja/mail.html)設定
#####*`session.php`*
->[セッションドライバ](https://readouble.com/laravel/5.3/ja/session.html)設定
#####*`view.php`*
->ビューテンプレート設定
#**<font color="RoyalBlue">database</font>**
データベース関連のファイルのまとまり。
####**factories**
---
Eloquentモデルの各属性にデフォルトを設定できる。ランダムデータを生成するFakerに関するもの。
[Fakerで自動テスト用のダミーデータ作成を自動化する](https://qiita.com/tanakahisateru/items/c4d39cc77a71067ed658)
####**migrations**
---
データベースの[マイグレーション](https://readouble.com/laravel/5.3/ja/migrations.html)ファイル置き場
####**seeds**
---
初期値設定（シーディング）。
[Laravel 5.1 データベース：シーディング](https://readouble.com/laravel/5.1/ja/seeding.html)
#**<font color="RoyalBlue">public</font>**
外部にそのまま公開されるフォルダ。CSSやJavaScriptが配置される。
####**css**
---
####**js**
---
#####*`.htaccess`*
[.htaccessとは？.htaccessで、できる事と設定手順についてまとめてみた](http://viral-community.com/blog/htaccess-3065/)
#####*`favicon.ico`*
[favicon.icoとは？](http://www.geekpage.jp/web/access-log/favicon.php)
#####*`index.php`*
初期ビュー
#####*`robots.txt`*
Webクローラーに対して、特定のページをインデックスに登録しないように指定するファイルです。
#**<font color="RoyalBlue">resources</font>**
リソース関係の配置場所。プログラムが必要とするテンプレートやアセットが用意されます。
[リソース (resource)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word1481.html)
####**assets**
---
ここにあるファイルは、自動的に[**Elixir**](https://readouble.com/laravel/5.1/ja/elixir.html)(CSS,Javascriptプリプロセッサー)がpublic/cssやpublic/jsへコピーしてくれます。
####**lang**
---
言語仕様。
####**views**
---
ビューファイルの置き場所です。
#**<font color="RoyalBlue">routes</font>**
アクセスするアドレスに割り当てられるプログラムの情報。ルーティング。
#####*`api.php`*
APIのルーティング。プログラム内から利用する、APIのアドレスを割り当てるのに利用する。
#####*`channels.php`*
[ブロードキャストチャンネル](https://readouble.com/laravel/5.3/ja/broadcasting.html)のためのルーティング。
#####*`console.php`*
コンソールプログラムのためのルーティング。
#####*`web.php`*
一般的なWebページとしてアクセスするためのルーティング。主にここを編集する。
#**<font color="RoyalBlue">storage</font>**
ファイルの保存場所。アプリケーションのログファイルや画像などが保存される。
####**app**
---
####**framework**
---
####**logs**
---
#**<font color="RoyalBlue">test</font>**
ユニットテストに関するファイル群。
####**Feature**
---
機能(Feature)テストは、多くのオブジェクトがそれぞれどのように関係しているなど、コードの幅広い範囲をテストします。
####**Unit**
---
ユニットテストは、コードの独立した一部をテストする。
#####*`CreatesApplication.php`*,*`Testcase.php`*
テスト環境用スクリプトファイル
#**<font color="RoyalBlue">vendor</font>**
Laravelフレームワークの司るライブラリを構成するファイル群。Composerによる依存パッケージが配置される。
ここは多すぎるので、省略します。

継承元のクラスを参照したいときは**`laravel/framework/src/illuminate`**以下を辿るといいでしょう。
また、状況によりますが、[Facades](https://readouble.com/laravel/5.3/ja/facades.html)を使うと、コードがより簡潔になり、チーム開発でクラスを共有しやすくなったりと、有利に働きます。
>ファサード（facade、「入り口」）はアプリケーションのサービスコンテナに登録したクラスへ、「静的」なインターフェイスを提供します。

#まとめ
これからも気づいたこと、指摘いただいたことは記事に反映して学んでいきたいので、ツッコミどころ、足りない部分多々あると思いますが、ビシバシご指導いただけたらと思います。