【Laravel入門】Laravelのappディレクトリについて構造を理解する【完全保存版】

2024年6月27日Laravel,PHP

ミニマリスト_カミ

kamiです。
TwitterYoutubeもやってます。

今回は【Laravel入門】Laravelのappディレクトリについて構造を理解する【完全保存版】です。

Laravelのディレクトリ構造

Console

Laravelのアプリでは、オリジナルでコマンドで作ることができます。
設定を「Console/Kernel.php」に記述します。

Kernel.php

アプリケーションのコンソールコマンドの定義とスケジュールを管理するためのファイルです。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        // 他のコマンドクラスをここに追加
        \App\Console\Commands\SampleCommand::class,
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // スケジュールされたコマンドの定義
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

$commands

アプリケーションで使用可能なArtisanコマンドのリストです。
オリジナルのArtisanでコマンドを追加したい場合はここに記述をしていきます。

この後の「Commands」と合わせて使いますので、先に確認してから、後で確認した方が理解しやすいかと思います。

    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        // 他のコマンドクラスをここに追加
        \App\Console\Commands\SampleCommand::class,
    ];

function schedule

アプリケーションのスケジュールされたコマンドを定義します。
Laravelのスケジューラを使用して、定期的に実行されるタスクを設定することができます。

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // スケジュールされたコマンドの定義
    }

function commands

アプリケーションのコマンドを登録するためのエントリーポイントです。
アプリケーションの初期化時に呼び出され、アプリケーションのコマンドをロードおよび登録します。

$this->load()メソッドを使用してコマンドディレクトリからコマンドをロードし、$this->commands()メソッドを使用して追加のコマンドを登録します。

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }

ここは特に触る必要はありません。

Commands

カスタムのコンソールコマンドを定義するためのディレクトリです。

php artisan make:command コマンド名

上記コマンドで、Sampleクラスが生成されます。

app
└── Console
    └── Commands
        └── SampleCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SampleCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sampleCommand';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Description of your command';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        // コマンドのロジックをここに記述
        $this->info('This is a sample command.');
        return 0;
    }
}

スポンサードサーチ

Exceptions | エクセプションズ

Exceptionsは例外処理を記述してきます。
エラーが発生したときの処理を書きたいときは、Exceptionsを使ってください。

Handler.php

<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * The list of the inputs that are never flashed to the session on validation exceptions.
     *
     * @var array<int, string>
     */
    protected $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];

    /**
     * Register the exception handling callbacks for the application.
     */
    public function register(): void
    {
        $this->reportable(function (Throwable $e) {
       Log::error($e->getMessage()); // 例外をログに記録する
        });
    }
}

$dontFlash

バリデーション例外が発生した場合にセッションにフラッシュされないデータのリストを定義します。

function register

例外の処理に関するコールバックを登録します。
reportableメソッドには、アプリケーション内で発生した例外を処理するためのコールバック関数が指定されています。

デフォルトのエラーは以下のファイルに記録されます。

storage/logs/laravel.logs

上記ファイルに記述しない設定や、除外する例外クラスなどを書いていきましょう。

Http

Controllers | コントローラーズ

コントローラーはモデルとのやり取り、ビューとのやり取りを行う繋ぎとして使います。

Auth

icon

authディレクトリはデフォルトではありませんが、多くのLaravelアプリで使用されることが多いので、あ説明しますね。

php artisan make:auth

上記コマンドの実行で、Laravelがデフォルトの認証システムを追加するために必要なファイルやディレクトリが生成されます。その中には、Authディレクトリが生成されます。

Controller.php

Controller.phpファイルは、Laravelプロジェクトのデフォルトで生成されるものです。
Controoler.phpは、app/Http/Controllersディレクトリ内に作成され、アプリケーション内のすべてのコントローラの基底となります。

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, ValidatesRequests;
}

リクエストの認可や検証などの共通の機能を提供するために使用されます。AuthorizesRequestsトレイトとValidatesRequestsトレイトが使用されており、これらのトレイトによって、リクエストの認可や検証に関するメソッドが提供されます。

