Upload
yuuki-takezawa
View
1.243
Download
2
Embed Size (px)
Citation preview
LaravelとMVCの先へLaravel Meetup Tokyo Vol.7 yuuki takezawa(ytake)
profile
• ytake(GitHub), ex_takezawa(twitter)
• java, php, node.js, RDBMS, NoSQL, VoltDB
• 最近転職しました
• phpライブラリとオレオレフレームワーク作り
• 最近はPHPSpec
Laravelエキスパート養成読本4章担当
ご興味がある方は是非お願いします
Laravel Feature
よくあげられる特徴• 静的呼び出しなファサード (\Event::fire())による初学者にもわかりやすい記述
• ActiveRecordライクなEloquent
• Auth関連コントローラが最初から付いている
• なんか流行っている
• MVCらしい
• 重量級(Laravel3は軽量だった)
• RoRっぽい
いえ、違います
よくあげられる特徴について
• ファサードはstaticではありません
• Eloquent利用は強制ではありません
• Authコントローラはあくまでモックアプリケーションや、使うならオーバライドを
• 流行りではなく、一通り使ってから決めましょう
• MVCで実装するかどうかはユーザー次第です
• RoRっぽく見えるのは外見だけです
Eloquent問題
• イーガーローディングを使おうと、発行されるのはIN句
• 外部キーや正規化されたデータベースには無力
• Eloquentに拘ることで自ら生み出すボトルネック
• queryBuilderで解決させる
• それ、SQL直接書いた方が早い(Basic)
• テストしてますか?
ファサードにみる問題
• どこにでも利用できるため、どこにでも書いてしまう
• テストしてますか?
• テストしてますか?
• テストしてますか?
テスト問題
• callや5.1で追加されたvisit()->seeInXXXなどは機能テスト(ファンクショナルテスト)
• クラス単位でユニットテストしてますか?
• PHPUnit本家のマニュアルは読みましょう
MVCじゃないの?
• 一部の機能では「設定より規約」を取り入れてますが、あくまで手段の一つ
• MVCとはアプリケーションの実装パターンの一つで、フォルダのやクラスの名前を指すものではありません
• モデルとは何か
どう使っていけば良いのか
学び方として
• フレームワークの機能を一通り使いましょう
• Illuminateコンポーネントのソースを読みましょう
• Applicationクラスを読んでみましょう
• サービスプロバイダの仕組みが理解できます
• ファサードと実クラスの関連性が理解できます
• Dependency Injectionへの理解
フレームワークは コンポーネントの集まり
アプリケーション 作りのフレームとしての
フレームワーク
こう作りなさい、という 規約のフレームワーク ではありません
PHPの流れとして
• コンポーネント志向
• 疎結合などによる拡張性や、設計
• デザインパターンの応用
• 実装もコンポジット化
• DDDへのアプローチ
フレームワークの使い方さえ知っていればよかった 時代ではないのです
Laravelで利用するには?
• コンテナを使いこなす
• ファサードを使わない選択
• リポジトリパターンから始めてみましょう
• レイヤを意識
コントローラ
モデル
ビュー
通常実装のイメージ
User::find(1)
return view()
コントローラで ファサード・Eloquentを利用すると密結合
コントローラ
データベースアクセス
リポジトリ導入イメージ
リポジトリリポジトリI/F
インターフェースを介することで データベース依存やその他のものから分離
リポジトリは データベース専用の 抽象レイヤではありませんので、 何かを操作するもの、 全てに対して有用です
コントローラ
サービス導入イメージ
それぞれのクラスが独立
サービス
リポジトリI/F
リポジトリI/F
リポジトリI/FArtisan
リポジトリパターンの姿
レイヤ
• ユーザインタフェース層
• アプリケーション層
• ドメイン層
• インフラ層
View
Controller
Model
下層のレイヤは上層を知りません
ファサードの実態を知ることで、 このレイヤを強く意識することができます
フレームワークに のった手法ではなく、 フレームワークを ツールとして
Laravelを使って、 フレームワークにとらわれない MVCのその先へ