📑

WEBアプリケーションのフレームワークをPHPで作ってみる(PHPで作るオリジナルフレームワーク)

2021/04/22に公開

概要

みなさん開発をする際はフレームワークを利用してますでしょうか?
WEBアプリケーションを作成する際にフレームワークを利用する事で画面テンプレート(HTML/CSS/JS)と実装(プログラミング)を分離できるというメリットを享受できる事と思います。ただし、いきなり複雑なフレームワークを使って構築していくと「よくわからないのにシステム・サイトが出来あがってしまう」という事になります。

フレームワークを正しく利用するためにフレームワークのコードを読むというのが必要と思いますが、一般的なフレームワークは多くのファイル・コードが連動しており複雑です。リクエスト(入力)からレスポンス(画面表示)まで順に読むだけでも簡単ではありません。

そこでフレームワークの基本として「画面と実装を分離」に限定したシンプルなフレームワークを自分でコードを書いて学習したいと思います。

実行環境

本記事は ローカルに環境を作成して確認しました。

  • Windows10/WSL2(Ubuntu 20.04.2 LTS)
  • Apache 2.4.41
  • PHP 7.4.3
  • MariaDB 10.3.25

WSL2を利用した環境の作り方は、下記の記事を参照いただけたらと思います。

https://zenn.dev/o2z/articles/f68d7aea7c075f

実装概要

今回は「置き換え文字列」だけを可能とするフレームワークを作ります。
画面(html)に置き換え文字列を埋め込んで実行すると置き換わるようにします。

1.index.phpからプログラムと画面(HTML)を分離して呼び出す構造とする。
 例:index.php -> xxx.php xxx.html
2.画面(HTML)に置き換え文字列を記述する。
 例:[%text%]
3.プログラムは連想配列のキーに置き換え文字列、置き換え文字を値にセットする。
 例:$replace['text'] = '置き換え文字'
4.画面(HTML)とプログラムはセットで作成し、URL(今回の実装はパラメータ)により切り替える。
 例:example.php と example.html をセットで作成する。

ディレクトリ構成

ディレクトリ構成は下記とします。
fw
├─ public ドキュメントルート(index.php)
├─ execute プログラム(example.php)
└─ template 画面テンプレート(example.html)

サンプルコード

サンプルでコードを書いてみるとこんな感じになりました。

index.php
<?php
// デバッグ用
error_reporting(-1);            // 「-1」= 全てのPHPエラーを出力する
ini_set('display_errors', '1'); // 1 = 画面にエラーを表示する

// 初期処理(本プログラムでセッションは使いませんが・・・)
session_start();

// 1.実行ファイル設定
$ex = "";
if(isset($_GET['ex'])){
    // 値受取
    $ex = $_GET['ex'];
    // 入力不可とする記号を大さっぱに無効化する
    $ex = htmlentities($ex, ENT_QUOTES, 'UTF-8');
    //「\」「.」「/」を削除する
    $ex = preg_replace('/[\\\.\/]/u','',$ex);
} else {
    // 実行ファイル指定無しはトップページを表示する
    $ex = "top";
}

// 2.テンプレートファイル読み込み
$html = "";
$fp = fopen('./../template/'.$ex.'.html', 'r');
while ($line = fgets($fp)) {
    $html .= $line;
}
fclose($fp);

// 3.実行ファイルの読み込み
require_once('./../execute/'.$ex.'.php');

// 4.プログラム実行(置き換え文字列の連想配列を取得する)
$replace  = array();
$ex_class = new $ex();
$replace  = $ex_class->execute();

// 5.置き換え文字列の置換処理
foreach( $replace as $key => $value ){
    $html = str_replace('[%'.$key. '%]',$value,$html);
}

// 6.HTML書き出し
echo $html;

?>

index.php コード解説

1.パラメータ「ex」で実行するプログラム/画面テンプレートを指定する
2.画面テンプレート(HTML)ファイルを読み込む
3.実行ファイル(PHP)を読み込む
4.プログラム実行する(置き換え文字列の連想配列を取得する)
5.置き換え文字列を連想配列と置換する
6.HTMLを書き出す

example.php
<?php
// ライブラリ読込

// 実行クラス
class one {

  public function execute(){
    $replace = array();

    // 置き換え文字をセットする
    $replace['test_text'] = "置き換え文字テスト";

    return $replace;
  }

}

?>

example.php コード解説

1.index.phpによりインスタンスが作成されて「execute()」が実行される。
2.execute()の戻り値は「置き換え文字列をKeyとして、置き換え文字をvalue値に設定する。

example.html
<html>
<head>
<title></title>
</head>
<body>
<h1>this example page</h1>
<div>[%test_text%]</div>
</body>
</html>

example.html コード解説

1.置き換え文字として [%test_text%] をHTMLの中に埋め込んでいる。

実行結果

WEBサーバよりindex.phpを呼び出してみます。

http://localhost/index.php?ex=example

まとめ

今回は「置き換え文字列」だけの機能としていますが、実際のフレームワークは画面テンプレートの中で条件分岐や繰り返しが利用可能など複雑な構造になっていると思います。
「よくわからないけど仕様を満たしているからOK」という働き方にならないように気を付けていないと、すぐにコピペのコードになり考える力が衰えていきます。
実際に設計してコードを書いて試すというのは大事だと感じました。

以上、WEBアプリケーションのフレームワークをPHPで作ってみる(PHPで作るオリジナルフレームワーク)でした。いかがでしたでしょうか。フレームワークも正しく理解して使用していきたいと思います。

GitHubで編集を提案

Discussion