Doctrineではじめるsymfony1.2開発

6,375 views

Published on

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,375
On SlideShare
0
From Embeds
0
Number of Embeds
426
Actions
Shares
0
Downloads
18
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide
  • Doctrineではじめるsymfony1.2開発

    1. 1. Doctrine ではじめる symfony1.2 開発 第 2 回 symfony 勉強会 小川 雄大
    2. 2. 自己紹介 <ul><li>名前: 小川雄大
    3. 3. 所属: アシアル株式会社
    4. 4. PHP暦: 2年弱
    5. 5. H.N.:  fivestar </li><ul><li>http://d.hatena.ne.jp/Fivestar
    6. 6. http://wassr.jp/user/fivestar </li></ul></ul>
    7. 7. アジェンダ <ul><li>Doctrine の特徴
    8. 8. Propel との比較
    9. 9. symfony 1.2 + Doctrine
    10. 10. TIPS+
    11. 11. Doctrine 2.0 </li></ul>
    12. 12. Doctrine の特徴
    13. 13. その前に
    14. 14. Doctrine 使ったこと ありますか?
    15. 15. Doctrine の特徴 <ul><li>DQL </li><ul><li>SQL に近い感覚でクエリをかける
    16. 16. Hibernate の HQL にインスパイア </li></ul><li>PDO </li><ul><li>PHP 5.2.3 以上 </li></ul><li>日本語のドキュメントあり </li><ul><li>http://www.doctrine-project.org/ </li></ul></ul>
    17. 17. DQL <ul><li>D octrine Q uery L anguage </li><ul><li>正確にはDoctrine用のSQL </li></ul><li>DQLを生成するためのインターフェイスが Doctrine_Query オブジェクト
    18. 18. 間違ってもDQNではない
    19. 19. この後Propelと比較しながら説明 </li></ul>
    20. 20. Propel との比較
    21. 21. Propel との比較 <ul><li>Propel 1.3 / Doctrine 1.0
    22. 22. CRUD
    23. 23. 生SQL
    24. 24. クラスの違い </li></ul>
    25. 25. CREATE
    26. 26. CREATE
    27. 27. RETRIEVE
    28. 28. WHERE id = 1
    29. 29. WHERE id = 1 AND title LIKE '%symfony%'
    30. 30. WHERE id = 1 OR title LIKE '%symfony%'
    31. 31. WHERE id IN (1, 2, 3) <ul><li>NOT INの場合は Criteria::NOT_IN / whereNotIn() </li></ul>
    32. 32. LEFT JOIN <ul><li>INNER JOINの場合は Criteria::INNER_JOIN / innerJoin() </li></ul>
    33. 33. ORDER BY price DESC LIMIT 5 OFFSET 10
    34. 34. UPDATE
    35. 35. UPDATE <ul><li>基本的にCREATEと同じ
    36. 36. 複数のレコードを一度に更新したい場合 </li><ul><li>Propel: BasePeer::doUpdate </li><ul><li>割愛 </li></ul><li>Doctrine </li><ul><li>プレースホルダを使用したい場合は set(array($key, $value)) のように配列で指定 </li></ul></ul></ul>
    37. 37. DELETE
    38. 38. DELETE
    39. 39. 生 S QL
    40. 40. 生 SQL <ul><li>あとはPDOStatementを好きなように </li><ul><li>PropelだとArticlePeer::populateObjects($stmt) </li></ul></ul>
    41. 41. クラスの違い
    42. 42. BaseObject / Doctrine_Record <ul><li>Propel </li><ul><li>BaseObject
    43. 43. モデル生成時にメソッドを作成し、 静的 に呼び出し
    44. 44. $article->getTitle(); </li></ul><li>Doctrine </li><ul><li>Doctrine_Record
    45. 45. メソッドは__callで 動的 に呼び出し
    46. 46. $article->getTitle() / get('title') / title / $article['title'] </li><ul><li>getTitleが実装されていれば呼び出し / それ以外はget('title')に </li></ul></ul></ul>
    47. 47. BasePeer / Doctrine_Table <ul><li>Propel </li><ul><li>BasePeer
    48. 48. クラスメソッド
    49. 49. ArticlePeer::doSelect(new Criteria()) </li></ul><li>Doctrine </li><ul><li>Doctrine_Table
    50. 50. インスタンスメソッド
    51. 51. Doctrine::getTable('Article')->findAll()
    52. 52. findOneByIdなど動的に実行 </li></ul></ul>
    53. 53. Doctrine_Collection <ul><li>Propel </li><ul><li>is_array ($articles) </li><ul><li>$articles[0] </li></ul></ul><li>Doctrine </li><ul><li>$articles instanceof Doctrine_Collection </li><ul><li>ArrayIteratorを実装したクラス
    54. 54. $articles->getFirst() / ->get(0) / $articles[0]
    55. 55. $articles->count() </li></ul></ul></ul>
    56. 56. symfony 1.2 + Doctrine
    57. 57. symfony 1.2 には はじめから Doctrine が 入ってます
    58. 58. databases.yml <ul><li>classを sfDoctrineDatabase に
    59. 59. doctrine.ini </li><ul><li>ありません </li></ul></ul>
    60. 60. ProjectConfiguration <ul><li>sfDoctrinePluginを読み込むよう設定
    61. 61. 必要に応じてconfigureDoctrineで設定変更 </li></ul>
    62. 62. 後はコマンドラインで <ul><li>symfonyコマンドにdoctrineがでてくるはず
    63. 63. config/doctrine/schema.ymlを作成
    64. 64. 後はモデルやフォームを作成 </li><ul><li>$ symfony doctrine:build-all </li><ul><li>lib/model/doctrine
    65. 65. lib/form/doctrine </li></ul></ul><li>まずはCRUDをみてみるといいかも </li><ul><li>$ symfony doctrine:generate-module </li></ul></ul>
    66. 66. TIPS+
    67. 67. オブジェクトのダンプ <ul><li>Record / Collection共にかなりのデータ量
    68. 68. var_dump($article) とかマジ危険
    69. 69. 配列にしてしまえばOK </li><ul><li>$record-> toArray ()
    70. 70. $collection-> toArray () </li></ul><li>ダンプ用のメソッドも </li><ul><li>Doctrine_Lib::getRecordAsString($record)
    71. 71. Doctrine_Lib::getCollectionAsString($collection) </li></ul></ul>
    72. 72. 配列から取り込み <ul><li>$record-> fromArray ($values)
    73. 73. $values = array(フィールド名 => 値, …)
    74. 74. 新規作成と同時に行いたい場合 </li><ul><li>Doctrine::getTable('Article')->create($values) </li></ul><li>IDなども上書きされるので注意 </li></ul>
    75. 75. フックメソッド <ul><li>一覧 </li><ul><li>pre/postSave </li><ul><li>pre/postInsert
    76. 76. pre/postUpdate </li></ul><li>pre/postDelete
    77. 77. pre/postDqlSelect
    78. 78. pre/postDqlDelete
    79. 79. pre/postDqlUpdate </li></ul><li>Tableクラスに記述 </li></ul>
    80. 80. テンプレート <ul><li>Propelのbehavior
    81. 81. デフォルトでいくつか用意されている </li><ul><li>Timestampable </li><ul><li>created_at / updated_atの自動更新 </li></ul><li>SoftDelete </li><ul><li>論理削除 </li></ul></ul><li>アシアルブログを参照 </li><ul><li>http://blog.asial.co.jp/475
    82. 82. http://blog.asial.co.jp/408 </li></ul></ul>
    83. 83. Doctrine 2.0
    84. 84. Doctrine 2.0 <ul><li>構造や実装が一新
    85. 85. DBAL層とORM層を明確に分離
    86. 86. いくつかの主要クラス名が大幅に変更 </li><ul><li>Doctrine_Record => Entity
    87. 87. Doctrine_Table => Repository, Manager </li></ul><li>namespaceの採用 </li></ul>
    88. 88. Doctrine 2.0 <ul><li>左が1.1のbranch
    89. 89. 右がtrunk(2.0) </li></ul>
    90. 90. Doctrine 2.0 <ul><li>リリースはまだまだ先の話 </li><ul><li>Trac上では2009年9月1日予定 </li></ul><li>詳しくは本家Wikiを参照 </li><ul><li>http://trac.doctrine-project.org/wiki/Doctrine2.0 </li></ul></ul>
    91. 91. ぜひ皆さんも Doctrine 使ってみましょう。
    92. 92. ご静聴ありがとうございました 小川雄大 (a.k.a fivestar)

    ×