404 motivation not found | t_ishidaのブログ

CAT | フレームワーク(笑)

件名についてですが、諸般の事情により
happy_ryoに全権委譲してhappy_ryoのプロジェクトになりました。

まず居ないと思いますが、これについて興味があって訪れていた方は、
happy_ryoのアナウンスを待ってください。

それに伴い、このページからは固定ページを無くしました。
happy_ryoについてはググれば出てくると思います。

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

No tags

件名の通り。
いい加減、ちゃんとテストして一本アプリ組みながら調整を加えていこうとというタイミングで、作りかけのアレですが固定ページ作りました。

ver0.2にはドキュメントがあります。嘘です。ただ、コメントを抽出する機能があるのでドキュメントっぽく読めるかも知れません。また、MVCフレームワークっぽいものとしても使えるような気がしますが、include_pathを汚さないライブラリ群としても使えるかも知れません。先日のHTMLっぽいテキストのタグパーサっぽいものは、これの一部です。

興味有る方はプログラムを読んだり書いたりしてください。リポジトリとかは特に設けないので、固定ページのライセンス事項に従って扱ってください。

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

No tags

近況

  • 飲んだくれてます
  • 仕事は割りと忙しかったりします
  • フレームワーク(笑) ver0.2という構想を細々形にしています

フレームワーク(笑) ver0.2

経緯

フレームワーク(笑) ver0.1系でウザかったところの修正がメイン。

まず、viewでヘルパを呼びつつ値を埋め込もうととすると、

<?php echo $this->escapeDeeply( $this->value1 ) );?>

とかって$thisを二回も三回も書かなきゃいけなくなるんだよね。これがウザイ。これはviewに限った話ではなくてactionのvalidateする時とかもそう。

if( $this->isMailAddress( $this->mail_address ) ){
   print 'hogehoge';
}

それから実は、ini_setでincludeパスをやたらめったらに通したりとか、require_once を一杯書いたりとかしなきゃならなかったり、モジュールの独立性(つまりクラスファイルをコピッてくれば、そのまま使えるような)を意識して作っていた事に起因する設定値の受け渡しとかが結構厄介になったりとかしていたところ。この辺をまとめてどうにかする事にしようとしているところですね。きわめて一部だけどver0.2で書くコードはこんな感じになります。これは基幹となるfwwObjectというクラスの自動テストの一部です。

FWW::start();
FWW::import( 'org.fww.core.*' );
FWW::import( 'org.fww.test.fwwTest' );
$obj = FWW::toObject(
  array(
    'html' => '<fuga>',
    'date' => '2009-09-09 20:20:00',
    'url'  => 'http://ishida-tak.sakura.ne.jp/wordpress' ,
    'ten'  => '0123456789',
    ) );
$t = new fwwTest( 'fwwObjectTest' );
$t->start();
$t->ok( $obj->html == '<fuga>' );
$t->ok( $obj->html( 'esc' ) == '&lt;fuga&gt;' );
$t->ok( $obj->url  == 'http://ishida-tak.sakura.ne.jp/wordpress' );
$t->ok( $obj->url( 'isURL' )  );
$t->ng( $obj->date( 'isURL' ) );
$t->ok( $obj->date == '2009-09-09 20:20:00' );
$t->ok( $obj->date( 'fmtD', 'YYYY年' ) == '2009年' );
$t->ok( $obj->ten( 'inStrLen', 10, true ) );
$t->ng( $obj->ten( 'inStrLen', 9, true ) );
$t->ok( $obj->ten( '#^(\d)(\d+$)#' ) );
$t->ok( $obj->ten( '$1' ) == '0'  );
$t->ok( $obj->ten( '$2' ) == '123456789'  );
$t->ng( $obj->date('#^(\d+$)#' ) );
$t->ok( $obj->date( '#^20#', '' ) == '09-09-09 20:20:00');
$t->end();
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

  • イメージのリサイズとかを、まとめた画像周りのウザいのをライブラリに切りだす
  • ジェネレータを刷新する
  • もう、どうせDBしか使わないからEntityBaseとDBDriverをまとめてしまう?
  • ウイジェット・ベーステンプレート機構を考えよう
  • 名前空間っぽいものを全部振り直す
  • ライブラリのパス解決とかウザいしini_setとかするとディレクトリ分けた意味がよく分からないので、importerを作ろう
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

No tags

概要

ORマッパ(笑)とはフレームワーク(笑)のMVC(笑)のモデル(笑)の部分を受け持つ仕組みです。実に低機能なORマッパっぽいものです。

