Feijoa Prototype Framework

PHPによる多数のWEBシステム開発経験から学んだ、効率的で安全なWEBシステム構築のためのプロトタイプフレームワーク。あらかじめ用意された管理メニューの雛形が開発のスタートアップを補ってくれることはもとより、必須となるセキュリティ要素を簡単に導入できるようにフレームワークを最適化。全く新しい概念のフレームワークです。

イントロダクション

Feijoa Prototype Frameowrkとは

Feijoa Prototype Framework外観

Feijoa Prototype Framework とは、PHPのMVC2フレームワーク Feijoa Framework と、一般的な管理画面で必須となる汎用的な機能をあらかじめ備えた管理画面の雛形となる Feijoa Prototype の統合環境です。

WEBアプリケーションを構築する上で必須となる機能を定型の雛形として組み込むことで、実装者が単調なコーディングの繰り返しに煩わされるのを避けるとともに、より簡単なコードでメンテナンス性の高い安全なアプリケーションを構築できるように配慮して作られたフレームワークです。

Framework部分は一般的なMVC2モデルを基本としますが、WEBアプリケーションで必須となるクライアントからのリクエスト処理に特化した RequestDataController という第4の要素を取り入れています。

RequestDataController

RequestDataControllerでは一般的なValidatorと同様に入力値のバリデーションを行うことはもとより、設定に応じて入力値の補正を自動で行います。例えば int が期待されているフィールドに全角の数字が入力された場合、実装者がそれを補正するように設定していれば、半角数字にパースしてからバリデーションが行われます。

RequestDataController は CSRF 対策用のチケットの照合も行います。例えばこの照合は、

$rdc->isCSRF($dto);

と記述するだけです。フレームワークが発行したチケットがクライアントから返されなかった時は Exception が throw され、フレームワークにより適切にエラー処理されます。実装者が try {} catch {} を実装する必要はありません。

Viewとテンプレートエンジン

Feijoa Prototype Framework では、多くのPHPフレームワークとは異なり、Viewとは別にテンプレートを持っています。Viewは、処理毎にテンプレートや表示項目を切り替える処理を担っています。テンプレートエンジンにはTwigが採用されています。

このため、テンプレートエンジンだけを使い慣れた別のテンプレートエンジンに切り替えることが容易です。

プロトタイプ管理画面のクライアントサイドは Twitter Bootstrap により構築されており、スマートフォンやタブレットなどにも柔軟に対応します。JavaScript フレームワークはjQueryです。

fcs入力支援ライブラリ

Feijoa Prototype Framework の強力な入力支援ライブラリとして、専用に開発された fcs があります。fcs は複数の入力項目をグループ化し、エンターキーでのフォーカス移動を簡単な記述で行うためのライブラリです。これは、業務アプリケーションなど、多数の入力項目があるフォームで効果を発揮してくれます。

suggestライブラリ

クライアント側での入力項目のバリデーションとしてsuggest ライブラリが利用できます。Feijoa Prototype Framework の suggest ライブラリは RequestDataController と密接に結びつき、POST後のバリデーションと全く同じバリデートがクライアント側入力時に非同期通信で行えます。このため、クライアントサイドで別途バリデート処理を記述する必要はありません。

スタックトレース

Feijoa Prototype Frameworkでは、Warnig、Notice、Errorが Exceptionとしてthrow されます。開発モードでは通常のエラーメッセージの他にデバッグ用のスタックトレースがプロタイプ画面上にダイレクトに表示されます。これらは実装者が都度コードを記述する必要なく標準で行われます。これは開発効率を飛躍的に向上させてくれます。エラーログやメモリ使用量のログファイルも別途出力されます。

DBアクセス

データベースアクセスは専用に設計された DataMapper によって行います。SQLを論理的に記述できるクエリビルダーと、プロトタイプメニューに組み込まれたモデル管理で自動生成されるDataModelを使い、効率的なDBアクセスが可能です。

DataMapperとDataModel

DBへのアクセスはDataMapper クラスと、テーブルエンティティを表した DataModel とによって行います。DataMapper はシングルトンモデルで構成され、記述にはチェーンメソッドを用います。SubModelAbstract では DataMapper のインスタンスが$Mapperというprotectedなメンバ変数として保持されています。

まず、DataMapperのイニシャルについて説明します。

$this->Mapper->set("User");

もし、上記ルール外の DataModel や テーブルを利用したい場合は、以下の様に記述します。

$this->Mapper->model("News")->table("news");

また、DataModel と テーブル名が同じ場合は、

$this->Mapper->setAsIs("News");

とすることで、上記と同様の意味になります。

INSERT

CUDは、DataModel にパラメターを設定してDataMapperに渡します。

$u = new User();
$u->user_id = "●●●●";
$u->user_name = "●●●●";
$this->Mapper->set("User")->insert($u)->execute();

insert、update、deleteに渡す引数は、同一形態の DataModel の配列でも構いません。DataMapper ではSQL文はプリペアされるため、配列で DataModel を渡すことで高速な INSERT、UPDATE、DELETE が行われます。

