読者です 読者をやめる 読者になる 読者になる

順次、選択、そして繰り返し

プログラミングのことやITのこと、たまに演劇のことも書きます。

必要最低限のMVCモデル(PHP)

PHPを調べてたらこんな記事が。

PHP10行で作る超シンプルフレームワーク - かってぃのブログ | choilog [チョイログ]

ほー面白そう。やってみよう。

とりあえず、.htaccessから
.htaccessはサーバーの動作を制御する設定ファイルみたいなものらしい。

<IfModule mod_rewrite.c>
    DirectoryIndex index.php
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ dispatch.php?url=$1 [QSA,L]
</IfModule>

以下の部分がすべてのアクセスをdispatch.php
集約するようになるらしい。

RewriteRule ^(.*)$ dispatch.php?url=$1 [QSA,L]

次にdispatch.php

<?php

/************************************************/
/* dispatch.php 				*/
/* 全てのアクセスを一旦dispatch.phpに集約させる */
/* 設定は.htaccessで行う 			*/
/************************************************/

/* グローバル変数読み込み */
require_once('./global.php');

$dataTransfer = 100;

/* URI取得 */
$url = "";

if(!empty($_GET['url'])){
	$url = $_GET['url'];
	$uri = explode('/', $url);
	$uri = array_shift($uri);
}

/* ファイルの存在確認 */
if(file_exists('./'.$uri.'Controller.php')){

	/* URIをもとにコントローラーへ */
	include ('./'.$uri.'Controller.php');

}else{

	/* エラー画面へ */
	include ('./error.php');
}

?>

http://localhost/プロジェクト名/xxxxxxxxの
xxxxxxxxを抽出して、コントローラーを割り振る。
抽出処理は以下の部分

if(!empty($_GET['url'])){
	$url = $_GET['url'];
	$uri = explode('/', $url);
	$uri = array_shift($uri);
}


今回はxxxxxxxxの部分をtestというURIにして実装する。
以下の部分で$uriに"test"という文字列が格納されているので、
testController.phpに遷移する。

/* URIをもとにコントローラーへ */
include ('./'.$uri.'Controller.php');

testController.php

<?php

/************************************************/
/* testController.php 				*/
/* コントローラーの役割 			*/
/************************************************/

	/* Modelを読み込む */
	require_once('./'.$uri.'Model.php');

	/* Modelの関数を実行 */
	$dataTransfer = execute($dataTransfer);

	/* Viewの読み込み */
	include ('./'.$uri.'View.php');

?>

処理を記載するtestModel.php
今回は与えられた値を2倍にして返すだけの処理を記載

<?php

/************************************************/
/* testModel.php 				*/
/* 処理を行う(ここでDBアクセスとかするイメージ)	*/
/************************************************/

	/* 実行する関数 */
	function execute($params){
		return $params * 2;
	}

?>

処理結果を出力するtestView.php

<?php
/************************************************/
/* testView.php 				*/
/* 出力画面 					*/
/************************************************/
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>シンプルフレームワーク</title>
    </head>
    <body>
        <h1><?php echo $dataTransfer; ?></h1>
    </body>
</html>

グローバル変数をまとめたglobal.php

<?php

/* データを受けとる変数 */
global $dataTransfer;

/* URIを格納する変数 */
global $uri;

?>

http://localhost/プロジェクト名/testでアクセスすると
正常に動作する。


全体の流れとしては……

全てのアクセスをdispatch.phpにまとめる

dispatch.phpでコントローラーを決定する。

モデルで処理を行う。

ビューで処理結果を基に出力する。

今回は記事をもとにして、実装を行った。
コントローラーの設定などがPHPファイルに直書きなので、設定内容とかを
XMLに記載し、それをPHPで読み込ませて反映させるとか
色々と改良できると思う。