基本的に、このController.phpファイルは、アプリケーションのすべてのコントローラが共通して使用する基底クラスとして機能し、アプリケーションの各機能を持つコントローラで継承されます。

ここは特に触る必要はありません。

ProfileController.php(存在確認 デフォルトであるのかわからない)

Controllerの作成

次のコマンドでControllerを作成します。

php artisan make:controller Controller名

コマンドを実行すると、「app/Http/Controllers」配下にControllerが作成されます。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HogeController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
icon

こちらは例でメソッド内に書いています。

index

index(): リソースの一覧を表示するためのメソッドです。
データベースから必要な情報を取得し、それをビューに渡して表示します。

    public function index()
    {
        $hoges = Hoge::all();
        return view('hoges.index', compact('hoges'));
    }

create

create(): 新しいリソースを作成するためのフォームを表示するためのメソッドです。
データの入力フォームを含むビューを返します。

    public function create()
    {
        return view('hoges.create');
    }

store

store(Request $request): 新しいリソースをデータベースに保存するためのメソッドです。
フォームからのデータを受け取り、それをデータベースに保存します。

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'description' => 'required',
        ]);

        Hoge::create($request->all());

        return redirect()->route('hoges.index')
                        ->with('success','Hoge created successfully.');
    }

show

show($id): 特定のリソースの詳細を表示するためのメソッドです。
一般的には、指定されたIDに対応するデータを取得して、それをビューに渡して表示します。

    public function show($id)
    {
        $hoge = Hoge::find($id);
        return view('hoges.show', compact('hoge'));
    }

edit

edit($id): 特定のリソースを編集するためのフォームを表示するためのメソッドです。
既存のデータを編集するためのフォームを含むビューを返します。

    public function edit($id)
    {
        $hoge = Hoge::find($id);
        return view('hoges.edit', compact('hoge'));
    }

update

update(Request $request, $id): 既存のリソースを更新するためのメソッドです。
フォームからのデータを受け取り、指定されたIDに対応するデータを更新します。

    public function update(Request $request, $id)
    {
        $request->validate([
            'name' => 'required',
            'description' => 'required',
        ]);

        $hoge = Hoge::find($id);
        $hoge->update($request->all());

        return redirect()->route('hoges.index')
                        ->with('success','Hoge updated successfully.');
    }

destroy

destroy($id): 特定のリソースを削除するためのメソッドです。指定されたIDに対応するデータをデータベースから削除します。

    public function destroy($id)
    {
        $hoge = Hoge::find($id);
        $hoge->delete();

        return redirect()->route('hoges.index')
                        ->with('success','Hoge deleted successfully.');
    }

スポンサードサーチ

Middeware | ミドルウェア

Middewareはコントローラで処理を行う前に、実装したい処理があればMiddewareを使います

Authenticate.php

Authenticateミドルウェアは、ユーザーが認証されていない場合に、リクエストを適切な場所にリダイレクトする役割を担います。

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Http\Request;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     */
    protected function redirectTo(Request $request): ?string
    {
        return $request->expectsJson() ? null : route('login');
    }
}

redirectToメソッドは、ユーザーが認証されていない場合にリダイレクトする先のパスを返します。
デフォルトでは、ユーザーがJSONレスポンスを期待していない場合には、loginルートにリダイレクトします。
JSONレスポンスを期待している場合は、リダイレクトしません。

EncryptCookies.php

EncryptCookiesミドルウェアは、Laravelアプリケーションの中でクッキーを暗号化するためのミドルウェアを定義するファイルです。

セッションクッキーや認証クッキーなど、アプリケーションで使用されるクッキーの値を暗号化する役割を果たします。これにより、ユーザーの個人情報やセッションデータなど、セキュリティ上重要な情報がクッキーに保存されている場合でも、その情報が漏洩するリスクを軽減します。

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array<int, string>
     */
    protected $except = [
        //
    ];
}

$exceptプロパティを使用して、暗号化しないクッキーの名前を指定することができます。
通常、セッションクッキーや認証クッキーなどの一部のクッキーは暗号化されずに残されます。

PreventRequestsDuringMaintenance.php

