My I/O

インプットしたことをアウトプットするブログ

Laravel5.5 サービスコンテナ

依存注入 という言葉がある。

イントロダクションでは、 コンストラクターか、ある場合にはセッターメソッドを利用し、あるクラスをそれらに依存しているクラスへ外部から注入する」

という説明があるが、自分の言葉で解釈すると、 クラス内で特定のサービスの記述をせず、コードの変更無くほかの実装に付け替えできるようにしよう

ということだと思う。それは仕事でもちょいちょい言われていること…。 Laravelサービスコンテナの説明を見て、普段の設計に生かせるようにもなりたいが、、 話を戻して、サービスプロバイダでサービスコンテナで依存注入を実際にやってみる。

実践・サービスコンテナ

準備する→。コントローラー、サービスプロバイダ、インターフェイス、その実装

$ php artisan make:controller ContainerTestController
$ php artisan make:provider MichikoTestServiceProvider
$ php artisan make:model Contracts/TestContainer
$ php artisan make:model Test/MichikoContainer

プロバイダーのregister()で依存注入。

    public function register()
    {
        $this->app->bind(
            'App\Contracts\TestContainer',
            'App\Test\MichikoContainer'
        );
    }

コントローラーの__constructの引数にタイプヒンティングして、なんのオブジェクトが得られるか確かめる。

use App\Contracts\TestContainer;

class ContainerTestController extends Controller
{
    private $container;

    public function __construct(TestContainer $container) {
        $this->container = $container;
    }

    public function show() {
        var_dump($this->container->hoge());die;
    }
}

f:id:michikoxxx:20180220175223p:plain

実装クラスのMichikoContainerが取得できていました!

というわけで依存(MichikoContainer)を注入できました。 うーむすごい。