対象バージョン: 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- パッケージ連携の入口もサービスプロバイダ