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

というか、図らずも消極的な理由からテンプレートエンジン使う気持を、実感してしまいました。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.