guessworkでパラメータを自由に設定

2008/04/03 | guesswork

cakePHPも試しつつ、実は使い続けているguesswork。この軽量なフレームワークはPHP5でも動作し、いまだに手放すことができずにいる(多分使い続けるだろう)。

さて。guessworkでは外部からgetやpostで引き渡された値をcontrollerクラス内の同名のクラス変数に割り当てられるようになっている。しかし外部からの変数の汚染を防ぐために、デフォルトのクラス変数にしか割り当てられない(つまりデフォルトで想定していない引数を外部から割り当てようとしてもできない)。

これは有効なようだが、意外と使えないかもしれない。特にフォームの入力項目を可変にしたいような場合には、デフォルトでクラス変数を定義することができないので「実現不可能」ということになる(回避策はいろいろあるのだが)。

しかし本来guessworkでは、変更されたくないクラス変数は_(アンダースコア)で始めるというルールがあるわけだから、上記のような機能が不要なようだろうと思っている。もちろん想定外の変数を割り当てられてしまうというのは致命的なバグになる可能性もあるわけだから、安全をとるなら現状の記述がよいとは思う。

しかし不便だから書き換える。該当箇所はGuesswork/Controller.phpの200行目付近のinitializeController関数内の記述だ(デフォルトの状態は下記にようになっている)。

function initializeController()
{
  // call initialize method
  $method_name = “init”;
  if (method_exists($this, $method_name)) {
    call_user_func(array(&$this, $method_name));
  }

  // set acceptable form parameters to instance variable
  $vars = get_class_vars(get_class($this));
  $acceptable = array();
  foreach ($vars as $key => $value) {
    if (substr($key, 0, 1) == ‘_’) {
      continue;
    }
    $acceptable[] = $key;
  }

  // call form parameter callback if defined
  if (is_string($this->_gw_form_parameter_callback)) {
    if (method_exists($this, $this->_gw_form_parameter_callback)) {
      $this->_gw_params = call_user_func(array(&$this, $this->_gw_form_parameter_callback), $this->_gw_params);
    }
  }

  foreach ($this->_gw_params as $key => $value) {
    if (in_array($key, $acceptable)) {
      $this->$key = $value;
    }
  }

  return true;
}

この関数は3つのステージで構成されているようだ
○「// call initialize method」
 init(初期化)関数があれば実行
○「// set acceptable form parameters to instance variable」
 デフォルトの受け入れ可能なクラス変数を取得
○「// call form parameter callback if defined」
 1.外部から渡された変数群にフィルター関数をかませて
 2.受け入れ可能な変数であれば、クラス変数に代入する

「あ゛」ここでフィルターがかけられるのか。わざわざ専用関数を書いてinit関数から呼び出していたよ(後日書き直すことにする)。で最後の「受け入れ可能な変数で・・・」なところさえ書き直せば、デフォルトで変数を定義していなくても使用できるようになりそうだ。

ということで上記のプログラムの最下部を以下のように書き換えた。

  foreach ($this->_gw_params as $key => $value) {
    if (in_array($key, $vars) && substr($key,0,1)==’_’) {
      continue;
    }
    $this->$key = $value;
  }

  return true;
}

これで「外部からの変数は何でも来い」の状態になってしまっている。当面は注意するという前提で、必要に応じて関数を上書きして使用することにする。

guesswork。新しいバージョンは出ないのだろうか。だったら派生させてオリジナルクラスを作るべきだろうな。超便利だから。

渡された値に対して、常に同じ処理をかける

2008/01/15 | guesswork

年末・年始・・・気がつけば2週間ブログの更新をお休みしてた。

フレームワーク「guesswork」。好調に開発を進めている。かなり使いやすい。まもなくPHP4のサポート期限が切れるので、PHP5対応の新バージョンが待たれるところだ。いちおう原稿バージョン(0.0.3)でもPHP5で動作するとのことなので、さほど気にはしていないのだが・・・。

guessworkで、外部からGETやPOSTで渡された変数に共通した処理を加える機能を実装した。やり方としては、適当な名前でControllerクラスを継承したクラスを作成し、その中に共通処理を記述した。以後、基本的に、この新しく作ったクラスを読み込んで継承していく作りとなる。

<?php
require_once(dirname(__FILE__).’/../Guesswork.php’);
class myController extends Controller
{
  function init()
  {
    $this->cleanup();
    // DB接続などはここに記述
  }

  function cleanup()
  {
    $this->_gw_params=$this->recursiveCleanUp($this->_gw_params);
  }

  function recursiveCleanUp($params)
  {
    foreach($params as $param => $value){
      if(is_array($value)){
        $value=$this->recursiveCleanUp($value);
      }elseif(is_string($value)){
        $value=trim($value);  // ここに共通処理をかく
      }
      $params[$param]=$value;
    }
    return $params;
  }
}

配列で値が渡された際に、再帰的に処理しているところがミソ。あと、_gw_params変数を見つけたのがよかった。
快適。

軽量フレームワークguesswork

2007/12/26 | guesswork

今回新たな開発案件でguessworkを採用することにした。
データベースアクセスや認証については、外部のライブラリに頼らないといけないが、本当に必要最小限のMVCをルールにのっとって操作できるというところが素敵なフレームワークだ。
たいていのフレームワークの場合、ディレクトリ構成をきちんとルール付けすることによって、余計な設定ファイルを記述しなくてもいいようになっているわけだが、このguessworkは別。基本的にファイルを自由自在に配置できるようになっている。
ウェブアプリの開発には2種類あって、ウェブサイトの管理そのものを開発者だけ(+理屈のわかっているコーダ)が管理するタイプと、開発者が管理にかかわるが、コーダがどんどん勝手にコーディングも更新してしまうタイプ。前者の場合は、サイトを管理する立場の人はいろんなタイプはあるけれど、基本的に「ルールを理解してくれる人」で構成されている。後者はたいていの場合「複雑なルールは面倒」と思う人で構成されている。前者の場合は、フレームワークでありがちな制約を理解してくれる可能性が高いが、後者の場合は、自由にファイルを配置したい、と思う人が多いはずだ。
今回の案件では、どちらかというと後者のタイプで開発を進めるほうがよいと判断したのだ。
軽量で、機能を極力減らしてあるフレームワークだけあって、理解するのは簡単だ。現在は「テンプレートエンジンを使用せず(デフォルトはSmarty)」、「データベースはADODBで」開発している。認証ロジックはまだ検討中だ。

基本的にはcakePHPで通しておきたいというのもあるが、やはり臨機応変でその場に適したフレームワークを使うというのが一番ベストだと思う。PHPのフレームワーク自体は基本的にmojaviからスタートしているわけだから制約がたくさんある(制約から抜け出すためには理解する知識が必要)。内容を理解しなくても、ある程度のアプリを書くことができるguessworkは、ある意味おさえておきたいPHPフレームワークのひとつだろう。

今後は開発していく上ででてきたTips等々を紹介することにする。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net