Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Symfony2による実践的アプリケーション開発

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 Symfony2による実践的アプリケーション開発

2012年4月7日 関西PHPユーザーズグループ PHP勉強会

Avatar for hidenorigoto

hidenorigoto

April 07, 2012
Tweet

More Decks by hidenorigoto

Other Decks in Programming

Transcript

  1. 自己紹介 • 後藤 秀宣(ごとう ひでのり) • @hidenorigoto • インクス株式会社/PHPメンターズ (KnpLabs

    Japanメンバー) • PHPは10年くらい利用 • 日本Symfonyユーザー会 • symfony 1.4の本 2
  2. アジェンダ • 実践編の流れ • 構築するアプリの説明 • Symfony2基礎知識 • 構築 •

    Symfony2インストールと設定の概略、ファイルとディレクトリ、バンドル、ジェネレーター(エン ティティクラスとリポジトリクラス)、エンティティ調整と初期データの投入、ページフローの実 装(ルーティングとコントローラ、テンプレート)、フォームの基本、TwigとSymfonyバインディ ング、フォームとバリデーション、CSRFトークン、フォームの詳細、Doctrine2 ORM基礎、バリ デーション定義、TwitterBootstrapの組み込み、ファンクショナル(受入)テスト、ユニットテス ト 3
  3. データベース 8 mysql> show tables; +-------------------------+ | Tables_in_questionnaire | +-------------------------+

    | answer | | answer_detail | | questionnaire_item | +-------------------------+ 3 rows in set (0.01 sec)
  4. answerテーブル 9 CREATE TABLE `answer` ( `id` int(11) NOT NULL

    AUTO_INCREMENT, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
  5. answer_detailテーブル 10 CREATE TABLE `answer_detail` ( `id` int(11) NOT NULL

    AUTO_INCREMENT, `answer_id` int(11) DEFAULT NULL, `questionnaire_item_id` int(11) DEFAULT NULL, `input` longtext, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `questionnaire_item_answer_idx` (`answer_id`,`questionnaire_item_id`), KEY `IDX_DCFF4534AA334807` (`answer_id`), KEY `IDX_DCFF45344DF37C59` (`questionnaire_item_id`), CONSTRAINT `FK_DCFF45344DF37C59` FOREIGN KEY (`questionnaire_item_id`) REFERENCES `questionnaire_item` (`id`), CONSTRAINT `FK_DCFF4534AA334807` FOREIGN KEY (`answer_id`) REFERENCES `answer` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
  6. questionnaire_itemテーブル 11 CREATE TABLE `questionnaire_item` ( `id` int(11) NOT NULL

    AUTO_INCREMENT, `text` longtext NOT NULL, `answer_type` varchar(255) NOT NULL, `optionality` varchar(255) NOT NULL, `item_number` int(11) NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `questionnaireitem_itemnumber_idx` (`item_number`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
  7. ページフローに必要なもの • ルーティング/ルート • コントローラから • テンプレートレンダリング • リダイレクト •

    コントローラ、テンプレートでルートに 基づくリンク • CSRFチェック用フォーム 32
  8. 実装するフロー 34 入力画面 確認画面 完了画面 準備 / GET inputAction /input

    inputPostAction POST confirmationAction confirmationPostAction /confirmation POST GET successAction /success GET ポストバック方式
  9. ルート一覧 35 URL HTTP メソッド コントローラ ルート名 /input GET inputAction

    kphpug_questionnaire_answer_input /input POST inputPostAction kphpug_questionnaire_answer_inputpost /confirmation GET confirmationAction kphpug_questionnaire_answer_confirmation /confirmation POST confirmationPostAction kphpug_questionnaire_answer_confirmationpos t /success GET successAction kphpug_questionnaire_answer_success / GET indexAction kphpug_questionnaire_answer_index php app/console router:debug
  10. Twigテンプレート 43 <html> <body> {% block body %} {% endblock

    %} </body> </body> {% extends “layout.html.twig ”%} {% block body %} <h1>見出し</h1> <p>コンテンツです。 </p> {% endblock %} 親 子 子は何階層でも 作れる
  11. テンプレート継承を使う例 44 ああああああああああああ ああああああああああああ ああああああああああああ ああああああああああああ あああ いいいいいいいいいいいい いいいいいいいいいいいい いいいいいいいいいいいい

    いいいいいいいいいいいい いいい うううううううううううう ううう うううううううううううう う ええええええええええ ええええええええええ layout.html.twig single.html.twig 2col.html.twig
  12. Doctrine2 • http://www.doctrine- project.org/ • データマッパー型ORM (Metadata Mapping) • PofEAA

    • Domain Model • Data Mapper • Metadata Mapping • Unit of Work • Repository • マッピング定義はYAML、XML、ア ノテーションどれでも同等 47
  13. FormType 56 Person ・name ・address ・bloodType ・company エンティティ フォーム PersonType

    ・text ・text ・choice ・CompanyType CompanyType ・text ・text ・: Company ・name ・address ・:
  14. More DDD Way • エンティティはリポジトリに保存する • リポジトリクラスにaddメソッドを実装 • addメソッド内でpersistするようにす る

    • 保存するオブジェクトの準備やエンティ ティマネージャのflushはサービスに実装 する 60