<?php
require_once 'define.php';
require_once 'drivers/DBDriver.php';
require_once 'EntityBase.php';
class or_mapper extends EntityBase {
	protected $TableName = __CLASS__;
	public function __construct(){
		parent::__construct(
			// データストアにするデータドライバー
			new DBDriver( DSN ), 

			// エラーが有ったら例外投げるか?(極力trueで)
			true
			);
	}
}

$x = new or_mapper();
$x->search( 10 );
$x->fld1 = 'fld1';
$x->fld2 = 'fld2';
$x->fld3 = 'fld3';
$x->save();

特徴

低機能な割にDBの設計に縛りを入れます。縛りは「主キーは必ず数値型でidと言う名前のフィールドでなければならない」と言うものです。

作り方

EntityBaseと言う抽象クラスを継承して作成します。コードのイメージは概要部のコード参照

ちょっとした説明

大雑把でやる気の無いクラス図で言うとこんな構造です。
x

実際にはデータカタログは単なるハッシュですが、簡単のために、クラスとして書いてます。DataDriverBaseのインターフェースを守っていればDBじゃなくてもORマッパ(笑)は、データストアは選びません。例えば固定長ファイルならば、項目別の値の長さの定義をどこかに定義(カタログ)しておきDataDriverBaseを継承したTextFileDriverが項目をsplitして返すような仕組みを作れば、使用するDriverを変えるだけDBだろうと固定長ファイルだろうと同じように動作するソフトウェアが書けるかも知れません。(あくまで理想論)

ただし、作者のやる気が足りないため、現状ではDBDriverしか作成していません。多分、今後もDB以外を作る事はないんじゃないかと思います。

使い方
主に使うのは二つのメソッドです。

search

検索します。

第一引数 – 検索条件

///
/// IDをそのまま引数として渡すと検索します(基本です)
///
$obj->search( 1 );

// 一件検索ならば自身がfillされます
print $obj->name;

/****************************
 * DB用Driverの勝手な拡張
 ****************************/
///
/// 検索条件の指定
///
foreach(
	$obj->search(
		array(
			'fld1' => 'filter1' ,
			'fld2' => 'filter2' ,
			'fld3' => 'filter3' ,
			'fld4' => 'filter4' ,
			)) as $row ) {

	// 指定した条件のand検索します
            // 複数行の選択が行われた場合には戻り値に配列で返ってきます
            // 自身は、先頭行の値でfillされます。
	print $row->name . "\n";
}

///
/// 検索条件の指定2
///
foreach(
	$obj->search(
		array(
			'fld1' => array( 1, 2, 3, 4, 5 )
			)) as $row ) {

	// 指定フィールドをin検索します
	print $row->name . "\n";
}

///
/// 検索条件の指定3
///
foreach(
	$obj->search(
		array(
			':sql' => array(
					"   fld1 = '?param1?'" ,
					"or fld2 = '?param2?'" ,
					),
			':params' => array(
				"param1" => 'parameter1' ,
				"param2" => 'parameter2' ,
				),
			))) as $row ) {

	// 指定されたWhere句で検索します
	//  SQL文本体は行を1要素としたarrayで指定。
            //  paramsは、パラメータ名とvalueのハッシュで指定
	print $row->name . "\n";
}

第二引数 – ページャー

array(
	'count' => '10',  // 一度に取得する件数
	'page'  => '2'    // 対象のページ
);

第三引数 – ソート指定

array(
  'name'      => 'ソート対象フィールド',  // ソート対象のフィールド
  'direction' => '(?:desc|asc)'           // ソート方向
);

save

保存します

単に、代入されている値で保存します
idが無ければ、新たにidを取得してinsert,
idがあれば、対象のidにupdateを試みます。

SQLEditor

概要

SQL文を読みやすく記述する為の支援クラスです。
SQL文中「?param_name?」で指定するとパラメータ置換が行われます。

$sql = new SQLEditor();

$sql->add( "select" );
$sql->add( " * " );
$sql->add( "from" );
$sql->add( "  tbl1" );
$sql->add( "where" );
$sql->add( "  ( 1 = 1 )" );
$sql->add( "and fld1 = '?param1?'");
$sql->add( "and fld2 = '?param2?'");
$sql->add( "and fld3 = '?param3?'");

$sql->setParam( 'param1', $param1 );
$sql->setParam( 'param2', $param2 );
$sql->setParam( 'param3', $param3 );

print $sql->toSQL();

1、置換されないパラメータの残っている行は行ごと削除されます
=> 検索条件を指定するような一覧の時とかに使用するとif文の嵐になりにくくなります。