UPDATE

$u = new User();
$u->user_id = "●●●●";
$u->user_name = "●●●●";
$u->update_time = "●-●-● ●:●:●";
$this->Mapper->set("User")->update($u)->execute();

insert、update、deleteに渡す引数は、同一形態の DataModel の配列でも構いません。DataMapper ではSQL文はプリペアされるため、配列で DataModel を渡すことで高速な INSERT、UPDATE、DELETE が行われます。

Feijoa Prototype Framework では日本のSoftware Integratorの慣例に従い、insert_time、insert_id、update_time、update_id、lg_delの5カラムが必須となっています。これらは多くの場合において冗長となります。

ただし、Whereオブジェクトを用いてUPDATEを行う場合は update_timeやプライマリキー は必須ではありません。この場合、楽観排他処理は行われませんので実装に当たっては十分に注意してください。Whereオブジェクトの詳細についてはモデル(SELECT)を参照してください。

$w = new Where(["user_id", "abc", "NOT"]);
$u = new User();
$u->user_id = "●●●●";
$u->user_name = "●●●●";
$this->Mapper->set("User")->updateByWhere($u, $w)->execute();

DELETE

DELETEは論理削除と物理削除が選択できます。デフォルトは論理削除です。DELETEでも、プライマリキーとupdate_timeは必須であり楽観排他が強制的に行われます。

$u = new User();
$u->user_id = "●●●●";
$u->user_name = "●●●●";
$u->update_time = "●-●-● ●:●:●";
$this->Mapper->set("User")->delete($u)->execute();

insert、update、deleteに渡す引数は、同一形態の DataModel の配列でも構いません。DataMapper ではSQL文はプリペアされるため、配列で DataModel を渡すことで高速な INSERT、UPDATE、DELETE が行われます。

第2引数にtrueを指定することで物理削除になります。

$this->Mapper->set("User")->delete($u, true)->execute();

ただし、UPDATEと同様にWhereオブジェクトを用いてUPDATEを行う場合は update_time とプライマリキーは必須ではありません。この場合、楽観排他処理は行われませんので実装に当たっては十分に注意してください。

$w = new Where(["user_id", "abc", "NOT"]);
$u = new User();
$u->user_id = "●●●●";
$u->user_name = "●●●●";
$this->Mapper->set("User")->deleteByWhere($u, $w)->execute();
$this->Mapper->set("User")->deleteByWhere($u, $w, true)->execute();

SELECT文用オブジェクト

SELECT文は、SQLを構成する複数のオブジェクトを利用してクエリを組み立てます。

Whereオブジェクト

$where = new Where(["col_a", "abc"], ["col_b", 1, "NOT"], .... );

上記の様に、Whereオブジェクトの初期化に合わせて配列で条件を渡します。上記は、

WHERE `col_a` = 'abc' AND NOT `col_b` = 1

となります。 配列の要素が2つ以上3つ以内でない場合、Exception が throw されます。配列が複数渡された場合、デフォルトではANDで接続されます。ORで接続したい場合は、

$where->and_or = "OR";

としてください。

一度イニシャライズしたWhereオブジェクトに条件を追加したいときは、

$where->setWhere(["col_c", "def"]);

のようにして追加を行うことが出来ます。

第3引数の演算子は以下の物が使えます。 "=" や ">" 等のその他の文字列が指定された場合は、そのまま比較演算子として利用されクエリが試行されます。

MATCH

			
["col_a", "abc", "MATCH"]
["col_a", "abc"]
["col_a", "abc", "="]
			
		
`col_a` = 'abc'

MATCHは=に置き換えられます。第3引数が省略された場合、MATCHが指定された場合と同じ動作になります。

NOT

			
["col_a", "abc", "NOT"]  
			
		
NOT `col_a` = 'abc'

LIKE

			
["col_a", "abc", "LIKE"]  
			
		
`col_a` LIKE '%abc%'
			
["col_a", "abc", "%LIKE"]  
			
		
`col_a` LIKE '%abc'
			
["col_a", "abc", "LIKE%"]  
			
		
`col_a` LIKE 'abc%'

IN

			
$array = array(1, 2, 3);  
["col_a", $array, "IN"]  
			
		
`col_a` IN (1, 2, 3)
			
$array = array(1, 2, 3);  
["col_a", $array, "NOTIN"]  
			
		
`col_a` NOT IN (1, 2, 3)

ISNULL

			
["col\_a", "abc", "ISNULL"]  
["col\_a", null]  
			
		
`col_a` IS NULL

第2引数にnullが渡されたときは自動的にIS NULLが利用されます。

			
["col_a", "abc", "ISNOTNULL"]  
["col_a", null]  
			
		
`col_a` IS NOT NULL

BETWEEN

			
$array = array(10, 20)
["col_a", $array, "BETWEEN"] 
			
		
`col_a` BETWEEN 10 AND 20

