Skip to content

Latest commit

 

History

History
175 lines (107 loc) · 6.82 KB

12-add-action-view-template.md

File metadata and controls

175 lines (107 loc) · 6.82 KB

Hello画面を作成する(アクション、ビュー、テンプレートを追加する)

実際のアプリケーション構築は、「アクション、(ビュー、) テンプレート」を追加していく作業の繰り返しとなります。

CRUD = アクション

"CRUD"というのを聞いたことがあるでしょうか?

Create, Read, Update, Delete の略です。 ウェブアプリケーションの仕事のほとんどは、この"CRUD"処理を行うことです。

ツイッターで例えると、

  • つぶやく,ふぁぼる(Create)
  • タイムラインを表示する、ツイートを表示する(Reade)
  • 自己紹介プロフィールを変更する(Update)
  • ツイートを削除する(Delete)

となります。

(ふぁぼるが"Create"なのに違和感があるかもしれませんが、"Favoritesというリソースを追加成する"と考えてください 。)

上記CRUDの各処理を、Ethnamでは「アクション」という言葉で表現します。 「作成アクション」「表示アクション」「更新アクション」「削除アクション」のような感じです。

Hello画面を追加してみる。

さっそく画面を追加してみましょう。

画面を作るには、まずアクション名を決める必要があります。 ここではアクション名を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オブジェクトに設定します
  • テンプレートを出力します