Laravel

Laravelのフォルダ構成の基本

Laravelプロジェクトを始めて作成したら、多数のフォルダがあるので何が何かわからないということがあるかと思います。
というよりも、実際に私自身が初めての時は全くわかりませんでした。

そこでこちらのページではまずは簡単にLaravelプロジェクトに関して理解するために、Laravelで作成される初期ディレクトリについて、どのような役割を持ったフォルダなのかを簡単にまとめてみました。

もし、始めてLaravelを触ってみるときには参考にしてみて下さい。

Laravelで初期で作成されるディレクトリ

Laravelのデフォルトで作製されるフォルダ構成はこのようになっています。

Laravelの開発でよく使用するフォルダ

Laravelをインストールした時点で多数のフォルダが作成されます。
とは言え、常に全てのファイルを使用するわけではありません。

私の場合ではありますが、使用頻度が高いのは以下です。

  1. App/Http/Controllers
  2. App/Models
  3. database
  4. routes

App/Http/Controllers

一番使用頻度が高いのが「App/Http/Controllers」です。

Laravelのメイン処理を書くのがコントローラーでこのフォルダ内に格納するようになっています。
Laravel開発のメインフォルダとも言えます。

App/Models

データベース用のモデル定義を配置するフォルダになります。

データベースで新規テーブル作製したら、まずモデルをこのフォルダに作成していきます。

database

テーブル追加、テーブル定義の更新、削除、初期データの挿入など、データベースに対しての処理を書くときにこのフォルダを使用します。

routes

「routes」という名前にあるように、ルートに関するファイルを設置するフォルダです。
ルートとコントローラーを結びつけたりするのがこのフォルダになります。

新規ページや新規Apiなどを作成したら、まずここに記述します。

その他のLaravelフォルダ

最初の画像にあるようにLaravelでは多数のフォルダが作成されます。
よく使用するフォルダで説明した以外でも比較的使用するフォルダ、ファイルを説明します。

app/Http/Middleware

Laravelの app/Http/Middleware ディレクトリには、HTTP ミドルウェアクラスが格納されています。ミドルウェアは、HTTP リクエストとレスポンスの間に位置するフィルタリング機構で、リクエストがアプリケーションに到達する前後の両方で動作します。それぞれのミドルウェアは、リクエストを受け取り、任意の処理を行った後で、次のレイヤー(次のミドルウェア、または最終的にはアプリケーション自体)にリクエストを渡します。

ミドルウェアの役割と使用例は以下の通りです:

  • 認証
    ミドルウェアを使用して、特定のルートやアクションにアクセスする前にユーザーが認証されていることを確認できます。
    例えば、認証されていないユーザーが保護されたダッシュボードページにアクセスしようとすると、ログインページにリダイレクトすることができます。
  • 認可
    認証されたユーザーが特定のリソースやアクションにアクセスする権限を持っているかどうかをチェックするためにも使用されます。
  • ログ記録
    アプリケーションに入ってくる全てのリクエストを記録するなど、診断情報のキャプチャにミドルウェアを利用できます。
  • セッションとキャッシュの管理
    ミドルウェアを使用して、セッションを開始したり、データをキャッシュに保存することができます。
  • クロスサイトリクエストフォージェリ(CSRF)保護
    Laravelは、CSRFトークンを利用してフォームからの安全なリクエストを保証するミドルウェアを提供しています。
    これは、外部からの悪意のあるリクエストを防ぐための重要なセキュリティ機能です。
  • コンテンツの変更
    レスポンスの内容やヘッダーを変更する必要がある場合に、ミドルウェアを使用できます。
    例えば、特定のセキュリティヘッダーを全レスポンスに追加するなどです。
  • レートリミッティング
    一定時間内に許可されるリクエストの数を制限するためにミドルウェアが使用されることもあります。
    これは、不正な利用やDoS攻撃からサービスを守るための一般的な方法です。

Laravelでは、これらのミドルウェアをカスタマイズしたり、プロジェクトの特定のニーズに合わせて新しいミドルウェアを作成したりすることができます。

全体として、ミドルウェアはアプリケーションのセキュリティを強化し、正しいデータとユーザーのみがシステムとやり取りできるようにするための効果的な方法を提供します。

config

Laravelの設定ファイルが置かれているフォルダになります。
Laravel標準で使用する設定ファイルもありますが、インストールしたパッケージに関する設定ファイルも"config"に設置することが多くなっています。

Laravel自体の設定は「config/app.php」に記述されています。
※あくまでもメインなので、それ以外もあります

public

Laravelの "public" フォルダは、ウェブアプリケーションにおける非常に重要な役割を果たします。
このディレクトリはプロジェクトにおいてウェブサーバーに直接公開される部分です。

