O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Diコンテナを学ぶ

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 34 Anúncio

Mais Conteúdo rRelacionado

Mais recentes (20)

Anúncio

Diコンテナを学ぶ

  1. 1. DIコンテナを学ぶ Laravelの肝
  2. 2. このDIコンテナ(サービスコンテナ)を学びましょう LaravelではDIコンテナという仕組みを使用しており、そこで依存性の解決を 行っています。 リファレンス本の中でサービスコンテナと書いてあるものが、DIコンテナに当 たります。 コントローラーに依存関係を持たせなくてよくなるため、コントローラーの単 体テストが容易になったりします。 bootstrap/app.php の中で返される $app がサービスコンテナそのもので す。Laravelを使い始める前にまず
  3. 3. しかし、まずその前に
  4. 4. DIとは? 依存性とは? コントローラ ーとは? MVCとは? 前提知識も足りていないことが多 い そもそも、フレームワークを使う 上での基本からおさらい しときま しょう 処理フローを学ぶためにフレーム ワークを使う場合と使わない場合 の違いから入っていきます
  5. 5. FW使わない場合 ブラウザで http://localhost:8080/get_user.php?uid=3 public/index.php public/get_user.php public/login.php ・・・・・ fileひとつで処理が完結するpattern
  6. 6. FW使う場合 Entrypointが入り口の全てを引き受ける public/index.phpがEntrypointに当たる (Laravel含め多くのPHPフレームワークで) 全てのアクセスがindex.phpを呼び出し、リクエスト内容(URL)から各コント ローラーに振り分けられる
  7. 7. コンポーネント基礎構造 ⑤ビジネスロジック ④コントローラー ③ Router ① Request ⑥ ビュー ⑦ Response Laravelも MVC パターンっぽくは見え るが、Modelがない 元々はModelsディレクトリが存在して いたが、5.1からなくなる 既存の曖昧な「モデル」という表現を 使うことによるの弊害をなくしたかっ た もっと限定された語彙を使用し開発を行えば、 明確に定義された責任を持つ、より小さくてき れいなクラスへ、アプリケーションを簡単に分 割できるでしょう by Taylor Otwell
  8. 8. コンポーネント基礎構造 ⑤ビジネスロジック ④コントローラー ③ Router ① Request ⑥ ビュー ⑦ Response Laravelも MVC パターンっぽくは見え るが、Modelがない 元々はModelsディレクトリが存在して いたが、5.1からなくなる 既存の曖昧な「モデル」という表現を 使うことによるの弊害をなくしたかっ た ② Middleware もっと限定された語彙を使用し開発を行えば、 明確に定義された責任を持つ、より小さくてき れいなクラスへ、アプリケーションを簡単に分 割できるでしょう by Taylor Otwell
  9. 9. つまり
  10. 10. Model(らしきもの)をどう設計、実装 するかは我々に委ねられている
  11. 11. なので
  12. 12. Modelはいったん置いときましょう 設計思想や経験に基づき、各ユーザごとに様々なモデリングが行われている あまりにも理解のための幅が広く、難易度が高い その代わり、コントローラとビューについては、標準で設置されており、役割も定められているの で、ここから理解していくのがよい (Laravelにおいては)
  13. 13. Controller の責務 ・ユーザからの入力を受け取る ・ビューを選択、生成する この二つだけ Sample(製品モデルを扱うコントローラ) app/Http/Controllers/ProductController.php をみてみる
  14. 14. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct() { } //一覧 public function index() { $id = request()->get(‘id’); $product = new Product(); $products = $product->find($id); return view('product.index, array('products' => $products)); } } app/Http/Controllers/ProductController.php
  15. 15. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct() { } //一覧 public function index() { $id = request()->get(‘id’); $product = new Product(); $products = $product->find($id); return view('product.index, array('products' => $products)); } } app/Http/Controllers/ProductController.php 入力を受けとり ビューを生成
  16. 16. ここから依存性の話
  17. 17. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct() { } //一覧 public function index() { $id = request()->get(‘id’); $product = new Product(); $products = $product->find($id); return view('product.index, array('products' => $products)); } } app/Http/Controllers/ProductController.php
  18. 18. Object(コントローラー)がObject() に依存している
  19. 19. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct() { } //一覧 public function index() { $id = request()->get(‘id’); $product = new Product(); $products = $product->find($id); return view('product.index, array('products' => $products)); } } app/Http/Controllers/ProductController.php
  20. 20. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct() { } //一覧 public function index() { $id = request()->get(‘id’); $product = new Product(‘has_option’); $products = $product->find($id); return view('product.index, array('products' => $products)); } } app/Http/Controllers/ProductController.php
  21. 21. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct() { } //一覧 public function index(Product $product) { $id = request()->get(‘id’); $products = $product->find($id); return view('product.index, compact('products')); } } $product = new Product(); $product = new Product(‘has_option’); app/Http/Controllers/ProductController.php どちらも使える
  22. 22. 依存されているObjectを外から引数で渡すことを 「依存性の注入(Dependency Injection)」という
  23. 23. これがDI(パターン)
  24. 24. ちなみにLaravelでは、外でnewしなくても、タ イプヒンティングで勝手にインスタンス生成し てくれる(条件つき)
  25. 25. 結合を緩くする(疎結合)
  26. 26. /** * Productインターフェースとそれを実装したクラスを1ファイルにまとめたもの */ interface ProductInterface { public function __construct() { } } class PackageProduct implements ProductInterface { public function __construct() { } } class CloudProduct implements ProductInterface { public function __construct() { } } } ProductInterfaceを実装し た、具象クラスが二つ
  27. 27. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct() { } //一覧 public function index(ProductInterface $product) { $id = request()->get(‘id’); $products = $product->find($id); return view('product.index, compact('products')); } } 抽象に注入せよ (OODのDI原則)
  28. 28. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct(Product $product) { $this->product = $product; } //一覧 public function index() { $id = request()->get(‘id’); $products = $this->product->find($id); return view('product.index, compact('products')); } } コンストラクタ インジェクション
  29. 29. <?php namespace AppHttpControllers; use Product; class ProductController extends Controller { /** * ProductController constructor. */ public function __construct(Product $product) { $this->product = $product; $this->request = request(); } //一覧 public function index() { $id = $this->request->get(‘id’); $products = $this->product->find($id); return view('product.index, compact('products')); } } =Request::class
  30. 30. 依存性がどんどん複雑になってくる
  31. 31. 依存を再帰的に解決するなど、複雑な依存関係 の解決を一手に引き受けてくれるのが
  32. 32. DIコンテナ(サービスコンテナ)
  33. 33. まとめ
  34. 34. ● コントローラーに責務を追わせすぎないようにしましょう ● オブジェクト同士の依存性をできるだけ緩くしましょう(疎結合) ● 依存関係がソースコードの奥深くに入り込まないように、DIコンテナ に解決を任せましょう

Notas do Editor

  • CodeCampなどで最初に学ぶやつ
    URLにファイル名を含める
  • 本来はMiddlewareなども入ってくるが、今回は割愛する
  • index()アクションなのに、詳細画面のロジックじゃない?ってのはスルーしてください
  • index()アクションなのに、詳細画面のロジックじゃない?ってのはスルーしてください
  • new Product() がないと、function index()は動かない
    = コントローラーが Productクラスに依存している
  • この場合はメソッドインジェクション
  • Interfaceは実装を書かない継承されるためのクラス
  • オブジェクト指向設計にはSOLID原則という5つの原則があり、その中の「依存関係逆転の原則」がこれにあたる
  • コンストラクタに渡す場合はコンストラクタインジェクション
  • 例)コンストラクタの引数が両手で収まらない

  • http://blog.tojiru.net/article/304867046.html

×