狠狠撸

狠狠撸Share a Scribd company logo
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日土曜日
厂测尘产濒辞驳?とは
              ? 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=/slideshow/symfony-13501061/13501061/"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('favicon1.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日土曜日
受け付ける?贬罢罢笔メソッド

              ? 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日土曜日
Ad

More Related Content

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

厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ
厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ
厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ
Hiroshi Oyamada
?
Symfony2 intro-20111204
Symfony2 intro-20111204Symfony2 intro-20111204
Symfony2 intro-20111204
Hidenori Goto
?
Symfony2 workshop-1
Symfony2 workshop-1Symfony2 workshop-1
Symfony2 workshop-1
Hidenori Goto
?
KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~
碍尝补产株式会社
?
Symfony2 Behat/BDD (#Symfony2study 4)
Symfony2 Behat/BDD (#Symfony2study 4)Symfony2 Behat/BDD (#Symfony2study 4)
Symfony2 Behat/BDD (#Symfony2study 4)
Hidenori Goto
?
第4回Symfony2勉強会 基礎編ワークショップ.1
第4回Symfony2勉強会 基礎編ワークショップ.1第4回Symfony2勉強会 基礎編ワークショップ.1
第4回Symfony2勉強会 基礎編ワークショップ.1
Yusuke Ueno
?
第4回Symfony2勉強会 基礎編ワークショップ.0
第4回Symfony2勉強会 基礎編ワークショップ.0第4回Symfony2勉強会 基礎編ワークショップ.0
第4回Symfony2勉強会 基礎編ワークショップ.0
Yusuke Ueno
?
Symfony updates
Symfony updatesSymfony updates
Symfony updates
Katsuhiro Ogawa
?
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
晃 遠山
?
厂颈濒别虫入门
厂颈濒别虫入门厂颈濒别虫入门
厂颈濒别虫入门
Takuya Sato
?
Symfony2
Symfony2Symfony2
Symfony2
Yusuke Higaki
?
Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?
Kousuke Ebihara
?
Drupal8 ? モダンなアーキテクチャのPHPベース OSS CMS
Drupal8 ? モダンなアーキテクチャのPHPベース OSS CMSDrupal8 ? モダンなアーキテクチャのPHPベース OSS CMS
Drupal8 ? モダンなアーキテクチャのPHPベース OSS CMS
Tomoki Hasegawa
?
厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々
厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々
厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々
mimizuk
?
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
Yuki Kanazawa
?
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
?
Symfony温泉2014 自己绍介LT
Symfony温泉2014 自己绍介LTSymfony温泉2014 自己绍介LT
Symfony温泉2014 自己绍介LT
Akira Suenami
?
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMSDrupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Tomoki Hasegawa
?
厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ
厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ
厂颈苍补迟谤补アプリを丑别谤辞办耻にアップ
Hiroshi Oyamada
?
Symfony2 intro-20111204
Symfony2 intro-20111204Symfony2 intro-20111204
Symfony2 intro-20111204
Hidenori Goto
?
KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~
碍尝补产株式会社
?
Symfony2 Behat/BDD (#Symfony2study 4)
Symfony2 Behat/BDD (#Symfony2study 4)Symfony2 Behat/BDD (#Symfony2study 4)
Symfony2 Behat/BDD (#Symfony2study 4)
Hidenori Goto
?
第4回Symfony2勉強会 基礎編ワークショップ.1
第4回Symfony2勉強会 基礎編ワークショップ.1第4回Symfony2勉強会 基礎編ワークショップ.1
第4回Symfony2勉強会 基礎編ワークショップ.1
Yusuke Ueno
?
第4回Symfony2勉強会 基礎編ワークショップ.0
第4回Symfony2勉強会 基礎編ワークショップ.0第4回Symfony2勉強会 基礎編ワークショップ.0
第4回Symfony2勉強会 基礎編ワークショップ.0
Yusuke Ueno
?
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
晃 遠山
?
厂颈濒别虫入门
厂颈濒别虫入门厂颈濒别虫入门
厂颈濒别虫入门
Takuya Sato
?
Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?
Kousuke Ebihara
?
Drupal8 ? モダンなアーキテクチャのPHPベース OSS CMS
Drupal8 ? モダンなアーキテクチャのPHPベース OSS CMSDrupal8 ? モダンなアーキテクチャのPHPベース OSS CMS
Drupal8 ? モダンなアーキテクチャのPHPベース OSS CMS
Tomoki Hasegawa
?
厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々
厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々
厂测尘蹿辞苍测开発者が尝补谤补惫别濒しようとして云々
mimizuk
?
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
Yuki Kanazawa
?
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
?
Symfony温泉2014 自己绍介LT
Symfony温泉2014 自己绍介LTSymfony温泉2014 自己绍介LT
Symfony温泉2014 自己绍介LT
Akira Suenami
?
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMSDrupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Tomoki Hasegawa
?

Recently uploaded (6)

論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...
論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...
論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...
Toru Tamaki
?
GitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptx
GitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptxGitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptx
GitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptx
TsukasaKomatsubara
?
AIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdf
AIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdfAIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdf
AIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdf
Data Source
?
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
Toru Tamaki
?
astahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansai
astahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansaiastahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansai
astahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansai
akipii Oga
?
論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...
論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...
論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...
Toru Tamaki
?
論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...
論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...
論文紹介:What, when, and where? ?Self-Supervised Spatio-Temporal Grounding?in Unt...
Toru Tamaki
?
GitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptx
GitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptxGitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptx
GitLab好きのAzureユーサ?ーに朗報!あなたのAzure OpenAIをつかって、GitLabて?AIを使う方法とメリットをこ?紹介.pptx
TsukasaKomatsubara
?
AIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdf
AIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdfAIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdf
AIの心臓部を支える力 ― ニューラルネットワークプロセッサの進化と未来.pdf
Data Source
?
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
論文紹介:PitcherNet: Powering the Moneyball Evolution in Baseball Video Analytics
Toru Tamaki
?
astahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansai
astahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansaiastahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansai
astahで問題地図を描いてみよう~第4回astah関西勉強会の発表資料です #astahkansai
akipii Oga
?
論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...
論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...
論文紹介:"Visual Genome:Connecting Language and Vision?Using Crowdsourced Dense I...
Toru Tamaki
?
Ad

日本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. 厂测尘产濒辞驳?とは ? 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=/slideshow/symfony-13501061/13501061/"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('favicon1.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. 受け付ける?贬罢罢笔メソッド ? 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日土曜日