2012年2月1日水曜日

AmidaMVC:appHelloを書いてみよう

今度はちゃんと俗に言うModelみたいな書き方を。

「demo/hello」フォルダーを作ります。
その下に「_App.php」ファイルを作って、



<?php
$_ctrl->prependComponent( 'appHello',  'app' );
class appHello extends \AmidaMVC\Component\Model
{
    static function actionDefault(
        \AmidaMVC\Framework\Controller $ctrl,
        \AmidaMVC\Component\SiteObj &$siteObj  )
    {
        $html = '<h1>Hello Application</h1>' .
            '<p>Hello World from Application</p>';
        $siteObj->setContents( $html );
    }
}

と書き込みます。

次のURLにアクセス。
http://your.host.here/pathto/AmidaMVC/demo/hello/

your.host.herepathtoは適宜環境に合わせてください。
すると、


と表示されます。

今度はたくさんのルールがあります。

_App.php

アプリケーションは_App.phpファイルにあるという規約になってます。

自分自身をコンポーネントとして登録

Componentとして自分自身をチェーンに登録する必要があります。
AmidaMVCのコントローラーが$_ctrlで取得できるので、prependComponentメソードを使って登録しています。

$_ctrl->prependComponent( 'appHello',  'app' );

ここにクラス名(appHello)を入れます。
この時点では、Loaderコンポーネント内で動いています。次に実行するコンポーネントとしてクラスを登録することになります。
正直、これは格好悪いと思いってます。クラス名を固定にしてコントローラー側で自動で読み込ませようかと思ったのですが、規約を増やすより、自分でコード書いた方がいいかな、と思って。というのは嘘で、ここでViewも読み込ませたいのですが、二つのクラスを上手に読み込ませるよい規約を思いつかなかったからです。

actionDefaultメソード

Loaderがファイルを読み込んだ後、appHelloクラスを実行します。
このURLだとアクションはデフォルトになります。なのでactionDefaultメソードが呼ばれることになります。

変数は3つあります。
  • $ctrl:AmidaMVCのコントローラーオブジェクト。
  • $siteObj:ウェブサイトに関するデータを収集するオブジェクト。
  • $data:前のコンポーネントから受け渡されるデータ(必要なければ無視)。

HTMLを返す

結果のHTMLは$siteObjに登録します。
これがRenderに運ばれて、テンプレートなどの処理を行います。

$siteObj->setContents( $html );


個人的な感想・・・

ちょっと書いてますが、もっと規約を増やして自動で処理する項目を増やしたほうがいいかもしれません。

  • たとえばRenderが受け取る$data(3番目の変数)は常にコンテンツにするとか。するとappあるいはviewメソードの最後にHTMLをreturnすればRenderが受け取ってコンテンツとして処理してくれるとかです。
  • それから、コンポーネントの登録を自動で行うとか。
  • _initメソードを前もって呼び出すとか。

フレームワークは作っていて楽しい理由は、ここら辺でしょうね。
やりすぎて使いにくくならないようにするのが難しいのかもしれません。

0 件のコメント: