SlideShare a Scribd company logo
1 of 82
Download to read offline
Symfony
                   ワークショップ
                     パート1
                  Symfony2 でブログを作ろう
                    symblog チュートリアル
                              6/30/2012




              https://connect.sensiolabs.com/profile/ganchiku


1                                                               @ganchiku Shin Ohno
12年6月30日土曜日
ワークショップ1
              13:00 - 14:30

                              @ganchiku Shin Ohno

2
12年6月30日土曜日
自己紹介
              • 名前:大野 晋(Shin Ohno)
              • ID: ganchiku (Twitter, githubなど)
              • 所属:日本Symfonyユーザ会
              • Symfony歴:0.6 くらいの頃から。
               • symfony1.x アプリ 6つくらい
               • Symfony2 アプリ 2つくらい
                                                   @ganchiku Shin Ohno

3
12年6月30日土曜日
• 最近は SwiftMailer の日本語対応をやってました。
                   ようやくSwiftMailer でiso-2022-jp エン
                  コードしたメールが送ることができそうです




                                       @ganchiku Shin Ohno

4
12年6月30日土曜日
Symfony ユーザ会

              • スタッフの方!手を挙げてください!
              • 途中でわからなくなったりしたら、その場で
               手を上げるなどしてスタッフの方を呼ぶな
               りしてください。


                                @ganchiku Shin Ohno

5
12年6月30日土曜日
本日の内容

              • ワークショップ1
               • Symfony2 でブログを作ろう
              • ワークショップ2
               • ユニットテストと機能テスト
                                     @ganchiku Shin Ohno

6
12年6月30日土曜日
http://tutorial.symblog.co.uk/
              http://symblog.co.uk/

              http://symblog.ganchiku.com/

                                               @ganchiku Shin Ohno

7
12年6月30日土曜日
Symblog�とは
              • symfony 0.6 - 1.0 のチュートリアル
               • Askeet(公式)
              • symfony1.2 - 1.4 のチュートリアル
               • Jobeet(公式)
              • Symfony2 のチュートリアル
               • symblog(非公式)
                                         @ganchiku Shin Ohno

8
12年6月30日土曜日
非公式ながら。。。
              •   英語、スペイン語、フランス語、日本語版

              •   しかし、まだ全部揃っていない。。。が、

              •   これで、だいぶ学ぶことはできる!

              •   注意点

                  •   Symfony2.0用

                      •   composer を使用していない(2.1 からデフォルト?)

                      •   ところどころ yaml での指定がある(このワークショップでは基
                          本 アノテーションで行う)

              •   大まかなところは、 Symfony2.1 と同じなので、十分使える。

                                                        @ganchiku Shin Ohno

9
12年6月30日土曜日
symblog のチュートリアル
              • Symfony2 のコンフィギュレーションとテンプレート
              • ページの作成: バリデータ、フォーム、メール送信
              • ブログモデル: Doctrine 2 の使用とデータフィクスチャ
              • コメントモデル: コメントの追加、 Doctrine リポジトリとマ
                  イグレーション

              •   ビューのカスタマイズ: Twig エクステンション、サイド
                  バーと Assetic

              • テスト: PHPUnit を使用したユニットテストと機能テスト
                                             @ganchiku Shin Ohno

10
12年6月30日土曜日
今日予定しているところ
              • Symfony2 のコンフィギュレーションとテンプレート
              • ページの作成: バリデータ、フォーム、メール送信
              • ブログモデル: Doctrine 2 の使用とデータフィクスチャ
              • コメントモデル: コメントの追加、 Doctrine リポジトリとマ
                  イグレーション

              •   ビューのカスタマイズ: Twig エクステンション、サイド
                  バーと Assetic

              • テスト: PHPUnit を使用したユニットテストと機能テスト
                                             @ganchiku Shin Ohno

11
12年6月30日土曜日
Symfony2 の
               コンフィギュレーションとテンプレート


              • Symfony2 アプリケーションのセットアップ
              • 開発ドメインの設定
              • Symfony2 のバンドル
              • ルーティング
              • コントローラ
              • Twig を使用したテンプレート
                                     @ganchiku Shin Ohno

12
12年6月30日土曜日
Symfony2 アプリケーションのセットアップ




              • 既に動く環境があることを前提にしていい
               ですか?




                                @ganchiku Shin Ohno

13
12年6月30日土曜日
まだの人
              • http://symfony.gr.jp/blog/
                20120624-symfony-standard を参照し
                てインストール(2.1-Beta)

               • でも、時間がかかるので。あと2.1-Beta
                 なので。。。

              • http://symfony.com/download からダ
                ウンロードして動作を確認する
                                             @ganchiku Shin Ohno

14
12年6月30日土曜日
動作確認
              • スクリプトの動作確認
               • app/config.php, web/config.php の動作を確認
              • 注意点
               • app/logs, app/cache の書き込み権限の確認
              • DB も使うので、 MySQL を適当に配置。
               • MySQL がないと一部ワークショップの内容ができま
                  せん

                                                @ganchiku Shin Ohno

