Submit Search
Upload
Diコンテナを学ぶ
•
Download as PPTX, PDF
•
1 like
•
517 views
Hisahiro Tsukamoto
Follow
PHPフレームワークのLaravelを通して、DIパターンおよびDIコンテナについて学習する用スライドです
Read less
Read more
Technology
Report
Share
Report
Share
1 of 34
Download now
Recommended
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
Laravelとテストについて
Laravelとテストについて
Takeo Noda
LeanDiagramを用いたProblem/SolutionFit 日本語説明
LeanDiagramを用いたProblem/SolutionFit 日本語説明
Tatsuya Izumori
C#coding guideline その2_20130325
C#coding guideline その2_20130325
Yoshihisa Ozaki
Use Laravel telescope
Use Laravel telescope
Hirata Tomoko
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニング
NOW PRODUCTION
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2edition
Satomi Tsujita
これからのOpenShiftの話をしよう
これからのOpenShiftの話をしよう
Kazuto Kusama
Recommended
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
Laravelとテストについて
Laravelとテストについて
Takeo Noda
LeanDiagramを用いたProblem/SolutionFit 日本語説明
LeanDiagramを用いたProblem/SolutionFit 日本語説明
Tatsuya Izumori
C#coding guideline その2_20130325
C#coding guideline その2_20130325
Yoshihisa Ozaki
Use Laravel telescope
Use Laravel telescope
Hirata Tomoko
Laravelを用いたゲームサーバーのチューニング
Laravelを用いたゲームサーバーのチューニング
NOW PRODUCTION
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2edition
Satomi Tsujita
これからのOpenShiftの話をしよう
これからのOpenShiftの話をしよう
Kazuto Kusama
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
normalian
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
スキトラ Spring + mybatis
スキトラ Spring + mybatis
小川 昌吾
DevOpsのはじめの一歩 〜監視の変遷〜
DevOpsのはじめの一歩 〜監視の変遷〜
Akihiro Kuwano
ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験
miso- soup3
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
転職とLaravel
転職とLaravel
kasikasikasi
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018
Uemura Yuichi
Visual Studio Onlineで実践するDevOps手法
Visual Studio Onlineで実践するDevOps手法
Takashi Takebayashi
More Related Content
Similar to Diコンテナを学ぶ
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
normalian
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
スキトラ Spring + mybatis
スキトラ Spring + mybatis
小川 昌吾
DevOpsのはじめの一歩 〜監視の変遷〜
DevOpsのはじめの一歩 〜監視の変遷〜
Akihiro Kuwano
ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験
miso- soup3
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
転職とLaravel
転職とLaravel
kasikasikasi
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018
Uemura Yuichi
Visual Studio Onlineで実践するDevOps手法
Visual Studio Onlineで実践するDevOps手法
Takashi Takebayashi
Similar to Diコンテナを学ぶ
(10)
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
スキトラ Spring + mybatis
スキトラ Spring + mybatis
DevOpsのはじめの一歩 〜監視の変遷〜
DevOpsのはじめの一歩 〜監視の変遷〜
ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
転職とLaravel
転職とLaravel
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018
Visual Studio Onlineで実践するDevOps手法
Visual Studio Onlineで実践するDevOps手法
Diコンテナを学ぶ
1.
DIコンテナを学ぶ Laravelの肝
2.
このDIコンテナ(サービスコンテナ)を学びましょう LaravelではDIコンテナという仕組みを使用しており、そこで依存性の解決を 行っています。 リファレンス本の中でサービスコンテナと書いてあるものが、DIコンテナに当 たります。 コントローラーに依存関係を持たせなくてよくなるため、コントローラーの単 体テストが容易になったりします。 bootstrap/app.php の中で返される $app
がサービスコンテナそのもので す。Laravelを使い始める前にまず
3.
しかし、まずその前に
4.
DIとは? 依存性とは? コントローラ ーとは? MVCとは? 前提知識も足りていないことが多 い そもそも、フレームワークを使う 上での基本からおさらい しときま しょう 処理フローを学ぶためにフレーム ワークを使う場合と使わない場合 の違いから入っていきます
5.
FW使わない場合 ブラウザで http://localhost:8080/get_user.php?uid=3 public/index.php public/get_user.php public/login.php ・・・・・ fileひとつで処理が完結するpattern
6.
FW使う場合 Entrypointが入り口の全てを引き受ける public/index.phpがEntrypointに当たる (Laravel含め多くのPHPフレームワークで) 全てのアクセスがindex.phpを呼び出し、リクエスト内容(URL)から各コント ローラーに振り分けられる
7.
コンポーネント基礎構造 ⑤ビジネスロジック ④コントローラー ③ Router ① Request ⑥
ビュー ⑦ Response Laravelも MVC パターンっぽくは見え るが、Modelがない 元々はModelsディレクトリが存在して いたが、5.1からなくなる 既存の曖昧な「モデル」という表現を 使うことによるの弊害をなくしたかっ た もっと限定された語彙を使用し開発を行えば、 明確に定義された責任を持つ、より小さくてき れいなクラスへ、アプリケーションを簡単に分 割できるでしょう by Taylor Otwell
8.
コンポーネント基礎構造 ⑤ビジネスロジック ④コントローラー ③ Router ① Request ⑥
ビュー ⑦ Response Laravelも MVC パターンっぽくは見え るが、Modelがない 元々はModelsディレクトリが存在して いたが、5.1からなくなる 既存の曖昧な「モデル」という表現を 使うことによるの弊害をなくしたかっ た ② Middleware もっと限定された語彙を使用し開発を行えば、 明確に定義された責任を持つ、より小さくてき れいなクラスへ、アプリケーションを簡単に分 割できるでしょう by Taylor Otwell
9.
つまり
10.
Model(らしきもの)をどう設計、実装 するかは我々に委ねられている
11.
なので
12.
Modelはいったん置いときましょう 設計思想や経験に基づき、各ユーザごとに様々なモデリングが行われている あまりにも理解のための幅が広く、難易度が高い その代わり、コントローラとビューについては、標準で設置されており、役割も定められているの で、ここから理解していくのがよい (Laravelにおいては)
13.
Controller の責務 ・ユーザからの入力を受け取る ・ビューを選択、生成する この二つだけ Sample(製品モデルを扱うコントローラ) app/Http/Controllers/ProductController.php をみてみる
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.
<?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.
ここから依存性の話
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.
Object(コントローラー)がObject() に依存している
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.
<?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.
<?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.
依存されているObjectを外から引数で渡すことを 「依存性の注入(Dependency Injection)」という
23.
これがDI(パターン)
24.
ちなみにLaravelでは、外でnewしなくても、タ イプヒンティングで勝手にインスタンス生成し てくれる(条件つき)
25.
結合を緩くする(疎結合)
26.
/** * Productインターフェースとそれを実装したクラスを1ファイルにまとめたもの */ interface ProductInterface { public
function __construct() { } } class PackageProduct implements ProductInterface { public function __construct() { } } class CloudProduct implements ProductInterface { public function __construct() { } } } ProductInterfaceを実装し た、具象クラスが二つ
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.
<?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.
<?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.
依存性がどんどん複雑になってくる
31.
依存を再帰的に解決するなど、複雑な依存関係 の解決を一手に引き受けてくれるのが
32.
DIコンテナ(サービスコンテナ)
33.
まとめ
34.
● コントローラーに責務を追わせすぎないようにしましょう ● オブジェクト同士の依存性をできるだけ緩くしましょう(疎結合) ●
依存関係がソースコードの奥深くに入り込まないように、DIコンテナ に解決を任せましょう
Editor's Notes
CodeCampなどで最初に学ぶやつ URLにファイル名を含める
本来はMiddlewareなども入ってくるが、今回は割愛する
index()アクションなのに、詳細画面のロジックじゃない?ってのはスルーしてください
index()アクションなのに、詳細画面のロジックじゃない?ってのはスルーしてください
new Product() がないと、function index()は動かない = コントローラーが Productクラスに依存している
この場合はメソッドインジェクション
Interfaceは実装を書かない継承されるためのクラス
オブジェクト指向設計にはSOLID原則という5つの原則があり、その中の「依存関係逆転の原則」がこれにあたる
コンストラクタに渡す場合はコンストラクタインジェクション
例)コンストラクタの引数が両手で収まらない
http://blog.tojiru.net/article/304867046.html
Download now