日本symfonyユーザ会によるsymfony2 ワークショップ

82
@ganchiku Shin Ohno https://connect.sensiolabs.com/profile/ganchiku Symfony ワークショップ パート1 Symfony2 でブログを作ろう symblog チュートリアル 1 6/30/2012 12630日土曜日

Upload: shin-ohno

Post on 19-May-2015

2.179 views

Category:

Technology


4 download

DESCRIPTION

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

TRANSCRIPT

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

@ganchiku Shin Ohno

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

Symfony ワークショップ

パート1Symfony2 でブログを作ろう

symblog チュートリアル

1

6/30/2012

12年6月30日土曜日

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

@ganchiku Shin Ohno

2

ワークショップ113:00 - 14:30

12年6月30日土曜日

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

@ganchiku Shin Ohno

自己紹介•名前:大野 晋(Shin Ohno)

• ID: ganchiku (Twitter, githubなど)

•所属:日本Symfonyユーザ会

•Symfony歴:0.6 くらいの頃から。

• symfony1.x アプリ 6つくらい

•Symfony2 アプリ 2つくらい

312年6月30日土曜日

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

@ganchiku Shin Ohno

4

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

12年6月30日土曜日

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

@ganchiku Shin Ohno

Symfony ユーザ会

•スタッフの方!手を挙げてください!

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

512年6月30日土曜日

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

@ganchiku Shin Ohno

本日の内容

•ワークショップ1

•Symfony2 でブログを作ろう

•ワークショップ2

•ユニットテストと機能テスト

612年6月30日土曜日

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

@ganchiku Shin Ohno

http://tutorial.symblog.co.uk/http://symblog.co.uk/

http://symblog.ganchiku.com/

712年6月30日土曜日

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

@ganchiku Shin Ohno

8

Symblog�とは• symfony 0.6 - 1.0 のチュートリアル

•Askeet(公式)

• symfony1.2 - 1.4 のチュートリアル

• Jobeet(公式)

•Symfony2 のチュートリアル

• symblog(非公式)

12年6月30日土曜日

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

@ganchiku Shin Ohno

非公式ながら。。。• 英語、スペイン語、フランス語、日本語版

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

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

• 注意点

• Symfony2.0用

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

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

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

912年6月30日土曜日

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

@ganchiku Shin Ohno

symblog のチュートリアル

• Symfony2 のコンフィギュレーションとテンプレート

• ページの作成: バリデータ、フォーム、メール送信

• ブログモデル: Doctrine 2 の使用とデータフィクスチャ

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

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

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

1012年6月30日土曜日

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

@ganchiku Shin Ohno

今日予定しているところ• Symfony2 のコンフィギュレーションとテンプレート

• ページの作成: バリデータ、フォーム、メール送信

• ブログモデル: Doctrine 2 の使用とデータフィクスチャ

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

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

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

1112年6月30日土曜日

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

@ganchiku Shin Ohno

Symfony2 のコンフィギュレーションとテンプレート

•Symfony2 アプリケーションのセットアップ

•開発ドメインの設定

•Symfony2 のバンドル

•ルーティング

•コントローラ

•Twig を使用したテンプレート

1212年6月30日土曜日

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

@ganchiku Shin Ohno

Symfony2 アプリケーションのセットアップ

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

1312年6月30日土曜日

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

@ganchiku Shin Ohno

まだの人•http://symfony.gr.jp/blog/

20120624-symfony-standard を参照してインストール(2.1-Beta)

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

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

1412年6月30日土曜日

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

@ganchiku Shin Ohno

動作確認

• スクリプトの動作確認

• app/config.php, web/config.php の動作を確認

• 注意点

• app/logs, app/cache の書き込み権限の確認

• DB も使うので、 MySQL を適当に配置。

• MySQL がないと一部ワークショップの内容ができません

1512年6月30日土曜日

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

@ganchiku Shin Ohno

開発ドメインの設定

•Symfony2 の話というより、Apache などのウェブサービスで開発しやすいように設定

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

1612年6月30日土曜日

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

