読者です 読者をやめる 読者になる 読者になる

Pinoco 0.2.3 リリース

PHP

拙作の「ダイナミックWebサイト向けフレームワーク」、Pinocoを公開します。悩ましいバグが取れたので、今こそ言うタイミングだ、ということで。

pinoco - web site environment using PHP and TAL - Google Project Hosting

このところブログの更新が怠っていたのは、秘密でこんなことしてたせいです。すみません。

ちょっと説明を。

このソフトウェアは、ダイナミックWebサイト、つまり、一般公開されるWebサイトを主なターゲットとした、プログラマーよりデザイナーを尊重するフレームワークです。動作環境はもちろん、一般公開サイトなので、ステートレスでCGIほどひどくない、そう、PHPです。

一般公開される企業サイトなどを作るとき、デザイナーとプログラマーは、互いに相手の作業を待ち合った経験があると思います。「いまPHPタグを埋めているので、そのあとHTMLの体裁をいじってください」「いまHTMLに起こしているので、それが全部できたら渡します」という感じで。フォルダ構成が入り組んだプロジェクトに、適切にテンプレートファイルを取り込むのは、少々骨が折れる作業で、とても継続的かつ非同期に行える気がしませんね。

でもこれって、せっかくチームで作業を分担しているのに、実は、両方のスキルを持った人が一人でやったほうが、結果としてパフォーマンスが高くなってしまいますよね。

さあ、そんな経験談に首を縦に振ってくれる方は、ぜひPinocoを評価してみてください。

Pinocoはデフォルトのテンプレートエンジンとして、PHPTALを使います。

PHPTAL :: Template Attribute Language for PHP 5

このエンジンは、Zopeから生まれたTALというアイデアをPHPで実装したものです。「XHTMLの拡張名前空間を使って、タグの属性に制御コードを書く」という構文を持っているため、つねにXHTMLバリッドであり、また、HTMLファイル単体で見た場合にも、テキストノードにゴミが入らないというメリットがあります。そう、Dreamveaverの通常のHTMLの機能だけで編集できるんです。

さらに、PHPTALはデザインレイアウト上すごく役に立つマクロ機能を持っています。全体のデザインとコンテンツの本文を切り分けるのは基本中の基本。デザイナーは、このエンジンのマクロ機能だけでも、Dreamweaverのライブラリから乗り換える価値があるでしょう。

しかも、パフォーマンスはSmartyと同等なレベルです。デザイナーにSmartyを学習してもらうぐらいなら、PHPTALのほうが圧倒的に良いでしょう。

PHPTALの宣伝おわり。

ここからがPinocoの話です。いまから、Pinocoの典型的なワークフローを紹介します。

まず、HTMLデザイナーがXHTMLを書きます。Photoshopワークだけではありません、本物の実装も、デザイナーが主導するのです。

HTMLを書くとき、CSSJavaScriptへのリンクは、ファイルシステムと同じ相対パスのままで大丈夫。書いたものをそのまま、サイトのドキュメントルートに置くと、Apacheを経由してブラウザにアウトプットが得られます。はい、本当にプログラムをまったく書いていないのに、フレームワークの実環境からアウトプットが得られるのです。まるでスタティックサイトのワークフローですね。けれど、このときすでに、サーバプログラムは動いているのです。

/htdocs/test/hello.html

<p>Hello <span>World</span></p>

プログラマーは、デザイナーが書いたHTMLに対応するファイル名の「フックスクリプト」を記述します。スクリプトの格納場所は、ドキュメントルートではないどこか別のフォルダでもかまいません。というか、そうしてください。Pinocoでは、完全にビュー/ロジックが分離されています。

スクリプトの記述には、クラス宣言も関数宣言も要りません、ほんとうに「やりたいことだけ」を書きます。それだけで、HTMLにアクセスしたとき、何かの処理が動きます。PinocoのAPIはすごく少なくて、機能や書き方を押し付けません。記述の自由度は、ほとんど生PHPと同じで、ユーザは好きなライブラリを使うことができます。

