もとい、今は絶賛Symfony2いぢり中ですw
この時間(03:00)で20人弱がHack(?)やSymfonyについて語り合ってるのはすごいww
もうメモったり感じたことをそのまんま書いちゃってますが、
RedBullウォッカを飲んでる私達をお許しくださいましm(__)m
たまにはこういう殴り書き風も大事だと感じたのでこのままで
まともにアンカーすら入れられてないですが、$HOME/.vimperator/pluginに
appendAnchor.jsをいれて:ancを叩いてくださいw
# 第一部
- SlideShare
-- http://t.co/F5Hs2XC
-- http://www.slideshare.net/uechcoco/symfony2-0
-- http://www.slideshare.net/uechcoco/symfony2-1
-- http://www.slideshare.net/uechcoco/symfony2-8203902
+ DIコンテナ
- lazy load
+ バンドル(plugin)
+ Doctrine2
- ORマッパー
+ Twig
- テンプレートエンジン
+ 名前空間の説明
+ Dependency Injection(依存性の注入)
- サンプルコードを交えて説明
DI containerのメリット
- lazy load
- テストしやすい
- 拡張しやすい
- chobi_e さんがDependency InjectionはPHP5.3になってどう変わったか日本語で書いてます
# workshop
Symfony/
app/ # AppKernel等のアプリケーション用に特化したカーネル等や、autoload(sf2ではrequire_onceを基本的に使わない)
bin/
src/
vendor/
web/
バンドルの作成
1. app/consoleコマンドでバンドル雛形を作成。
% pwd /var/www/Symfony/
$command_text = <<
組み込みステップ
-> Webテスト系をスムーズに記述可能
テストのないようがわかり易い
-> テストのメンテナンス性
なので。。。ハードルが低い
BDDについて
振舞駆動開発
PHPUnit等でもBDDはできる
BehatのBDDは「しなりおBDD」
読みやすいDSLによるテストの記述と実行
(PHPUnitマニュアル第13章 ボウリングゲームの例を参考に)
雪日足す言語(DDD)との親和性
Behatについて
BDDフレームワーク for PHP
Cucumber(Ruby)互換DSL(Gherkin)
sf2のコンポーネントを使って実装
sf2と統合しやすい(BehatBundle)
sf2意外のフレームワークのテストにも利用可能
sf2でBehatを使う
https://gist.github.com/997514
sf2 に以下を組み込む
Behat
Gherkin
Mink
BehatBundle
MinkBundle
Behatでテスト書く準備
用語
フィーチャ
アプリケーションの機能ごとの単位
粒度は自由に決める(モジュール単位、画面単位、チケット単位)
Behatでは、1つのフィーチャファイル(拡張子 feature)
シナリオ
特定のフィーチャの振舞を表現するシナリオ
Scenario(シナリオ) :に続けて記述
1つのフィーチャには、複数のシナリオを記述する
ステップ
1つのしなりおには、複数のステップを記述できる。
・組み込みステップ
組み込みステップの場所(Mink内)
・カスタムステップ
ex.) behat:test:bundle --steps --lang=ja バンドル
前提(Given)もし、ならば
Gherkin
Mink
Sahi
テストファーストについて
慣れろ!!(開発のサイクルに乗せるだけ
まずはテストを書くことに慣れる
たとえばechoデバッグを、テスtおコードで行う
$steps->Given('hoge', function() {
echo $hoge . PHP_EOL;
echo $hoge . PHP_EOL;
echo $hoge . PHP_EOL;
echo $hoge . PHP_EOL;
});
「はじめる!Cucumber」 同じようにRailsアプリを作っていく電子書籍
* Symfony2 のフォームについて By 小川さんこと @fivestr
http://www.slideshare.net/fivestar/symfony2-8203873
** フォームフレームワークの役割
** sf1との違い
入力データのマッピング
バリデーション(sf2ではValidatorコンポーネントとて独立している)
DBの保存
DoctrineなどORMごとにFormクラスの拡張が用意されている
** sf2のフォーム
- Formコンポーネントとして提供
- 入力データのマッピングのみ
- sf2ではあどんなオブジェクトでもマッピングできるよう、強力なマッピング機構が実装されている
- 大幅な柔軟性の
Symfony\Component\Form
3つの要素
FormFactory
FormBuilderからFormオブジェクトを生成する際、依存などを解消するファクトリー
FormBuilder
FormTypeのbuildForm()メソッドの中でFormuilderオブジェクト
FormType
sf1でいうwidgetみたいなもん(FormTypeInterfaceを実装されている)
** Constraintvalidator
制約に対するバリデーションを行う
各フォーム項目のエラーメッセージもymlで記述できる
sample.yml
user:
constraints:
GreaterThan:
left: startDate
right: endDate
properties:
name: ...
** ひとつのフォームオブジェクトのデータを複数のフォームから入力する場合、バリデーショングループを実装する。
** DataTransformer
フォームに関わる型キャストの問題解消、みたいなもん??
ex.) FileToArray
** EventDispatcher
Observerパターンの格闘
** 複雑なフォームの扱い
- sf1では、エンベッドフォームというのを使わないと、1つのフォームに複数のオブジェクトを使えなかった。
- sf2では、どちらもFormTypeで扱う。(特に意識することなく使える)
** マッピングの注意点
- フォームの定義とオブジェクトの定義が一致していないと基本的にマッピングはできない。
* PHPマイクロフレームワークSilex入門 By 前田さんこと @brtriver
http://www.slideshare.net/brtriver/silex-8204780
- microframeworkとは??
-- 各言語でそろってる。Silex自体はRubyの???から(失念
-- PHP: Silex, Python: Flask # FIXME: Python Flask気になるね。
-- Silexを理解すればするほどsf2を理解できる!!
--- 同じコンポーネントを使ってたりするから
- Silexで絶対実装しないもの(by fabian)
-- cli tool
-- xml, ymlを必須とする設定
-- PHPっぽくない機能
-- Silexに多くのコードを追加して実装するような機能
- PHP5.3をフル活用
-- PHAR (ふぁー)
--- 複数のファイルをひとつにまとめるための便利な仕組み
// ライブラリはPHARを読み込むだけ
require_once__DIR__.'/silex/phar';
// Simple Dipendency Injection Container for PHP 5.3
// コードコメントアウト覗くと50行しかないから覗いてみて!!
PIMPLE
-- 名前空間
--- 割愛
-- クロージャ
--- 割愛
-- extention
--- TwigExtensionで例を紹介
-- testsディレクトリ下に短く済んでいるテストコードがあるので、
TDDの参考になるはず。
* Symfony2でより長いソフトウェアを作るために By くぼさんこと @iteman
- 依存関係の逆転
-- Client -> Server
-- ↓
-- Client -> Server Interface -> Server
--- Server interface は sf2の DI Containerに値する。
- Programmerはモデラー。モデラーはプログラマー
- プロセス、技法、パラダイム
-- アジャイルプロセス(Scrum, XP, ...)
-- テスト駆動開発
-- ビヘイビア駆動開発
-- リファクタリング
-- SOLID
-- オブジェク
-- 関数プログラミング
-- ジェネリック
-- アスペクト指向プログラミング
-- 言語ワークベンチ
-- ジェネレーティブプログラミング
-- りんソフトアーキテクチャ?? DCI: data, context, and interaction
--- MVCのさきをゆくらしい(要調査)
* LT:一発目 CLI
- 基本
-- php app/console XXXXX
- init:bundle
-- appKernel, autoloadの更新が面倒
--- 解決するのがgithub上にあった
--- github Garfield-fr/Symfony2Project
* LT:二発目 madapaja (?) Symfony2 + mongoDB
- Beta1までしか開発がおっついてない。
https://www.dropbox.com/s/pwq7ubnluuoq79a/symfony2_workshop_no4_outline.pdf
* LT:三発目 @hnw PHPunit MocObject試そう!! By @hnw
http://slidesha.re/iXW1J3
- PHPunit MocObject試そう!!
-- $ pear list -c phpunit
- モックとは
-- 本物のクラスオブジェクトにそっくりな、テスト用のオブジェクト
- モックとそ結合
-- DIでないとダメ
- モックとスタブの違い
-- スタブは状態の確認、モックは振舞の確認もできる。(何回モック化したメソッドが呼ばれたか等)
--- sample code
// 中でインスタンス生成してちゃ差し替えられんだろ!
function hoge() {
$foo = new Foo();
$foo->sendMail();
}
// DI Containerだと大丈夫、DI便利だね♪
function hoge(Foo $foo) {
$foo->sendMail();
}
総括して、非常に中身の濃い一日でありました!!
DIコンテナ便利!!
Silexを触ることでsf2も分かってくる予感!!
テストはスキル!!!
0 件のコメント:
コメントを投稿