404 motivation not found | t_ishidaのブログ

2月/09

9

フレームワーク(笑) – その2 – Actionクラス

Actionクラス

概要

ブラウザからURLを叩かれた時に動くプログラムです。ActionBaseを継承して作成します。このクラスに実装するのは、主に「validate,doService」の二つです。

主に使う変数

$this->GET
GET値が入ってます。さらに”exts”と言う名前でpackage,actionの解析で余った値が順番に、配列で入ってきます。

$this->POST
POST値が入ってます。

$this->COOKIE
COOKIEが入ってきます。

$this->SESSION
SESSIONが入ってきます。これに値を設定するとフレームワーク(笑)がセッションに書き戻します。

$this->FILE
input type=”file”が入ってきます。フレームワーク(笑)が勝手にuploadして、

array( ‘name’ => ‘一時ディレクトリのpath’ )

と言う値にして入ってます。

$this->REQUEST
$_REQUESTです。

validate

ジェネレータが吐いたソースを見ると分かると思うのですが、ここでPOSTやGETで渡ってきたデータをチェックします。

このメソッドでtrueを返せば、処理を続行しdoServiceメソッドが呼ばれます。falseを返せばエラーページとして設定されているページを表示します。エラーメッセージは

$this->Data['msg']

のようにして保存しておき、エラーメッセージ用のテンプレート側で受け取って表示する。と言う手順になります。

一応上記のエラー表示を基本に据えていますが想定しているのはAjaxを使って画面の遷移を行わないパターンです。ジェネレートしたままだとその仕組みになっているはずですJavaScriptとサーバーの両方で入力チェックするのが面倒くさいのでこうしています。JavaScriptを無効にしている人は普通にエラーページに飛びますが、多くの人は画面遷移無しに操作出来ることでしょう。

validateの必要無いようなリクエストを捌く場合には、

return true;

だけ返しておけば良いです。

doService

所謂「処理」はここで行います。データの検索、生成、保存などですね。ここで、

$this->Data

に画面生成に用いたい値を設定して、

// viewsを起点にファイルを探します
return 'package/template.php'

とする事でHTMLが生成されて、ブラウザに返されます。

その他のメソッド

上記二つは必須で実装する必要が有ります。が、必須ではないが実装すれば実行されるメソッドもあります。上記二つを含めてメソッドの流れを記述すると以下になります。

doThisFirst
plugin->First
beforeValidate
validate
afterValidate
breforeDoService
plugin->BeforeService
doService
afterDoService
doThisLast
plugin->Last

例えば、doThisFirstは、

if( !$this->GET['search_word'] && $this->GET['exts'][0] ){
  $this->GET['search_word'] = $this->GET['exts']
}

のように$this->GET['exts']を格納し直せばquery_stringで指定してもURLの中にパラメータを含めても、validate以降で同じように処理を行う事が出来ます。

さて時系列の中にplugin->Firstとか言うのが有りますがActionクラスに、なんちゃってプラグインを追加する出来ます。プラグインはActionPluginBaseと言う抽象クラスを実装してclassesのaction_pluginsディレクトリに格納しておくことで自動的にロードされます。

class ActionPlugin extends ActionPluginBase{
  protected $HookPoint = 'First' // First, BeforeService,  Last
  protected $Action    = null;   // アクションクラスが入ってきます
  public function doService(){
  // some code
  return 'redirect: /login/show_form'
  }
}

フックがHookでスペルが有ってるのか分からないのですが、僕が分かるから良いやと言うノリで作って、今はとても後悔しています。で、これだけだと何をして良いのか分かりませんね。Actionクラスには公開メソッドが幾つかあります。

//
// 今呼ばれているアクションが所属するパッケージ名を返す
//
public function getPackageName();

//
// セッションを返す
//
public function getSession();

//
// 格納されているデータを返す
//
public function getData();

//
// 格納されているデータを書きかえる
//
public function setData();

//
// $this->REQUESTを返す
//
public function getRequest();

//
// パラメータを全部書き換える
//
public function rewriteParams( $p, $g, $s, $c, $f, $e, $s, $r );

//
// パラメータを全部受け取る
//
public function getParams(  ){
  return array(
    $this->POST,
    $this->GET,
    $this->SESSION,
    $this->COOKIE,
    $this->FILE,
    $this->ENV,
    $this->SERVER,
    $this->REQUEST
  );
}

と言う訳で基本的にActionが持ってる情報は全部読めるし全部書き換えられます。

例えば、”First”に引っかけてvalidaterを起動する”First”に引っかけて定義ファイルからURLに含めたパラメータを$this->GETに書き戻す。”First”に引っかけて、定義ファイルに基づいてログインチェックを行う。等のプラグインをかます事で、書かなければならないコードを減らす事ができるでしょう。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< フレームワーク(笑) – その3 – ORマッパ(笑)

フレームワーク(笑) – その1 >>

Find it!

Theme Design by devolux.org

Tag Cloud