Laravelでサービスプロバイダを理解し、活用する方法

対象バージョン: Laravel 13.x / PHP 8.3+(2026年時点のシリーズ基準)
一次ソース: Service Providers / Release Notes

Laravel 13.x で、サービスプロバイダの役割と使い方を整理します。作成(make:provider)、登録先(bootstrap/providers.php)、register と boot の境界、よくある利用シーンまでを通します。コンテナの高度な機能やパッケージ開発の全体像は扱いません。まずは「自分で作ったプロバイダを正しい場所に載せ、バインドと起動を分けて書ける」状態を目指します。

この記事で分かること

  • サービスプロバイダがアプリ起動(bootstrapping)の中心であること
  • make:provider と bootstrap/providers.php への登録
  • register(バインドのみ)と boot(ルート・イベント・ミドルウェア等)の使い分け
  • パッケージ連携の概要

対象バージョン

本記事の前提は Laravel 13.x / PHP 8.3+ です。Laravel 13 は 2026年3月17日リリースの現行メジャーであり、サポート表上 PHP 8.3〜8.5 を対象とします(Release Notes)。フレームワーク本体も php: ^8.3 を要求します。調査時点で確認した laravel/framework 13.x の最新 stable は v13.34.0 です。

本記事は全文 rewrite ではなく、現行学習者向けの major_update です。旧手順にあった config/app.php の providers 配列への登録は、現行例から外します。


サービスプロバイダとは

サービスプロバイダは、Laravel アプリケーションの bootstrapping(起動時の組み立て)の中心 です。サービスコンテナへのバインド、イベントリスナー、ミドルウェア、ルートなどの登録を、ここにまとめます。

ユーザー定義のプロバイダは、通常 app/Providers に置きます。fresh なアプリには既定で AppServiceProvider があります。独自プロバイダも同じディレクトリに追加して構いません。基底クラスは Illuminate\Support\ServiceProvider です。


サービスプロバイダの作成

新しいプロバイダは Artisan で生成します。

php artisan make:provider CustomServiceProvider

app/Providers/CustomServiceProvider.php が作られます。make:provider を実行すると、Laravel は生成したプロバイダを bootstrap/providers.php へ自動追加します。 作成直後に、別ファイルへ手で追記する必要はありません(手動でクラスだけ作った場合は後述)。


サービスプロバイダの登録

Laravel 13.x では、すべてのユーザー定義サービスプロバイダを bootstrap/providers.php に登録します。このファイルは、プロバイダのクラス名の配列を返します。

<?php

return [
    App\Providers\AppServiceProvider::class,
    App\Providers\CustomServiceProvider::class,
];

make:provider で作った場合は、この配列への追記が自動で行われます。クラスファイルだけを手で置いた場合は、同じ配列へ手動で追加してください。

注意: Laravel 10.x では config/app.php の providers 配列に登録していました。Laravel 11 以降の新規アプリでは、その配列は使わず、bootstrap/providers.php が正規の登録先です。古い記事の手順を写さないでください。


サービスの登録(register)

コンテナへのバインドは、register メソッドで行います。プロバイダ内では $this->app 経由でサービスコンテナに常にアクセスできます。

register ではバインドだけを行い、イベントリスナー・ルート・その他の機能登録は書かないでください。 それらは boot 側です。

シングルトンの例です。一度解決すると、以降は同じインスタンスが返ります。

<?php

namespace App\Providers;

use App\Services\CustomService;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Foundation\Application;

class CustomServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->singleton(CustomService::class, function (Application $app) {
            return new CustomService();
        });
    }

    public function boot(): void
    {
        //
    }
}

対比として、bind は解決のたびに新しいインスタンスを返します。単純な登録だけなら、プロバイダの bindings / singletons プロパティで宣言する方法もあります(詳細は公式 docs)。


サービスの起動(boot)

boot は、ほかのすべてのサービスプロバイダの register が終わったあと に呼ばれます。すでに登録済みのサービスにアクセスできます。boot の引数は type-hint でき、コンテナが自動注入します。

ルートの登録、イベントリスナー、ミドルウェア、ビューコンポーザなど、バインド以外の初期化は boot に書きます。

public function boot(): void
{
    // ルート・イベント・ミドルウェアなどの起動処理
}

利用シーンとパッケージ

アプリ側では、次のように役割を分けると安全です。

処理 置き場所
サービスコンテナへの bind / singleton register
ルート・イベントリスナー・ミドルウェア・ビューまわり boot

パッケージと Laravel をつなぐのもサービスプロバイダです。Composer の extra.laravel.providers による package discovery で、自動読込できる場合があります。

遅延読込(Deferred providers)や、より高度なコンテナ機能は、必要になったタイミングで公式 docs を足していくとよいです。本記事では入門範囲に留めます。


まとめ

  • サービスプロバイダは Laravel の bootstrapping の中心
  • 作成は php artisan make:provider(bootstrap/providers.php へ自動登録)
  • 正規の登録先は bootstrap/providers.php(config/app.php の providers は現行手順にしない)
  • register はコンテナ bind のみ。ルート・イベント・ミドルウェアは boot
  • パッケージ連携の入口もサービスプロバイダ

参考リンク

コメントする