ディレクトリ構造
イントロダクション
Laravelのデフォルトアプリケーション構造はアプリケーションの大小にかかわらず、素晴らしいスタートを切ってもらえることを意図しています。もちろんアプリケーションは皆さんのお好みに応じ、自由に体系立ててください。クラスがComposerによりオートローディングできるならば、Laravelはクラスをどこに配置するか強制することはまずありません。
modelsディレクトリはどこにある?
Laravelを学習し始めるとき、多くの開発者はmodels
ディレクトリが存在しないことに戸惑います。しかし、意図的にこのディレクトリを用意していません。多くの別々の人達にとって、その意味合いは様々なため、"models"という言葉の定義は曖昧であることに私達は気づきました。ある開発者たちはすべてのビジネスロジックを総称してアプリケーションの「モデル」と呼び、一方で別の人達はリレーショナルデータベースに関連するクラスを「モデル」として参照しています。
このため、私達はEloquentモデルをデフォルトではapp
ディレクトリ下へ設置することを選択し、開発者自分が選んだどこか別の場所へ設置してもらうことにしました。
プロジェクトディレクトリ
appディレクトリ
app
ディレクトリは名前の示すとおり、アプリケーションのコアコードを配置します。このフォルダーの詳細は、このあとに説明します。しかし、アプリケーションのほとんど全部のクラスは、このディレクトリの中に設定されることを覚えておいてください。
bootstrapディレクトリ
bootstrap
フォルダーはフレームワークの初期起動やオートローディングの設定を行うファイルを含んでいます。その中のcache
ディレクトリは、初期処理のパフォーマンスを最適化するため、フレームワークが生成するルートやサービスのキャッシュファイルが保存されるフォルダーです。
Configディレクトリ
config
ディレクトリは名前が示す通り、アプリケーションの全設定ファイルが設置されています。全ファイルに目を通し、設定可能なオプションに慣れ親しんでおくのは良い考えでしょう。
databaseディレクトリ
database
フォルダーはデータベースのマイグレーションと初期値設定(シーディング)を配置します。ご希望であれば、このファイルをSQLiteデータベースの設置場所としても利用できます。
publicディレクトリ
public
ディレクトリは、アプリケーションへの全リクエストの入り口となるindex.php
ファイルを持っています。また、このディレクトリにはアセット(画像、JavaScript、CSSなど)を配置します。
resourcesディレクトリ
resources
ディレクトリはビューやアセットの元ファイル(LESS、SASS、JavaScript)で構成されています。また、すべての言語ファイルも配置します。
routesディレクトリ
routes
ディレクトリはアプリケーションの全ルート定義により構成されています。デフォルトでは、web.php
、api.php
、console.php
の3ファイルが含まれています。
Web.php
ファイルは、RouteServiceProvider
のweb
ミドルウェアグループに属するルートで構成します。このミドルウェアは、セッションステート、CSRF保護、クッキーの暗号化機能を提供しています。もしアプリケーションがステートレスではなく、RESTフルなAPIを提供しないのであれば、すべてのルートはweb.php
ファイルの中で定義されることになるでしょう。
api.php
ファイルは、RouteServiceProvider
のapi
ミドルウェアグループに属するルートで構成します。このミドルウェアはアクセス回数制限を提供しています。このファイル中で定義されるルートは、ステートレスであることを意図しています。つまり、これらのルートを通るアプリケーションに対するリクエストは、セッションステートにアクセスする必要がないように、トークンを使って認証されることを意図しています。
console.php
ファイルは、クロージャベースの全コンソールコマンドを定義する場所です。それぞれのコマンドのIOメソッドと連携するシンプルなアプローチを提供するコマンドインスタンスと、各クロージャは結合します。厳密に言えば、このファイルはHTTPルートは定義していないのですが、コンソールベースのエントリポイントを定義しているという点で、ルート定義なのです。
storageディレクトリ
storage
ディレクトリにはコンパイルされたBladeテンプレート、ファイルベースのセッション、ファイルキャッシュなど、フレームワークにより生成されるファイルが保存されます。このフォルダーはapp
、framework
、logs
ディレクトリに分かれています。app
ディレクトリはアプリケーションにより生成されるファイルを保存するために利用します。framework
ディレクトリはフレームワークが生成するファイルやキャッシュに利用されます。最後のlogs
ディレクトリはアプリケーションのログファイルが保存されます。
storage/app/public
ディレクトリにはプロファイルのアバターなどのようなユーザにより生成され、外部からアクセスされるファイルが保存されます。public/storage
がこのディレクトリを指すように、シンボリックリンクを張る必要があります。リンクは、php artisan storage:link
コマンドを使い生成できます。
testsディレクトリ
tests
ディレクトリには皆さんの自動テストを配置します。サンプルのPHPUnitテストが最初に含まれています。各テストクラスはサフィックスとしてTest
を付ける必要があります。テストはphpunit
か、php vendor/bin/phpunit
コマンドにより実行できます。
vendorディレクトリ
vendor
ディレクトリには、Composerによる依存パッケージが配置されます。
appディレクトリ
皆さんのアプリケーションの主要な部分は、app
ディレクトリー内に配置します。このディレクトリーはデフォルトで、App
名前空間のもとに置かれており、PSR-4オートローディング規約を使い、Composerがオートロードしています。
app
ディレクトリは多様なサブディレクトリを持っています。Console
、Http
、Providers
などです。Console
とHttp
ディレクトリは、アプリケーションの「コア」へAPIを提供していると考えてください。HTTPプロトコルとCLIは両方共にアプリケーションと相互に関係するメカニズムですが、実際のアプリケーションロジックではありません。言い換えれば、これらはアプリケーションに指示を出す、2つの方法に過ぎません。Console
ディレクトリは全Artisanコマンドで構成され、一方のHttp
ディレクトリはコントローラーやフィルター、リクエストにより構成されています。
クラスを生成するためのmake
Artisanコマンドを使用することにより、その他様々なディレクトリがapp
ディレクトリ内に作成されます。たとえばapp/Jpbs
ディレクトリは、ジョブクラスを生成するmake:job
Artisanコマンドを実行するまで存在していません。
Tip!! Artisanコマンドにより、
app
ディレクトリ下にたくさんのクラスが生成されます。使用可能なコマンドを確認するには、php artisan list make
コマンドをターミナルで実行してください。
Consoleディレクトリ
Console
ディレクトリは、アプリケーションの全カスタムArtisanコマンドで構成します。これらのコマンドクラスはmake:command
コマンドにより生成されます。コンソールカーネルもこのディレクトリ内にあり、カスタムArtisanコマンドや、タスクのスケジュールを登録します。
Eventsディレクトリ
このディレクトリはデフォルトで存在していません。event:generate
かmake:event
Artisanコマンド実行時に作成されます。Events
ディレクトリは名前の通り、イベントクラスを設置する場所です。イベントは特定のアクションが起きたことをアプリケーションの別の部分に知らせるために使われ、柔軟性と分離性を提供しています。
Exceptionsディレクトリ
Exceptions
ディレクトリはアプリケーションの例外ハンドラで構成します。また、アプリケーションから投げる例外を用意するにも適した場所でしょう。例外のログやレンダー方法をカスタマイズしたい場合は、このディレクトリのHandler
クラスを修正してください。
Httpディレクトリ
Http
ディレクトリはコントローラ、ミドルウェア、フォームリクエストを設置します。アプリケーションへのリクエストを処理するロジックは、ほぼ全てこのディレクトリ内に設置します。
Jobsディレクトリ
このディレクトリはデフォルトで存在していません。make:job
Artisanコマンドを実行すると作成されます。Jobs
ディレクトリーはアプリケーションのキュー投入可能なジョブを置いておく場所です。Jobs
はアプリケーションによりキューに投入されるか、もしくは現在のリクエストサイクル中に同期的に実行されます。現在のリクエストサイクル中に同期的に実行するジョブは、コマンドパターンを実装しているため、時に「コマンド」と呼ばれることがあります。
Listenersディレクトリ
Tこのディレクトリはデフォルトで存在していません。event:generate
かmake:listener
Artisanコマンドを実行すると、作成されます。Listeners
ディレクトリには、eventsイベントを処理するクラスを設置します。イベントリスナはイベントインスタンスを受け取り、発行されたイベントへ対応するロジックを実行します。たとえば、UserRegistered
(ユーザ登録)イベントは、SendWelcomeEmail
(ウェルカムメール送信)リスナにより処理されることになるでしょう。
Mailディレクトリ
このディレクトリはデフォルトでは存在していません。make:mall
Artisanコマンドを実行すると、作成されます。Mail
ディレクトリは、アプリケーションから送信されるメールを表す全クラスで構成します。メールオブジェクトにより、Mail::send
メソッドを使用して送られるメールを組み立てるロジックをすべて、1つのシンプルなクラスへカプセル化できます。
Notificationsディレクトリ
このディレクトリはデフォルトでは存在していません。make:notification
Artisanコマンドを実行すると作成されます。Notifications
ディレクトリは、アプリケーションから送られる全「業務上」の通知、たとえばアプリケーションの中でイベントが発生したことを知らせるシンプルな通知などで構成します。Laravelの通知機能は、メール、Slack、SMS、データベースへの保存などのように、様々なドライブに対する通知の送信を抽象化しています。
Policiesディレクトリ
このディレクトリはデフォルトでは存在していません。make:policy
Artisanコマンドを実行すると、作成されます。Policies
ディレクトリにはアプリケーションの認可ポリシークラスを設置します。ポリシーは、リソースに対し指定したアクションをユーザが実行できるかを決定します。詳細は、認可のドキュメントをご覧ください。
Providersディレクトリ
Providers
ディレクトリは、アプリケーションの全サービスプロバイダにより構成します。サービスプロバイダは、サービスをコンテナと結合、イベントの登録、もしくはアプリケーションへやってくるリクエストを処理するために必要な用意をするタスクを実行するなど、アプリケーションの事前準備を行います。
インストール直後のアプリケーションでも、このディレクトリは多くのプロパイダーを含んでいます。必要に応じて、自分のプロバイダーを自由に追加してください。