具体的な役割としては以下のような点が挙げられます。

  1. エントリポイント
    "public" フォルダ内の index.php は、Laravel アプリケーションのエントリポイント(フロントコントローラ)です。
    すべての HTTP リクエストはこのファイルを経由して処理され、適切なルートやコントローラに転送されます。
  2. 静的ファイル
    スタイルシート(CSS)、JavaScript ファイル、画像など、ウェブサイトの静的アセットは、この "public" ディレクトリに保存されます。
    これにより、これらのファイルはウェブブラウザから直接アクセス可能になります。
  3. セキュリティ
    このディレクトリ構造は、アプリケーションの残りの部分(設定ファイル、ソースコード、データベース設定など)を公開インターネットから隔離します。
    これはセキュリティのベストプラクティスであり、不正アクセスや悪意のある攻撃からアプリケーションを保護します。
  4. 最適化とキャッシュ
    "public" ディレクトリは、圧縮されたアセットやキャッシュされたファイルなど、パフォーマンス最適化のための要素もホストすることができます。
    これにより、ウェブページの読み込み時間を短縮し、ユーザー体験を改善するために使用されます。

Laravelをデプロイする際には、ウェブサーバー(例:ApacheやNginx)のドキュメントルートまたはウェブルートをこの "public" ディレクトリに設定する必要があります。
これにより、ユーザーがウェブサイトにアクセスしたときに、必要なアセットに適切にアクセスでき、かつアプリケーションの内部構造が保護されるようになります。

resources

Laravel の resources ディレクトリは、ビュー、言語ファイル、およびアセット(Sass、JavaScriptなど)を含む、フロントエンドのリソースに関連するさまざまなファイルが格納されています。
このフォルダは主に、ユーザーインターフェースとそれに関連するコンポーネントの開発に使われます。

具体的な役割と内容は以下の通りです。

  1. ビュー (views)
    resources/views フォルダには、アプリケーションのビューファイルが格納されています。
    これらは通常、HTMLと混合したBladeテンプレートとして提供されます。
    BladeはLaravel専用のテンプレートエンジンで、PHPのコードをテンプレートに直接埋め込むことができ、継承、セクション、コンポーネントなどの機能を提供します。
  2. 言語ファイル (lang)
    resources/lang フォルダは、多言語アプリケーションをサポートするための翻訳文字列を含んでいます。
    このディレクトリには、各言語ごとにディレクトリが用意されており、アプリケーションのメッセージやラベルの翻訳が格納されます。
  3. アセット (assets)
    resources/assets ディレクトリ(Laravelのバージョンによっては直接 resources の下に配置されることもあります)は、フロントエンドのアセットに使用されます。
    これには、SassファイルやJavaScriptファイルが含まれ、これらは通常、Webpackを使用したLaravel Mixによってコンパイルされます。
    これにより、開発者はフロントエンドテクノロジーを使用してインタラクティブなユーザーインターフェースを構築することができます。
  4. JSONファイル
    一部の設定やデータ管理のために、JSONファイルが resources 内に保存されることがあります。
    これには、例えば、特定の機能の設定パラメータや、ローカライズデータなどが含まれる場合があります。

resources ディレクトリは、基本的にはユーザーが直接やり取りする部分(UI/UX)と、そのインターフェースの裏側で動作する言語やデータ構造を定義する場所です。このように、resources フォルダはアプリケーションの見た目と感じを形作る重要な役割を担っており、国際化(i18n)、アセットコンパイル、テンプレートレンダリングなど、多くの側面をカバーしています。

storage

Laravel の storage ディレクトリは、アプリケーションによって生成されたファイルを保存するためのもので、非常に重要な役割を果たしています。
このディレクトリは複数のサブディレクトリに分かれており、それぞれが異なる種類の生成されたコンテンツやキャッシュされたデータを扱います。

以下、その主な内容です。

  1. app
    storage/app ディレクトリは、アプリケーションが生成するファイルのデフォルトの保存場所です。
    通常、この場所にはユーザーからアップロードされたファイルや、アプリケーションがプログラム的に生成したその他のファイルが保存されます。Laravel のファイルストレージの機能を使用して、ここに保存されているファイルに安全にアクセスしたり管理したりすることができます。
  2. framework
    storage/framework ディレクトリには、フレームワークによって使用されるファイルとキャッシュが保存されます。
    これにはセッションファイル、キャッシュデータ、そしてビューやルートのキャッシュファイルなどが含まれています。
    これらのファイルは Laravel アプリケーションのパフォーマンスを最適化するために使われます。
  3. logs
    storage/logs ディレクトリは、アプリケーションのログファイルを保存する場所です。
    Laravel は強力なログ機能を提供しており、異なるレベルでのログ情報を自動的にここに保存します。
    これにより、エラーや重要なシステムイベント、デバッグ情報などを後で確認することができます。

