読者です 読者をやめる 読者になる 読者になる

sekaie engineers' blog

セカイエ株式会社が主催するエンジニア勉強会について

laravel.osaka #2 Laravelで学ぶDIの仕組みに行ってきました!!

こんにちは。

最近iPhoneのバッテリー40%を切ると突如電源が落ちるの大西です。

機種変しようかな。。

さて

タイトルの通り、

laravel.connpass.com

に行ってきました!!

今回はこの勉強会の感想です。

投稿が遅くなってしまいました。。

ちなみに

私はLaravel超初心者です。

チュートリアルを始めたばっかりです。。

なので、「Laravelって何?おいしいの?」って状態で参加してきました。。。

Laravelで学ぶDIの仕組み

スピーカーは後藤知宏 @chatbox.incさん

内容は「LaravelのDIの仕組みを中心に、 変更に強いモデル層の構築の仕組み」

という事で

  • そもそもDI(コンテナ)とは?
  • DIコンテナを使うメリットは?
  • どう実装するのが良いの?

と言った内容を当日は喋っていただきました。

そもそもDI(コンテナ)とは?

DIを日本語で訳すと・・

DI = 依存性の注入

ナンノコッチャ??

例えば、「Aの機能を実現するためにBという機能を利用する。」

この状態をAはBに依存すると言えます。

Laravelのチュートリアルにはこういったコードがあります。

<?php

/**
 * 新タスク追加
 */
Route::post('/task', function (Request $request) {
    // hoge
});

このRequest $requestの部分が依存を注入してると言うそうです。

つまりこの処理はRequestというクラスに依存してるという事です。

そしてLaravelのDIコンテナと言うのは、コードのようにRequestと書くだけでDIコンテナRequestキーで格納しているクラスのインスタンスをエエ感じに取得してくれる機能の事です。

クラスのインスタンスと書きましたが、単純に値や関数なんかも格納しておくことができるようです。

DIコンテナの中は連想配列みたいなもんなんですかね。

DIコンテナを使うメリットは?

DIコンテナを使うメリットはクラス間、モジュール間などの依存関係を疎結合にできる、というのが大きいらしいです。

疎結合にできることで、変更をしやすい、テストを書きやすい、といったメリットがあります。

こんな感じ。

<?php

class ClassA
{
    // DIコンテナ使わないパターン
    // ClassBが動作しない、まだ実装していない場合にmethod1が動作しない
    // ClassBをやめてClassCに変えたくなった時に、該当箇所を全て変更しないといけなくなる
    public function method1() {
        $classB = new ClassB();
        $classB->hoge();
    }

    // DIコンテナ使うパターン
    // ClassBを実装していなくても、とりあえずhogeメソッドを持つモックをDIコンテナに登録しておけば、method2は動作させることが出来る(ClassBがなくてもテストができる)
    // ClassCに変更する場合でも、DIコンテナに格納している箇所を一箇所変えるだけで、変更できる
    public function method2(ClassB $classB) {
        $classB->hoge();
    }
}

こう書いてはいるんですが

実際にDIコンテナを使っておらずメリット・デメリットが体感できてないので、イメージがあまりつかめていないです。

実際に利用した後にまた記事を書きたいですね。

でも、疎結合なコードは良いというのはわかるので、それをエエ感じにしてくれるDIコンテナはきっと良いヤツなんでしょう!

どう実装するのが良いの?

「LaravelのDIの仕組みを中心に、 変更に強いモデル層の構築の仕組み」変更に強いという部分を実装するには実際どうすれば良いの?といった内容も喋っていただいたので、それについても書いておきます。

まず、メソッド内でnew Class()はしない。ダメ、絶対!

インスタンスの取得はDIへ任せましょう。という事でした。

次に、DIコンテナへの格納はインターフェースのクラス名をキーにして、そのインターフェースの実体クラスを格納すると良いと言ってました。

要はインターフェースを登録しておけば、そのインターフェースの実体をDIコンテナ側で切り替える事で、変更や拡張をDIコンテナ側で吸収することが出来るのが良いのでしょう。

ちなみに、聴いてて「これってクラスの設計とか、経験とテクニックが必要だなー」と思った次第です。

終わりに

今回はLaravelのと言うより、DIの勉強会って感じでしたね。

でもLaravelにDIコンテナという機能があって、これがすごく良さそうってのを学べたことが良かったです。

laravel.connpass.com

次回のイベントは3月14日です。ホワイトデーですね。皆さんお返しはちゃんとしましょうね。

興味のある方はぜひ。

ほな!