symfony 1.2を支えるサブフレームワーク
TRANSCRIPT
![Page 1: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/1.jpg)
symfony 1.2 を支えるサブフレームワーク
1
第 39 回 PHP 勉強会fivestar
![Page 2: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/2.jpg)
あけましておめでとうございます
2
![Page 3: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/3.jpg)
symfony 1.2 ネタということで
3
![Page 4: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/4.jpg)
CakePHP1.2 に対抗してみました
4
![Page 5: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/5.jpg)
自己紹介
• HN: fivestar (ふぁいぶすたー)• 名前 : 小川雄大(おがわかつひろ)• 所属 : アシアル株式会社
http://d.hatena.ne.jp/Fivestar/http://wassr.jp/user/fivestar
5
![Page 6: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/6.jpg)
サブフレームワークって
どんなのがあるの?
6
![Page 7: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/7.jpg)
サブフレームワーク
• Form Framework• Filter Framework• Routing Framework• ORM Framework
7
![Page 8: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/8.jpg)
今日しゃべること
• それぞれのサブフレームワークの紹介と簡単な使い方説明など
8
![Page 9: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/9.jpg)
Form Framework
9
![Page 10: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/10.jpg)
Form Framework
• symfony 1.1 から追加• 入力フォームのレンダリング– sfWidget
• 入力された値のバリデーション– sfValidator
• CSRF 対策
10
![Page 11: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/11.jpg)
symfony 1.0 まで
11
![Page 12: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/12.jpg)
入力フォーム• Form ヘルパー
12
![Page 13: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/13.jpg)
バリデーション• validate.yml• validateXxx / handleErrorXxx
13
![Page 14: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/14.jpg)
symfony 1.2 では
14
![Page 15: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/15.jpg)
Form クラス• sfForm を継承したクラスを作成– sfPropelForm / sfDoctrineForm
15
![Page 16: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/16.jpg)
入力フォーム• Widget をレンダリング
16
![Page 17: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/17.jpg)
さらに短く• echo $form で一括レンダリング–デフォルトでは <tr> で囲われる
17
![Page 18: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/18.jpg)
バリデーション・保存
• Form に bind して validate して save
18
![Page 19: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/19.jpg)
さらに短く• bindAndSave– bind -> validate -> save の流れを一括で
19
![Page 20: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/20.jpg)
Form Framework のメリット• アクションが簡潔に– handleError とはお別れ
• クラスなので拡張が容易• 入力項目とバリデーションが一目でわか
る
20
![Page 21: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/21.jpg)
Filter Framework
21
![Page 22: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/22.jpg)
Filter Framework
• symfony 1.2 から追加• 検索用の sfForm– sfFormFilter extends sfForm–それぞれの ORM にあわせて拡張• sfFormFilterPropel / sfFormFilterDoctrine
22
![Page 23: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/23.jpg)
Form Framework の使い方• 基本的な扱い方は sfForm と同じ– configure / bind / render– widget / validator
• sfFormFilterPropel– buildCriteria(array $values)
• sfFormFilterDoctrine– buildQuery(array $values)
23
![Page 24: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/24.jpg)
sfFormFilterDoctrine の場合
24
![Page 25: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/25.jpg)
Routing Framework
25
![Page 26: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/26.jpg)
Routing Framework
• symfony 1.2 から追加• RESTful なルーティングのサポート
26
![Page 27: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/27.jpg)
27
![Page 28: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/28.jpg)
RESTful なルーティング?• sf_method– GET, POST, PUT, DELETE
• URI (リソース)と 4 つのメソッドを組み合わせてルーティングを行う
28
![Page 29: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/29.jpg)
例 1
• /user + GET => user/index• /user/new + GET => user/new• /user + POST => user/create
29
![Page 30: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/30.jpg)
例 2
• /user/1 + GET => user/show?id=1• /user/1/edit + GET => user/edit?id=1• /user/1 + PUT => user/update?id=1• /user/1 + DELETE => user/delete?id=1
30
![Page 31: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/31.jpg)
sf_method
• <input type=“hidden” name=“sf_method” />–自分で書くことは基本的にはない
• $form->renderFormTag()• link_to(‘delete’, ‘user_delete’, $user,
array(‘method’ => ‘delete’))
31
![Page 32: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/32.jpg)
sfRoute
• sfRoute–従来のルーティングにあたるクラス
• sfRequestRoute– sfRoute + sf_method
32
![Page 33: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/33.jpg)
sfObjectRoute
• sfRequestRoute + オブジェクト–ルーティングからオブジェクトを取得
• sfPropelRoute / sfDoctrineRoute
33
![Page 34: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/34.jpg)
object と list
• object–単一のオブジェクト (edit, show など )– $route->getObject()
• list–オブジェクトのコレクション (index など )– $route->getObjects()
34
![Page 35: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/35.jpg)
sfObjectRouteCollection
• sfObjectRoute を複数まとめたもの–例 1 と例 2 で書いたものがデフォルトで定義
済み
35
![Page 36: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/36.jpg)
ルーティングの定義• apps/xxx/config/routing.yml
36
![Page 37: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/37.jpg)
ルーティングとオブジェクト
url_for(‘user_edit’, $user)// 以下と同一url_for(‘@user_edit?id=’ . $user->getId())url_for(‘user/edit?id=’ . $user->getId())
• object タイプのルーティングのみ有効• @ はつけない
37
![Page 38: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/38.jpg)
ルーティングとアクション• getRoute()– Route オブジェクトを取得– $this->getRoute()->getObject()
• generateUrl()– url_for と同じ– $this->generateUrl(‘user_show’, $user)
• メソッドの判定が不要に
38
![Page 39: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/39.jpg)
定義済みルーティングの確認• symfony app:routes application
39
![Page 40: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/40.jpg)
ORM Framework
40
![Page 41: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/41.jpg)
Propel
41
![Page 42: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/42.jpg)
Propel
• symfony 1.1 からプラグインに• version 1.2 => 1.3• Creole => PDO
42
![Page 43: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/43.jpg)
The Creole Project is Dead
43
![Page 44: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/44.jpg)
Doctrine
44
![Page 45: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/45.jpg)
Doctrine
• symfony 1.2 から公式にバンドル• http://www.doctrine-project.org/–日本語のドキュメントも
• だいぶ安定してきた感じ
I Love Doctrine
45
![Page 46: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/46.jpg)
Doctrine_Query
• 直感的なクエリ操作
46
![Page 47: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/47.jpg)
Configuration
• ProjectConfiguration– sfDoctrinePlugin を有効– enableAllPluginsExcept(array(‘sfPropelPlugin’))
• databases.yml– class を sfDoctrineDatabase に
47
![Page 49: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/49.jpg)
symfony 1.2 を今からはじめる方へ
49
![Page 50: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/50.jpg)
50
![Page 51: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/51.jpg)
素晴らしいチュートリアルが
お待ちしてます
51
![Page 52: symfony 1.2を支えるサブフレームワーク](https://reader035.vdocuments.mx/reader035/viewer/2022081506/5584b0d4d8b42a96768b45fc/html5/thumbnails/52.jpg)
ご清聴ありがとうございました
End