/app/hooks/test/hello.html.php

<?php
$this->world = "Pinoco";
?>

※ご安心を、この手続きのスコープは、グローバルではなく、システムから隔離された関数の中です。

もういちどHTMLに。せっかくのデザインレイアウトを崩さないように、属性に制御を仕込みます。これで作業は完了。

/htdocs/test/hello.html

<p>Hello <span tal:content="this/world">World</span></p>

たったこれだけで、スタティックなページがダイナミックに生まれ変わりました。

Dreamweaverでもブラウザでも、ローカルファイルシステム上のプレビューはまったく崩れていません。でも、じっさいにWebサーバからのアウトプットは。「Hello Pinoco」となっていることでしょう。

デザイナーは、追加されたタグの属性に注意して、このファイルをありのままスタイリングし、好きなときにアップロードできます。同時にプログラマーは、フックスクリプトに十分な機能を実装し、まとまったら、デザイナーの仕事に合体させます(それまでは仮のプログラムを渡しておく)。

デザイナーが後からスタイリングできるなら、HTMLのお化粧が完成している必要はないので、プログラマーへのHTMLページ提供はずっと早くできるでしょうし、プログラマーが機能を詰めている間にも、後回しにした飾り付けをやっておけます。

ふだん生のPHPを書いているけれど、ファイル管理に一貫性がなくてやりにくいと思っている方、ふだんフレームワークを使っているけれど、外向きには重すぎて使えないと思っている方に、すごくオススメです。もちろん、簡単でいいけどサーバサイドの技術がどうしても要るデザイナーにも。

PHPTALのパフォーマンスはSmarty相当、PinocoのPHPTALを除くパフォーマンスは、おおよそ、CodeIgniterと同じレベルです。性能は極端に高くはないけど、一般公開サイトとしても、まあ妥当なレベルかと思います。主なターゲットとして一般公開サイトを主眼にしていますが、データ管理アプリケーションを作る場合でも、生のPHPに比べればずっと生産性が高くなります。場合によっては、高級なフレームワークよりも生産的だったりします。(実話)

ちなみに、Pinocoはデータベース関連の機能を提供しませんので、生のAPIを使うなりdoctrineを導入するなり、好きな方法でやってくださいね。データの複雑さに応じて、適当なデータアクセス層を自由に選べるほうがいいですよね。たぶん。(一応、ソースコードリポジトリには、PDOをより便利にするラッパーがあります)

あと、すでに公開されているサイトに動的ページを後付けする場合、追加するHTMLとフックを、ファイルとして場当たり的に追加できます。ひとつのURLアクションが独立したひとつのファイル(しかもただ逐次処理が順に書いてあるだけで、周りにあわせるための書式なんてない)になる。オブジェクト指向やURLマッピングが必須だと、そういうわけには行きませんね。

Pinocoは簡単/安直だから劣ってるというわけじゃなくて、むしろ、現実の仕事にとってより実用的な解になる、そんな感じを目指しています。バージョン管理ソフトのログでファイル名だけ見て、どのアクションに手が入ったか、すぐ見れたり、リクエスト中で使わないとわかりきってる、アクションに対応しないその他すべてのクラスメンバをパースする必要もないし。

まとめます。

  • デザイナーから見える世界はスタティックサイト
  • プログラマーは任意のURIにフックを仕掛ける
  • 妥当な速さ
  • 必要なライブラリを自由選択
  • あくまでファイル単位での構成=即物的で現実的

他にもいっぱい、ここがおいしいと言える特徴があるんですが、とりあえずこのへんで切り上げ。他はまあ、実際に動かしてみてください。

使いたい方はLGPLでご自由にどうぞ。そして使った方はぜひ、ご意見ご感想を。Google codeのプロジェクト情報やソースコードを見れば、コンタクト方法がわかると思います。