unoh.github.com

Django風PHPフレームワークPlufを試してみました

Sun Jun 14 20:37:50 -0700 2009

最近マジクエストというアトラクションにはまっています。
Keitaです。

PHPには、CakePHPやsymfony、EthnaやrhacoとかCodeIgniterやPiece Frameworkなどなどいろいろフレームワークがありますが、探してみるとこういったよく耳にするフレームワークのほかにもいろいろなフレームワークがあります。

Do You PHP はてなの記事で知ったのですが、The Big List of PHP Frameworksといった記事も出ているようです。

最近では、RubyのSinatraライクなフレームワークもちょこちょこ出てきているようで、yamaokaが社内の勉強会にて発表してくれていました。
さて、そのThe Big List of PHP Frameworksの僕自身そのリストの膨大さに愕然としてまったくその内容やソースを追いかけていませんでしたのですが、先日偶然に「Django風のルーティングなフレームワークほしいなー」とか考えて探していたらPlufというフレームワークがひっかりましたので、簡単に試してみました。

Plufの特色

詳しくは公式のドキュメントを見てもらうとしておおむねざっくりと僕の理解で書かせていただくと、Djangoの機能を「シンプル」に実装したPHPフレームワークというイメージです。
なぜシンプルにという部分を強調したかというと、難しいと思われる機能をシンプルに実装することによって非常に高速に動作します。

ここらへん難しいことをシンプルに行うというPHPの思想(?)にあってるなという印象があります。 また、Python風のコードを移植するとなんとなくコードの書き方もPython風にしたくなりますが、PHPの標準のコードともいえるPEAR風の書き方になっておりここらへんも個人的にはとてもポイントが高かったです。

シンプルなコード

$ctl[] = array('regex' => '#^/hello$#',
               'base' => '/index.php',
               'model' => 'Unoh_Views',
               'method' => 'hello');

class Unoh_Views 
{
    public function hello($req, $arg)
    {
        return new Pluf_HTTP_Response('Hello Pluf!');
    }
}

ルーティングは正規表現で記述します。 正規表現や名前つきの正規表現をサポートします。
$ctl[] = array('regex' => '#^/sample/(\d+)/$#',
               'base' => '/index.php',
               'model' => 'Unoh_Views',
               'method' => 'year');

class Unoh_Views 
{
    public function hello($req, $arg)
    {
        return new Pluf_HTTP_Response($arg['year']);
    }

}

テンプレート

テンプレートエンジンを独自(?)にもっており継承をサポートしています。
$ctl[] = array('regex' => '#^/template/$#',
               'base' => '/index.php',
               'model' => 'Unoh_Views',
               'method' => 'template');
Views
    public function template($req, $arg)
    {
        return Pluf_Shortcuts_RenderToResponse('unoh/template.html',
                                                array('data' => 'data')
                                               );
    }

Base.html(元になるHTML)
<html>
<head>
<title>{block title}{/block}</title>
</head>
<a href="{url 'Unoh_Views::date', array('2009', '06')}">2009/06</a>
{block body}{/block}
</html>

template.html(実際に表示するhtml)
{extends 'unoh/base.html'}

{block title}test{/block}
{block body}<span style="color:red">ボディ</span>{/block}
またテンプレート関数のurlはディスパッチャの設定の指定を見てURLを生成してくれます。

そのほか

formやバリデートを行うクラスや、ORマッパができるモデルやテストツールマイグレーションまでかなり幅広く用意されていますが今回は省略します。

まとめ

PHPには追いきれないほどのフレームワークがあります。
もちろんすべてを使う必要はありませんが、フレームワークにはそれぞれいろいろなノウハウが入っており、コードを読んで勉強するというは非常によいことかなと考えています。

また有名どころではなくても面白いものがいっぱいありますので、是非、いろいろなフレームワークを試すととても勉強になりそうです。

何かのご参考になれば幸いです。