Laravelのサービスプロバイダーとは?仕組み・使い方・実践例までわかりやすく解説!

未経験エンジニアの日常
  • Laravelのサービスプロバイダーって何?
  • メリットがいまいちわからない
  • 現場だとどう使われるのか知りたい

このようなお悩みを解決するために、Laravelのサービスプロバイダーについてメリットや必要性を含めて簡単に解説していきます。

この記事を書いた人

  • エンジニア3年目
  • 主にLaravel, Vue.jsを使用

まずはこの一冊!一番わかりやすいLaravelの書籍

楽天Kobo電子書籍ストア
¥3,000 (2025/03/04 10:59時点 | 楽天市場調べ)
\楽天ポイント5倍セール!/
楽天市場

Laravelのサービスプロバイダーとは


サービスプロバイダ は、Laravelアプリケーションにおけるサービスの登録を担当するクラスです。

どこにサービスを登録するの?
そもそもサービスを登録するって何?
あと、どうしてサービスを登録する必要があるの?

サービスプロバイダはサービスコンテナというクラスのインスタンスや依存関係を管理し、必要なときに提供する仕組みにサービスを登録します

サービスを登録するとは、Laravelのサービスコンテナにクラスや機能を追加し、アプリ全体で使えるようにすることです。

サービスを登録することで、いちいち必要なクラスのインスタンスをnewで作成しなくてもLaravelが自動でインスタンスを作成してくれるので、コードの記述量を減らしたり再利用しやすくなります

ざっくりと書きましたが、詳細を知りたい方はこちらの記事を確認してください。

スポンサーリンク

サービスプロバイダーの構成要素

サービスプロバイダーの使い方を確認する前にどんなメソッドが入っているのか、各メソッドの役割、使用場面を確認しましょう。

サービスプロバイダーの主な構成要素は以下の3つです。

  • register():サービスをコンテナに登録する
  • boot():初期設定やイベント登録を行う
  • provides()(オプション):遅延ロード対象のサービスを指定する

各メソッドの使い方も含め、もう少し詳しく見ていきましょう。

1. registerメソッド(サービスの登録)

registerメソッドはサービスコンテナにクラスや機能を登録するためのメソッドです。

registerメソッドの中で使われるメソッドにはbindsingletonの2つがあるのでこの2つのメソッドの違いも確認していきましょう。

bindメソッドとsingletonメソッドの使い方と違い

この2つのメソッドの違いは、bind()毎回新しいインスタンスsingleton()最初の1回だけインスタンスを作成し、使い回すことです。

もう少し具体的な使い分けが必要なシーンを説明すると、

ユーザーごとに異なる処理が必要な場合などのリクエストごとに異なるデータを処理するサービスにはbindメソッドを使用し、データベース接続、APIクライアントなど新しいインスタンスを作成する必要がない設定や接続情報を共有したいものの場合はsingletonメソッドを使用します。

使い方に特に違いはなく、どちらも第一引数に登録するクラスやインターフェースの名前、第二引数にクラスのインスタンスを生成する処理を記入します。

public function register()
{
$this->app->singleton(MyService::class, function ($app) {
return new MyService();
});

$this->app->bind(MyService::class, function ($app) {
return new MyService();
});
}

2. bootメソッド(初期設定やイベント登録)

bootメソッドはregisterメソッドの後に実行されるサービスの初期設定や、ルート・イベントリスナーなどを登録するメソッドです。

もう少し詳しく主な使用場面を見ていきましょう。

bootメソッドの使用例1 ルートの登録

Laravelにはルートモデルバインディングというルートの {} 内のIDを使い、自動で対応する Eloquent モデル(User::find($id) など)を取得する仕組みがあります。

例えば、/users/{user} にアクセスすると User::find(user) を自動で取得してくれるというような形です。

ただ、{}内をそのモデルの主キー(id)ではなく、usernameなどの主キー以外のカラムで検索したい場合にはroute用のサービスプロバイダを作成し、bootメソッド内で以下のように記載する必要があります。

use App\Models\User;
use Illuminate\Support\Facades\Route;

public function boot()
{
    Route::bind('user', function ($value) {
        return User::where('username', $value)->firstOrFail();
    });
}

bootメソッドの使用例2 イベントリスナー

何かが起こったときに特定の処理を実行する(イベントリスナー)をbootメソッド内で設定します。

下記はユーザーが登録されたときにメールを送信するイベントリスナーを登録しています。

use App\Events\UserRegistered;
use App\Listeners\SendEmail;
use Illuminate\Support\Facades\Event;

public function boot()
{
    Event::listen(UserRegistered::class, SendEmail::class);
}

bootメソッドの使用例3 カスタムBladeディレクティブ・バリデーションの追加

bootメソッド内でカスタムバリデーションルール、Bladeディレクティブを登録することで、サービスプロバイダーのロード時にルールを適用できるので、アプリケーション全体で利用できるようになります。

下記のコードはカスタムディレクティブの例です。

ビュー内でuppercaseという小文字を大文字に変えるカスタムBladeディレクティブをbootメソッドファイル内に設定しておくとビューファイルに@uppercase(‘hello’)と記載するだけで使用できるようになります。

public function boot()
{
    Blade::directive('uppercase', function ($expression) {
        return "<?php echo strtoupper($expression); ?>";
    });
}

下記のコードはカスタムバリデーション追加の例です。

bootメソッドに以下のように書くと

public function boot()
{
    Validator::extend('uppercase', function ($attribute, $value, $parameters, $validator) {
        return strtoupper($value) === $value;
    });
}

このように書くだけでカスタムバリデーションルールを使用できるようになります。

$request->validate([
    'name' => 'required|uppercase',
]);

3. provides メソッド(オプション:遅延ロード用)

サービスプロバイダーが遅延ロードをサポートする場合に使用されます。

providesメソッドがあると、Laravelはそのサービスが遅延ロード可能であることを認識し、実際に使われるまでメソッド内で指定しているサービスのインスタンス化を遅らせます

public function provides()
{
return [MyService::class];
}

遅延ロードとは?

遅延ロードとは、必要になるまでサービスのインスタンスを作成しない手法です。

アプリケーションの起動時に不要なリソースを消費せず、パフォーマンスを最適化できます。

スポンサーリンク

サービスプロバイダの使い方

サービスプロバイダーの使い方は以下の順序になります。

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

以下のコマンドの〇〇の部分を用途に応じて変更し、新しいサービスプロバイダを作成します。

php artisan make:provider 〇〇ServiceProvider

2. register メソッドでサービスを登録

3. boot メソッドで初期化処理

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

サービスプロバイダはconfig/app.phpに登録して、アプリケーションに読み込ませます。

'providers' => [
// 既存のサービスプロバイダ
App\Providers\〇〇ServiceProvider::class,
],

config/app.phpのprovidersに追加するだけでLaravel起動時にサービスプロバイダを順番に読み込んでregister, bootメソッドが実行されていきます。

ここの流れがイマイチピンときていない方、復習したい方は下記の記事を確認してください。

【Laravelを最短でマスター!】初中級者が確実に成長するおすすめ書籍3選

これを読めばLaravelで開発ができる!わかりやすく、実践的な学習書を厳選して紹介します!

Laravelの教科書 バージョン10対応

初めてLaravelに触れる、フレームワークに触れるという方は絶対にこの一冊!と言っても過言ではないほど初学者に寄り添った書籍になります。

MVCモデル?フレームワーク?という状態だった筆者がこれらの基本知識を理解し、アプリ開発できたのもこの書籍のおかげです。

難しいこと言葉には必ずわかりやすい説明がついていてこの書籍で学べば必ずLaravelの使い方を理解して何か開発することができるはず!

技術書って難しいしなあ、Laravelってどう使うんだろうという悩みや疑問を持っている方必読の一冊です。

楽天Kobo電子書籍ストア
¥3,000 (2025/03/04 10:59時点 | 楽天市場調べ)
\楽天ポイント5倍セール!/
楽天市場

Laravelリファレンス Web職人好みの新世代PHPフレームワーク

Laravelの深い理解を目指す開発者にとって必読の一冊です。

シンプルなコード例から実践的なテクニックまで幅広くカバーしているので、初心者はもちろん、中級者の方にも新たな発見がある内容になっています。

実務でLaravelを使いこなすためのベストプラクティスや、最新のフレームワーク動向を網羅しているため、初心者、中級者からさらにステップアップしたい方おすすめの一冊です。

\楽天ポイント5倍セール!/
楽天市場

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応

Laravelの基礎から実践的な開発手法までをわかりやすく解説した一冊です。

サンプルコードが豊富で、初心者の方でもスムーズに学習できるのが魅力だと思います。

実務で使える知識も多く、Laravelをしっかり習得したい方におすすめです。

今回のライフサイクルについても図解つきで説明してくれています。

楽天Kobo電子書籍ストア
¥3,799 (2025/02/18 18:21時点 | 楽天市場調べ)
\楽天ポイント5倍セール!/
楽天市場
スポンサーリンク

Laravel サービスプロバイダー まとめ

いかがだったでしょうか?

Laravelのサービスプロバイダーは、アプリケーションのサービスを登録・管理し、開発を効率化する重要な仕組みです。

本記事では、サービスプロバイダーの基本から、registerメソッド・bootメソッド・providesメソッド の役割、具体的な使用例まで詳しく解説しました。

特に、ルートの登録・イベントリスナー・カスタムBladeディレクティブやバリデーションの追加 など、実際の開発で役立つ活用法も紹介しました。

サービスプロバイダーを理解し活用することで、Laravelの拡張性を最大限に引き出し、より柔軟でメンテナブルなコードを書くことができます。

Laravelをさらに深く学びたい方は、ぜひおすすめ書籍もチェックして、実践的なスキルを身につけてください!

最後まで読んでくださって本当にありがとうございました!

今後ともよろしくお願いします。

おすすめのLaravel記事

おすすめの技術系記事

SNSはこちらから
twitter https://moile.twitter.com/QTzmttr1FeEYck
主に勉強記録を更新しています。

note https://note.com/arichan0/

参考記事・書籍

8.x リクエストのライフサイクル Laravel

Laravelリファレンス Web職人好みの新世代PHPフレームワーク

Laravelリファレンス Web職人好みの新世代PHPフレームワーク

コメント

タイトルとURLをコピーしました