Laravel勉強 その4  Laravelのディレクトリ構造

## 前回記事
[Laravel勉強 その3 Laravelに関する設定](https://qiita.com/masa_skd30/items/2cc2450b9bd3bc39ec44)

## 目的
- 勉強のため、Laravel 7.xの公式ドキュメントを読み解いていく。
- 今回は、公式ドキュメントの「ドキュメント構造」の章を扱う。

## 参考
[Laravel 7.x ドキュメント構造](https://readouble.com/laravel/7.x/ja/structure.html)


## イントロダクション
>Laravelのデフォルトアプリケーション構造はアプリケーションの大小にかかわらず、素晴らしいスタートを切ってもらえることを意図しています。
>アプリケーションは皆さんのお好みに応じ、自由に体系立ててください。
>クラスがComposerによりオートローディングできるならば、Laravelはクラスをどこに配置するか強制することはまずありません。

はい。

### modelsディレクトリはどこにある？
>Laravelを学習し始めるとき、多くの開発者はmodelsディレクトリが存在しないことに戸惑います。しかし、意図的にこのディレクトリを用意していません。
>多くの別々の人達にとって、その意味合いはさまざまなため、"models"という言葉の定義は曖昧であることに私達は気づきました。
>ある開発者たちはすべてのビジネスロジックを総称してアプリケーションの「モデル」と呼び、一方で別の人達はリレーショナルデータベースに関連するクラスを「モデル」として参照しています。

>このため、私達はEloquentモデルをデフォルトではappディレクトリ下へ設置することを選択し、開発者自分が選んだどこか別の場所へ設置してもらうことにしました。

modelsディレクトリはなくて、appディレクトリに置くそう。



## プロジェクトディレクトリ

### appディレクトリ
アプリケーションの主要な部分を配置する。
クラス生成のためのmake Artisanコマンドを使用することで、様々なディレクトリがappディレクトリ内に作成される。
例：make:jobコマンドでapp/Jobsディレクトリが作成される。
使用可能なコマンドを確認するには、php artisan list makeコマンドを実行する。

```
# php artisan list make
Laravel Framework 7.12.0

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands for the "make" namespace:
  make:cast          Create a new custom Eloquent cast class
  make:channel       Create a new channel class
  make:command       Create a new Artisan command
  make:component     Create a new view component class
  make:controller    Create a new controller class
  make:event         Create a new event class
  make:exception     Create a new custom exception class
  make:factory       Create a new model factory
  make:job           Create a new job class
  make:listener      Create a new event listener class
  make:mail          Create a new email class
  make:middleware    Create a new middleware class
  make:migration     Create a new migration file
  make:model         Create a new Eloquent model class
  make:notification  Create a new notification class
  make:observer      Create a new observer class
  make:policy        Create a new policy class
  make:provider      Create a new service provider class
  make:request       Create a new form request class
  make:resource      Create a new resource
  make:rule          Create a new validation rule
  make:seeder        Create a new seeder class
  make:test          Create a new test class
```

以下は、app以下のディレクトリについて。

#### Bloadcastingディレクトリ
デフォルトでは作成されず、make:channelコマンドで作成される。
アプリケーションの全ブロードキャストチャンネルクラスで構成する。

#### Consoleディレクトリ
make:commandコマンドにより作成される。
Consloeディレクトリは、全Artisanコマンドで構成される。
コンソールカーネルもこのディレクトリ内にあり、カスタムArtisanコマンドや、タスクのスケジュールを登録する。

#### Eventsディレクトリ
デフォルトでは作成されず、event:generateかmake:event Artisanコマンドで作成される。
イベントクラスを設置する場所で、イベントは特定のアクションが起きたことをアプリケーションの別の部分へ知らせるために使われる。

#### Exceptionsディレクトリ
アプリケーションの例外ハンドラで構成され、アプリケーションから投げる例外を用意するにも適している。
例外のログやレンダー方法をカスタマイズしたい場合は、このディレクトリのHandlerクラスを修正する。

#### Httpディレクトリ
コントローラ、ミドルウェア、フォームリクエストを設置する。
アプリケーションへのリクエストを処理するロジックは、ほぼすべてこのディレクトリ内に設置する。

#### Jobsディレクトリ
デフォルトでは作成されず、make:job Artisanコマンドで作成される。
アプリケーションのキュー投入可能なジョブを置いておく場所で、アプリケーションによりキューに投入されるか、もしくは現在のリクエストサイクル中に同期的に実行される。

#### Listenersディレクトリ
デフォルトでは作成されず、event:generateかmake:listener Artisanコマンドで作成される。
eventsイベントを処理するクラスが設置される。
イベントリスナはイベントインスタンスを受け取り、発行されたイベントへ対応するロジックを実行する。

#### Mailディレクトリ
デフォルトでは作成されず、make:mail Artisanコマンドで作成される。
アプリケーションから送信されるメールを表す全クラスで構成される。
メールオブジェクトにより、Mail::sendメソッドを使用して送られるメールを組み立てるロジックをすべて、１つのシンプルなクラスへカプセル化できる。

#### Notificationsディレクトリ
デフォルトでは作成されず、make:notification Artisanコマンドで作成される。
アプリケーションから送られる全「業務上」の通知、たとえばアプリケーションの中でイベントが発生したことを知らせるシンプルな通知などで構成される。
Laravelの通知機能は、メール、Slack、SMS、データベースへの保存などのように、さまざまなドライバに対する通知の送信を抽象化している。

#### Policiesディレクトリ
デフォルトでは作成されず、make:policy Artisanコマンドで作成される。
アプリケーションの認可ポリシークラスを設置する。
ポリシーは、リソースに対し指定したアクションをユーザーが実行できるかを決定する。

#### Providesディレクトリ
アプリケーションの全サービスプロバイダにより構成される。
サービスプロバイダは、サービスをコンテナと結合、イベントの登録、もしくはアプリケーションへやってくるリクエストを処理するために必要な用意をするタスクを実行するなど、アプリケーションの事前準備を行う。

#### Rulesディレクトリ
デフォルトでは作成されず、make:rule Artisanコマンドで作成される。
アプリケーションが使用するバリデーションルールオブジェクトで構成される。
ルールは複雑なバリデーションロジックをシンプルなオブジェクトへカプセル化するために使用する。


### bootstrapディレクトリ
フレームワークの初期処理を行うapp.phpファイルを含んでいる。
中のcacheディレクトリは、初期処理のパフォーマンスを最適化するため、フレームワークが生成するルートやサービスのキャッシュファイルが保存されるフォルダとなっている。

### configディレクトリ
アプリケーションの全設定ファイルが設置されている。

### databaseディレクトリ
データベースのマイグレーションとモデルファクトリ、初期値設定（シーディング）を配置する。

### publicディレクトリ
アプリケーションへの全リクエストの入り口となり、オートローディングを設定するindex.phpファイルがある。
このディレクトリには、画像・JavaScript・CSSなどのアセットを配置する。

### resourcesディレクトリ
ビューやアセットの元ファイル（LESS、SASS、JavaScript）、すべての言語ファイルを配置する。

### routesディレクトリ
アプリケーションの全ルート定義により構成されており、デフォルトでは、web.php、api.php、console.php、channels.phpファイルが含まれている。

- web.php
  RouteServiceProviderのwebミドルウェアグループに属するルートで構成される。
  このミドルウェアは、セッションステート、CSRF保護、クッキーの暗号化機能を提供している。

- api.php
  RouteServiceProviderのapiミドルウェアグループに属するルートで構成される。
  このミドルウェアはアクセス回数制限を提供している。
  これらのルートを通るアプリケーションに対するリクエストは、セッションステートにアクセスする必要がないように、トークンを使って認証されることを意図している。
  
- console.php
  クロージャベースの全コンソールコマンドを定義する。
  それぞれのコマンドのIOメソッドと連携するシンプルなアプローチを提供するコマンドインスタンスと、各クロージャは結合する。

- channels.php
  アプリケーションでサポートする、全ブロードキャストチャンネルを登録する。

### storageディレクトリ
コンパイルされたBladeテンプレート、ファイルベースのセッション、ファイルキャッシュなど、フレームワークにより生成されるファイルが保存される。

- appディレクトリ
  アプリケーションにより生成されるファイルを保存するために利用する。

  - publicディレクトリ
    プロファイルのアバターなどのようなユーザーにより生成され、外部からアクセスされるファイルが保存される。
    public/storageがこのディレクトリを指すように、php artisan storage:linkコマンドを使いシンボリックリンクを張る必要がある。

- frameworkディレクトリ
  フレームワークが生成するファイルやキャッシュに利用される。
  
- logsディレクトリ
  アプリケーションのログファイルが保存される。

### testsディレクトリ
各自の自動テストを配置する。（サンプルのPHPUnitテストが最初に含まれている）
各テストクラスはサフィックスとしてTestを付ける必要があり、テストはphpunitか、php vendor/bin/phpunitコマンドにより実行できる。

### vendorディレクトリ
Composerによる依存パッケージが配置される。


わかったような、わからないような。
第4回はここまで。