BackEnd

LaravelのDI

投稿日:

はじめに

今回の記事では、PHPのフレームワークであるLaravelのDIに関する機能と実装方法を紹介します。Laravelの基礎知識に関してはこちらをご覧ください。

DIに関する機能

DIとは

大雑把に説明すると、DI(Dependency Injection)とはあるコンポーネントで利用する別のコンポーネントを外部から注入できるようにするデザインパターンです。コンポーネント間を疎結合にするために、コンポーネント間の関係には具体的なコンポーネントではなくインタフェースを用います。DIに関してはこちらが参考になります。

サービスコンテナ

サービスコンテナはLaravelアプリケーションにおいてインスタンスの管理を行う機能です。サービスコンテナの役割は大きく分けて二つあります。一つはインスタンスの生成方法の管理、もう一つは生成したインスタンスの管理です。

サービスプロバイダ

サービスプロバイダはインスタンスの生成方法をサービスコンテナに登録する役割を担います。

サービスコンテナ

ここでは、サービスコンテナにインスタンスの生成方法を登録する方法(バインド)とサービスコンテナを利用したインスタンスの生成方法(解決)について説明します。

バインド

バインドには下記の四つの方法が用意されています。

  • bindメソッド
  • bindIfメソッド
  • singletonメソッド
  • instanceメソッド

bind

まず始めに一般的なbindメソッドの使用方法を説明します。下記のサンプルコードの通り、 app()->bind() メソッドの第一引数に文字列(登録名)、第二引数にクロージャ(生成方法)を指定します。

bindIf

bindIfメソッドは引数に指定した文字列に対応したバインドが存在しない場合にバインドを行います。

singletonメソッド

singletonメソッドでバインドした場合、生成したインスタンスはサービスコンテナにキャッシュされます。

instanceメソッド

instanceメソッドは生成したインスタンスをサービスコンテナにバインドします。

解決

サービスコンテナを介したインスタンスの生成には app()->make() メソッドか app() ヘルパ関数で行います。

サービスプロバイダ

サービスコンテナへのインスタンス生成方法のバインドは AppServiceProvider クラスや独自のサービスプロバイダクラスに定義します。独自のサービスプロバイダクラスを作成した場合は app.php に定義を追加します。

サービスプロバイダクラスにはregisterメソッドとbootメソッドがあります。バインド処理は基本的にregisterメソッドに記述します。ただし、インスタンス生成時に他のクラスを利用する必要がある場合はbootメソッドに記述します。

DIを利用する

ここではLaravelでのDIの利用方法を紹介します。まず、下記の用にインタフェースとクラスを定義し、バインドします。

コンストラクタインジェクション

上記のインタフェースをコンスタラクタインジェクションで利用する場合は下記のようになります。

メソッドインジェクション

メソッドインジェクションで利用する場合は下記のようになります。

さいごに

LaravelでのDIの利用にあたり重要な機能であるサービスコンテナとサービスプロバイダについて説明しました。

おすすめ書籍

初めてのPHP PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 基礎から学ぶ Vue.js

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Rust入門してみた その5 ライフタイム

1 はじめに2 ライフタイムと借用チェッカー3 コンパイラにライフタイムを教える3.1 ライフタイムの指定が不要なケース4 ライフタイムの省略5 さいごに6 おすすめ書籍 はじめに Rustには、借用 ...

Go言語

Go 1.24で追加されたjsonのomitzero

1 はじめに2 1.24の更新点3 jsonのomitzeroタグ3.1 Go 1.23までの場合3.2 Go 1.24での場合3.3 要素が空の場合とnilの場合3.4 omitzeroをコントロー ...

laravel logo

LaravelのHttp Facade

1 はじめに2 基本定な使い方2.1 get2.2 post3 タイムアウト4 リトライ5 マルチパートリクエスト6 エラー処理7 さいごに8 おすすめ書籍 はじめに 現在関わっている案件でHttpク ...

rails

Ruby2.4でCookieを手動で復号する際に発生したエラーの対処

1 はじめに1.1 前提条件2 発生したエラー2.1 実際のコード2.2 エラー詳細2.3 原因3 どう対処したか3.1 修正後のコード はじめに こんにちは、onoです。 現在開発中のアプリケーショ ...

Next.jsのrevalidatePathとrevalidateTag

1 はじめに2 前提3 revalidatePathとrevalidateTag3.1 revalidatePath3.2 revalidateTag4 今回の場合5 おすすめ書籍 はじめに Next ...

フォロー

blog-page_side_responsive

2019年2月
 12
3456789
10111213141516
17181920212223
2425262728  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。