PreventRequestsDuringMaintenanceミドルウェアは、アプリケーションがメンテナンスモードに入っている間にリクエストを処理せず、代わりにメンテナンスモードのページを表示する役割を担います。

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;

class PreventRequestsDuringMaintenance extends Middleware
{
    /**
     * The URIs that should be reachable while maintenance mode is enabled.
     *
     * @var array<int, string>
     */
    protected $except = [
        //
    ];
}

$exceptプロパティが空の配列となっています。
この場合、メンテナンスモード中でもすべてのURIへのアクセスが制限されます。
もし特定のURIをメンテナンスモード中でも許可したい場合は、この配列にそのURIを追加します。

protected $except = [
    '/hoge',
    '/foo',
    '/fuga/*'
];

メンテナンスモードの有効

メンテナンスモードを有効にするには、downコマンドの実行を行います。

php artisan down

メンテナスモードの解除

メンテナンスモードを解除するには、UPコマンドの実行を行います。

php artisan up

RedirectIfAuthenticated.php

RedirectIfAuthenticatedはユーザーがすでに認証されている場合に、認証されたユーザーがログインまたは登録ページにアクセスしようとした場合にリダイレクトします。

<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next, string ...$guards): Response
    {
        // ガードが指定されていない場合はデフォルトのガードを使う
        $guards = empty($guards) ? [null] : $guards;
        // ガードごとにユーザーが認証されているか確認
        foreach ($guards as $guard) {
        // ユーザーが認証されている場合はリダイレクト
            if (Auth::guard($guard)->check()) {
                return redirect(RouteServiceProvider::HOME);
            }
        }
        // ユーザーが認証されていない場合は次のミドルウェアまたはリクエストハンドラに処理
        return $next($request);
    }
}

TrimStrings.php

TrimStringsミドルウェアは、HTTPリクエスト内のデータをトリミング(先頭と末尾の空白を削除)です。
※一部の属性についてはトリミングを行わないように指定されています。

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;

class TrimStrings extends Middleware
{
    /**
     * The names of the attributes that should not be trimmed.
     *
     * @var array<int, string>
     */
    protected $except = [
        'current_password',               // 現在のパスワードはトリミングしない
        'password',                      // パスワードはトリミングしない
        'password_confirmation',         // パスワード確認はトリミングしない
    ];
}

$except変数は、トリミングを適用しないリストです。

TrustHosts.php

TrustHostsミドルウェアは、信頼できるホスト(ドメイン)を指定するために使用されます。

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustHosts as Middleware;

class TrustHosts extends Middleware
{
    /**
     * Get the host patterns that should be trusted.
     *
     * @return array<int, string|null>
     */
    public function hosts(): array
    {
        return [
            $this->allSubdomainsOfApplicationUrl(), // アプリケーションURLのすべてのサブドメインを信頼する
        ];
    }
}

hosts()メソッドは、信頼できるホストのパターンを返します。このメソッド内で、$this->allSubdomainsOfApplicationUrl()が呼び出されています。これは、アプリケーションのURLに関連するすべてのサブドメインを信頼するためのメソッドです。

TrustProxies.php

TrustProxiesは、プロキシを信頼し、リクエストの情報を適切に検出するための設定です。

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array<int, string>|string|null
     */
    protected $proxies;

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers =
        Request::HEADER_X_FORWARDED_FOR |        // プロキシからの送信元IPアドレスを示すヘッダー
        Request::HEADER_X_FORWARDED_HOST |       // プロキシが転送するホスト名を示すヘッダー
        Request::HEADER_X_FORWARDED_PORT |       // プロキシが転送するポート番号を示すヘッダー
        Request::HEADER_X_FORWARDED_PROTO |      // プロキシが使用するプロトコルを示すヘッダー
        Request::HEADER_X_FORWARDED_AWS_ELB;     // AWS Elastic Load Balancerからの転送を示すヘッダー
}

$headersは、プロキシからの転送を検出するために使用されるヘッダーの設定です。

ValidateSignature.php

ValidateSignatureミドルウェアは、リクエストの署名を検証するために使用されます。

<?php

namespace App\Http\Middleware;

use Illuminate\Routing\Middleware\ValidateSignature as Middleware;

class ValidateSignature extends Middleware
{
    /**
     * The names of the query string parameters that should be ignored.
     *
     * @var array<int, string>
     */
    protected $except = [
        // 'fbclid',
        // 'utm_campaign',
        // 'utm_content',
        // 'utm_medium',
        // 'utm_source',
        // 'utm_term',
    ];
}

$exceptは、無視すべきクエリ文字列パラメータの名前を保持します。
コメントアウトされている部分は、デフォルトでは署名検証の対象外となるクエリ文字列パラメータの例です。
これらのパラメータは、通常、Google AnalyticsやFacebookなどの外部サービスが自動的に追加するものであり、リクエストの署名検証に影響を与えないようにするために除外されます。

VerifyCsrfToken.php

セキュリティ上の理由から、フォーム送信などのPOSTリクエストに含まれるCSRFトークンを検証します。

CSRとはCross-Site Request Forgeryの略です。

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array<int, string>
     */
    protected $except = [
        // 除外するCSRF検証の対象外とするURIを指定する
    ];
}

$exceptは、CSRF検証の対象外とするURIです。
CSRFトークン検証をスキップする特定のURIパスをここに指定します。
特定のルートやエンドポイントからのリクエストをCSRF検証の対象外にすることができます。

※APIエンドポイントや特定のフォーム送信先などが指定される場合があります。

Requests

Auth

フォームリクエストクラスを保存するための場所です。これらのリクエストクラスは、入力データのバリデーションやその他のリクエストの処理を行うために使用されます。

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CreateUserRequest extends FormRequest
{
    public function authorize()
    {
        return true; // 認可ロジックをここに追加することもできます
    }

    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|string|min:8',
        ];
    }
}

ProfileUpdateRequest.php

<?php

namespace App\Http\Requests;

use App\Models\User; // Userモデルを使用するためのuse文
use Illuminate\Foundation\Http\FormRequest; // Laravelのフォームリクエストクラス
use Illuminate\Validation\Rule; // バリデーションルールを定義するためのRuleクラス

class ProfileUpdateRequest extends FormRequest // FormRequestクラスを継承
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
     */
    public function rules(): array
    {
        return [
            'name' => ['string', 'max:255'], // 名前は文字列で255文字以下
            'email' => ['email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)], // メールアドレスは有効な形式で255文字以下で、他のユーザーのメールアドレスと重複しない
        ];
    }
}

rules メソッドは、リクエストの検証ルールを定義します。rules メソッドは、検証ルールを配列で返す必要があります。

  1. nameフィールドは文字列であり、最大255文字まで許容されます。
  2. email フィールドは有効なメールアドレスであり、最大255文字まで許容されます。
    • Userモデルのレコードと重複しないことが要求されています。
    • Rule::unique(User::class)->ignore($this->user()->id) で実現されています。
      • 同じメールアドレスが他のユーザーによって使用されていても、自分のユーザーレコードを更新する場合にエラーが発生しないようになります。

Kernel.php

icon

extends HttpKernelなどで先ほどの、
Kernel extends ConsoleKernelとは異なるので間違えないように覚えてください。

Kernel.php

