実際のアプリケーション構築は、「アクション、(ビュー、) テンプレート」を追加していく作業の繰り返しとなります。
"CRUD"というのを聞いたことがあるでしょうか?
Create, Read, Update, Delete の略です。 ウェブアプリケーションの仕事のほとんどは、この"CRUD"処理を行うことです。
ツイッターで例えると、
- つぶやく,ふぁぼる(Create)
- タイムラインを表示する、ツイートを表示する(Reade)
- 自己紹介プロフィールを変更する(Update)
- ツイートを削除する(Delete)
となります。
(ふぁぼるが"Create"なのに違和感があるかもしれませんが、"Favoritesというリソースを追加成する"と考えてください 。)
上記CRUDの各処理を、Ethnamでは「アクション」という言葉で表現します。 「作成アクション」「表示アクション」「更新アクション」「削除アクション」のような感じです。
さっそく画面を追加してみましょう。
画面を作るには、まずアクション名を決める必要があります。
ここではアクション名をhello
としましょう。
そうすると、URLは/?action_hello=true
となります。
次に、アクションクラスファイル名は、app/action
に以下のような命名規則で作成します。
- アクション名の先頭を大文字にします
- '_'を'/'に置き換え(= ディレクトリで区切り)続く文字を大文字にします
従ってファイル名はapp/action/Hello.php
となります。
さて、ではクラスファイルapp/action/Hello.php
を作成してみましょう。
クラス名はSample_Action_Hello
です。
- Ethna_ActionClassを継承したクラスを定義します
- Ethna_ActionClassのperform()メソッドをオーバーライドして、行いたい処理を記述します
- perform()メソッドの戻り値として遷移名(画面を表す名前)を返します
<?php
class Sample_Action_Hello extends Ethna_ActionClass
{
public function perform()
{
return 'hello';
}
}
このクラスでは、サーバ側では何も処理を行わずに'hello'という遷移名を返しています。つまり
「なにもしないで'hello'という画面名を表示する」
という処理になります。
アクションクラスファイルを毎回1から手で書くのは面倒なので、ethnam-generatorコマンドのadd-actionオプションを利用して、ひながたを生成することも出来ます。
$ vendor/bin/ethnam-generator add-action hello
画面に何らかのパラメータを渡したい場合は、ビュークラスを作成することで実現できます。
'hello'という遷移名に対応するビュークラスファイルは、アクションクラスと同様にapp/viewに以下のような命名規則で作成し
- '_'をディレクトリで区切り
- ファイル名は大文字で開始し
つまりhello画面に対応するビュークラスファイルはapp/view/Hello.php
となります。
クラス名はSample_View_Hello
となります。
app/view/Hello.php
の中身を以下のように書きます。
ここでは、現在時刻をパラメータとして渡します。(setAppというのが画面にパラメータを渡すメソッドです。)
<?php
class Sample_View_Hello extends Ethna_ViewClass
{
public function preforward()
{
$this->af->setApp('now', strftime('%Y/%m/%d'));
}
}
preforward()メソッドはテンプレートのレンダリング前に呼び出され、テンプレートに任意のパラメータを渡すことが可能です。ここでは'now'という名前で現在時刻を渡しています。
ビュースクラスファイルを毎回1から記述するのは面倒なので、ethnam-generatorコマンドのadd-viewオプションを利用して、スケルトンファイルを生成することも出来ます。
$ vendor/bin/ethnam-generator add-view hello
この時に-tオプションをつける事によって、同時にテンプレートのスケルトンファイルが生成されます。
例:
$ vendor/bin/ethnam-generator add-view -t hello
また、ビュークラスが不要な場合(単純にテンプレートを表示したい場合等)は、ビュークラスの記述を省略することも可能です。
次に、テンプレートファイルを作成します。
テンプレートディレクトリは template/ja_JP
なので、template/ja_JP/hello.tpl
を作成します。
Hello Ethnam<br />
current time: {$app.now}
実際には、毎回テンプレートを1から記述するのは面倒なので、ethnam-generatorコマンドのadd-template オプションを利用して、スケルトンファイルを生成することも出来ます。
$ vendor/bin/ethnam-generator add-template hello
以上でアクション、ビュー、テンプレートの追加は完了ですので、実際にアクセスして動作を確認します。
http://localhost:8000/?action_hello=true
Hello画面が表示されれば成功です。
上記のとおり、アクションクラス、あるいはビュークラスで
$this->af->setApp('foo', 'bar');
として値を設定すると、テンプレート側で{$app.foo}
として値を取得することができます。
Smartyの使い方についてはSmartyのドキュメントを見てください。 (なお、Ethnamがサポートしているのは今のところSmarty 2のみです。v3はサポートしていません。)
Ethnamのコントローラ、アクション、ビューは、以下のように動作します。
- Action Classは、実行中に取得したダイナミックな表示データをAction Formオブジェクトに格納します
- アクションクラスは、コントローラに遷移名を返します
- コントローラは、アクションクラスから返された遷移名に基づいて、ビューオブジェクトを生成します
- ビューオブジェクトは、ダイナミックな表示データをアクションフォームから取得します
- ビューオブジェクトはSmartyオブジェクトを生成し、必要な変数をSmartyオブジェクトに設定します
- テンプレートを出力します