PHPで作るWebアプリの仕組みを考えた
perlで作ってた簡易フレームワーク(id:smeghead:20070205:1170685097)の焼き直しみたいになってしまったんですが、PHPで作るWebアプリの構成を考えてみました。
PHPでは、リクエストを受け取る仕組みから、Sessionの仕組みまで組込まれているので、やったこと自体は少ないです。
とりあえず、全部のファイルを同じディレクトリに入れました。
index.php
フロントコントローラになるファイル
<?php //action関数の定義をincludeする。 include_once("action.php"); //PATH_INFOの取得 $path_info = "/"; if (isset($_SERVER["PATH_INFO"])) $path_info = $_SERVER["PATH_INFO"]; $commands = split("/", substr($path_info, 1)); $action_name = "action_" . array_shift($commands); if (!function_exists($action_name)) { $action_name = "action_default"; } //action関数の実行 $template_name = $action_name($commands); //テンプレートの表示 include($template_name); /** * PATH_INFOが取得できない場合、または * action関数が存在しない場合に呼ばれる。 */ function action_default() { return "top.php"; } ?>
action.php
action関数を定義するファイル。actionが増えれば関数が増える。
<?php function action_hello($commands) { $_REQUEST["greeting"] = "helo......" . array_shift($commands); return "hello.php"; } ?>
hello.php
テンプレートを定義するファイル
<?php require_once("utils.php"); ?> <html> <body> <h1>hello</h1> <?php h($_REQUEST["greeting"]); ?> </body> </html>
utils.php
画面表示のためのヘルパー関数を定義しているファイル
<?php function h($str) { echo htmlspecialchars($str); } ?>
テスト
この状態で http://localhost/phpapp/index.php/hello にアクセスしたら、
Hello
helo……
が表示された。
http://localhost/phpapp/index.php/hello/good-bye にアクセスしたら、
Hello
helo……good-bye
が表示された。
まとめ
コード書いてると、どんどん無駄を排除してコードの質を高めようとしていくんですが、やりたい事ができないことが多い気がします。まだ、PHP初めたばかりだから知らないことも多いと思いますが。
例えば、テンプレートでは、変数を表示するだけなので、↓のように宣言的に書きたい訳です。
<?php h $_REQUEST["greeting"] ?> エラーになる。
h関数は、utils.phpで定義したXSS対策用の出力関数です。
なぜか、echo関数では↓のように記述することが可能でした。
<?php echo $_REQUEST["greeting"] ?>
ユーザ定義型の関数と組込み関数を同じように使えないってことのようです。
愚痴モードON
そうゆうもんだと思ってしまえばいいのかもしれませんが、問題を上手く解決しようとすると、言語仕様の壁にぶつかるのは、ストレスが溜まります。
愚痴モードOFF
というか、図らずも消極的な理由からテンプレートエンジン使う気持を、実感してしまいました。