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


関連記事

laravel logo

LaravelのHttp Facade

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

laravel logo

Laravelで非同期実行する

1 はじめに1.1 動作環境2 準備2.1 デーブルの作成2.2 .envの修正3 ジョブの作成4 ジョブのディスパッチ5 キューワーカーを起動6 より細かな制御6.1 特定のキューにディスパッチする ...

Laravelの開発環境をdocker-composeで一から構築してみる

1 はじめに2 nginxでwebサーバを立てる2.1 default.conf作成2.2 index.html作成2.3 nginxコンテナ起動3 nginxでPHP-FPMを動作させる3.1 do ...

laravel logo

[Laravel] ログの扱い方 [5.8]

1 はじめに2 環境3 Monologについて4 コード上で設定する方法5 config/logging.phpで設定する方法6 おまけ:ログレベルについて7 さいごに8 おすすめ書籍 はじめに こん ...

rails

configに追記したのに、rails runnerが起動しない?

1 はじめに1.1 環境2 rails runnerを使用してみる2.1 バッチファイルの作成2.2 configにパスを追記2.3 実行3 ところが…3.1 解決方法4 おまけ(runnerコマンド ...

フォロー

blog-page_side_responsive

2019年2月
 12
3456789
10111213141516
17181920212223
2425262728  

アプリ情報

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