ぷぎがぽぎ このページをアンテナに追加 RSSフィード

2010-02-25

[][]limeからPHPUnit

Time for another big news! #Symfony 2.0 will use #PHPUnit instead of #lime. Integration is already on its way.

Twitter / Fabien Potencier: Time for another big news! ...

昨日、しんふぉにゃんの間にビッグニュースがありました。

それは、ファビアンがSymfony2ではPHPUnitをテストツールとして利用するとつぶやいたからです。

これまでsymfonyには自前で小回りの効くlimeというテストツールが用意されていたのですが、これをPHPUnitに乗り換えするようです。


テストが多くなってくるとlimeだと厳しくなってくるというのは分かりますが、気軽さでいえばlimeのほうが上です。

気軽さよりもしっかりと書けるPHPUnitを採用するメリットが大きいのかもしれません。


ちなみに、limeは完全に無くなったわけではないようで、GitHub上でlime2の開発は今現在も行われているようです。

no title

Symfony2ではログ、キャッシュライブラリを自前でなくZend Frameworkを使ったりするなど、「優れたライブラリは積極的に取り入れる」という姿勢が見られるので、今回もその意思が感じ取れます。


詳しいことはそのうち公式ブログで発表があると思いますし、lime,SimpletestでなくなぜPHPUnitなのかということにも触れてくれると思います。


また、PHPUnitでテストをどのように書くかというサンプルとしても参考になると思います。そして、今後はしんふぉにゃん達は当たり前のようにPHPUnitを使うことになるんでしょうか?

参考リンク

http://www.phpunit.de/manual/3.4/ja/index.html

no title

2010-02-21

[]Symfony2 と戯れてみた (その1)

Symfony2はsandbox版が配布されていますが、実際に自分でアプリケーションバンドルを作成するにはどうするのか試してみました。

sandboxをとってきて試すだけであればno titleからどうぞ。以下はGitHubからソースコードを取得し、コマンドを使って雛形まで作ってみます。

ただし、公式のマニュアルにはこれらの手順については何も書かれていませんのであくまでも私が推測で試した結果です。また動きが怪しかったりしてますが、まだプレビュー版ですので安定していないかったりバグがあるのはよくあることです。この点をご理解の上お読みください。_(_ _)_

Symfony2のソースをとってくる

ここではGitHubからcloneしてきます。symfony-sandoxをclonseしてきます。

symfonyそのもののリポジトリもありますが、sandboxに比べてファイルがインストーラーのファイルなどが足らないようで、コアな部分のみで構成されているようですね。

$ cd /usr/local/src
$ git clone git://github.com/symfony/symfony-sandbox.git sf2.git
$ cd sf2.git
$ ls
LICENSE	README create_sandbox.sh hello src web

helloはサンプルのアプリケーション、srcは実際のソース群、webはwebサーバーで公開するディレクトリになります。

mydemoアプリケーションを作成する

symfonyコマンドはSymfony2では src/vendor/symfony/src/Symfony/Framework/WebBundle/Resource/bin/symfony.phpにありました。

なので、init:applicationでmydemoアプリケーションを作成します。まずはhelpでコマンドを確認してみます。

$ php src/vendor/symfony/src/Symfony/Framework/WebBundle/Resources/bin/symfony.php help init:application
Usage:
 Symfony init:application [--yaml] name path web_path

Arguments:
 name      The application name
 path      The path to the application
 web_path  The path to the public web root

Options:
 --yaml Use YAML for configuration files

pathはアプリケーションを作成するパス、web_pathは公開ディレクトリを指定するようです。もともと用意されているhelloアプリケーションと同じ場所にmydemoを作成し、webディレクトリは同じ場所にするので、基底となるディレクトリで以下のように実行しました。

$ pwd
/usr/local/src/sf2.git
$ php src/vendor/symfony/src/Symfony/Framework/WebBundle/Resources/bin/symfony.php init:application mydemo ./mydemo ./web

これでmydemoアプリケーションのディレクトリとwebディレクトリにコントローラーが作成されました。

$ tree mydemo
mydemo
|-- cache
|-- config
|   |-- config.xml
|   |-- config_dev.xml
|   |-- config_prod.xml
|   `-- routing.xml
|-- console
|-- logs
`-- mydemoKernel.php