15
12年6月30日土曜日
開発ドメインの設定
              • Symfony2 の話というより、Apache など
               のウェブサービスで開発しやすいように設
               定

              • しなくても、localhost で動けば、とりあえ
               ずはよし。VirtualHost で指定したけれ
               ば、それ用に設定。

                                      @ganchiku Shin Ohno

16
12年6月30日土曜日
確認

              • 現時点で動いていますか?
              • 動いていない人は、周りのスタッフに聞く
               か、隣の人に聞いてみてください。

              • ちょっと待ちます。
                                  @ganchiku Shin Ohno

17
12年6月30日土曜日
Symfony2 のバンドル
              • バンドルとは?
               • バンドルは、全ての Symfony2 アプリケーションの
                 基本的な構成要素

               • ぶっちゃけるとプラグインのようなちょっと違うよう
                 な。必要な物(コントローラ、モデル、テンプレート、
                 アセットなど)をカプセル化したもの

               • フルスタックフレームワークである Symfony2 も
                 複数のバンドルによって構成されている。
                                        @ganchiku Shin Ohno

18
12年6月30日土曜日
余談
              •   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 Ohno

19
12年6月30日土曜日
バンドルの作成

     $ php app/console generate:bundle --namespace=Blogger/BlogBundle




              •   ウェブサイトには、 --format-yml があるが、今回は無しで。デフォル
                  トはアノテーションになる。

              •   フォーマットでは、 xml, yml, アノテーションが指定できるが、オスス
                  メはアノテーション(個人的には。また、おそらくほとんどの人は。)

                                                         @ganchiku Shin Ohno

20
12年6月30日土曜日
generate:bundle

              • src/ 以下にバンドルのスケルトンを配置
              • app/AppKernel.php に バンドルを登録
              • app/config/routing.yml にコントローラ
               のルーティング設定を登録


                                          @ganchiku Shin Ohno

21
12年6月30日土曜日
--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 Ohno

22
12年6月30日土曜日
アノテーション(デフォルト)
                  だと。。。

                <?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 Ohno

23
12年6月30日土曜日
�整理
              • デフォルトで作ってくれるバンドルとテンプレートを削
               除してしまいます。

               • src/Blogger/BlogBundle/Controller/
                 DefaultController.php

               • src/Blogger/BlogBundle/Resources/views/
                 Default/

               • src/Blogger/BlogBundle/Resources/config/
                 routing.yml のエントリ
                                                      @ganchiku Shin Ohno

24
12年6月30日土曜日
テンプレートエンジン
                    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 Ohno

25
12年6月30日土曜日
<!-- 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>
26
12年6月30日土曜日
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 Ohno

