日本symfonyユーザ会によるsymfony2 ワークショップ
DESCRIPTION
06/30/2012 日本 Symfony ユーザ会のワークショップです。実際は半分くらいしか使われていないですが。。。TRANSCRIPT
@ganchiku Shin Ohno
https://connect.sensiolabs.com/profile/ganchiku
Symfony ワークショップ
パート1Symfony2 でブログを作ろう
symblog チュートリアル
1
6/30/2012
12年6月30日土曜日
@ganchiku Shin Ohno
2
ワークショップ113:00 - 14:30
12年6月30日土曜日
@ganchiku Shin Ohno
自己紹介•名前:大野 晋(Shin Ohno)
• ID: ganchiku (Twitter, githubなど)
•所属:日本Symfonyユーザ会
•Symfony歴:0.6 くらいの頃から。
• symfony1.x アプリ 6つくらい
•Symfony2 アプリ 2つくらい
312年6月30日土曜日
@ganchiku Shin Ohno
4
•最近は SwiftMailer の日本語対応をやってました。ようやくSwiftMailer でiso-2022-jp エンコードしたメールが送ることができそうです
12年6月30日土曜日
@ganchiku Shin Ohno
Symfony ユーザ会
•スタッフの方!手を挙げてください!
•途中でわからなくなったりしたら、その場で手を上げるなどしてスタッフの方を呼ぶなりしてください。
512年6月30日土曜日
@ganchiku Shin Ohno
本日の内容
•ワークショップ1
•Symfony2 でブログを作ろう
•ワークショップ2
•ユニットテストと機能テスト
612年6月30日土曜日
@ganchiku Shin Ohno
http://tutorial.symblog.co.uk/http://symblog.co.uk/
http://symblog.ganchiku.com/
712年6月30日土曜日
@ganchiku Shin Ohno
8
Symblog�とは• symfony 0.6 - 1.0 のチュートリアル
•Askeet(公式)
• symfony1.2 - 1.4 のチュートリアル
• Jobeet(公式)
•Symfony2 のチュートリアル
• symblog(非公式)
12年6月30日土曜日
@ganchiku Shin Ohno
非公式ながら。。。• 英語、スペイン語、フランス語、日本語版
• しかし、まだ全部揃っていない。。。が、
• これで、だいぶ学ぶことはできる!
• 注意点
• Symfony2.0用
• composer を使用していない(2.1 からデフォルト?)
• ところどころ yaml での指定がある(このワークショップでは基本 アノテーションで行う)
• 大まかなところは、 Symfony2.1 と同じなので、十分使える。
912年6月30日土曜日
@ganchiku Shin Ohno
symblog のチュートリアル
• Symfony2 のコンフィギュレーションとテンプレート
• ページの作成: バリデータ、フォーム、メール送信
• ブログモデル: Doctrine 2 の使用とデータフィクスチャ
• コメントモデル: コメントの追加、 Doctrine リポジトリとマイグレーション
• ビューのカスタマイズ: Twig エクステンション、サイドバーと Assetic
• テスト: PHPUnit を使用したユニットテストと機能テスト
1012年6月30日土曜日
@ganchiku Shin Ohno
今日予定しているところ• Symfony2 のコンフィギュレーションとテンプレート
• ページの作成: バリデータ、フォーム、メール送信
• ブログモデル: Doctrine 2 の使用とデータフィクスチャ
• コメントモデル: コメントの追加、 Doctrine リポジトリとマイグレーション
• ビューのカスタマイズ: Twig エクステンション、サイドバーと Assetic
• テスト: PHPUnit を使用したユニットテストと機能テスト
1112年6月30日土曜日
@ganchiku Shin Ohno
Symfony2 のコンフィギュレーションとテンプレート
•Symfony2 アプリケーションのセットアップ
•開発ドメインの設定
•Symfony2 のバンドル
•ルーティング
•コントローラ
•Twig を使用したテンプレート
1212年6月30日土曜日
@ganchiku Shin Ohno
Symfony2 アプリケーションのセットアップ
•既に動く環境があることを前提にしていいですか?
1312年6月30日土曜日
@ganchiku Shin Ohno
まだの人•http://symfony.gr.jp/blog/
20120624-symfony-standard を参照してインストール(2.1-Beta)
•でも、時間がかかるので。あと2.1-Beta なので。。。
•http://symfony.com/download からダウンロードして動作を確認する
1412年6月30日土曜日
@ganchiku Shin Ohno
動作確認
• スクリプトの動作確認
• app/config.php, web/config.php の動作を確認
• 注意点
• app/logs, app/cache の書き込み権限の確認
• DB も使うので、 MySQL を適当に配置。
• MySQL がないと一部ワークショップの内容ができません
1512年6月30日土曜日
@ganchiku Shin Ohno
開発ドメインの設定
•Symfony2 の話というより、Apache などのウェブサービスで開発しやすいように設定
•しなくても、localhost で動けば、とりあえずはよし。VirtualHost で指定したければ、それ用に設定。
1612年6月30日土曜日
@ganchiku Shin Ohno
確認
•現時点で動いていますか?
•動いていない人は、周りのスタッフに聞くか、隣の人に聞いてみてください。
•ちょっと待ちます。
1712年6月30日土曜日
@ganchiku Shin Ohno
Symfony2 のバンドル• バンドルとは?
• バンドルは、全ての Symfony2 アプリケーションの基本的な構成要素
• ぶっちゃけるとプラグインのようなちょっと違うような。必要な物(コントローラ、モデル、テンプレート、アセットなど)をカプセル化したもの
• フルスタックフレームワークである Symfony2 も複数のバンドルによって構成されている。
1812年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
バンドルの作成
• ウェブサイトには、 --format-yml があるが、今回は無しで。デフォルトはアノテーションになる。
• フォーマットでは、 xml, yml, アノテーションが指定できるが、オススメはアノテーション(個人的には。また、おそらくほとんどの人は。)
20
$ php app/console generate:bundle --namespace=Blogger/BlogBundle
12年6月30日土曜日
@ganchiku Shin Ohno
generate:bundle
•src/ 以下にバンドルのスケルトンを配置
•app/AppKernel.php に バンドルを登録
•app/config/routing.yml にコントローラのルーティング設定を登録
2112年6月30日土曜日
@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日土曜日
@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日土曜日
@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日土曜日
@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日土曜日
@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日土曜日
@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日土曜日
@ganchiku Shin Ohno
twig のタグについて• {% %}
•何かをさせるタグ
• {{ }}
•何かを表示させるタグ
• {# #}
•コメントタグ
28
{% extends '::base.html.twig' %}
{% block title %}タイトルタグは子供テンプレートが決めて{% endblock %}
{{ blog.created|date("d-m-Y") }}
{# ここはコメントだよ! #}
12年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
とりあえず動かすため、CSS はコピペ�><
30
/web/css/screen.css
12年6月30日土曜日
@ganchiku Shin Ohno
確認
•トップページは見えました?
•見えてない方は近くのスタッフ、または隣の人に聞いてください。
3112年6月30日土曜日
@ganchiku Shin Ohno
ページ作成
•about ページを作ってみよう。
•ルーティング、コントローラ、テンプレートを用意
3212年6月30日土曜日
@ganchiku Shin Ohno
質問タイム
•ここまでで何か質問がありますか?
3312年6月30日土曜日
@ganchiku Shin Ohno
ページの作成: バリデータ、フォーム、メール送信
34
•バリデータ
•フォーム
•バンドルのコンフィギュレーションの値の設定
問い合わせフォームを作成し、そのバリデーションを行い、メールを送信する!
12年6月30日土曜日
@ganchiku Shin Ohno
実装
35
コントローラの作成
ルーティングの設定
ビューの作成
↓
↓
アノテーションを使えば、1ファイルで
12年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
エンティティ作成•データベースで使用するテーブルとフィール
ドでよく使われるけど、そうでないといけないわけではない!
•問い合わせフォームはデータベースと連携していないが、そのまま使える。
•時間があれば、データベースとの連携とのころも説明します。。。
3712年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
フォームの作成
•symfony1.x 系との大きな違いの1つ
•フォームフレームワークが使いやすくなった!らしい。。。
3912年6月30日土曜日
@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日土曜日
@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日土曜日
@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日土曜日
@ganchiku Shin Ohno
ビューの作成
•action の先を {{ path(‘contact’) }} に変更して、後はコピペで。
4312年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
フォームの装飾
•フォーム用の CSS コピペ
•src/Blogger/BlogBundle/Resource/public/css/blog.css
•合わせて layout.html.twig も修正
•symlink を web/bundles 以下に貼る
4512年6月30日土曜日
@ganchiku Shin Ohno
確認
•フォームがちゃんと表示されましたか?
4612年6月30日土曜日
@ganchiku Shin Ohno
受け付ける�HTTPメソッド
•GET のみの指定になっていたが、�POST も受け付けるように変更する。
47
* @Method("GET")
* @Method("GET|POST")
12年6月30日土曜日
@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日土曜日
@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日土曜日
@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日土曜日
@ganchiku Shin Ohno
メール送信
•gmail を通してメールを送信してみる。
•password: xxxxxxxx(当日に伝えます)
5112年6月30日土曜日
@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日土曜日
@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日土曜日
@ganchiku Shin Ohno
SwiftMailer• Fabien がリードディベロッパーのメール送信ライブラリ
• 日本語の取り扱いがもう少しでできるはず。。。6/28 時点でできるようになったはず!まだ試してないが。。。
• ただ、デフォルトで送ると Quoted Printable で utf-8 なメールが送信される。初期設定を上書きすることができるので、これを Base64Encoding で iso-2022-jp なメールヘッダに変更することが可能。
5412年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
独自の定義の使い方
•src/Blogger/BlogBundle/Resources/config/config.yml などを作成して、定義を書く。
•app/config/config.yml�でインポートをするように指定する。
5612年6月30日土曜日
@ganchiku Shin Ohno
質問タイム
•質問や詰まったところ、わからなかったところ。
•もしくは、スタッフからのツッコミ
5712年6月30日土曜日
@ganchiku Shin Ohno
時間があればサクッと説明します
•ブログモデル: Doctrine 2 の使用とデータフィクスチャ
•コメントモデル: コメントの追加、 Doctrine リポジトリとマイグレーション
•ビューのカスタマイズ: Twig エクステンション、サイドバーと Assetic
5812年6月30日土曜日
@ganchiku Shin Ohno
ブログモデル: Doctrine 2 の使用とデータフィクスチャ
•ブログエンティティの作成
•CRUD で使うメソッドなど
•DataFixture の使用
•LifeCycleCallback
5912年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
個人的に思うこと
•ルーティングを�yml でやっているが、ここもアノテーションで統一した方がわかりやすいと思う。使用するテンプレートの名前を省略することも可能なので。
•少し触れているが、タイムスタンプなどは、StofDoctrineExtensionsBundle�を使うとアノテーションでよろしくやってくれる。
6112年6月30日土曜日
@ganchiku Shin Ohno
コメントモデル: コメントの追加、 Doctrine リポジトリとマイ
グレーション
•Doctrine2 のリポジトリクラス
•コメントエンティティの作成
•ManyToOneリレーションの指定
•Doctrine2 マイグレーション
•複数のエンティティのフィクスチャの使用
6212年6月30日土曜日
@ganchiku Shin Ohno
個人的に思うこと
•最初はデータベーステーブルの構造も変わる可能性があるからマイグレーションはいいかな。ある程度できてからは、マイグレーションの方が良さそう。でも、便利。
•フィクスチャの読み込む順番を指定できるのは便利
•フィクスチャの別のエンティティへの参照も便利
6312年6月30日土曜日
@ganchiku Shin Ohno
ビューのカスタマイズ: Twig エクステンション、サイドバーと Assetic
•遅延ローディングと JOIN
•Twig render メソッド
•Twig エクステンション
•Assetic
6412年6月30日土曜日
@ganchiku Shin Ohno
個人的に思うこと
•Twig エクステンションは、ほとんどの場合書くことになる。 mb_strimwidth など、そのまま渡す場合なども
•Assetic フィルター便利。LESS のコンパイルとかもサクッとできる
6512年6月30日土曜日
@ganchiku Shin Ohno
66
ワークショップ214:40 - 16:10
12年6月30日土曜日
@ganchiku Shin Ohno
https://connect.sensiolabs.com/profile/ganchiku
Symfony ワークショップ
パート2
67
Symfony2 でブログを作ろうsymblog チュートリアル
6/30/2012
12年6月30日土曜日
@ganchiku Shin Ohno
テスト: PHPUnit を使用したユニットテストと機能テスト
•symblog-part5-done.tgz で行います。symblog のパート5まで終えた分になります。
6812年6月30日土曜日
@ganchiku Shin Ohno
ユニットテスト
•コードの単位を独立させて使用した際に正しく動くか検証する
•Symfony2 では、主にエンティティのテストに使用する。Twigエクステンションのテストもユニットテストの範囲。
6912年6月30日土曜日
@ganchiku Shin Ohno
機能テスト
•ルーティング、コントローラ、ビューといった異なるコンポーネントの統合した際の動作の検証
•Symfony2 では、ブラウザをシミュレートして、動作をチェックする
7012年6月30日土曜日
@ganchiku Shin Ohno
エンティティのテスト
•slugify�メソッドはちゃんと動く?
•失敗したときはどうなるのか。
7112年6月30日土曜日
@ganchiku Shin Ohno
Twig エクステンションのテスト
•createdAgo は正しく動くか?
•テストが通らなかった場合は、修正してみよう。
7212年6月30日土曜日
@ganchiku Shin Ohno
機能テスト
•アバウトページは正しく表示されるか?
•ホームページは正しく表示されるか?
•問い合わせページは正しく機能するか?
•ブログのコメントは正しく追加されるか?
7312年6月30日土曜日
@ganchiku Shin Ohno
1つだけテストをしたい
74
テキスト$ phpunit -c app/ src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php
12年6月30日土曜日
@ganchiku Shin Ohno
問い合わせページの機能テスト
•フォーム送信をシミュレートする。
7512年6月30日土曜日
@ganchiku Shin Ohno
ブログにコメント追加する機能テスト
•フォーム送信をシミュレート
•コメントがちゃんと追加されたかチェック
7612年6月30日土曜日
@ganchiku Shin Ohno
リポジトリのテスト
•データベースの接続が必要
7712年6月30日土曜日
@ganchiku Shin Ohno
コードカバレッジ
•xdebug が必要
7812年6月30日土曜日
@ganchiku Shin Ohno
さらに時間があればディスカッション
•アノテーション派、yml派、xml派
•便利なバンドル
7912年6月30日土曜日
@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日土曜日
@ganchiku Shin Ohno
お疲れ様でした
8112年6月30日土曜日
@ganchiku Shin Ohno
スタッフの方ありがとうございました。
8212年6月30日土曜日