$ tree web
web
|-- check.php
|-- index.php
|-- index_dev.php
|-- mydemo.php
`-- mydemo_dev.php

設定ファイルがxmlになっています。さきほどのinit:applicaitonで--yamlを指定すればyaml形式で設定ファイルができるのですが、この後の作業で何故かエラーになります。まぁまだ開発中ですし。

追記: 「XML形式を推奨している」ということでは無いと思います。xmlでもyamlでも同じように設定が行えるようになる予定です。ORMでDoctrineとPropelを使えるのと同じことだと推測しています。

とりえあずこのアプリケーションにアクセスしてみます。まずは、もともとあるapacheでwebディレクトリが表示できるようにシンボリックリンクを貼りました。ローカル環境はmacで、公開ディレクトリはホームディレクトリ直下のSitesだったので以下のように実行。

$ ln -s /usr/local/src/sf2.git/web $HOME/Sites/sf2

あとは、ブラウザでアクセスすると無事Congratulationの画面が!

f:id:brtRiver:20100221105124p:image

また、アプリケーションを作るために使ったinit:applicationコマンドですが、パスを指定できるといっても現在のところ完全に自分の好きな場所に作成しても動きません。相対パスが指定されている箇所があってそこでエラーになります。もちろん、パスを直せば大丈夫ですが面倒なので今回は素直に動く場所にインストールしました。

mydemoのバンドルを作成する

Symfony2からはプラグインモジュールなどはバンドルと呼ばれる単位になるようです。

次にmydemoのバンドルを作ります。さきほど作成されたmydemoディレクトリにmydemo用にconsoleファイルがあるので、このファイルを通してコマンドを実行するようです。引数でバンドルを作成するnamespaceを指定します。

sandboxのルールと同じで./src/Bundle/MydemoBundleという場所に作成したいのでBundle\MydemoBundleと指定します。

$ php ./mydemo/console init:bundle "Bundle\MydemoBundle"

これで、以下のファイルが作成されました。

$ tree src/Bundle/MydemoBundle
src/Bundle/MydemoBundle
|-- Bundle.php
|-- Controller
|   `-- DefaultController.php
|-- Model
`-- Resources
    |-- config
    |   `-- routing.xml
    `-- views
        `-- Default
            `-- index.php

このようにアプリケーションのディレクトリと別のディレクトリにバンドルを作成するのは、プラグインなどのように複数のアプリケーションでバンドルを共有したい場合などを考慮してのことだと思います。実際に各アプリケーションごとに利用するバンドルを複数指定できます。

今回のmydemoアプリケーションが作成したバンドルを利用できるように登録しておきます。

$ vim mydemo/mydemoKernel.php
<?php
  public function registerBundles()
  {
    return array(
      new Symfony\Foundation\Bundle\KernelBundle(),
      new Symfony\Framework\WebBundle\Bundle(),

      // enable third-party bundles
      new Symfony\Framework\ZendBundle\Bundle(),
      new Symfony\Framework\DoctrineBundle\Bundle(),
      new Symfony\Framework\SwiftmailerBundle\Bundle(),

      // register your bundles here
      new Bundle\MydemoBundle\Bundle(), // 追加
    );
  }

次にバンドルのルーティングを変更します。アプリケーションディレクトリのconfig/routing.xmlになります。

ここでWebBundleを参照しているのを先ほど作成したMydemoBundleに変更します。

$ vim mydemo/config/routing.xml
  <route id="homepage" pattern="/">
    <default key="_bundle">MydemoBundle</default>
    <default key="_controller">Default</default>
    <default key="_action">index</default>
  </route>

これで再度アクセスします。

f:id:brtRiver:20100221105318p:image


おー。ちゃんとルーティングが変更されましたね。

感想

やはりというかsymfony1系とは全くの別モノです。アプリケーションごとにKernelが存在しBundleを変更することでコアでもバンドル(プラグイン)でも何でも拡張できます。

そして、バンドル単位で作成することで再利用性は格段に向上しました。なぜなら普通に作成したバンドルは他のアプリケーションでもそのまま登録すれば利用できるからです。

つまり、意識しなくてもプラグインを常に開発するというイメージでしょうか。symfony1系やCakePHPのように"拡張のためにプラグインで作る"必要がないということですね。

こういった点からもバンドルという概念を理解することが第一歩のようです。

2010-02-18

[] ./console --shellを拡張してみた

早速なので、仕事であまり時間がないけどちょっと触ってみました。

Symfony2からは各アプリケーション毎にconsoleコマンドがあり、以前でいうsymfonyコマンドのようです。

また、インタラクティブシェルも用意されており、--shellオプションで起動できます。*1

f:id:brtRiver:20100218230504p:image

で、このシェルを拡張する方法を試してみました。

拡張したいファイルをコピーしnamespaceを書き換える

今回利用したファイルはno titleです。

symfonyのドキュメントにあったAJAXを使ったショッピングカートのSymfony2実装版です。

動作させるために必要なのはPHP5.3の環境とgit cloneしたファイルです。

主なディレクトリ構成は以下のようになっていました。

./web => 公開ディレクトリ(コントローラー, 画像, css, js等)
./cart => cartの設定ファイル関連
  * console ... Symfony2コンソールコマンド
./src
  ./Bundle
    ./CartBundle => cartバンドルのファイル群
      ./Controller
      ./Model
      ./Resources
  ./vender
    ./symfony
      ./src
        ./Symfony => Symfony2のコアファイル群
          ./Compornents
          ./Foundation
          ./Framework
            ./WebBundle => Webバンドル
              ./Controller
              ./Resources
              ./Console
              .... 他多数

これまでモジュールと呼んでいた単位がバンドルという名称で呼ばれているようです。

モジュール単位ではなくプロジェクト単位のようです。

そして、Webバンドルというものがコアに存在しconsoleコマンドはこのConsoleにあるファイルを使っていました。

そこで、自分のバンドル内にコアファイルで利用しているファイルをコピーしてきました。

/src/vendor/symfony/src/Symfony/Framework/WebBundle/Consoleを

/src/Bundle/CartBundl/Consoleにコピーし、コピーしたファイルのnamespaceをコピー先のパスに書き換えます

// namespace Symfony\Framework\WebBundle\Console; // 旧
namespace Bundle\CartBundle\Console; // 新

そして、拡張したい内容をコーディングします。

アプリケーションのconsoleコマンドファイルのuseを書き換える

consoleコマンドファイルを開きuseを拡張したnamespaceに置き換えます。

//use Symfony\Framework\WebBundle\Console\Application; // 旧
use Bundle\CartBundle\Console\Application; // 新

namespaceのおかげで拡張するクラス名やメソッド名は一切変更していません。変えたのは名前空間と実装部分のみです。

sfという接頭辞ももう見なくなっちゃいますね。

さて、拡張した結果以下のようにしんふぉにゃんを出すことだって簡単に...

f:id:brtRiver:20100218231443p:image

しんふぉにゃんについてはsymfonyの非公式マスコットが作成されたようです - モノノフ日記

AA作成についてはASCII Art Generator - Make your picture into textを利用させていただきました。

*1:このオプションを利用するためにはPHPが--with-readlineコンパイルされている必要があります。

2010-02-17

[]Symfony2 プレビュー版リリース

f:id:brtRiver:20100218063936p:image

no title

フランスではSymfonyカンファレンスが開催され、Symfony2のプレビュー版がついさきほど公開されました。

残念ながら日本からtwitterタイムラインを眺めつつ雰囲気を味わっていたのですが、そのまとめをちょこっと。

イベントの公式サイトは以下のとおり。

no title

かなり濃厚な発表が色々あったようです。

以下気になった事

Doctrine2ではマジックメソッドをまったく使っていない => 予想以上に速くなった

Doctrineを使い始めて最初に大変な思いをしたのが、マジックメソッドが多いため、どのように処理されているかを追うことでした。

個人的にも嬉しい対応。

Doctrine 2 - Not The Same Old Php Orm

Symfony2ではログやキャッシュZend Frameworkを使う

ZFのキャッシュを使ったことがありますが、使いやすかったです。わざわざ新しい事を覚える必要がないのでこれも嬉しいですね。

ZFのプロジェクトリーダーのMatthew Weier O'Phinneyさんのスライドは以下から。

404 error. Page Not Found.

symfonyで冗長構成なアプリケーションを作るための解説

なかなかまとまった情報ってなかったので嬉しいスライドです。参考になる方も多いのではないでしょうか?

Symfony in the Cloud

次期phpBBはSymfony2で開発される

なぜSymfony2を選んだかの理由はわかっていませんが、参考となるサンプルコードとしても利用できるので嬉しいです。

公開質問状(open letter)でphpBBコミュニティからの回答が掲載されていました。

no title

まとめると、車輪の再開発をしなくてよい。Symfonyのコミュニティを活用できる。拡張性。新しいマーケット開発の手段として独自フレームワークでなく既存フレームワークを選択した。などなど。

Fast as hell (Symfony2はめっちゃ速い)

  • symfony1.4.2より2.5倍速い
  • Symfony2はsymfony1系の半分のメモリ使用量

素直に歓迎。他とのフレームワークとも比較してましたがここでは触れません。

速度なんて実装の仕方やサーバーのスペックやインフラに影響受けますから。

参考程度に見たい方は以下のページでどうぞ :-)

no title

easy to learn (マスターするのが簡単)

正直ここは「symfony1系と比べて」+「PHP5.3の機能(とくに名前空間)の理解をしていること」が前提だと思います。

ただ、実際にSymfony2を触った感じではテンプレート周りがすっきりしたので多少はデザイナーとの共同作業も楽になりそうです。

hogehogeSuccess.phpのようなMojavi負の遺産が無くなっただけでも大きいです。

デバッグツールバーが画面下に固定表示

デザインの邪魔になりません。画面の縦が短いネットブックのような環境では辛いかもしれません。

フォーム操作は今のところsymfony1.4系と同じ => sfFormを使う

1.4系の資産がそのまま使えるという点では嬉しいですが、他のコンポーネントに比べてかなり複雑なので新しいコンセプトのFormコンポーネントが登場することに期待。

正式リリースは2010後半

今年中にリリースする案件での使用は避けたほうが良いそうです。でもPHP5.3の学習も兼ねて触ってみるにはとても楽しいと思います。

Symfony2を触ってみた

現段階ではCLIインストーラーなどが無いようで、sandboxをダウンロードしてきて動かす方法になります。

ってブログ書いている間にid:co3kさんのレビューがあるので、そちらをどうぞw

no title

また、公式サイトで画像入りは以下にあります。デバッグツールバーなどのキャプチャも見れます。

no title

まだ本格的に使うには厳しそうですが、雰囲気は十分に伝わってきます。これまでのsymfonyとは全くと言って別モノだというのが分かります。PHP5.3の環境がある方は名前空間の勉強も兼ねて触ってみてはいかがですか?

それにしても、Lithiumもそうですが、PHP5.3の名前空間に慣れないと駄目ですね。

追記:

Fabienさんのスライドが公開されました。Symfony2 revealed

追記2:

phpBBがSymfony2を採用する理由について書かれたサイトがあったのでリンクを追加

2010-02-03

[][]MongoDBを使ったセッション管理

MongoDBを使ったセッション管理のほうがMySQL(PDO)より確実に速いよね?でも、そのためのクラスが用意されてないよね?

ってことで、書いてみました。

no title

書いたといっても、DBのセッション管理クラスをそのまま書き換えたぐらいです。

設定

使い方はfactories.ymlにて以下のように設定。

レプリケーションさせたりというところまでは考慮してません。

   storage:
     class: sfMongoSessionStorage
     param:
       host: localhost          #接続先
       port: 27017              #ポート
       db_name: symfony         #DB名
       collection_name: session #コレクション名

結果

ざっくばらんにローカル環境でab -n 5000 -c 100 した結果

MySQL   => Requests per second:    10.86 [#/sec] (mean)
MongoDB => Requests per second:    16.61 [#/sec] (mean)

Default => Requests per second:    17.58 [#/sec] (mean)

思っていた以上にMongoDBが優秀な結果に。CPUの使用率の問題などありますが使えそうです。

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |