サービスコンテナへの結合
サービスコンテナは、必要なサービス類を全て自動的に組み込みます。ただ、クラス内で「ここでインスタンスを組み込みます」といった明示的な処理はありません。サービスコンテナが自動的にインスタンスを作成し、組み込んでいます。こうしたインスタンスの組み込み処理を「結合」と呼びます。
この結合は勝手にやってくれる際は便利なのですが、時としてインスタンス作成を明示的に行いたい場合もあります。このような場合に、「どのようにインスタンスがサービスコンテナに結合されるか」を理解しておく必要があります。
インスタンスのサービスコンテナへの結合はサービスコンテナに用意されるbindメソッドを使用して行われます。
1 2 3 4 |
app()->bind(クラス名 , function($app)) { //--インスタンス生成処理-- return インスタンス; } |
bindメソッドは結合するクラス名と、実際に結合に使うインスタンを返すクロージャ(関数)を引数に指定します。クロージャ内でインスタンスを作成し、returnすれば、そのインスタンスがサービスコンテナに結合されます。
サービスコンテナについて詳しく知りたい方はここを押してください。
bindの基本的な使い方
では実際にbindを使用してみましょう。
クラス構成について詳しく知りたい方はこちらの記事を参照ください
testServiceクラスを修正し、引数なしでインスタンスを作成し、後からIDを設定できるように修正しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php namespace App\TestClasses; class TestService { private $intId = -1; private $strMsg = 'idがありません'; private $aryData = ['one', 'two', 'three']; public function __construct() { } public function setId($intId) { $this->intId = $intId; if ($intId >= 0 && $intId < count($this->aryData)) { $this->strMsg = "select id:" . $intId . ", data:" . $this->aryData[$intId]; } } public function say() { return $this->strMsg; } public function data(int $intId) { return $this->aryData[$intId]; } public function alldata() { return $this->aryData; } } |
プロバイダでMyServiceを結合
上記で修正したtestserviceクラスを結合しましょう。システム全体で結合が反映されることを考えて、プロバイダを利用することをおすすめします。
app/Providers/AppServiceProvider.php を開きbootメソッドを下記の様に修正しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use App\TestClasses\TestService; /** * Bootstrap any application services. * * @return void */ public function boot() { app()->bind("App\TestClasses\TestService", function($app) { $testservice = new TestService(); $testservice->setId(0); return $testservice; }); } |
上記でbindを使用してtestServiceの結合を行っております。クロージャでは、まずnew testServiceでインスタンスを作成し、setid(0)を0に設定しておきましょう。
testServiceを利用
では、testService利用してみましょう。
app/Http/Controllers/HelloController.php@indexを下記の様に修正してください。
1 2 3 4 5 6 7 8 9 |
public function index(TestService $testservice ,int $intId = -1) { $testservice->setId($intId); $data = [ 'strMsg' => $testservice->say($intId), 'aryData' => $testservice->alldata() ]; return view('hello.index', $data); } |
修正が完了したら、/helloにアクセスしてみてください。
下記の様に表示ができていれば成功です。
idが-1ではなく、0に設定されているということはサービスコンテナが自動的に結合したインスタンスではなく、明示的に結合されたインスタンスが使用されていることが確認できます。