日本Symfonyユーザ会によるSymfony2 ワークショップ

2,939 views

Published on

06/30/2012 日本 Symfony ユーザ会のワークショップです。実際は半分くらいしか使われていないですが。。。

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

  • Be the first to like this

No Downloads
Views
Total views
2,939
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

日本Symfonyユーザ会によるSymfony2 ワークショップ

  1. 1. Symfony ワークショップ パート1 Symfony2 でブログを作ろう symblog チュートリアル 6/30/2012 https://connect.sensiolabs.com/profile/ganchiku1 @ganchiku Shin Ohno12年6月30日土曜日
  2. 2. ワークショップ1 13:00 - 14:30 @ganchiku Shin Ohno212年6月30日土曜日
  3. 3. 自己紹介 • 名前:大野 晋(Shin Ohno) • ID: ganchiku (Twitter, githubなど) • 所属:日本Symfonyユーザ会 • Symfony歴:0.6 くらいの頃から。 • symfony1.x アプリ 6つくらい • Symfony2 アプリ 2つくらい @ganchiku Shin Ohno312年6月30日土曜日
  4. 4. • 最近は SwiftMailer の日本語対応をやってました。 ようやくSwiftMailer でiso-2022-jp エン コードしたメールが送ることができそうです @ganchiku Shin Ohno412年6月30日土曜日
  5. 5. Symfony ユーザ会 • スタッフの方!手を挙げてください! • 途中でわからなくなったりしたら、その場で 手を上げるなどしてスタッフの方を呼ぶな りしてください。 @ganchiku Shin Ohno512年6月30日土曜日
  6. 6. 本日の内容 • ワークショップ1 • Symfony2 でブログを作ろう • ワークショップ2 • ユニットテストと機能テスト @ganchiku Shin Ohno612年6月30日土曜日
  7. 7. http://tutorial.symblog.co.uk/ http://symblog.co.uk/ http://symblog.ganchiku.com/ @ganchiku Shin Ohno712年6月30日土曜日
  8. 8. Symblog�とは • symfony 0.6 - 1.0 のチュートリアル • Askeet(公式) • symfony1.2 - 1.4 のチュートリアル • Jobeet(公式) • Symfony2 のチュートリアル • symblog(非公式) @ganchiku Shin Ohno812年6月30日土曜日
  9. 9. 非公式ながら。。。 • 英語、スペイン語、フランス語、日本語版 • しかし、まだ全部揃っていない。。。が、 • これで、だいぶ学ぶことはできる! • 注意点 • Symfony2.0用 • composer を使用していない(2.1 からデフォルト?) • ところどころ yaml での指定がある(このワークショップでは基 本 アノテーションで行う) • 大まかなところは、 Symfony2.1 と同じなので、十分使える。 @ganchiku Shin Ohno912年6月30日土曜日
  10. 10. symblog のチュートリアル • Symfony2 のコンフィギュレーションとテンプレート • ページの作成: バリデータ、フォーム、メール送信 • ブログモデル: Doctrine 2 の使用とデータフィクスチャ • コメントモデル: コメントの追加、 Doctrine リポジトリとマ イグレーション • ビューのカスタマイズ: Twig エクステンション、サイド バーと Assetic • テスト: PHPUnit を使用したユニットテストと機能テスト @ganchiku Shin Ohno1012年6月30日土曜日
  11. 11. 今日予定しているところ • Symfony2 のコンフィギュレーションとテンプレート • ページの作成: バリデータ、フォーム、メール送信 • ブログモデル: Doctrine 2 の使用とデータフィクスチャ • コメントモデル: コメントの追加、 Doctrine リポジトリとマ イグレーション • ビューのカスタマイズ: Twig エクステンション、サイド バーと Assetic • テスト: PHPUnit を使用したユニットテストと機能テスト @ganchiku Shin Ohno1112年6月30日土曜日
  12. 12. Symfony2 の コンフィギュレーションとテンプレート • Symfony2 アプリケーションのセットアップ • 開発ドメインの設定 • Symfony2 のバンドル • ルーティング • コントローラ • Twig を使用したテンプレート @ganchiku Shin Ohno1212年6月30日土曜日
  13. 13. Symfony2 アプリケーションのセットアップ • 既に動く環境があることを前提にしていい ですか? @ganchiku Shin Ohno1312年6月30日土曜日
  14. 14. まだの人 • http://symfony.gr.jp/blog/ 20120624-symfony-standard を参照し てインストール(2.1-Beta) • でも、時間がかかるので。あと2.1-Beta なので。。。 • http://symfony.com/download からダ ウンロードして動作を確認する @ganchiku Shin Ohno1412年6月30日土曜日
  15. 15. 動作確認 • スクリプトの動作確認 • app/config.php, web/config.php の動作を確認 • 注意点 • app/logs, app/cache の書き込み権限の確認 • DB も使うので、 MySQL を適当に配置。 • MySQL がないと一部ワークショップの内容ができま せん @ganchiku Shin Ohno1512年6月30日土曜日
  16. 16. 開発ドメインの設定 • Symfony2 の話というより、Apache など のウェブサービスで開発しやすいように設 定 • しなくても、localhost で動けば、とりあえ ずはよし。VirtualHost で指定したけれ ば、それ用に設定。 @ganchiku Shin Ohno1612年6月30日土曜日
  17. 17. 確認 • 現時点で動いていますか? • 動いていない人は、周りのスタッフに聞く か、隣の人に聞いてみてください。 • ちょっと待ちます。 @ganchiku Shin Ohno1712年6月30日土曜日
  18. 18. Symfony2 のバンドル • バンドルとは? • バンドルは、全ての Symfony2 アプリケーションの 基本的な構成要素 • ぶっちゃけるとプラグインのようなちょっと違うよう な。必要な物(コントローラ、モデル、テンプレート、 アセットなど)をカプセル化したもの • フルスタックフレームワークである Symfony2 も 複数のバンドルによって構成されている。 @ganchiku Shin Ohno1812年6月30日土曜日
  19. 19. 余談 • FrameworkBundle - Symfony のコアフレームワークバンドル • SensioFrameworkExtraBundle - テンプレートとルーティングにアノテーション機能を追加するなどいくつ かの便利な機能を追加 • DoctrineBundle - Doctrine ORM のサポートを追加 • TwigBundle - Twig テンプレートエンジンのサポートを追加 • SecurityBundle - Symfony のセキュリティコンポーネントの統合によるセキュリティ機能を追加 • SwiftmailerBundle - メール送信を行う Swiftmailer のサポートを追加 • MonologBundle - ロギングライブラリである Monolog のサポートを追加 • AsseticBundle - アセット処理のライブラリである Assetic のサポートを追加 • JMSSecurityExtraBundle - アノテーションを介したセキュリティの追加を有効化 • JMSDiExtraBundle - より強力なディペンデンシーインジェクション機能の追加 • WebProfilerBundle (in dev/test env) - プリファイリングの機能とウェブデバッグツールバーを追加 • SensioDistributionBundle (in dev/test env) - Symfony のディストリビューションでの設定と動作の機 能を追加 http://www.symfony.gr.jp/blog/20120624-symfony-standard @ganchiku Shin Ohno1912年6月30日土曜日
  20. 20. バンドルの作成 $ php app/console generate:bundle --namespace=Blogger/BlogBundle • ウェブサイトには、 --format-yml があるが、今回は無しで。デフォル トはアノテーションになる。 • フォーマットでは、 xml, yml, アノテーションが指定できるが、オスス メはアノテーション(個人的には。また、おそらくほとんどの人は。) @ganchiku Shin Ohno2012年6月30日土曜日
  21. 21. generate:bundle • src/ 以下にバンドルのスケルトンを配置 • app/AppKernel.php に バンドルを登録 • app/config/routing.yml にコントローラ のルーティング設定を登録 @ganchiku Shin Ohno2112年6月30日土曜日
  22. 22. --format=yml だと。。。 <?php // src/Blogger/BlogBundle/Controller/DefaultController.php namespace BloggerBlogBundleController; use SymfonyBundleFrameworkBundleControllerController; class DefaultController extends Controller { public function indexAction($name) { return $this->render(BloggerBlogBundle:Default:index.html.twig, array(name => $name)); } # /src/Blogger/BlogBundle/Resources/config/routing.yml BloggerBlogBundle_homepage: pattern: /hello/{name} defaults: { _controller: BloggerBlogBundle:Default:index } @ganchiku Shin Ohno2212年6月30日土曜日
  23. 23. アノテーション(デフォルト) だと。。。 <?php // src/Blogger/BlogBundle/Controller/DefaultController.php namespace BloggerBlogBundleController; use SymfonyBundleFrameworkBundleControllerController; use SensioBundleFrameworkExtraBundleConfigurationRoute; use SensioBundleFrameworkExtraBundleConfigurationTemplate; class DefaultController extends Controller { /** * @Route(“/hello/{name}”) * @Template() */ public function indexAction($name) { return array(name => $name); } @ganchiku Shin Ohno2312年6月30日土曜日
  24. 24. �整理 • デフォルトで作ってくれるバンドルとテンプレートを削 除してしまいます。 • src/Blogger/BlogBundle/Controller/ DefaultController.php • src/Blogger/BlogBundle/Resources/views/ Default/ • src/Blogger/BlogBundle/Resources/config/ routing.yml のエントリ @ganchiku Shin Ohno2412年6月30日土曜日
  25. 25. テンプレートエンジン Twig • 3レベル継承 • app/Resources/views/ base.html.twig • src/Blogger/BlogBundle/Resources/ views/layout.html.twig • src/Blogger/BlogBundle/Resources/ views/Page/index.html.twig @ganchiku Shin Ohno2512年6月30日土曜日
  26. 26. <!-- app/Resources/views/base.html.twig --> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html"; charset=utf-8" /> <title>{% block title %}symblog{% endblock %} - symblog</title> <!--[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> {% block stylesheets %} <link href=http://fonts.googleapis.com/css?family=Irish+Grover rel=stylesheet type=text/css> <link href=http://fonts.googleapis.com/css?family=La+Belle+Aurore rel=stylesheet type=text/css> <link href="{{ asset(css/screen.css) }}" type="text/css" rel="stylesheet" /> {% endblock %} <link rel="shortcut icon" href="{{ asset(favicon.ico) }}" /> </head> <body> <section id="wrapper"> base.html.twig <header id="header"> <div class="top"> {% block navigation %} <nav> <ul class="navigation"> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li><a href="#">Contact</a></li> </ul> </nav> {% endblock %} </div> <hgroup> <h2>{% block blog_title %}<a href="#">symblog</a>{% endblock %}</h2> <h3>{% block blog_tagline %}<a href="#">creating a blog in Symfony2</a>{% endblock %}</h3> </hgroup> </header> <section class="main-col"> {% block body %}{% endblock %} </section> <aside class="sidebar"> {% block sidebar %}{% endblock %} </aside> <div id="footer"> {% block footer %} Symfony2 blog tutorial - created by <a href="https://github.com/dsyph3r">dsyph3r</a> {% endblock %} </div> </section> {% block javascripts %}{% endblock %} @ganchiku Shin Ohno </body> </html>2612年6月30日土曜日
  27. 27. base.html.twig 継承 {# src/Blogger/BlogBundle/Resources/views/layout.html.twig #} {% extends ::base.html.twig %} {% block sidebar %} Sidebar content {% endblock %} layout.html.twig 継承 {# src/Blogger/BlogBundle/Resources/views/Page/index.html.twig #} {% extends BloggerBlogBundle::layout.html.twig %} {% block body %} Blog homepage {% endblock %} index.html.twig @ganchiku Shin Ohno2712年6月30日土曜日
  28. 28. twig のタグについて • {% %} {% extends ::base.html.twig %} • 何かをさせるタグ {% block title %}タイトルタグは子供テンプレートが決めて{% endblock %} • {{ }} {{ blog.created|date("d-m-Y") }} • 何かを表示させるタグ • {# #} {# ここはコメントだよ! #} • コメントタグ @ganchiku Shin Ohno2812年6月30日土曜日
  29. 29. ページテンプレート作成 <?php // src/Blogger/BlogBundle/Controller/PageController.php namespace BloggerBlogBundleController; use SymfonyBundleFrameworkBundleControllerController; use SensioBundleFrameworkExtraBundleConfigurationRoute; use SensioBundleFrameworkExtraBundleConfigurationTemplate; use SensioBundleFrameworkExtraBundleConfigurationMethod; class PageController extends Controller { /** * @Route("/") * @Method("GET") * @Template() */ public function indexAction() { return array(); } } @ganchiku Shin Ohno2912年6月30日土曜日
  30. 30. とりあえず動かすため、 CSS はコピペ�>< /web/css/screen.css @ganchiku Shin Ohno3012年6月30日土曜日
  31. 31. 確認 • トップページは見えました? • 見えてない方は近くのスタッフ、または隣 の人に聞いてください。 @ganchiku Shin Ohno3112年6月30日土曜日
  32. 32. ページ作成 • about ページを作ってみよう。 • ルーティング、コントローラ、テンプレート を用意 @ganchiku Shin Ohno3212年6月30日土曜日
  33. 33. 質問タイム • ここまでで何か質問がありますか? @ganchiku Shin Ohno3312年6月30日土曜日
  34. 34. ページの作成: バリデータ、 フォーム、メール送信 • バリデータ • フォーム • バンドルのコンフィギュレーションの値の設定 問い合わせフォームを作成し、そのバリデーションを 行い、メールを送信する! @ganchiku Shin Ohno3412年6月30日土曜日
  35. 35. 実装 ルーティングの設定 アノテーションを使え ↓ ば、1ファイルで コントローラの作成 ↓ ビューの作成 @ganchiku Shin Ohno3512年6月30日土曜日
  36. 36. 問い合わせページ作成 use SensioBundleFrameworkExtraBundleConfigurationMethod; // snip... /** * @Route("/contact”) * @Method("GET|POST") * @Template() */ public function contactAction() { } return $this->render(); テンプレート コントローラー {# src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig #} {% extends BloggerBlogBundle::layout.html.twig %} {% block title %}Contact{% endblock%} {% block body %} <header> <h1>Contact symblog</h1> </header> <p>Want to contact symblog?</p> {% endblock %} @ganchiku Shin Ohno3612年6月30日土曜日
  37. 37. エンティティ作成 • データベースで使用するテーブルとフィール ドでよく使われるけど、そうでないといけない わけではない! • 問い合わせフォームはデータベースと連携し ていないが、そのまま使える。 • 時間があれば、データベースとの連携とのこ ろも説明します。。。 @ganchiku Shin Ohno3712年6月30日土曜日
  38. 38. <?php // src/Blogger/BlogBundle/Entity/Enquiry.php namespace BloggerBlogBundleEntity; class Enquiry { protected $name; protected $email; protected $subject; protected $body; public function getName() { return $this->name; } public function setName($name) { } $this->name = $name; public function getEmail() エンティティは { とりあえずコピペで return $this->email; } public function setEmail($email) { $this->email = $email; } public function getSubject() { return $this->subject; src/Blogger/BlogBundle/ } public function setSubject($subject) { $this->subject = $subject; } public function getBody() Entity/Enquiry.php { return $this->body; } public function setBody($body) { $this->body = $body; } } @ganchiku Shin Ohno12年6月30日土曜日
  39. 39. フォームの作成 • symfony1.x 系との大きな違いの1つ • フォームフレームワークが使いやすくなっ た!らしい。。。 @ganchiku Shin Ohno3912年6月30日土曜日
  40. 40. <?php // src/Blogger/BlogBundle/Form/EnquiryType.php namespace BloggerBlogBundleForm; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilder; class EnquiryType extends AbstractType { フォームタイプも public function buildForm(FormBuilder $builder, array $options) コピペで { $builder->add(name); $builder->add(email, email); $builder->add(subject); $builder->add(body, textarea); } public function getName() { return contact; } } *buildForm のパラメータは、2.1でイ src/Blogger/BlogBundle/ ンタフェースが変わりました。 FormBuilder型ではなく、 Type/EnquiryType.php FormBuilderInterface型に。 @ganchiku Shin Ohno4012年6月30日土曜日
  41. 41. コントローラの実装 use BloggerBlogBundleEntityEnquiry; use BloggerBlogBundleFormEnquiryType; // snip Enquiry と // src/Blogger/BlogBundle/Controller/PageController.php /** * @Route("/contact”) EnquiryType * @Method("GET") * @Template() */ を use public function contactAction() { $enquiry = new Enquiry(); $form = $this->createForm(new EnquiryType(), $enquiry); $request = $this->getRequest(); if ($request->getMethod() == POST) { $form->bindRequest($request); POST リクエス if ($form->isValid()) { // Perform some action, such as sending an email // Redirect - This is important to prevent users re-posting トの際にはパラ // the form if they refresh the page } return $this->redirect($this->generateUrl(blogger_blog_page_contact)); メータをフォーム } return $this->render(array( form => $form->createView() にバインド ); } @ganchiku Shin Ohno4112年6月30日土曜日
  42. 42. ルーティング名のおさらい • ルーティング名前は指定することが可能 • デフォルトでは、{{バンドル名}}_{{コントローラ名}}_{{アクション名}} となっ ている。 • blogger_blog_page_index • blogger_blog_page_about • blogger_blog_page_contact • アノテーションの @Route に ルーティング名を指定 * @Route("/", name= homepage ) * @Route("/about", name= about ) * @Route("/contact", name= contact ) @ganchiku Shin Ohno4212年6月30日土曜日
  43. 43. ビューの作成 • action の先を {{ path(‘contact’) }} に 変更して、後はコピペで。 @ganchiku Shin Ohno4312年6月30日土曜日
  44. 44. {{ form_widget(form)}} form_rest 忘れない! {{ form_errors(form) }} {{ form_row(form.name) }} {{ form_row(form.email) }} {{ form_row(form.subject) }} {{ form_row(form.body) }} {{ form_rest(form) }} @ganchiku Shin Ohno4412年6月30日土曜日
  45. 45. フォームの装飾 • フォーム用の CSS コピペ • src/Blogger/BlogBundle/ Resource/public/css/blog.css • 合わせて layout.html.twig も修正 • symlink を web/bundles 以下に貼る @ganchiku Shin Ohno4512年6月30日土曜日
  46. 46. 確認 • フォームがちゃんと表示されましたか? @ganchiku Shin Ohno4612年6月30日土曜日
  47. 47. 受け付ける�HTTPメソッド • GET のみの指定になっていたが、�POST も受け付けるように変更する。 * @Method("GET") * @Method("GET¦POST") @ganchiku Shin Ohno4712年6月30日土曜日
  48. 48. バリデーション <?php // src/Blogger/BlogBundle/Entity/Enquiry.php namespace BloggerBlogBundleEntity; use SymfonyComponentValidatorConstraints as Assert; class Enquiry { /** * @AssertNotBlank */ protected $name; /** * @AssertEmail */ protected $email; /** * @AssertNotBlank * @AssertMaxLength(50) */ protected $subject; /** * @AssertNotBlank * @AssertMinLength(50) */ protected $body; } @ganchiku Shin Ohno4812年6月30日土曜日
  49. 49. アノテーションがないとき <?php // src/Blogger/BlogBundle/Entity/Enquiry.php namespace BloggerBlogBundleEntity; use SymfonyComponentValidatorMappingClassMetadata; use SymfonyComponentValidatorConstraintsNotBlank; use SymfonyComponentValidatorConstraintsEmail; use SymfonyComponentValidatorConstraintsMinLength; use SymfonyComponentValidatorConstraintsMaxLength; class Enquiry { // .. public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint(name, new NotBlank()); $metadata->addPropertyConstraint(email, new Email()); $metadata->addPropertyConstraint(subject, new NotBlank()); $metadata->addPropertyConstraint(subject, new MaxLength(50)); $metadata->addPropertyConstraint(body, new MinLength(50)); } // .. } @ganchiku Shin Ohno4912年6月30日土曜日
  50. 50. アノテーションがあるとき <?php // src/Blogger/BlogBundle/Entity/Enquiry.php namespace BloggerBlogBundleEntity; use SymfonyComponentValidatorConstraints as Assert; class Enquiry { /** * @AssertNotBlank */ protected $name; /** * @AssertEmail */ protected $email; /** * @AssertNotBlank * @AssertMaxLength(50) */ protected $subject; /** * @AssertNotBlank * @AssertMinLength(50) */ protected $body; } @ganchiku Shin Ohno5012年6月30日土曜日
  51. 51. メール送信 • gmail を通してメールを送信してみる。 • symfony.japan.test@gmail.com • password: xxxxxxxx(当日に伝えます) @ganchiku Shin Ohno5112年6月30日土曜日
  52. 52. parameters.ini 昔はini がデフォルトだったのですが。 今時点では yml がデフォルトに parameters: database_driver: pdo_mysql database_host: localhost database_port: database_name: symblog database_user: root database_password: null locale: ja mailer_transport: gmail mailer_encryption: ssl mailer_auth_mode: login mailer_host: smtp.gmail.com mailer_user: mailer_password: secret: 7833e4257a91d6249d9d5bd9705a3af8d66cd526 @ganchiku Shin Ohno5212年6月30日土曜日
  53. 53. コントローラの修正 public function contactAction() { // .. if ($form->isValid()) { $message = Swift_Message::newInstance() ->setSubject(Contact enquiry from symblog) ->setFrom(symfony.japan.test@gmail.com) ->setTo(YOUR_MAIL_ADDRESS@example.com) ->setBody($this->renderView(BloggerBlogBundle:Page:contactEmail.txt.twig, array(enquiry => $enquiry))); $this->get(mailer)->send($message); $this->get(session)->setFlash(blogger-notice, Your contact enquiry was successfully sent. Thank you!); // Redirect - This is important to prevent users re-posting // the form if they refresh the page return $this->redirect($this->generateUrl(blogger_blog_page_contact)); } // .. } SwiftMailer を使用 @ganchiku Shin Ohno5312年6月30日土曜日
  54. 54. SwiftMailer • Fabien がリードディベロッパーのメール送信ライブラリ • 日本語の取り扱いがもう少しでできるはず。。。6/28 時点でできるようになったはず!まだ試してない が。。。 • ただ、デフォルトで送ると Quoted Printable で utf-8 なメールが送信される。初期設定を上書きす ることができるので、これを Base64Encoding で iso-2022-jp なメールヘッダに変更することが可 能。 @ganchiku Shin Ohno5412年6月30日土曜日
  55. 55. フラッシュメッセージ • 成功メッセージ、失敗メッセージなど $this->get(session)->setFlash(blogger-notice, Your contact enquiry was successfully sent. Thank you!); {% if app.session.hasFlash(blogger-notice) %} <div class="blogger-notice"> {{ app.session.flash(blogger-notice) }} </div> {% endif %} @ganchiku Shin Ohno5512年6月30日土曜日
  56. 56. 独自の定義の使い方 • src/Blogger/BlogBundle/Resources/ config/config.yml などを作成して、定 義を書く。 • app/config/config.yml�でインポートを するように指定する。 @ganchiku Shin Ohno5612年6月30日土曜日
  57. 57. 質問タイム • 質問や詰まったところ、わからなかったとこ ろ。 • もしくは、スタッフからのツッコミ @ganchiku Shin Ohno5712年6月30日土曜日
  58. 58. 時間があればサクッと説明 します • ブログモデル: Doctrine 2 の使用とデー タフィクスチャ • コメントモデル: コメントの追加、 Doctrine リポジトリとマイグレーション • ビューのカスタマイズ: Twig エクステン ション、サイドバーと Assetic @ganchiku Shin Ohno5812年6月30日土曜日
  59. 59. ブログモデル: Doctrine 2 の使用とデータフィクスチャ • ブログエンティティの作成 • CRUD で使うメソッドなど • DataFixture の使用 • LifeCycleCallback @ganchiku Shin Ohno5912年6月30日土曜日
  60. 60. 個人的に思うこと • チュートリアルでは、そのまま書いていって いるが、コマンドを使うと楽。アノテーション でフィールド定義を作ってくれる $ php app/console doctrine:generate:entity -- entity="BloggerBlogBundle:Blog" --fields="title:string author:string(64) blog:text image:string(20) tags:text created:datetime updated:datetime" $ php app/console doctrine:schema:update --dump-sql $ php app/console doctrine:schema:update --force @ganchiku Shin Ohno6012年6月30日土曜日
  61. 61. 個人的に思うこと • ルーティングを�yml でやっているが、ここ もアノテーションで統一した方がわかりや すいと思う。使用するテンプレートの名前を 省略することも可能なので。 • 少し触れているが、タイムスタンプなどは、 StofDoctrineExtensionsBundle�を使う とアノテーションでよろしくやってくれる。 @ganchiku Shin Ohno6112年6月30日土曜日
  62. 62. コメントモデル: コメントの追加、 Doctrine リポジトリとマイ グレーション • Doctrine2 のリポジトリクラス • コメントエンティティの作成 • ManyToOneリレーションの指定 • Doctrine2 マイグレーション • 複数のエンティティのフィクスチャの使用 @ganchiku Shin Ohno6212年6月30日土曜日
  63. 63. 個人的に思うこと • 最初はデータベーステーブルの構造も変わる可 能性があるからマイグレーションはいいかな。あ る程度できてからは、マイグレーションの方が良 さそう。でも、便利。 • フィクスチャの読み込む順番を指定できるのは 便利 • フィクスチャの別のエンティティへの参照も便利 @ganchiku Shin Ohno6312年6月30日土曜日
  64. 64. ビューのカスタマイズ: Twig エクステンション、サイドバーと Assetic • 遅延ローディングと JOIN • Twig render メソッド • Twig エクステンション • Assetic @ganchiku Shin Ohno6412年6月30日土曜日
  65. 65. 個人的に思うこと • Twig エクステンションは、ほとんどの場合 書くことになる。 mb_strimwidth など、 そのまま渡す場合なども • Assetic フィルター便利。LESS のコンパ イルとかもサクッとできる @ganchiku Shin Ohno6512年6月30日土曜日
  66. 66. ワークショップ2 14:40 - 16:10 @ganchiku Shin Ohno6612年6月30日土曜日
  67. 67. Symfony ワークショップ パート2 Symfony2 でブログを作ろう symblog チュートリアル 6/30/2012 https://connect.sensiolabs.com/profile/ganchiku67 @ganchiku Shin Ohno12年6月30日土曜日
  68. 68. テスト: PHPUnit を使用した ユニットテストと機能テスト • symblog-part5-done.tgz で行います。 symblog のパート5まで終えた分になりま す。 @ganchiku Shin Ohno6812年6月30日土曜日
  69. 69. ユニットテスト • コードの単位を独立させて使用した際に正 しく動くか検証する • Symfony2 では、主にエンティティのテス トに使用する。Twigエクステンションのテ ストもユニットテストの範囲。 @ganchiku Shin Ohno6912年6月30日土曜日
  70. 70. 機能テスト • ルーティング、コントローラ、ビューといった 異なるコンポーネントの統合した際の動作 の検証 • Symfony2 では、ブラウザをシミュレートし て、動作をチェックする @ganchiku Shin Ohno7012年6月30日土曜日
  71. 71. エンティティのテスト • slugify�メソッドはちゃんと動く? • 失敗したときはどうなるのか。 @ganchiku Shin Ohno7112年6月30日土曜日
  72. 72. Twig エクステンション のテスト • createdAgo は正しく動くか? • テストが通らなかった場合は、修正してみ よう。 @ganchiku Shin Ohno7212年6月30日土曜日
  73. 73. 機能テスト • アバウトページは正しく表示されるか? • ホームページは正しく表示されるか? • 問い合わせページは正しく機能するか? • ブログのコメントは正しく追加されるか? @ganchiku Shin Ohno7312年6月30日土曜日
  74. 74. 1つだけ テストをしたい テキスト $ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php @ganchiku Shin Ohno7412年6月30日土曜日
  75. 75. 問い合わせページの 機能テスト • フォーム送信をシミュレートする。 @ganchiku Shin Ohno7512年6月30日土曜日
  76. 76. ブログにコメント追加する 機能テスト • フォーム送信をシミュレート • コメントがちゃんと追加されたかチェック @ganchiku Shin Ohno7612年6月30日土曜日
  77. 77. リポジトリのテスト • データベースの接続が必要 @ganchiku Shin Ohno7712年6月30日土曜日
  78. 78. コードカバレッジ • xdebug が必要 @ganchiku Shin Ohno7812年6月30日土曜日
  79. 79. さらに時間があれば ディスカッション • アノテーション派、yml派、xml派 • 便利なバンドル @ganchiku Shin Ohno7912年6月30日土曜日
  80. 80. 便利なバンドル • FOSUserBundle: ユーザ管理、登録、変更、メール確認など • JMSSecurityExtraBundle: アノテーションでセキュリティ • StofDoctrineExtensionBundle: Doctrine のビヘイビア • LiipImagineBundle: Imagine で画像切り出し • MopaBootstrapBundle: Twitter�Bootstrap の使用 • KnpPagerBundle, KnpMenuBundle, CrauseFormBundleなど • GenemuFormBundle: いろんなフォームウィジェット • Chosen, jQuery DatePicker, TinyMCE, FileUploadなど • SonataAdminBundle: Admin Generator http://friendsofsymfony.github.com/slides/there_is_a_bundle_for_that.html @ganchiku Shin Ohno8012年6月30日土曜日
  81. 81. お疲れ様でした @ganchiku Shin Ohno8112年6月30日土曜日
  82. 82. スタッフの方 ありがとうございました。 @ganchiku Shin Ohno8212年6月30日土曜日

×