全体として、storage ディレクトリは、アプリケーションの状態を維持し、さまざまな種類の動的データを安全に管理するための中心的な役割を果たしています。
このディレクトリの内容は一般に敏感であり、しばしば .gitignore にリストされているため、間違って外部に公開されたり、ソースコントロールシステムにコミットされたりすることはありません

また、特定のデータ(例えばセッションやキャッシュ)は時限性があるため、定期的にクリアする必要があります。
Laravel はこれを管理するためのコマンドも提供しています。

ユーザーがアップロードするファイルはどこに保存するのか?

ファイルを保存するときに使用するのはstorageです。
ユーザーがアップロードした画像を保存したりしたものは、storageフォルダに保存し、それを公開する形をとります。

storageに保存することで、Laravelのルートとコントローラーのアクションを経由して行われるようになるため、必要な認証や権限チェックが提供されるので安全にファイルを管理することができます。

保存したファイルを公開する場合にはシンボリックリンクを貼って公開するというのが一般的な流れとなっています。

tests

名前からわかるようにtestを書いたファイルを保存するのがこのフォルダになります。

vendor

これはlaravelの本体もそうですが、composerを使用してインストールしたパッケージファイルが保存されています。

自動でファイルが作成されるために、vendorの中身を触ることはありません。
この中身を変更したとしても、vendorの中身はgit管理からも外れるので他のユーザーと共有できません。

パッケージの中身を変更する場合、それぞれのパッケージごとにアプローチ方法があるので、変更が必要な場合はパッケージに合わせて変更する必要があるので注意して下さい。

.env

Laravelの環境変数を保存してあるファイルです。

デフォルトのデータベースへの接続情報などもここに記述しておいたりします。

重要な情報も含まれるので、基本的にはgit管理から外されているので、githubなどで管理する場合「.env」に関しては別手段での共有をするようにしましょう。

composer.json

現在展開しているphpプロジェクトで必要な情報が記述されています。
主には使用するパッケージ指定が書かれているので、ここを見れば使用しているパッケージを確認できます。

composer.json ファイルは、PHPプロジェクトにおいて非常に重要な役割を果たしています。
これは、プロジェクトの依存関係とメタデータを管理するための基本的なツールです。

具体的には以下のような機能があります。

  1. 依存関係の管理
    composer.json ファイルは、プロジェクトが依存するPHPパッケージのリストを保持しています。開発者が新しいライブラリやツールをプロジェクトに追加したい場合、そのパッケージ名とバージョンをこのファイルに追記します。その後、composer installcomposer update コマンドを実行することで、Composerはこのファイルを参照し、必要なパッケージを正しいバージョンでプロジェクトにインストールします。
  2. オートロード設定
    composer.json は、PHPクラスのオートローディングも管理します。
    これは、autoload セクションで設定され、PSR-4やクラスマップなど、さまざまなオートローディングの規約をサポートしています。
    これにより、開発者は requireinclude を繰り返し書く代わりに、オートローダーを通じてクラスや関数、ファイルを自動的に読み込むことができます。
  3. プロジェクトメタデータの提供
    このファイルはプロジェクトのメタデータも保持しており、例えば、プロジェクトの名前、説明、バージョン、ライセンス、著者などの情報が含まれます。
    これらの情報は、他の開発者やユーザーがプロジェクトをより簡単に理解し、コントリビューションや利用を行うために役立ちます。
  4. スクリプトの実行
    scripts セクションでは、コマンドラインから実行できるスクリプトを定義することができます。
    これにより、パッケージのインストールやアップデートの際に、カスタムスクリプトを実行して、特定のイベントに応じた処理を自動化することができます。
  5. パッケージ設定:
    • さらに、config セクションでは、Composerの動作に影響を与えるさまざまな設定を定義することができます。
      これには、プロジェクト固有の挙動や、依存パッケージに適用される一般的なルールが含まれます。

composer.json は、プロジェクトの構造と依存関係を明確に定義するための中心的な役割を果たします。
このファイルがあることで、開発者は環境間での一貫性を保ちながら、コードベースを簡単に管理、共有、デプロイすることができるようになります。

Laravelのディレクトリ構成について まとめ

ここまでみてきたようにLaravelでは多数のディレクトリが用意されるので、どれを見るべきなのかがわからないかもしれません。
しかし、最初に押さえておきたいのが「よく使用するディレクトリ」で紹介した部分です。

  1. App/Http/Controllers
  2. App/Models
  3. database
  4. routes

特に「App/Http/Controllers」「App/Models」が最もよく使うので、ここを押さえておけば良いと思います。

慣れればわかってはいくのですが、最初は色々と触って学んで行ってみて下さい!

-Laravel
-