Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Iocコンテナについて

5,063 views

Published on

laravelのiocコンテナについて

Published in: Technology
  • Be the first to comment

Iocコンテナについて

  1. 1. IoCコンテナについて
  2. 2. プロフィール 氏名:寺山 昭夫 twitter: trtraki
  3. 3. アジェンダ 1. そもそもIoCって何? 2. IoCコンテナって何? 3. 実際何が嬉しいのか? 4. IoCコンテナの実例 5. Facadesを適応してみよう!
  4. 4. 1. そもそもIoCって何? Inversion of Controlの略称で、制御の反転 と言う意味。
  5. 5. どういうこと? 抽象化原則の一種で、手続き型プログラミン グと比較したとき、システムの制御の流れが 逆転しているソフトウェアアーキテクチャ設 計を表している。 参考:wikipediaより抜粋 http://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E3%81%AE%E5%8F%8D%E8%BB%A2
  6. 6. だから、どういうこと?
  7. 7. ClassAControllerと言うクラスは、
 処理を行う際は、ClassBをnewしている。
 処理の流れ的にはClassAController→ClassB と言う流れになっている。
 これをClassB→ClassAControllerと言うよう な流れに変える事を、IoC(制御の反転)と呼 ぶ。
  8. 8. イメージ図 ClassAController ClassB
  9. 9. イメージ図 ClassAController ClassB ClassB
  10. 10. 2. IoCコンテナって何? IoCをあるオブジェクト(コンテナ)にまとめた もの。 実際にController側で使用する場合は、コン テナから取得する。 ※Laravel5ではサービスコンテナに名前が変 わっています。
  11. 11. IoCコンテナ イメージ図 ClassAController ClassB ClassC IoCコンテナ ClassB
  12. 12. 3. 実際何が嬉しいのか ある一定の単位コード毎にソースを分離する 事が出来る。(ソースが綺麗になる!) 単体テストと相性抜群!
  13. 13. 4. IoCコンテナの実例 •サービスプロバイダーでインスタンス作成 •Controllerで依存性を注入
  14. 14. これから説明する内容は↓の実例はこちら https://github.com/trtraki/ioc
  15. 15. サービスプロバイダーでインスタンス作成 • app/Providers/TestServiceProvider.php public function register() { $this->app->bind('Testinterface', function($app) { return new Test($app['Test']); }); } • config/app.php 'AppProvidersTestServiceProvider' ※Laravel5のドキュメント例になります。他の記述の仕方もあります。
  16. 16. Controllerで依存性を注入 • app/Http/Controllers/WelcomeController.php protected $test; ! public function __construct(Test $test) { $this -> test = $test; } public function index() { $this -> test ->addition($x, $y); }
  17. 17. これだけすっきりしました https://github.com/trtraki/ioc/blob/master/ app/Http/Controllers/WelcomeController.php
  18. 18. テストも書きやすくなりました。 https://github.com/trtraki/ioc/blob/master/ tests/service/CalculationTest.php
  19. 19. IoCコンテナを使う事で、小さい単位でコー ドがまとまるようになりました。
  20. 20. しかし
  21. 21. まだControllerにユニットテストが導入され ていない状態です。
  22. 22. 現状でも、Controllerのユニットテストを導入 出来ますが、楽に実装する仕組みがあります。
  23. 23. Facadesです!
  24. 24. 5. Facadesを適応してみよう!
  25. 25. そもそもFacadesとは? •IoCコンテナに登録されているクラスの メソッドを、staticメソッドとして呼び 出せるようにする機構。
  26. 26. 適応して嬉しい事は? •簡単にmockと置き換える事が出来 る。
  27. 27. Facadesの実例 • Facades継承したクラスを作成す る。  ※IoCコンテナを導入している事が前提です。 ! • 別名の設定をする。
  28. 28. Facadesの実例 • Facades継承したクラスを作成す る。  ※IoCコンテナを導入している事が前提です。 ! • 別名の設定をする。
  29. 29. Facades継承したクラスを作成する。 • app/Facades/TestFacade.php <?php namespace AppFacades; use IlluminateSupportFacadesFacade; ! class TestFacade extends Facade { protected static function getFacadeAccessor() { return Testinterface'; } }
  30. 30. 別名の設定をする。 • config/app.php ! 'TestFacade' => 'AppFacadesTestFacade', !
  31. 31. そうすると ! $this -> test -> addition($x, $y); ! ! TestFacade:: addition($x, $y); ! • app/Http/Controllers/WelcomeController.php            ↓
  32. 32. Facadesをmockに置き換える • mockeryをインストール ! • mockeryを使用するようにテスト を書く
  33. 33. mockeryをインストール • composer.json ! "mockery/mockery": " 0.8" ! • 【php ./composer.phar update】でイン ストール
  34. 34. mockeryを使用するようにテストを書く • tests/service/CalculationTest.php /** * * @expectedException ErrorException * */ public function testControllerMock() { TestFacade::shouldReceive('addition') ->once() ->with(2,3) ->andThrow(); WelcomeController::index(); } !
  35. 35. これで外部ロジック部分を、簡単に置 き換える事が可能になりました! ! 必要な部分を好きにテスト出来るよう になりました!
  36. 36. まとめ • IoCコンテナはユニットテストとの 相性が抜群! • 更に、Facadesも適応するとユニッ トテストを書くのが簡単に!
  37. 37. 参考図書 http://www.amazon.co.jp/Laravel%E3%82%A8%E3%82%AD %E3%82%B9%E3%83%91%E3%83%BC%E3%83%88%E9%A4%8A %E6%88%90%E8%AA%AD%E6%9C%AC- %E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E9%96%8B %E7%99%BA%E3%82%92%E5%AE%9F%E7%8F%BE %E3%81%99%E3%82%8BPHP%E3%83%95%E3%83%AC %E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF %EF%BC%81-Software-Design-plus/dp/4774173134
  38. 38. では、皆さん良いIoCコンテナライフを!
  39. 39. ご清聴ありがとうございました!

×