@ganchiku Shin Ohno

確認

•現時点で動いていますか?

•動いていない人は、周りのスタッフに聞くか、隣の人に聞いてみてください。

•ちょっと待ちます。

1712年6月30日土曜日

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

@ganchiku Shin Ohno

Symfony2 のバンドル• バンドルとは?

• バンドルは、全ての Symfony2 アプリケーションの基本的な構成要素

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

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

1812年6月30日土曜日

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

@ganchiku Shin Ohno

余談• 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 のディストリビューションでの設定と動作の機能を追加

19

http://www.symfony.gr.jp/blog/20120624-symfony-standard

12年6月30日土曜日

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

@ganchiku Shin Ohno

バンドルの作成

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

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

20

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

12年6月30日土曜日

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

@ganchiku Shin Ohno

generate:bundle

•src/ 以下にバンドルのスケルトンを配置

•app/AppKernel.php に バンドルを登録

•app/config/routing.yml にコントローラのルーティング設定を登録

2112年6月30日土曜日

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

@ganchiku Shin Ohno

--format=yml だと。。。

22

<?php// src/Blogger/BlogBundle/Controller/DefaultController.php

namespace Blogger\BlogBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

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.ymlBloggerBlogBundle_homepage: pattern: /hello/{name} defaults: { _controller: BloggerBlogBundle:Default:index }

12年6月30日土曜日

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

@ganchiku Shin Ohno

アノテーション(デフォルト)だと。。。

23

<?php// src/Blogger/BlogBundle/Controller/DefaultController.php

