#はじめに
Laravel のデフォルトのアプリケーション構成は、大規模・小規模問わず優れた出発点を提供することを目的としています。しかし、アプリケーションの構成は自由に変更できます。Laravel は Composer がクラスをオートロードできる限り、クラスの配置場所にほとんど制限を設けていません。
Laravel を初めて使う方は、Laravel Bootcamp をチェックしてください。フレームワークの実践的なツアーを通じて、最初の Laravel アプリケーションの構築を案内します。
#ルートディレクトリ
#App ディレクトリ
app ディレクトリはアプリケーションのコアコードを含みます。後ほど詳しく説明しますが、ほとんどのクラスはこのディレクトリに配置されます。
#Bootstrap ディレクトリ
bootstrap ディレクトリにはフレームワークを起動する app.php ファイルがあります。このディレクトリには、ルートやサービスのキャッシュファイルなど、パフォーマンス最適化のためにフレームワークが生成するファイルを格納する cache ディレクトリも含まれます。通常、このディレクトリ内のファイルを変更する必要はありません。
#Config ディレクトリ
config ディレクトリは名前の通り、アプリケーションの設定ファイルをすべて含みます。これらのファイルを読み、利用可能なオプションを把握することをおすすめします。
#Database ディレクトリ
database ディレクトリにはデータベースのマイグレーション、モデルファクトリー、シーダーが含まれます。必要に応じて、このディレクトリに SQLite データベースを置くこともできます。
#Public ディレクトリ
public ディレクトリには、すべてのリクエストのエントリーポイントである index.php ファイルが含まれ、オートロードの設定も行います。また、画像や JavaScript、CSS などのアセットもこのディレクトリに置きます。
#Resources ディレクトリ
resources ディレクトリには ビュー と、CSS や JavaScript のような未コンパイルの生のアセットが含まれます。
#Routes ディレクトリ
routes ディレクトリにはアプリケーションのすべてのルート定義が含まれます。デフォルトで Laravel には web.php、api.php、console.php、channels.php のルートファイルが含まれています。
web.php ファイルには、RouteServiceProvider が web ミドルウェアグループに配置するルートが含まれます。このグループはセッション状態、CSRF 保護、クッキー暗号化を提供します。ステートレスな RESTful API を提供しない場合、ほとんどのルートは web.php に定義されるでしょう。
api.php ファイルには、RouteServiceProvider が api ミドルウェアグループに配置するルートが含まれます。これらのルートはステートレスを想定しており、トークンによる認証 via tokens が行われ、セッション状態にはアクセスできません。
console.php ファイルはクロージャベースのコンソールコマンドを定義する場所です。各クロージャはコマンドインスタンスにバインドされ、コマンドの IO メソッドと簡単にやり取りできます。このファイルは HTTP ルートを定義しませんが、コンソールベースのエントリーポイント(ルート)を定義します。
channels.php ファイルは、アプリケーションがサポートするすべての イベントブロードキャスト チャンネルを登録する場所です。
#Storage ディレクトリ
storage ディレクトリにはログ、コンパイル済み Blade テンプレート、ファイルベースのセッション、ファイルキャッシュ、その他フレームワークが生成するファイルが含まれます。このディレクトリは app、framework、logs のサブディレクトリに分かれています。app はアプリケーションが生成するファイル用、framework はフレームワーク生成ファイルとキャッシュ用、logs はログファイル用です。
storage/app/public ディレクトリは、プロフィール画像などのユーザー生成ファイルを公開可能に保存するために使えます。public/storage にこのディレクトリを指すシンボリックリンクを作成してください。php artisan storage:link Artisan コマンドでリンクを作成できます。
storage ディレクトリの場所は LARAVEL_STORAGE_PATH 環境変数で変更可能です。
#Tests ディレクトリ
tests ディレクトリには自動テストが含まれます。デフォルトで PHPUnit のユニットテストや機能テストの例が用意されています。各テストクラスは Test で終わる名前にしてください。テストは phpunit または php vendor/bin/phpunit コマンドで実行できます。より詳細で見やすい結果を得たい場合は、php artisan test Artisan コマンドを使ってください。
#Vendor ディレクトリ
vendor ディレクトリには Composer の依存パッケージが含まれます。
#App ディレクトリ
アプリケーションの大部分は app ディレクトリに格納されます。デフォルトでこのディレクトリは App 名前空間に属し、Composer の PSR-4 オートロード標準 によってオートロードされます。
app ディレクトリには Console、Http、Providers などの追加ディレクトリが含まれます。Console と Http はアプリケーションのコアへの API と考えてください。HTTP プロトコルと CLI はどちらもアプリケーションとやり取りする手段ですが、実際のアプリケーションロジックは含みません。つまり、アプリケーションにコマンドを発行する2つの方法です。Console にはすべての Artisan コマンドが、Http にはコントローラー、ミドルウェア、リクエストが含まれます。
make Artisan コマンドでクラスを生成すると、app ディレクトリ内にさまざまなディレクトリが作成されます。例えば、app/Jobs ディレクトリは make:job Artisan コマンドでジョブクラスを生成するまで存在しません。
app ディレクトリ内の多くのクラスは Artisan コマンドで生成できます。利用可能なコマンドを確認するには、ターミナルで php artisan list make を実行してください。
#Broadcasting ディレクトリ
Broadcasting ディレクトリにはアプリケーションのブロードキャストチャンネルクラスが含まれます。これらのクラスは make:channel コマンドで生成されます。デフォルトでは存在しませんが、最初のチャンネルを作成すると自動的に作られます。チャンネルについて詳しくは イベントブロードキャスト のドキュメントを参照してください。
#Console ディレクトリ
Console ディレクトリにはアプリケーションのカスタム Artisan コマンドが含まれます。これらは make:command コマンドで生成できます。また、カスタム Artisan コマンドを登録し、スケジュールタスク を定義するコンソールカーネルもこのディレクトリにあります。
#Events ディレクトリ
デフォルトでは存在しませんが、event:generate や make:event Artisan コマンドで作成されます。Events ディレクトリには イベントクラス が含まれます。イベントはアプリケーションの他の部分に特定のアクションが発生したことを通知し、高い柔軟性と疎結合を実現します。
#Exceptions ディレクトリ
Exceptions ディレクトリにはアプリケーションの例外ハンドラーが含まれ、アプリケーションでスローされる例外もここに置くのに適しています。例外のログ記録やレンダリング方法をカスタマイズしたい場合は、このディレクトリ内の Handler クラスを修正してください。
#Http ディレクトリ
Http ディレクトリにはコントローラー、ミドルウェア、フォームリクエストが含まれます。アプリケーションに入るリクエストを処理するほとんどのロジックはこのディレクトリに置かれます。
#Jobs ディレクトリ
デフォルトでは存在しませんが、make:job Artisan コマンドで作成されます。Jobs ディレクトリにはアプリケーションの キュー可能なジョブ が含まれます。ジョブはアプリケーションによってキューに入れられたり、現在のリクエストライフサイクル内で同期的に実行されたりします。同期的に実行されるジョブは「コマンド」と呼ばれることもあり、コマンドパターン の実装です。
#Listeners ディレクトリ
デフォルトでは存在しませんが、event:generate または make:listener Artisan コマンドで作成されます。Listeners ディレクトリには イベント を処理するクラスが含まれます。イベントリスナーはイベントインスタンスを受け取り、イベント発火に応じてロジックを実行します。例えば、UserRegistered イベントは SendWelcomeEmail リスナーで処理されるかもしれません。
#Mail ディレクトリ
デフォルトでは存在しませんが、make:mail Artisan コマンドで作成されます。Mail ディレクトリにはアプリケーションが送信する メールを表すクラス が含まれます。メールオブジェクトはメール作成のロジックを単一のシンプルなクラスにまとめ、Mail::send メソッドで送信できます。
#Models ディレクトリ
Models ディレクトリにはすべての Eloquent モデルクラス が含まれます。Laravel に含まれる Eloquent ORM は、美しくシンプルな ActiveRecord 実装でデータベース操作を提供します。各データベーステーブルには対応する「モデル」があり、そのテーブルとのやり取りに使います。モデルはテーブルのデータをクエリしたり、新しいレコードを挿入したりできます。
#Notifications ディレクトリ
デフォルトでは存在しませんが、make:notification Artisan コマンドで作成されます。Notifications ディレクトリにはアプリケーションが送信する「トランザクション」通知 が含まれます。これはアプリ内で発生したイベントに関するシンプルな通知などです。Laravel の通知機能はメール、Slack、SMS、データベース保存など多様なドライバーで通知送信を抽象化します。
#Policies ディレクトリ
デフォルトでは存在しませんが、make:policy Artisan コマンドで作成されます。Policies ディレクトリにはアプリケーションの 認可ポリシークラス が含まれます。ポリシーはユーザーがリソースに対して特定の操作を実行できるかどうかを判断します。
#Providers ディレクトリ
Providers ディレクトリにはアプリケーションのすべての サービスプロバイダー が含まれます。サービスプロバイダーはサービスコンテナへのバインディング、イベント登録、その他リクエスト準備のための処理を行い、アプリケーションを起動します。
新規の Laravel アプリケーションでは、このディレクトリにすでにいくつかのプロバイダーが含まれています。必要に応じて独自のプロバイダーを追加できます。
#Rules ディレクトリ
デフォルトでは存在しませんが、make:rule Artisan コマンドで作成されます。Rules ディレクトリにはアプリケーションのカスタムバリデーションルールオブジェクトが含まれます。ルールは複雑なバリデーションロジックをシンプルなオブジェクトにまとめます。詳細は バリデーションのドキュメント を参照してください。