Kernelミドルウェアでは、HTTPリクエストに対するミドルウェアの設定を行なっています。

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,   // ホストを信頼するためのミドルウェア(コメントアウトされています)
        \App\Http\Middleware\TrustProxies::class,  // プロキシを信頼するためのミドルウェア
        \Illuminate\Http\Middleware\HandleCors::class,  // CORS (Cross-Origin Resource Sharing) を処理するためのミドルウェア
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,  // メンテナンス中にリクエストを拒否するためのミドルウェア
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,  // POSTリクエストのサイズを検証するためのミドルウェア
        \App\Http\Middleware\TrimStrings::class,  // リクエスト内の文字列の両端の空白をトリミングするためのミドルウェア
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,  // 空の文字列をnullに変換するためのミドルウェア
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,  // クッキーを暗号化するためのミドルウェア
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,  // キューに追加されたクッキーをレスポンスに追加するミドルウェア
            \Illuminate\Session\Middleware\StartSession::class,  // セッションを開始するためのミドルウェア
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,  // セッションからエラーをビューに共有するミドルウェア
            \App\Http\Middleware\VerifyCsrfToken::class,  // CSRFトークンを検証するためのミドルウェア
            \Illuminate\Routing\Middleware\SubstituteBindings::class,  // ルートモデルバインディングを行うためのミドルウェア
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,  // Sanctumによるフロントエンドリクエストの状態管理を確保するためのミドルウェア(コメントアウトされています)
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',  // APIリクエストのスロットリングを行うためのミドルウェア
            \Illuminate\Routing\Middleware\SubstituteBindings::class,  // ルートモデルバインディングを行うためのミドルウェア
        ],
    ];

    /**
     * The application's middleware aliases.
     *
     * Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
     *
     * @var array<string, class-string|string>
     */
    protected $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,  // 認証ミドルウェア
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,  // ベーシック認証ミドルウェア
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,  // セッション認証ミドルウェア
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,  // キャッシュヘッダーを設定するためのミドルウェア
        'can' => \Illuminate\Auth\Middleware\Authorize::class,  // アクセス権を検証するためのミドルウェア
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,  // 認証済みユーザーをリダイレクトするためのミドルウェア
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,  // パスワードの確認を要求するためのミドルウェア
        'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,  // 未来のリクエストを処理するためのミドルウェア
        'signed' => \App\Http\Middleware\ValidateSignature::class,  // リクエスト署名を検証するためのミドルウェア
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,  // リクエストのスロットリングを行うためのミドルウェア
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,  // メールアドレスが確認されていることを確認するためのミドルウェア
    ];
}

Laravelのアプリケーション全てのHTTPリクエストに対するミドルウェアは「Kernel.php」内の「$middleware」配列内に記述します。

middleware

アプリケーションのグローバルなHTTPミドルウェアスタックを定義します。
$middlewareはアプリケーション内のすべてのリクエストに対して実行されます。

リクエストを受信する前にリクエストデータを処理するためのミドルウェアや(例:トリミング、データの変換)、リクエストのサイズを検証するためのミドルウェア、セキュリティ関連の処理(CSRF検証、XSS対策)が含まれます。

    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,   // ホストを信頼するためのミドルウェア(コメントアウトされています)
        \App\Http\Middleware\TrustProxies::class,  // プロキシを信頼するためのミドルウェア
        \Illuminate\Http\Middleware\HandleCors::class,  // CORS (Cross-Origin Resource Sharing) を処理するためのミドルウェア
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,  // メンテナンス中にリクエストを拒否するためのミドルウェア
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,  // POSTリクエストのサイズを検証するためのミドルウェア
        \App\Http\Middleware\TrimStrings::class,  // リクエスト内の文字列の両端の空白をトリミングするためのミドルウェア
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,  // 空の文字列をnullに変換するためのミドルウェア
    ];

middlewareGroupsルートへの設定

ルートミドルウェアグループの定義になります。
特定のルートまたはルートグループに対してミドルウェアをまとめて適用するために使用されます。

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,  // クッキーを暗号化するためのミドルウェア
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,  // キューに追加されたクッキーをレスポンスに追加するミドルウェア
            \Illuminate\Session\Middleware\StartSession::class,  // セッションを開始するためのミドルウェア
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,  // セッションからエラーをビューに共有するミドルウェア
            \App\Http\Middleware\VerifyCsrfToken::class,  // CSRFトークンを検証するためのミドルウェア
            \Illuminate\Routing\Middleware\SubstituteBindings::class,  // ルートモデルバインディングを行うためのミドルウェア
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,  // Sanctumによるフロントエンドリクエストの状態管理を確保するためのミドルウェア(コメントアウトされています)
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',  // APIリクエストのスロットリングを行うためのミドルウェア
            \Illuminate\Routing\Middleware\SubstituteBindings::class,  // ルートモデルバインディングを行うためのミドルウェア
        ],
    ]
  • webグループ:Webアプリケーション用のミドルウェア
  • apiグループ:APIエンドポイント用のミドルウェア

