AwesomeFrameworkにForwardを実装しました。

AwesomeFramework-0.2.zip

<?php
include $_GET["action"] ? $_GET["action"].".php" : "default.php";
function forward($action) { include $action.".php"; }
?>

なんて高機能なんだ。
これでViewにforwardすることでModelとViewとControllerがそろってると言えるのではないだろうか!!

AwesomeTemplateEngineと同様、PHPファイル自体をテンプレートとして使用しますがAwesomeFrameworkはあくまで、$GLOBALS経由でテンプレートに値を渡します!

Actionのファイル:

<?php
$GLOBALS["message"] = "World";
forward("view");
?>

Viewのファイル:

Hello <?=$GLOBALS["message"]?>!

あと、今思いついたんですが、

module/
 action.php
index.php
index.php?action=module/action

ってやってモジュールによって管理する機能搭載!とか言えないでしょうか・・・。

Harukiからの平面波

個別処理に関数やクラスを使っても良いが、各caseで関数などのコールが入るだけで、やることは変わらない。

PHPのフレームワークは、個別処理をどう別けて記述するかを決めるところが肝であって、mojaviとか見たいに、コントローラクラスなんて作らなくてもいいやんと言う気もする。柔軟性高いし速いし。

Harukiさんのフレームワークについての考察。
振り分け処理(あえてコントローラーとは言わない)の最小限サンプルを書かれています。

確かにFront Controller Patternといってもやりたいことはこれだけスね。
それに比べた場合、他のフレームワークの便利な点は何か?

  • 名前空間が分かれている
  • エントリポイントに制約(仕様)がある

名前付けとか開放・閉鎖原則とか単にオブジェクト指向の便利な点と変わらなくなってしまいました。

クラスになると名前空間を分けることができるけれど、(クラスに対してコンパイラがやっているように)関数名と変数名にPrefixを付ければ同じことになる。

JavaやPHP5のように仕様を強制できる仕組み(インターフェースとか)があると個別処理が交換可能なことが保障されるので便利。だけど仕様を覚えるのが面倒。

これを全部とっぱらって柔軟性が高くて習得コストが低いのを売りにしたフレームワーク(的なもの)っていう方向性も面白いなと思いました。

そこで、昔面白いなと思った「7行のテンプレートエンジンAwesomeTemplateEngine」に対抗して「1行のフレームワークAwesomeFramework」を作ってみました。

AwesomeFramework 0.1(HelloWorldサンプル付属)

そのソース:

<?php include $_GET["action"] ? $_GET["action"].".php" : "default.php"; ?>

これを使ってある程度のアプリを作ろうとすると、逆に名前空間のありがたさとか(グローバル変数地獄)を身をもってわかって良いかも知れない!

[を] 言及リンクのないTrackBackについて

自分の記事へのリンクがあればまあ良いかなと思っています。
リンクのありなしでしょんぼり度がかなり違いますからね。

これはありますね。

大量のトラックバックスパムに紛れて本物のTBキター!
 ↓
自記事への言及無し
 ↓
ガッカリ・・・
 ↓
少しでも関連のあるサイトに片っ端からTB打ったのかも?
 ↓
むしろ小腹すら立つ

Mojavi2、こんなFilterはどうだろうか。

<?php
class MessageFilter extends Filter {
    function execute(&$filterChain, &$controller, &$request, &$user) {
        if ($request->hasAttribute("messages") === false) {
            // global messages
            $globalMessagesPath = BASE_DIR."configs/messages_".DEFAULT_LANG.".ini";
            if (is_readable($globalMessagesPath)) {
                $messages = parse_ini_file($globalMessagesPath);
            }
        }
            // module messages
            $messagesPath = $controller->getModuleDir()."config/messages_".DEFAULT_LANG.".ini";
            if (is_readable($messagesPath)) {
                $messages = array_merge($messages, array($controller->getCurrentModule() => parse_ini_file($messagesPath)));
            }

            $filterChain->execute($controller, $request, $user);
        }
    }
}
?>

messages_ja.ini, messages_en.iniとか置いといて読み込むことで多言語化の枠組みを提供するFilter。

アプリ共通のiniとモジュール毎のiniを両方読み込む。
strutsのように環境変数から勝手に切り替えるようにしたいんだけどHTTP_ACCEPT_LANGUAGEのパースが面倒臭い。MojaviのRequestにもServletRequest.getLocale()があれば・・・。

RubyForge: Welcome

rubyforge.png

RubyForge is a home for open source Ruby projects; thanks to the folks who make it possible!

RubyForgeて、
Ruby界隈はどんだけアツいんだよ!

Tociyuki::Diary – Perlによる依存性の注入のデモ

JavaにはSpring、RubyにはNeedleやCoplandなどのDIフレームワークがありますけど、Perlでは目立たないなと思って試しに書いてみたわけです。

RubyのDIコンテナ、NeedleとCopland。メモ。

Mojavi Japanなど含めて2~3日サイトがアクセスできない状態にありました。
土日、LAN内からは見えてたから気づかなかったです・・・。
「落ちてる!」と教えてくれた方々、ありがとうございました。

・・・というかdist-upgradeの誘惑に負けた。

先週、社内でPHPに関する質問メールを頂きました。

「MojaviのRequestクラスのsetAttributeメソッドとsetAttributeByRefメソッドの違いがわからない。」

というものです。
値渡し参照渡しの違いですが、おれ自身、参照を本当に理解しているかあやしいもんです。本当に理解していないとわかりやすく説明することはできません。
概念を本当に理解したかどうかは言語化(コード化)、もしくは図にできるかどうかで判断することにしています。

Prove it.(証明せよ)」ということでMojaviでのサンプルを作ってみました。

ref-0.1.zip

<?php
class DefaultIndexAction extends Action {
    function execute(&$controller, &$request, &$user) {
        $value = "foo";

        $request->setAttribute("value", $value);        // real
//        $request->setAttributeByRef("value", $value);    // ref

        $value = "bar";

        echo $request->getAttribute("value");
        return VIEW_NONE;
    }
}
?>

setAttributeとsetAttributeByRefで動作が変わる最小限サンプルです。
質問への回答はメールに返信してこのサンプルも一緒に送ったんですが、果たして解りやすい説明だったかどうか・・・自信がイマイチです。

でろでろの押切蓮介短編集。

とても楽しい。
特に卒業式の日にサメの幽霊に襲われてしまうお話、「卒業シャーク」はすごい。
ただでさえ恐ろしいホオジロザメが幽霊になったらその恐ろしさは計り知れません。

hoojirozame.jpg

timaki.jpg

恵比寿駅でチマキ。