namespace Blogger\BlogBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class DefaultController extends Controller{ /** * @Route(“/hello/{name}”) * @Template() */ public function indexAction($name) { return array('name' => $name); }

12年6月30日土曜日

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

@ganchiku Shin Ohno

�整理• デフォルトで作ってくれるバンドルとテンプレートを削

除してしまいます。

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

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

• src/Blogger/BlogBundle/Resources/config/routing.yml のエントリ

2412年6月30日土曜日

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

@ganchiku Shin Ohno

テンプレートエンジン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

2512年6月30日土曜日

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

@ganchiku Shin Ohno

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"> <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 %} </body></html>

base.html.twig

12年6月30日土曜日

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

@ganchiku Shin Ohno

27

{# src/Blogger/BlogBundle/Resources/views/layout.html.twig #}{% extends '::base.html.twig' %}

{% block sidebar %} Sidebar content{% endblock %}

{# src/Blogger/BlogBundle/Resources/views/Page/index.html.twig #}{% extends 'BloggerBlogBundle::layout.html.twig' %}

{% block body %} Blog homepage{% endblock %}

layout.html.twig

index.html.twig

継承

継承

base.html.twig

12年6月30日土曜日

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

@ganchiku Shin Ohno

twig のタグについて• {% %}

•何かをさせるタグ

• {{ }}

•何かを表示させるタグ

• {# #}

•コメントタグ

28

{% extends '::base.html.twig' %}

{% block title %}タイトルタグは子供テンプレートが決めて{% endblock %}

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

{# ここはコメントだよ! #}

12年6月30日土曜日

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

@ganchiku Shin Ohno

ページテンプレート作成

29

<?php// src/Blogger/BlogBundle/Controller/PageController.php

namespace Blogger\BlogBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

class PageController extends Controller{ /** * @Route("/") * @Method("GET") * @Template() */ public function indexAction() { return array(); }}

12年6月30日土曜日

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

@ganchiku Shin Ohno

とりあえず動かすため、CSS はコピペ�><

30

/web/css/screen.css

12年6月30日土曜日

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

@ganchiku Shin Ohno

確認

•トップページは見えました?

•見えてない方は近くのスタッフ、または隣の人に聞いてください。

3112年6月30日土曜日

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

@ganchiku Shin Ohno

ページ作成

•about ページを作ってみよう。

•ルーティング、コントローラ、テンプレートを用意

3212年6月30日土曜日

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

@ganchiku Shin Ohno

質問タイム

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

3312年6月30日土曜日

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

@ganchiku Shin Ohno

ページの作成: バリデータ、フォーム、メール送信

34

•バリデータ

•フォーム

•バンドルのコンフィギュレーションの値の設定

問い合わせフォームを作成し、そのバリデーションを行い、メールを送信する!

12年6月30日土曜日

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

@ganchiku Shin Ohno

実装

35

コントローラの作成

ルーティングの設定

ビューの作成

アノテーションを使えば、1ファイルで

12年6月30日土曜日

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

@ganchiku Shin Ohno

問い合わせページ作成

36

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

// 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 %}

コントローラーテンプレート

12年6月30日土曜日

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

@ganchiku Shin Ohno

エンティティ作成•データベースで使用するテーブルとフィール

ドでよく使われるけど、そうでないといけないわけではない!

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

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

3712年6月30日土曜日

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

@ganchiku Shin Ohno

<?php// src/Blogger/BlogBundle/Entity/Enquiry.php

namespace Blogger\BlogBundle\Entity;

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; }

public function setSubject($subject) { $this->subject = $subject; }

public function getBody() { return $this->body; }

public function setBody($body) { $this->body = $body; }}

エンティティはとりあえずコピペで

src/Blogger/BlogBundle/Entity/Enquiry.php

12年6月30日土曜日

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

@ganchiku Shin Ohno

フォームの作成

•symfony1.x 系との大きな違いの1つ

•フォームフレームワークが使いやすくなった!らしい。。。

3912年6月30日土曜日

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

@ganchiku Shin Ohno

40

<?php// src/Blogger/BlogBundle/Form/EnquiryType.php

namespace Blogger\BlogBundle\Form;

use Symfony\Component\Form\AbstractType;use Symfony\Component\Form\FormBuilder;

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'; }}

フォームタイプもコピペで

src/Blogger/BlogBundle/Type/EnquiryType.php

*buildForm のパラメータは、2.1でインタフェースが変わりました。FormBuilder型ではなく、FormBuilderInterface型に。

12年6月30日土曜日

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

@ganchiku Shin Ohno

コントローラの実装

41

use Blogger\BlogBundle\Entity\Enquiry;use Blogger\BlogBundle\Form\EnquiryType;

// snip

// src/Blogger/BlogBundle/Controller/PageController.php

/** * @Route("/contact”) * @Method("GET") * @Template() */public function contactAction(){ $enquiry = new Enquiry(); $form = $this->createForm(new EnquiryType(), $enquiry);

$request = $this->getRequest(); if ($request->getMethod() == 'POST') { $form->bindRequest($request);

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() );}

Enquiry と EnquiryTypeを use

POST リクエストの際にはパラメータをフォームにバインド

12年6月30日土曜日

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

@ganchiku Shin Ohno

ルーティング名のおさらい• ルーティング名前は指定することが可能

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

• blogger_blog_page_index

• blogger_blog_page_about

• blogger_blog_page_contact

• アノテーションの @Route に ルーティング名を指定

42

* @Route("/", name=”homepage”) * @Route("/about", name=”about”)

* @Route("/contact", name=”contact”)

12年6月30日土曜日

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

@ganchiku Shin Ohno

ビューの作成

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

4312年6月30日土曜日

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

@ganchiku Shin Ohno

44

{{ form_widget(form)}}

{{ form_errors(form) }}

{{ form_row(form.name) }} {{ form_row(form.email) }} {{ form_row(form.subject) }} {{ form_row(form.body) }}

{{ form_rest(form) }}

form_rest 忘れない!

12年6月30日土曜日

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

@ganchiku Shin Ohno

フォームの装飾

•フォーム用の CSS コピペ

•src/Blogger/BlogBundle/Resource/public/css/blog.css

•合わせて layout.html.twig も修正

•symlink を web/bundles 以下に貼る

4512年6月30日土曜日

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

@ganchiku Shin Ohno

確認

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

4612年6月30日土曜日

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

@ganchiku Shin Ohno

受け付ける�HTTPメソッド

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

47

* @Method("GET")

* @Method("GET|POST")

12年6月30日土曜日

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

@ganchiku Shin Ohno

バリデーション

48

<?php

// src/Blogger/BlogBundle/Entity/Enquiry.php

namespace Blogger\BlogBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Enquiry

{

/** * @Assert\NotBlank */ protected $name;

/** * @Assert\Email */ protected $email;

/** * @Assert\NotBlank * @Assert\MaxLength(50) */ protected $subject;

/** * @Assert\NotBlank * @Assert\MinLength(50) */ protected $body;}

12年6月30日土曜日

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

@ganchiku Shin Ohno

アノテーションがないとき

49

<?php// src/Blogger/BlogBundle/Entity/Enquiry.php

namespace Blogger\BlogBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;use Symfony\Component\Validator\Constraints\NotBlank;use Symfony\Component\Validator\Constraints\Email;use Symfony\Component\Validator\Constraints\MinLength;use Symfony\Component\Validator\Constraints\MaxLength;

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)); }

