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

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

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

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

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