EXISTS

			
$select = new Select(null, "col_b", "table");
["col_a", $select, "EXISTS"] 
			
		
EXISTS (SELECT `col_b` FROM `table`)

Selectオブジェクトについては後述します。

			
$select = new Select(null, "col_b", "table");
["col_a", $select, "NOTEXISTS"] 
			
		
NOT EXISTS (SELECT `col_b` FROM `table`)

その他の文字列によるサブクエリ

			
$select = new Select(null, "col_b", "table");
["col_a", $select, "="] 
			
		
`col_a` = (SELECT `col_b` FROM `table`)

WhereオブジェクトのANDとOR

WhereオブジェクトのデフォルトはANDです。Whereオブジェクトを階層化することで、複雑なWhere句を生成できます。

			
$w1 = new Where(["a", 1], ["a", 5]);  
$w1->and_or = "OR";  
$w2 = new Where("b", "abc", "NOT"], $w1, ["c", 20, ">"]);  
			
		
WHERE NOT `b` = 'abc' AND (`a` = 1 OR `a` = 5) AND `c` > 20

OrderByオブジェクト

			
$o = new OrderBy(["col_a", "ASC"], ["col_b", "DESC"], .... );
			
		
ORDER BY `col_a` ASC, `col_b` DESC, ....

OrderByのデフォルトはDESCです。要素1または2以外の配列、配列以外が渡された場合はException が throw されます。

Limitオブジェクト

			
$l = new Limt(1, 10);
			
		
LIMIT 10 OFFSET 1

GroupByオブジェクト

			
$g = new GroupBy("col_a", "col_b", "col_c", ...);
			
		
GROUP BY `col_a`, `col_b`, `col_c`, ...

Havingオブジェクト

			
$h = new Having(["col_a", "abc"], ["col_b", "def", "NOT"], ...);
			
		
HAVING `col_a` = 'abc' AND NOT `col_b` = 'def' AND ...

Havingの条件についてはWhereオブジェクトを参照してください。

			
$g = new GroupBy("col_a");  
$h = new Having(["col_a", "abc"])  
$g->having = $h;  
			
		
GROUP BY `col_a` HAVING `col_a` = 'abc'

Selectオブジェクト

Selectオブジェクトは、単純なSELECT文を構築するオブジェクトです。

			
$w = new Where(["col_a", "abc"]);
$o = new OrderBy("col_a", "ASC");
$l = new Limit(1, 10);
$select = new Select(null, "*", "users", null, $w, $o, $l, true);
$this->Mapper->set("User")->select($select)->execute();
			
		

上記コードは

SELECT * FROM `users` WHERE `col_a` = 'abc' ORDER BY `col_a` ASC LIMIT 10 OFFSET 1 FOR UPDATE;

となります。select()メソッドに対してSelectオブジェクトを渡すことでSELECT文が構築されます。

Select()の引数は、

  1. エイリアス
  2. select項目
  3. テーブル名
  4. GroupByオブジェクト
  5. Whereオブジェクト
  6. OrderByオブジェクト
  7. Limitオブジェクト

となります。

指定しない項目はnullを与えてください。3のテーブル名は、set()メソッドなどでテーブル名が指定されている場合はnullで省略できます。

コマンド管理

Feijjoa Prototype Framework のコマンドを作成する画面です。

この画面でコマンドを作成するとFrameworkで必要とされるディレクトリやファイルの雛形が自動で作成されます。この雛形を元に実装を行ってください。

コマンド管理

モデル管理

Feijjoa Prototype Framework のテーブルとDataModelを作成する画面です。

カスタムテーブルと、DataModelの作成を行います。MySQL、PostgreSQL、SQLinteに対応していますが、モデル管理のフル機能を利用できるのは現在MySQLのみです。

モデル管理

コードマスター

Feijjoa Prototype Framework のシステムで利用するコードを管理するメニューです。

コードマスター

セクションコード

メッセージ管理

Feijjoa Prototype Framework のシステムで利用するメッセージを管理するメニューです。多言語対応では、この画面で各言語ごとのメッセージを編集します。

メッセージ管理

セクションメッセージ管理

組織構成管理

店舗や支社など、ユーザーの所属する組織を管理します。

組織構成管理

グループ管理

ユーザーの所属するグループを管理します。

グループ管理

ユーザー管理

ユーザーの管理をします。所属組織、所属グループ、アクセスできるコマンドや権限レベルなどを設定します。

ユーザー管理

ログイン失敗履歴

ログインの失敗履歴を管理します。ユーザID、IPアドレス単位のロックが可能です。入力パスワードは、閲覧ユーザ権限により通常はマスクされます。

ログイン失敗履歴

ドキュメント

汎用的ドキュメント管理です。

ドキュメント

マークダウン記法で記述できます。

ドキュメント編集

過去のドキュメントの差分表示、修正箇所の復元が可能です。

ドキュメント比較

画像アップロード

画像アップローダーです。

画像アップロード

お問い合せ