$middlewareAliases

$middlewareAliasesは、ミドルウェアのエイリアスを定義します。
エイリアスは、ルートやルートグループにミドルウェアを割り当てる際に使用され、クラス名の代わりにエイリアス名を使用できます。

    protected $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

Models | モデル

モデルはDBとのやり取り、その結果をコントローラーと行います。

Userモデルを例に説明していきます。

<?php

namespace App\Models;

// 必要なモジュールをインポート
use Illuminate\Contracts\Auth\MustVerifyEmail; // メール確認が必要な場合に使用するインターフェース
use Illuminate\Database\Eloquent\Factories\HasFactory; // ファクトリー関連の機能を提供するトレイト
use Illuminate\Foundation\Auth\User as Authenticatable; // 認証機能を提供するベースのユーザーモデルクラス
use Illuminate\Notifications\Notifiable; // 通知機能を提供するトレイト
use Laravel\Sanctum\HasApiTokens; // APIトークン関連の機能を提供するトレイト

class User extends Authenticatable
{
    // 使用するトレイトを指定
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name', // 名前
        'email', // メールアドレス
        'password', // パスワード
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password', // シリアライズ時に非表示にするパスワード
        'remember_token', // ログイン状態を保持するためのトークン
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime', // メール確認日時を日付型にキャスト
        'password' => 'hashed', // パスワードをハッシュ化して保存
    ];
}

fillable

「代入可能な」属性の指定です。
create メソッドやinsertメソッドなどを使用してモデルに代入できます。

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name', // 名前
        'email', // メールアドレス
        'password', // パスワード
    ];

hidden

モデルを返すときに、表示させないフィールドです。

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password', // シリアライズ時に非表示にするパスワード
        'remember_token', // ログイン状態を保持するためのトークン
    ];

casts

モデルを返すときに、キャストする型を記述します。

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime', // メール確認日時を日付型にキャスト
        'password' => 'hashed', // パスワードをハッシュ化して保存
    ];

Modelの作成

php artisan make:モデル名

モデルで使用する変数の説明もコメントで入れています。
作成時には使用してください。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // テーブル名を指定する変数
    protected $table = 'users';

    // プライマリキーのカラム名を指定する変数
    protected $primaryKey = 'id';

    // モデルが作成されたときに自動的に設定されるタイムスタンプを有効または無効にする変数
    public $timestamps = true;

    // タイムスタンプのフォーマットを指定する変数
    protected $dateFormat = 'Y-m-d H:i:s';

    // モデルの可変項目(Mass Assignment)を指定する変数
    protected $fillable = [
        'name', 'email', 'password',
    ];

    // モデルの不可変項目(Mass Assignment)を指定する変数
    protected $guarded = [];

    // JSON形式で取得される属性を指定する変数
    protected $visible = [];

    // JSON形式で取得される属性以外の属性を指定する変数
    protected $hidden = [];

    // 日付属性のデータ型を指定する変数
    protected $dates = [
        'created_at', 'updated_at', 'deleted_at',
    ];

    // キャスト可能な属性を指定する変数
    protected $casts = [];

    // リレーションの事前読み込みを指定する変数
    protected $with = [];

    // モデルを配列に変換するときに含める属性を指定する変数
    protected $appends = [];

    // モデルのクエリのデフォルトのグローバルスコープを指定する変数
    protected static function boot()
    {
        parent::boot();

        // 例: ソートされたクエリを返すグローバルスコープ
        static::addGlobalScope('sorted', function ($builder) {
            $builder->orderBy('created_at', 'asc');
        });
    }
}

ユーザーモデルクラスは、Illuminate\Database\Eloquent\Modelクラスを継承しており、Eloquent ORMを使用してデータベースとのやり取りを行います。
$fillableプロパティを使用して、ユーザーモデルに直接代入可能な属性を指定し、$hiddenプロパティを使用して、JSON表現から除外される属性を指定しています。

use App\Models\User;

$user = User::create([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'password' => bcrypt('password'),
]);