2、パラメータのシングルクォートを自動で「”」に置換します
=> ORマッパ(笑)と違って、カラム型とかを考慮している訳ではないので、
シングルクォートしか対策は行っていません。
ユーザー入力の数値型とかを素通りさせないように注意して下さい。

3、行頭の連続スペースを削除して、行末にスペースを加えます。
=> スペースの入れ忘れのエラーとか防げます

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

No tags

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

No tags

フレームワーク(笑)の概要

PHPを仕事で使う事になり、PHPを勉強する材料として選んだのが「フレームワークっぽいものを作ること」と言う感じで作ったもの。

なお、これより前のフレームワーク(笑)に関する記事については、2009/2月時点では著しく情報が古いので参考程度に。

フレームワーク(笑)

特徴

  • 特徴が無い
  • やる気が無い
  • ドキュメントが無い
  • 完成していない
  • 割と薄い
  • MVC(笑)
  • ORマッパ(笑)
  • 僕しか使ってない
  • 割とバギー

適用対象

小規模Webを少人数で作る時にやる気が足りない時

ライセンス

使おうが、直そうが、そのまま自分の名前で公開しようが構わないけど、何か有っても僕は知らないし、一切のサポートしないし、バージョンアップも気が向いた時しかしないよ、僕のじゃないソースも一部含まれてる(simpletest,spyc, common.jsに一部、parsers/XMLParsers.php,parsers/JSONParsers.phpに一部)けど、それらの処遇は書いた人のライセンスに従ってねライセンス

環境

AMP

設置

今のセットだとデータストアにはDBしか使えません。

  1. フレームワーク(笑) からダウンロード
  2. htdocsに配置
  3. DBの構成決める
  4. create table文を書く
  5. [fw_root ]/tools にcreate table文のファイルを置く
  6. 出来あがったディレクトリの類を [fw_root] にコピーする
  7. [fw_root ]/define.php にDBのアクセス文字列(pear/DB.phpの奴)を定義する
  8. ジェネレートされたactions,viewsがDBの項目名のまんまになってるので日本語名に直して下さい。
  9. ジェネレートされたソースを参考にしながら適当に直して、Webアプリを作って下さい。

用語説明

Action

一つの処理を現すクラスです。ここでデータの保存をしたり、生成して、viewに渡したりします

Controller

要求の有ったアクションを判別して実行したりviewを呼び出して実行したりしてブラウザに値を返します。

View

テンプレートです。PHPそのものをテンプレートエンジンとして使います。

package_name

何の事はないただのactionsのサブディレクトリです。actions直下にactionを突っ込むと、物凄い量になってしまったりするので、サブディレクトリで分けます。

瞬間的な動きの説明

1

  1. ブラウザからリクエストは全てindex.phpで受けます
  2. Controllerクラスがロードされてリクエストの有ったactionを実行します
  3. actionが戻り値としてControllerへviewとして実行するファイル名を返します
  4. Controllerがviewとして実行したファイルの結果をブラウザに返します

ディレクトリ構成

俯瞰図

┌─actions
├─classes
├─css
├─includes
├─js
├─lib
│ ├─simpletest
│ └─spyc
├─tools
└─views

説明 – 必須のディレクトリ

actions

Actionを格納します。 通常は、{package_name}/action_name.php のようにディレクトリを作ります。

views

テンプレートの部分だけ切り出したPHPを格納します。それだけです。

lib

フレームワーク(笑)の本体です。色々入ってます。

説明 – 必須ではないけど慣例的なディレクトリ

classes

通常使うクラス類を格納します。

tools

ジェネレータが入ってます。 一回使ったら削除して良いです。

css

cssを入れます。

js

jsを入れます。

includes

ジェネレート直後のソースが使用している共通的なヘッダ、 フッタ、メニューが入ってるディレクトリ。割とどうでも 良いです

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

No tags

PC立ち上げる気がしないので携帯から適当にメモ。

PHPを覚える為に作ったフレームワーク(笑)ですが、PerlでCGI書いてたのものの移植なので一番肌に合ってるのか、少しずつ直しながら使い続けてます。

今、社内フレームワークの仕様を検討中なのですが、そこで話し合っている内容から意外と欲しいアイデアがチラホラ出てきました。

そいつらを試験実装してみようかとか色々検討中。

・コントローラーに携帯サイト構築用の機能をプラグインで追加出来るようにする

・アクションクラスにバリデータのプラグインを追加出来るようにする

