Piece Uploader (仮)

Piece Franework の最新版がリリースされたので、さっそく example を使ってみました。

  • Layout 素晴らしい。自分でテンプレートごとに共通のヘッダとフッタを <flexy:include> していたのが何と無駄だったことか。
  • Interceptor_Authentication これも便利。設定でちょっと注意あり。(後述します)

Piece_Unity 0.9.0 の新機能は他にもたくさんありますが、まだほんの触りなので、詳しくはこれから追いかけていきます。

Interceptor_Authentication

最初にテストしたときは、サンプルの B. Authentication - 2. A resource ... で Interceptor_Authentication が効かず、なんでやねん? と思ったわけですが、原因は設定にありました。
piece-unity-config.yaml で Interceptor_Authentication の設定がしてあるのですが、Interseptor の対象となる URL およびリダイレクト先の URL はドキュメントルートからの絶対パスで指定するようになっており、今回は htdocs をドキュメントルートに設定していなかったので Intersepotr が働かなかったというオチでした。
実運用サーバと開発用サーバでドキュメントルートからのパスが異なるのは予期せぬ問題の種となりやすいので避けた方が無難なのですが、しかしそのような場合もあります。
そこで、Add-Hook な解として Interceptor_Authentication の対象を増やしてみました。本来は複数の異なる認証フローを利用するための手段だと思われますが、こういう使い方もできますね。*1

--- /usr/local/share/pear/data/Piece_Unity/data/examples/webapp/config/piece-unity-config.yaml
+++ ./webapp/config/piece-unity-config.yaml
@@ -80,7 +80,16 @@
     - name: services
       type: configuration
       value:
-        - name: Example
+        - name: ExampleLocalHost
+          guard:
+            class: AuthenticationAction
+            method: isAuthenticated
+          url: "http://example.org/test/piece/htdocs/authenticate.php"
+          resources:
+            - /test/piece/htdocs/protected-resource.php
+          useCallback: true
+          callbackKey: callback
+        - name: ExampleVirtualHost
           guard:
             class: AuthenticationAction
             method: isAuthenticated

※サンプルを普通に動かすだけなら url と resources を適宜書き換えるだけで十分です。また、複数のエントリポイントに対して同じ認証を透過的に行うには resources の子要素を追加するだけで OK です。
ちなみに Web 側では Piece の機能により、特に意識しなくても URL の解決ができます。これもステキですよ。

AHAH


何だか楽しいことになってますがコラではありません、exclusive なフローと XMLHttpRequest の組み合わせで起こりうる現象です。
具体的には、いったん exclusive なフローを実行し、別ウインドウで同じフローを開始すると既存の古いフローが破棄され、続けて古いフロー側で submit すると、さらに先ほど開始したフローが破棄され、新しいフローのレンダリング結果がレスポンスとして帰ってきて画像の状態になったというわけです。*2
しかしこの問題はそう遠くないうちに解決されるでしょう。(Google グループの Piece Framework Developers (ja) を参照されたし)

Piece Uploader

ようやく本題。これから Piece Framework の勉強も兼ねてサンプルアプリケーションを作っていきます。
なるべくコンパクトなアプリケーションで、なるべく多くの Piece の機能を使うに適した題材は何か?
ということで、ファイルアップローダを作ってみることにしました。


下記の5つのフローからなるアプリケーションを計画しています。

  • index
    • non-exclusive
    • ページ遷移には Renderer_JSON を使う
  • upload
    • exclusive
    • password, expires を設定可能
    • アップロード可能なファイルタイプの判別に Validator_File を使う
  • download
    • exclusive
  • authenticate
    • exclusive
  • log
    • non-exclusive
    • Interceptor_Authentication あり

ユーザ登録機能と Privilege 機構もやってみたいとは思いますが、ひとまず後回しですね。


制作の過程は本家ドキュメントファームに書いていきますので、ご期待ください。
なお、僕自身このアプリケーションを作りながら Piece の作法を学んでいきますので、はじめはおかしな点もあると思いますが、それも徐々に洗練されていくはずです。

*1:VirtualHost なり何なりで DocumentRoot を揃えた方が結局は楽だし、分かりやすいと思います。

*2:画像では見た目をよりドラスティックにするために同じ作業をくりかえしています