モデルクラスを使って、データベース内のユーザーテーブルに対する操作を行うことができます。
createメソッドを使って新しいユーザーをデータベースに挿入しています。bcrypt関数を使用してパスワードをハッシュ化しています。

スポンサードサーチ

Providers | プロバイダーズ

「providers」はLaravel起動時の処理が記述されています。
「ServiceProvider」を継承しているファイルです。

サービスプロバイダーは、サービスコンテナへのサービスの登録を行なっています。

vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php

AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // サービスの登録
    }

    public function boot()
    {
        // アプリケーションの起動時に実行されるロジック
    }
}

プロバイダークラスは、Illuminate\Support\ServiceProviderクラスを継承しており、registerメソッドとbootメソッドを持っています。

register

registerメソッドでは、アプリケーションのサービスコンテナに新しいサービスを登録するためのロジックが含まれます。
シングルトンとして登録するためのロジックが記述されるため、アプリケーション全体で1つのインスタンスが共有されるようになります。

icon

少し補足を入れます。

  • プリケーションが利用可能にするサービスやエイリアスを登録するための場所です。
  • サービスプロバイダーが提供するサービスやクラスをアプリケーション全体で利用可能にするために使用されます。
  • 通常、依存性の注入(Dependency Injection)のためにサービスのバインディングやコンテナへの結びつけが行われます。

boot

bootメソッドでは、アプリケーションの起動時に実行される初期化ロジックが含まれますServiceProviderとはLaravelのコア機能の初期化(ブートストラップ)の中心点となっています。

こちらも補足を入れます。

  • bootメソッドは、アプリケーションの起動時に追加の処理を実行するために使用されます。
  • これは、アプリケーションの起動時に必要な初期化や追加の設定を行うための場所です。
  • イベントリスナーの登録やミドルウェアの設定、ルーティングの設定など、アプリケーション全体の振る舞いを変更するための処理がここで行われます。
  • 外部サービスの登録やプロバイダーの登録、DBクエリのリスニングなど、アプリケーション全体の様々な側面に関わる処理も行われることがあります。

View

ビューは画面のことを指します。
表示したい内容を記述します。

変数など値の結果などはコントローラーから取得します。

AppLayout.php

Bladeテンプレート内で簡単に使い回すことができるクラスです。

<?php

namespace App\View\Components;

use Illuminate\View\Component;
use Illuminate\View\View;

class AppLayout extends Component
{
    /**
     * Get the view / contents that represents the component.
     */
    public function render(): View
    {
        // layouts.app ビューを描画する
        // アプリケーションの共通レイアウトを定義するビューファイルです
        return view('layouts.app');
    }
}

AppLayoutクラスでは、Componentのrenderメソッドがオーバーライドされ、指定されたビューファイル(layouts.app)を描画するように定義されています。

GuestLayout.php

<?php

namespace App\View\Components;

use Illuminate\View\Component;
use Illuminate\View\View;

class GuestLayout extends Component
{
    /**
     * Get the view / contents that represents the component.
     */
    public function render(): View
    {
        // layouts.guestビューを描画する
        // ゲストユーザー向けの共通レイアウトを定義するビューファイルです
        return view('layouts.guest');
    }
}

実装やエラーが解決できない場合

プログラミングの実装やエラーでどうしてもわからない場合はメンターに相談するのが一番です。

考えている、見えている範囲が狭くなり、解決から遠くに行って何時間も、何日も経っていることなんてよくある話です。

そういう時は聞ける先輩や、メンターに相談することが大事です。

僕にも相談可能なので気軽に相談してください。

Twitterからの連絡だと確実ですよ。

オンラインスクールやプログラミングスクールといったプログラミングを学べる方法もあるので、そちらもぜひ活用してもいいと思います。

Web開発で分からない時

オンライン完結型スクール DMM WEBCAMP PRO

アプリ開発で分からない時

プログラミング×稼げる副業スキルはテックキャンプ

プログラミングについて分からない時

【コエテコ様限定】※ご案内を受けた以外のメディアが使用しても成果は承認されません。
ミニマリスト_カミ

僕への個人でもメンターでも、スクールでもお好きな方を活用ください。

Laravel,PHPLaravel

Posted by kami