・生PHPだけじゃなくてテンプレートエンジンを切り替えて使えるようにする。
他、気になってる事
・ジェネレータの中にジェネレート用のコード直書きなので、テンプレートを分けるようにする

・ID、NAMEは、マスタのフィールド名として縛りを入れて、リレーションの有りそうなテーブルには、ORマッパの具象クラスにジェネレータで名称取得メソッドを自動ジェネレートする

・create table文にコメントが含まれている場合、そこから日本語名を取得して、日本語名を使用したプログラムねジェネレートをするようにする。

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

No tags

試験的に「REST対応って言ったら、本気な人たちに怒られそうな対応」をしました。mod_rewriteを使う前提です。ゴメンなさい。使っても良いけど何が有っても知りません。使い方は酷いソースだけど、ソースとか読んでください。

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

No tags

能書き

フレームワーク(笑)とは?

t_ishidaが、PHPの勉強のために作ってみたフレームワーク的なもの。

フレームワークは薄く、ライブラリは豊富に、と言う、t_ishidaの自己満足が詰まったものPHPのジャンクなコード群です。

考え方

MVC(笑)です。

なんか、そんな格好良いものじゃなくて、テストのしやすさを追求しているうちにこうなった。みたいな感じです。現状では理想系には程遠い状況です。ただ、自分では使い始めちゃってるのと、リアルで知っている人に聞かれたらイチイチ聞かれるのも面倒なので、ここにまとめておきます。なお、勝手に使ってOKですし、勝手にソースを直してもOKです。勝手にして下さい。が、何も保障しませんし、何も出来ません。あとlibに、simpletestとspycが入ってますが、これは僕が作った訳では有りません。依存クラスです。こいつらは多分、これの作者に著作権的なものがありますので、こいつらを弄ったり使ったりする時には、それに従ってください。

ダウンロード

プロフィールのところからダウンロードできます。多分。

使い方

index.php

全てのリクエストは、index.phpで受けます。URLは、”?action=[action]“って感じです。actionの名前に指定されたactionが呼び出されて処理する感じです。

  1. ブラウザからURLがコールされる。
  2. URLの中のactionで指定されたactionが動く
  3. actionが返したviewに渡されて、viewがperseされる
  4. ブラウザに行き着く

と言う感じです。

ディレクトリ構造

├─actions              ---Actionクラスを格納する
├─classes              ---エンティティとかを入れる
├─lib                  ---フレームワーク(笑)のコアが入っている
│  ├─drivers
│  │  └─db_catalog
│  ├─parsers
└─views                ---viewのPHPを格納する

作り方の手順を大雑把にまとめると、以下のようになります。

  • index.phpに、actions、viewsの定義を書く。実ファイルにコメントがあるんで、それを読んで上手く設定して下さい。
  • actionsにActionクラスを書きまくる
  • viewsにテンプレートを書きまくる
Actionクラス

libの下にある、ActionBaseを継承して作ります。

ちょうど、こんな感じになります。

<?php
require_once 'impressions.php';
require_once 'ActionBase.php';
class SaveComment extends ActionBase{
public function validate() {
$errors = array();
!$this->REQUEST['user_id'] && $errors[] = 'user_idが無いって(><)';
!$this->REQUEST['news_id'] && $errors[] = 'news_idが無いって(><)';
count( $errors ) && $this->Data['countents'] = join( "\n", $errors );
return ( count($errors) == 0 ) ;
}
public function doService(){
$imp = new impressions( );
$imp->search(
array(
'user_id' => $this->REQUEST['user_id'] ,
'news_id' => $this->REQUEST['news_id']      ,
)
);
$imp->user_id    = $this->REQUEST['user_id'];
$imp->news_id    = $this->REQUEST['news_id'];
$imp->comment    = $this->REQUEST['comment'];
$imp->will_write = $this->REQUEST['will_write'];
$imp->save();
$this->Data['result'] = 'OK';
return 'dummy';
}
}

主に実装するのはvalidate,doServiceの2メソッドです。他にも、doThisFirstとか、有れば適当なタイミングで実行するメソッドが有ります。無ければ実効しません。順番は、ActionBaseのrunメソッドを見てください。

  • validate = パラメータチェックですね。
  • doService = 実際のサービスを記入する場所ですね。

Actionクラスでは、$this->DataにActionの結果となるデータを格納します。

doServiceの戻り値に、viewsに定義してある、viewの名前を返します。

つまり、doService中に、正しく通ったら、正常なviewを返したり、例外的が発生したら、エラーページ的なviewを返したりなどしたりします。

Actionのコンストラクタに