27
12年6月30日土曜日
twig のタグについて
              • {% %}    {% extends '::base.html.twig' %}




               • 何かをさせるタグ
                         {% block title %}タイトルタグは子供テンプレートが決めて{% endblock %}




              • {{ }}                     {{ blog.created|date("d-m-Y") }}



               • 何かを表示させるタグ
              • {# #}                     {# ここはコメントだよ! #}




               • コメントタグ
                                                            @ganchiku Shin Ohno

28
12年6月30日土曜日
ページテンプレート作成
              <?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 Ohno

29
12年6月30日土曜日
とりあえず動かすため、
               CSS はコピペ�><
                /web/css/screen.css


                                      @ganchiku Shin Ohno

30
12年6月30日土曜日
確認

              • トップページは見えました?
              • 見えてない方は近くのスタッフ、または隣
               の人に聞いてください。



                                @ganchiku Shin Ohno

31
12年6月30日土曜日
ページ作成


              • about ページを作ってみよう。
               • ルーティング、コントローラ、テンプレート
                を用意



                                 @ganchiku Shin Ohno

32
12年6月30日土曜日
質問タイム


              • ここまでで何か質問がありますか?


                                   @ganchiku Shin Ohno

33
12年6月30日土曜日
ページの作成: バリデータ、
               フォーム、メール送信
              • バリデータ
              • フォーム
              • バンドルのコンフィギュレーションの値の設定
         問い合わせフォームを作成し、そのバリデーションを
         行い、メールを送信する!

                                  @ganchiku Shin Ohno

34
12年6月30日土曜日
実装
              ルーティングの設定
                          アノテーションを使え
                 ↓
                           ば、1ファイルで
              コントローラの作成

                 ↓
               ビューの作成
                               @ganchiku Shin Ohno

35
12年6月30日土曜日
問い合わせページ作成
              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 Ohno

36
12年6月30日土曜日
エンティティ作成
              • データベースで使用するテーブルとフィール
               ドでよく使われるけど、そうでないといけない
               わけではない!

              • 問い合わせフォームはデータベースと連携し
               ていないが、そのまま使える。

              • 時間があれば、データベースとの連携とのこ
               ろも説明します。。。
                                 @ganchiku Shin Ohno

37
12年6月30日土曜日
<?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 Ohno


12年6月30日土曜日
フォームの作成

              • symfony1.x 系との大きな違いの1つ
              • フォームフレームワークが使いやすくなっ
               た!らしい。。。



                                   @ganchiku Shin Ohno

39
12年6月30日土曜日
<?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 Ohno

40
12年6月30日土曜日
コントローラの実装
     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 Ohno

41
12年6月30日土曜日
ルーティング名のおさらい
              •   ルーティング名前は指定することが可能

                  •   デフォルトでは、{{バンドル名}}_{{コントローラ名}}_{{アクション名}} となっ
                      ている。

                      •   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 Ohno

42
12年6月30日土曜日
ビューの作成


              • action の先を {{ path(‘contact’) }} に
                変更して、後はコピペで。




                                             @ganchiku Shin Ohno

43
12年6月30日土曜日
{{ 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 Ohno

44
12年6月30日土曜日
フォームの装飾
              • フォーム用の CSS コピペ
               • src/Blogger/BlogBundle/
                 Resource/public/css/blog.css

              • 合わせて layout.html.twig も修正
              • symlink を web/bundles 以下に貼る
                                            @ganchiku Shin Ohno

45
12年6月30日土曜日
確認


              • フォームがちゃんと表示されましたか?


                                 @ganchiku Shin Ohno

46
12年6月30日土曜日
受け付ける�HTTPメソッド

              • GET のみの指定になっていたが、�POST
               も受け付けるように変更する。

                        * @Method("GET")




                      * @Method("GET¦POST")



                                              @ganchiku Shin Ohno

47
12年6月30日土曜日
バリデーション
              <?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 Ohno

48
12年6月30日土曜日
アノテーションがないとき
              <?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 Ohno

49
12年6月30日土曜日
アノテーションがあるとき
              <?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 Ohno

50
12年6月30日土曜日
メール送信

              • gmail を通してメールを送信してみる。
              • symfony.japan.test@gmail.com
              • password: xxxxxxxx(当日に伝えます)

                                        @ganchiku Shin Ohno

51
12年6月30日土曜日
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 Ohno

52
12年6月30日土曜日
コントローラの修正
       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 Ohno

53
12年6月30日土曜日
SwiftMailer
              • Fabien がリードディベロッパーのメール送信ライブラリ
               • 日本語の取り扱いがもう少しでできるはず。。。6/28
                 時点でできるようになったはず!まだ試してない
                 が。。。

               • ただ、デフォルトで送ると Quoted Printable で
                 utf-8 なメールが送信される。初期設定を上書きす
                 ることができるので、これを Base64Encoding で
                 iso-2022-jp なメールヘッダに変更することが可
                 能。
                                             @ganchiku Shin Ohno

54
12年6月30日土曜日
フラッシュメッセージ
              • 成功メッセージ、失敗メッセージなど
              $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 Ohno

55
12年6月30日土曜日
独自の定義の使い方

              • src/Blogger/BlogBundle/Resources/
                config/config.yml などを作成して、定
                義を書く。

              • app/config/config.yml�でインポートを
                するように指定する。

                                            @ganchiku Shin Ohno

56
12年6月30日土曜日
質問タイム

              • 質問や詰まったところ、わからなかったとこ
               ろ。

              • もしくは、スタッフからのツッコミ

                                   @ganchiku Shin Ohno

57
12年6月30日土曜日
時間があればサクッと説明
                  します
              • ブログモデル: Doctrine 2 の使用とデー
               タフィクスチャ

              • コメントモデル: コメントの追加、 Doctrine
               リポジトリとマイグレーション

              • ビューのカスタマイズ: Twig エクステン
               ション、サイドバーと Assetic
                                      @ganchiku Shin Ohno

58
12年6月30日土曜日
ブログモデル:
              Doctrine 2 の使用とデータフィクスチャ


              • ブログエンティティの作成
              • CRUD で使うメソッドなど
              • DataFixture の使用
              • LifeCycleCallback
                                    @ganchiku Shin Ohno

59
12年6月30日土曜日
個人的に思うこと
              • チュートリアルでは、そのまま書いていって
               いるが、コマンドを使うと楽。アノテーション
               でフィールド定義を作ってくれる
      $ 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 Ohno

60
12年6月30日土曜日
個人的に思うこと
              • ルーティングを�yml でやっているが、ここ
               もアノテーションで統一した方がわかりや
               すいと思う。使用するテンプレートの名前を
               省略することも可能なので。

              • 少し触れているが、タイムスタンプなどは、
               StofDoctrineExtensionsBundle�を使う
               とアノテーションでよろしくやってくれる。
                                          @ganchiku Shin Ohno

61
12年6月30日土曜日
コメントモデル:
          コメントの追加、 Doctrine リポジトリとマイ
                  グレーション

              • Doctrine2 のリポジトリクラス
              • コメントエンティティの作成
               • ManyToOneリレーションの指定
              • Doctrine2 マイグレーション
              • 複数のエンティティのフィクスチャの使用
                                @ganchiku Shin Ohno

62
12年6月30日土曜日
個人的に思うこと
              • 最初はデータベーステーブルの構造も変わる可
               能性があるからマイグレーションはいいかな。あ
               る程度できてからは、マイグレーションの方が良
               さそう。でも、便利。

              • フィクスチャの読み込む順番を指定できるのは
               便利

              • フィクスチャの別のエンティティへの参照も便利
                                  @ganchiku Shin Ohno

63
12年6月30日土曜日
ビューのカスタマイズ:
              Twig エクステンション、サイドバーと Assetic




              • 遅延ローディングと JOIN
              • Twig render メソッド
              • Twig エクステンション
              • Assetic
                                      @ganchiku Shin Ohno

64
12年6月30日土曜日
個人的に思うこと

              • Twig エクステンションは、ほとんどの場合
               書くことになる。 mb_strimwidth など、
               そのまま渡す場合なども

              • Assetic フィルター便利。LESS のコンパ
               イルとかもサクッとできる

                                      @ganchiku Shin Ohno

65
12年6月30日土曜日
ワークショップ2
              14:40 - 16:10

                              @ganchiku Shin Ohno

66
12年6月30日土曜日
Symfony
                   ワークショップ
                     パート2
                  Symfony2 でブログを作ろう
                    symblog チュートリアル
                              6/30/2012




              https://connect.sensiolabs.com/profile/ganchiku


67                                                              @ganchiku Shin Ohno
12年6月30日土曜日
テスト: PHPUnit を使用した
          ユニットテストと機能テスト


              • symblog-part5-done.tgz で行います。
               symblog のパート5まで終えた分になりま
               す。



                                         @ganchiku Shin Ohno

68
12年6月30日土曜日
ユニットテスト

              • コードの単位を独立させて使用した際に正
               しく動くか検証する

              • Symfony2 では、主にエンティティのテス
               トに使用する。Twigエクステンションのテ
               ストもユニットテストの範囲。

                                   @ganchiku Shin Ohno

69
12年6月30日土曜日
機能テスト

              • ルーティング、コントローラ、ビューといった
               異なるコンポーネントの統合した際の動作
               の検証

              • Symfony2 では、ブラウザをシミュレートし
               て、動作をチェックする

                                    @ganchiku Shin Ohno

70
12年6月30日土曜日
エンティティのテスト


              • slugify�メソッドはちゃんと動く?
              • 失敗したときはどうなるのか。

                                       @ganchiku Shin Ohno

71
12年6月30日土曜日
Twig エクステンション
                    のテスト

              • createdAgo は正しく動くか?
              • テストが通らなかった場合は、修正してみ
               よう。



                                @ganchiku Shin Ohno

72
12年6月30日土曜日
機能テスト

              • アバウトページは正しく表示されるか?
              • ホームページは正しく表示されるか?
              • 問い合わせページは正しく機能するか?
              • ブログのコメントは正しく追加されるか?
                                 @ganchiku Shin Ohno

73
12年6月30日土曜日
1つだけ
                        テストをしたい


                                   テキスト
 $ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php




                                                                  @ganchiku Shin Ohno

74
12年6月30日土曜日
問い合わせページの
                  機能テスト



              • フォーム送信をシミュレートする。


                                   @ganchiku Shin Ohno

75
12年6月30日土曜日
ブログにコメント追加する
                 機能テスト


              • フォーム送信をシミュレート
              • コメントがちゃんと追加されたかチェック

                                 @ganchiku Shin Ohno

76
12年6月30日土曜日
リポジトリのテスト


              • データベースの接続が必要


                               @ganchiku Shin Ohno

77
12年6月30日土曜日
コードカバレッジ
              • xdebug が必要




                             @ganchiku Shin Ohno

78
12年6月30日土曜日
さらに時間があれば
                  ディスカッション


              • アノテーション派、yml派、xml派
              • 便利なバンドル

                                     @ganchiku Shin Ohno

79
12年6月30日土曜日
便利なバンドル
              •   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 Ohno

80
12年6月30日土曜日
お疲れ様でした


                        @ganchiku Shin Ohno

81
12年6月30日土曜日
スタッフの方
          ありがとうございました。

                    @ganchiku Shin Ohno

82
12年6月30日土曜日

More Related Content

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

Symfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoyaSymfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoyaHidenori Goto
 
Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)Hidenori Goto
 
無印Pentium debian install memo
無印Pentium debian install memo無印Pentium debian install memo
無印Pentium debian install memoYukiyoshi Yoshimoto
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようKenji NAKAGAKI
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
NodeにしましょうYuzo Hebishima
 
Symfony勉強会#9 form
Symfony勉強会#9 formSymfony勉強会#9 form
Symfony勉強会#9 formYuichi Okada
 
初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話Masataka Tsukamoto
 
Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案
Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案
Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案福重 伸太朗
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!Masaki Muranaka
 
Symfony2 intro-20111204
Symfony2 intro-20111204Symfony2 intro-20111204
Symfony2 intro-20111204Hidenori Goto
 
20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?Tetsuo Mitsuda
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
EC-CUBEユーザカンファレンス2016
EC-CUBEユーザカンファレンス2016EC-CUBEユーザカンファレンス2016
EC-CUBEユーザカンファレンス2016Chihiro Adachi
 
KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~KLab株式会社
 
2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinigTom Hayakawa
 

Similar to 日本Symfonyユーザ会によるSymfony2 ワークショップ (20)

翻訳について
翻訳について翻訳について
翻訳について
 
Symfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoyaSymfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoya
 
Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)
 
無印Pentium debian install memo
無印Pentium debian install memo無印Pentium debian install memo
無印Pentium debian install memo
 
Osoljp201204
Osoljp201204Osoljp201204
Osoljp201204
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
Symfony勉強会#9 form
Symfony勉強会#9 formSymfony勉強会#9 form
Symfony勉強会#9 form
 
初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話
 
Symfony2#5 LT
Symfony2#5 LTSymfony2#5 LT
Symfony2#5 LT
 
Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案
Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案
Co Linuxによる Windowsオンリー開発の不満をスッキリ解決! 7つの提案
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
 
Symfony2 intro-20111204
Symfony2 intro-20111204Symfony2 intro-20111204
Symfony2 intro-20111204
 
20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?
 
Ojag20120811
Ojag20120811Ojag20120811
Ojag20120811
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
Products.PloneOrg
Products.PloneOrgProducts.PloneOrg
Products.PloneOrg
 
EC-CUBEユーザカンファレンス2016
EC-CUBEユーザカンファレンス2016EC-CUBEユーザカンファレンス2016
EC-CUBEユーザカンファレンス2016
 
KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~
 
2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (8)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

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

  • 1. Symfony ワークショップ パート1 Symfony2 でブログを作ろう symblog チュートリアル 6/30/2012 https://connect.sensiolabs.com/profile/ganchiku 1 @ganchiku Shin Ohno 12年6月30日土曜日
  • 2. ワークショップ1 13:00 - 14:30 @ganchiku Shin Ohno 2 12年6月30日土曜日
  • 3. 自己紹介 • 名前:大野 晋(Shin Ohno) • ID: ganchiku (Twitter, githubなど) • 所属:日本Symfonyユーザ会 • Symfony歴:0.6 くらいの頃から。 • symfony1.x アプリ 6つくらい • Symfony2 アプリ 2つくらい @ganchiku Shin Ohno 3 12年6月30日土曜日
  • 4. • 最近は SwiftMailer の日本語対応をやってました。 ようやくSwiftMailer でiso-2022-jp エン コードしたメールが送ることができそうです @ganchiku Shin Ohno 4 12年6月30日土曜日
  • 5. Symfony ユーザ会 • スタッフの方!手を挙げてください! • 途中でわからなくなったりしたら、その場で 手を上げるなどしてスタッフの方を呼ぶな りしてください。 @ganchiku Shin Ohno 5 12年6月30日土曜日
  • 6. 本日の内容 • ワークショップ1 • Symfony2 でブログを作ろう • ワークショップ2 • ユニットテストと機能テスト @ganchiku Shin Ohno 6 12年6月30日土曜日
  • 7. http://tutorial.symblog.co.uk/ http://symblog.co.uk/ http://symblog.ganchiku.com/ @ganchiku Shin Ohno 7 12年6月30日土曜日
  • 8. Symblog�とは • symfony 0.6 - 1.0 のチュートリアル • Askeet(公式) • symfony1.2 - 1.4 のチュートリアル • Jobeet(公式) • Symfony2 のチュートリアル • symblog(非公式) @ganchiku Shin Ohno 8 12年6月30日土曜日
  • 9. 非公式ながら。。。 • 英語、スペイン語、フランス語、日本語版 • しかし、まだ全部揃っていない。。。が、 • これで、だいぶ学ぶことはできる! • 注意点 • Symfony2.0用 • composer を使用していない(2.1 からデフォルト?) • ところどころ yaml での指定がある(このワークショップでは基 本 アノテーションで行う) • 大まかなところは、 Symfony2.1 と同じなので、十分使える。 @ganchiku Shin Ohno 9 12年6月30日土曜日
  • 10. symblog のチュートリアル • Symfony2 のコンフィギュレーションとテンプレート • ページの作成: バリデータ、フォーム、メール送信 • ブログモデル: Doctrine 2 の使用とデータフィクスチャ • コメントモデル: コメントの追加、 Doctrine リポジトリとマ イグレーション • ビューのカスタマイズ: Twig エクステンション、サイド バーと Assetic • テスト: PHPUnit を使用したユニットテストと機能テスト @ganchiku Shin Ohno 10 12年6月30日土曜日
  • 11. 今日予定しているところ • Symfony2 のコンフィギュレーションとテンプレート • ページの作成: バリデータ、フォーム、メール送信 • ブログモデル: Doctrine 2 の使用とデータフィクスチャ • コメントモデル: コメントの追加、 Doctrine リポジトリとマ イグレーション • ビューのカスタマイズ: Twig エクステンション、サイド バーと Assetic • テスト: PHPUnit を使用したユニットテストと機能テスト @ganchiku Shin Ohno 11 12年6月30日土曜日
  • 12. Symfony2 の コンフィギュレーションとテンプレート • Symfony2 アプリケーションのセットアップ • 開発ドメインの設定 • Symfony2 のバンドル • ルーティング • コントローラ • Twig を使用したテンプレート @ganchiku Shin Ohno 12 12年6月30日土曜日
  • 13. Symfony2 アプリケーションのセットアップ • 既に動く環境があることを前提にしていい ですか? @ganchiku Shin Ohno 13 12年6月30日土曜日
  • 14. まだの人 • http://symfony.gr.jp/blog/ 20120624-symfony-standard を参照し てインストール(2.1-Beta) • でも、時間がかかるので。あと2.1-Beta なので。。。 • http://symfony.com/download からダ ウンロードして動作を確認する @ganchiku Shin Ohno 14 12年6月30日土曜日
  • 15. 動作確認 • スクリプトの動作確認 • app/config.php, web/config.php の動作を確認 • 注意点 • app/logs, app/cache の書き込み権限の確認 • DB も使うので、 MySQL を適当に配置。 • MySQL がないと一部ワークショップの内容ができま せん @ganchiku Shin Ohno 15 12年6月30日土曜日
  • 16. 開発ドメインの設定 • Symfony2 の話というより、Apache など のウェブサービスで開発しやすいように設 定 • しなくても、localhost で動けば、とりあえ ずはよし。VirtualHost で指定したけれ ば、それ用に設定。 @ganchiku Shin Ohno 16 12年6月30日土曜日
  • 17. 確認 • 現時点で動いていますか? • 動いていない人は、周りのスタッフに聞く か、隣の人に聞いてみてください。 • ちょっと待ちます。 @ganchiku Shin Ohno 17 12年6月30日土曜日
  • 18. Symfony2 のバンドル • バンドルとは? • バンドルは、全ての Symfony2 アプリケーションの 基本的な構成要素 • ぶっちゃけるとプラグインのようなちょっと違うよう な。必要な物(コントローラ、モデル、テンプレート、 アセットなど)をカプセル化したもの • フルスタックフレームワークである Symfony2 も 複数のバンドルによって構成されている。 @ganchiku Shin Ohno 18 12年6月30日土曜日
  • 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 Ohno 19 12年6月30日土曜日
  • 20. バンドルの作成 $ php app/console generate:bundle --namespace=Blogger/BlogBundle • ウェブサイトには、 --format-yml があるが、今回は無しで。デフォル トはアノテーションになる。 • フォーマットでは、 xml, yml, アノテーションが指定できるが、オスス メはアノテーション(個人的には。また、おそらくほとんどの人は。) @ganchiku Shin Ohno 20 12年6月30日土曜日
  • 21. generate:bundle • src/ 以下にバンドルのスケルトンを配置 • app/AppKernel.php に バンドルを登録 • app/config/routing.yml にコントローラ のルーティング設定を登録 @ganchiku Shin Ohno 21 12年6月30日土曜日
  • 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 Ohno 22 12年6月30日土曜日
  • 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 Ohno 23 12年6月30日土曜日
  • 24. �整理 • デフォルトで作ってくれるバンドルとテンプレートを削 除してしまいます。 • src/Blogger/BlogBundle/Controller/ DefaultController.php • src/Blogger/BlogBundle/Resources/views/ Default/ • src/Blogger/BlogBundle/Resources/config/ routing.yml のエントリ @ganchiku Shin Ohno 24 12年6月30日土曜日
  • 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 Ohno 25 12年6月30日土曜日
  • 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> 26 12年6月30日土曜日
  • 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 Ohno 27 12年6月30日土曜日
  • 28. twig のタグについて • {% %} {% extends '::base.html.twig' %} • 何かをさせるタグ {% block title %}タイトルタグは子供テンプレートが決めて{% endblock %} • {{ }} {{ blog.created|date("d-m-Y") }} • 何かを表示させるタグ • {# #} {# ここはコメントだよ! #} • コメントタグ @ganchiku Shin Ohno 28 12年6月30日土曜日
  • 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 Ohno 29 12年6月30日土曜日
  • 30. とりあえず動かすため、 CSS はコピペ�>< /web/css/screen.css @ganchiku Shin Ohno 30 12年6月30日土曜日
  • 31. 確認 • トップページは見えました? • 見えてない方は近くのスタッフ、または隣 の人に聞いてください。 @ganchiku Shin Ohno 31 12年6月30日土曜日
  • 32. ページ作成 • about ページを作ってみよう。 • ルーティング、コントローラ、テンプレート を用意 @ganchiku Shin Ohno 32 12年6月30日土曜日
  • 33. 質問タイム • ここまでで何か質問がありますか? @ganchiku Shin Ohno 33 12年6月30日土曜日
  • 34. ページの作成: バリデータ、 フォーム、メール送信 • バリデータ • フォーム • バンドルのコンフィギュレーションの値の設定 問い合わせフォームを作成し、そのバリデーションを 行い、メールを送信する! @ganchiku Shin Ohno 34 12年6月30日土曜日
  • 35. 実装 ルーティングの設定 アノテーションを使え ↓ ば、1ファイルで コントローラの作成 ↓ ビューの作成 @ganchiku Shin Ohno 35 12年6月30日土曜日
  • 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 Ohno 36 12年6月30日土曜日
  • 37. エンティティ作成 • データベースで使用するテーブルとフィール ドでよく使われるけど、そうでないといけない わけではない! • 問い合わせフォームはデータベースと連携し ていないが、そのまま使える。 • 時間があれば、データベースとの連携とのこ ろも説明します。。。 @ganchiku Shin Ohno 37 12年6月30日土曜日
  • 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 Ohno 12年6月30日土曜日
  • 39. フォームの作成 • symfony1.x 系との大きな違いの1つ • フォームフレームワークが使いやすくなっ た!らしい。。。 @ganchiku Shin Ohno 39 12年6月30日土曜日
  • 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 Ohno 40 12年6月30日土曜日
  • 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 Ohno 41 12年6月30日土曜日
  • 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 Ohno 42 12年6月30日土曜日
  • 43. ビューの作成 • action の先を {{ path(‘contact’) }} に 変更して、後はコピペで。 @ganchiku Shin Ohno 43 12年6月30日土曜日
  • 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 Ohno 44 12年6月30日土曜日
  • 45. フォームの装飾 • フォーム用の CSS コピペ • src/Blogger/BlogBundle/ Resource/public/css/blog.css • 合わせて layout.html.twig も修正 • symlink を web/bundles 以下に貼る @ganchiku Shin Ohno 45 12年6月30日土曜日
  • 46. 確認 • フォームがちゃんと表示されましたか? @ganchiku Shin Ohno 46 12年6月30日土曜日
  • 47. 受け付ける�HTTPメソッド • GET のみの指定になっていたが、�POST も受け付けるように変更する。 * @Method("GET") * @Method("GET¦POST") @ganchiku Shin Ohno 47 12年6月30日土曜日
  • 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 Ohno 48 12年6月30日土曜日
  • 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 Ohno 49 12年6月30日土曜日
  • 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 Ohno 50 12年6月30日土曜日
  • 51. メール送信 • gmail を通してメールを送信してみる。 • symfony.japan.test@gmail.com • password: xxxxxxxx(当日に伝えます) @ganchiku Shin Ohno 51 12年6月30日土曜日
  • 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 Ohno 52 12年6月30日土曜日
  • 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 Ohno 53 12年6月30日土曜日
  • 54. SwiftMailer • Fabien がリードディベロッパーのメール送信ライブラリ • 日本語の取り扱いがもう少しでできるはず。。。6/28 時点でできるようになったはず!まだ試してない が。。。 • ただ、デフォルトで送ると Quoted Printable で utf-8 なメールが送信される。初期設定を上書きす ることができるので、これを Base64Encoding で iso-2022-jp なメールヘッダに変更することが可 能。 @ganchiku Shin Ohno 54 12年6月30日土曜日
  • 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 Ohno 55 12年6月30日土曜日
  • 56. 独自の定義の使い方 • src/Blogger/BlogBundle/Resources/ config/config.yml などを作成して、定 義を書く。 • app/config/config.yml�でインポートを するように指定する。 @ganchiku Shin Ohno 56 12年6月30日土曜日
  • 57. 質問タイム • 質問や詰まったところ、わからなかったとこ ろ。 • もしくは、スタッフからのツッコミ @ganchiku Shin Ohno 57 12年6月30日土曜日
  • 58. 時間があればサクッと説明 します • ブログモデル: Doctrine 2 の使用とデー タフィクスチャ • コメントモデル: コメントの追加、 Doctrine リポジトリとマイグレーション • ビューのカスタマイズ: Twig エクステン ション、サイドバーと Assetic @ganchiku Shin Ohno 58 12年6月30日土曜日
  • 59. ブログモデル: Doctrine 2 の使用とデータフィクスチャ • ブログエンティティの作成 • CRUD で使うメソッドなど • DataFixture の使用 • LifeCycleCallback @ganchiku Shin Ohno 59 12年6月30日土曜日
  • 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 Ohno 60 12年6月30日土曜日
  • 61. 個人的に思うこと • ルーティングを�yml でやっているが、ここ もアノテーションで統一した方がわかりや すいと思う。使用するテンプレートの名前を 省略することも可能なので。 • 少し触れているが、タイムスタンプなどは、 StofDoctrineExtensionsBundle�を使う とアノテーションでよろしくやってくれる。 @ganchiku Shin Ohno 61 12年6月30日土曜日
  • 62. コメントモデル: コメントの追加、 Doctrine リポジトリとマイ グレーション • Doctrine2 のリポジトリクラス • コメントエンティティの作成 • ManyToOneリレーションの指定 • Doctrine2 マイグレーション • 複数のエンティティのフィクスチャの使用 @ganchiku Shin Ohno 62 12年6月30日土曜日
  • 63. 個人的に思うこと • 最初はデータベーステーブルの構造も変わる可 能性があるからマイグレーションはいいかな。あ る程度できてからは、マイグレーションの方が良 さそう。でも、便利。 • フィクスチャの読み込む順番を指定できるのは 便利 • フィクスチャの別のエンティティへの参照も便利 @ganchiku Shin Ohno 63 12年6月30日土曜日
  • 64. ビューのカスタマイズ: Twig エクステンション、サイドバーと Assetic • 遅延ローディングと JOIN • Twig render メソッド • Twig エクステンション • Assetic @ganchiku Shin Ohno 64 12年6月30日土曜日
  • 65. 個人的に思うこと • Twig エクステンションは、ほとんどの場合 書くことになる。 mb_strimwidth など、 そのまま渡す場合なども • Assetic フィルター便利。LESS のコンパ イルとかもサクッとできる @ganchiku Shin Ohno 65 12年6月30日土曜日
  • 66. ワークショップ2 14:40 - 16:10 @ganchiku Shin Ohno 66 12年6月30日土曜日
  • 67. Symfony ワークショップ パート2 Symfony2 でブログを作ろう symblog チュートリアル 6/30/2012 https://connect.sensiolabs.com/profile/ganchiku 67 @ganchiku Shin Ohno 12年6月30日土曜日
  • 68. テスト: PHPUnit を使用した ユニットテストと機能テスト • symblog-part5-done.tgz で行います。 symblog のパート5まで終えた分になりま す。 @ganchiku Shin Ohno 68 12年6月30日土曜日
  • 69. ユニットテスト • コードの単位を独立させて使用した際に正 しく動くか検証する • Symfony2 では、主にエンティティのテス トに使用する。Twigエクステンションのテ ストもユニットテストの範囲。 @ganchiku Shin Ohno 69 12年6月30日土曜日
  • 70. 機能テスト • ルーティング、コントローラ、ビューといった 異なるコンポーネントの統合した際の動作 の検証 • Symfony2 では、ブラウザをシミュレートし て、動作をチェックする @ganchiku Shin Ohno 70 12年6月30日土曜日
  • 71. エンティティのテスト • slugify�メソッドはちゃんと動く? • 失敗したときはどうなるのか。 @ganchiku Shin Ohno 71 12年6月30日土曜日
  • 72. Twig エクステンション のテスト • createdAgo は正しく動くか? • テストが通らなかった場合は、修正してみ よう。 @ganchiku Shin Ohno 72 12年6月30日土曜日
  • 73. 機能テスト • アバウトページは正しく表示されるか? • ホームページは正しく表示されるか? • 問い合わせページは正しく機能するか? • ブログのコメントは正しく追加されるか? @ganchiku Shin Ohno 73 12年6月30日土曜日
  • 74. 1つだけ テストをしたい テキスト $ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php @ganchiku Shin Ohno 74 12年6月30日土曜日
  • 75. 問い合わせページの 機能テスト • フォーム送信をシミュレートする。 @ganchiku Shin Ohno 75 12年6月30日土曜日
  • 76. ブログにコメント追加する 機能テスト • フォーム送信をシミュレート • コメントがちゃんと追加されたかチェック @ganchiku Shin Ohno 76 12年6月30日土曜日
  • 77. リポジトリのテスト • データベースの接続が必要 @ganchiku Shin Ohno 77 12年6月30日土曜日
  • 78. コードカバレッジ • xdebug が必要 @ganchiku Shin Ohno 78 12年6月30日土曜日
  • 79. さらに時間があれば ディスカッション • アノテーション派、yml派、xml派 • 便利なバンドル @ganchiku Shin Ohno 79 12年6月30日土曜日
  • 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 Ohno 80 12年6月30日土曜日
  • 81. お疲れ様でした @ganchiku Shin Ohno 81 12年6月30日土曜日
  • 82. スタッフの方 ありがとうございました。 @ganchiku Shin Ohno 82 12年6月30日土曜日