// ..

}

12年6月30日土曜日

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

@ganchiku Shin Ohno

アノテーションがあるとき

50

<?php

// src/Blogger/BlogBundle/Entity/Enquiry.php

namespace Blogger\BlogBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Enquiry

{

/** * @Assert\NotBlank */ protected $name;

/** * @Assert\Email */ protected $email;

/** * @Assert\NotBlank * @Assert\MaxLength(50) */ protected $subject;

/** * @Assert\NotBlank * @Assert\MinLength(50) */ protected $body;}

12年6月30日土曜日

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

@ganchiku Shin Ohno

メール送信

•gmail を通してメールを送信してみる。

[email protected]

•password: xxxxxxxx(当日に伝えます)

5112年6月30日土曜日

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

@ganchiku Shin Ohno

parameters.ini

52

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

昔はini がデフォルトだったのですが。今時点では yml がデフォルトに

12年6月30日土曜日

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

@ganchiku Shin Ohno

コントローラの修正

53

public function contactAction(){ // .. if ($form->isValid()) {

$message = \Swift_Message::newInstance() ->setSubject('Contact enquiry from symblog') ->setFrom('[email protected]') ->setTo('[email protected]') ->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 を使用

12年6月30日土曜日

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

@ganchiku Shin Ohno

SwiftMailer• Fabien がリードディベロッパーのメール送信ライブラリ

• 日本語の取り扱いがもう少しでできるはず。。。6/28 時点でできるようになったはず!まだ試してないが。。。

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

5412年6月30日土曜日

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

@ganchiku Shin Ohno

フラッシュメッセージ

•成功メッセージ、失敗メッセージなど

55

{% if app.session.hasFlash('blogger-notice') %} <div class="blogger-notice"> {{ app.session.flash('blogger-notice') }} </div>{% endif %}

$this->get('session')->setFlash('blogger-notice', 'Your contact enquiry was successfully sent. Thank you!');

12年6月30日土曜日

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

@ganchiku Shin Ohno

独自の定義の使い方

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

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

5612年6月30日土曜日

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

@ganchiku Shin Ohno

質問タイム

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

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

5712年6月30日土曜日

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

@ganchiku Shin Ohno

時間があればサクッと説明します

•ブログモデル: Doctrine 2 の使用とデータフィクスチャ

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

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

5812年6月30日土曜日

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

@ganchiku Shin Ohno

ブログモデル: Doctrine 2 の使用とデータフィクスチャ

•ブログエンティティの作成

•CRUD で使うメソッドなど

•DataFixture の使用

•LifeCycleCallback

5912年6月30日土曜日

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

@ganchiku Shin Ohno

個人的に思うこと•チュートリアルでは、そのまま書いていって

いるが、コマンドを使うと楽。アノテーションでフィールド定義を作ってくれる

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 --force

$ php app/console doctrine:schema:update --dump-sql

12年6月30日土曜日

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

@ganchiku Shin Ohno

個人的に思うこと

•ルーティングを�yml でやっているが、ここもアノテーションで統一した方がわかりやすいと思う。使用するテンプレートの名前を省略することも可能なので。

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

6112年6月30日土曜日

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

@ganchiku Shin Ohno

コメントモデル: コメントの追加、 Doctrine リポジトリとマイ

グレーション

•Doctrine2 のリポジトリクラス

•コメントエンティティの作成

•ManyToOneリレーションの指定

•Doctrine2 マイグレーション

•複数のエンティティのフィクスチャの使用

6212年6月30日土曜日

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

@ganchiku Shin Ohno

個人的に思うこと

•最初はデータベーステーブルの構造も変わる可能性があるからマイグレーションはいいかな。ある程度できてからは、マイグレーションの方が良さそう。でも、便利。

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

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

6312年6月30日土曜日

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

@ganchiku Shin Ohno

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

•遅延ローディングと JOIN

•Twig render メソッド

•Twig エクステンション

•Assetic

6412年6月30日土曜日

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

@ganchiku Shin Ohno

個人的に思うこと

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

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

6512年6月30日土曜日

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

@ganchiku Shin Ohno

66

ワークショップ214:40 - 16:10

12年6月30日土曜日

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

@ganchiku Shin Ohno

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

Symfony ワークショップ

パート2

67

Symfony2 でブログを作ろうsymblog チュートリアル

6/30/2012

12年6月30日土曜日

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

@ganchiku Shin Ohno

テスト: PHPUnit を使用したユニットテストと機能テスト

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

6812年6月30日土曜日

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

@ganchiku Shin Ohno

ユニットテスト

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

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

6912年6月30日土曜日

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

@ganchiku Shin Ohno

機能テスト

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

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

7012年6月30日土曜日

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

@ganchiku Shin Ohno

エンティティのテスト

•slugify�メソッドはちゃんと動く?

•失敗したときはどうなるのか。

7112年6月30日土曜日

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

@ganchiku Shin Ohno

Twig エクステンションのテスト

•createdAgo は正しく動くか?

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

7212年6月30日土曜日

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

@ganchiku Shin Ohno

機能テスト

•アバウトページは正しく表示されるか?

•ホームページは正しく表示されるか?

•問い合わせページは正しく機能するか?

•ブログのコメントは正しく追加されるか?

7312年6月30日土曜日

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

@ganchiku Shin Ohno

1つだけテストをしたい

74

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

12年6月30日土曜日

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

@ganchiku Shin Ohno

問い合わせページの機能テスト

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

7512年6月30日土曜日

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

@ganchiku Shin Ohno

ブログにコメント追加する機能テスト

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

•コメントがちゃんと追加されたかチェック

7612年6月30日土曜日

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

@ganchiku Shin Ohno

リポジトリのテスト

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

7712年6月30日土曜日

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

@ganchiku Shin Ohno

コードカバレッジ

•xdebug が必要

7812年6月30日土曜日

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

@ganchiku Shin Ohno

さらに時間があればディスカッション

•アノテーション派、yml派、xml派

•便利なバンドル

7912年6月30日土曜日

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

@ganchiku Shin Ohno

便利なバンドル

80

• FOSUserBundle: ユーザ管理、登録、変更、メール確認など

• JMSSecurityExtraBundle: アノテーションでセキュリティ

• StofDoctrineExtensionBundle: Doctrine のビヘイビア

• LiipImagineBundle: Imagine で画像切り出し

• MopaBootstrapBundle: Twitter�Bootstrap の使用

• KnpPagerBundle, KnpMenuBundle, CrauseFormBundleなど

• GenemuFormBundle: いろんなフォームウィジェット

• Chosen, jQuery DatePicker, TinyMCE, FileUploadなど

• SonataAdminBundle: Admin Generatorhttp://friendsofsymfony.github.com/slides/there_is_a_bundle_for_that.html

12年6月30日土曜日

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

@ganchiku Shin Ohno

お疲れ様でした

8112年6月30日土曜日

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

@ganchiku Shin Ohno

スタッフの方ありがとうございました。

8212年6月30日土曜日