$a = new Action(
[post] ,
[get]  ,
[session] ,
[cookie] ,
[file] ,
);

で渡され、

$this->POST;
$this->GET;
$this->SESSION;
$this->COOKIE;
$this->FILE;

として保存されます。

$this->REQUESTは、POSTとGETがマージされたものです。

これらの値を元に、actionして下さい。

あー、自動テストのコードとか貼り付ければわかりやすいかも。

やる気が出たらやるね。つまり、やる気が無いから、今は書かない。

テストの仕方としては、simpletestに一発食わせてやれば、好きなようにテストできます。ここは、スケルトン位はジェネレートするようにしたいが、出来ていない。

views
<html>
<body>
<ol>
<? foreach( $data['ranking'] as $rank ) : ?>
<li><a href="<?=$rank['url']?>"> <?=$rank['name']?></a></li>
<? endforeach; ?>
</body>
</html>

見たとおりです。ただのPHPです。

$dataと言う変数へActionクラスの$this->Dataで入れたデータがそのまんま入ってきます。PHPの本領である、高機能なテンプレートエンジンぷりを見せ付ける最大のチャンスとなるファイルです。

テストの仕方としては、頭に

<?php
$data = array(
'ranking' => array(
array( 'name' => 'hogehoge1' ,'url' => 'http://xxx.xxx.xxx/' ) ,
array( 'name' => 'hogehoge2' ,'url' => 'http://xxx.xxx.xxx/' ) ,
array( 'name' => 'hogehoge3' ,'url' => 'http://xxx.xxx.xxx/' ) ,
)
);
?>

とか作っておけばテンプレート自身を直接叩くと、正しくテンプレートが動いているかを確認できます。実際のテンプレートとして動かすときには$dataをコメントアウトしておけばOK。

なお、やりたくて現状できていない事の一つに、Controlerにデバッグモードを用意しておき、デバッグモード時には、POST,GET値のテストパターンを読み込んで、テンプレートから渡された、POST,GET値を自動比較するような機能を追加しておきたい。

ORマッパ(笑)

lib/EntityBaseを継承したものが、ORマッパ(笑)の概念です。

次のようなコードになります。

<?php
require_once 'define.php';
require_once 'EntityBase.php';
require_once 'drivers/DBDriver.php';
class tags extends EntityBase{
protected $TableName = 'tags';
public function __construct(  ){
parent::__construct( new DBDriver(DSN) );
}
}

以下の手順で自動ジェネレートできます。

  1. DBにテーブルを作って下さい
  2. create_entities.phpをコマンドラインから叩いて、質問に答えて下さい。
  3. classesに勝手にテーブル全部分のORマッパ(笑)が作成されます。

と言う内容です。今のところ、MySQLしか動きません。また、MySQLでも古いのだと動きません。

使うメソッド

  • search
    • $comment->search(1);
      • id1のデータで自身を満たします。
    • $comments = $comment->search( array( ‘news_id’ => 1, ‘user_id’ => 2 ) );
      • news_id = 1 and user_id = 2のデータで返ってきたものを自身の配列にして$commentsに返す
  • save
    • $comment->save();
      • idが一致するものが無かったら、insert、一致するものがあればupdateします。

なお、やる気のある人が居れば、ORマッパ(笑)は、DataDriverBaseを継承したものをコンストラクタの引数として受け取れます。DataDriverBaseのインターフェースさえ守っていれば、同じインターフェースのまま、データストアを自由自在に選択することが出来ます。

その他

ライブラリはまだ、そんなにありません。

適当にコード読んで下さい。

現状の開発状況

想定の40%位。

いろいろ

指針としては、この程度。他にも無駄に機能はあるけど、まあとりあえず。

既知のバグも沢山あるし、テスト不足も認識済み。

ワリとダサいプログラムだけど、それでも試したい人はお好きにどうぞ。

当面のTODO

  • テンプレートからのPOST,GETのテストモードを作る
  • ORマッパのカタログのキャッシュとか
  • Actionのスケルトンコードジェネレートとか
  • classesとActionのテストのスケルトンコードジェネレートとか
  • actionとviewについて、定義が無い場合にはディレクトリを検索して自動で呼び出すとか*1
  • 各種バグ対応
  • actionとかviewとか、いっぱいになる事が目に見えているので管理しやすい仕組みを考え直す。
  • 恐れ知らずに、ウケ狙いでSourceForgeに登録して、一人で笑ってみるとか

*1:一回作って消した。やっぱり必要だろ

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

No tags

Find it!

Theme Design by devolux.org

Tag Cloud