Edited at

PHPで超簡単自作フレームワーク

More than 1 year has passed since last update.


目的

フレームワークは、LaravelやRails、Djangoなど、機能満載な物ばかりが出ています。

その障害か、まるでフレームワークはすごい人が作った魔法かのように感じる初心者が多いかと思いますので、もっと身近にフレームワークを感じて頂けるようになれたらと思います。


1. メリット

frameworkの仕様に沿ってコードを書くだけで、保守運用性と開発効率を上げる


2. どうやって?

frameworkの開発者が幸せになる様にと願いを込めて使いやすい仕様とパワフルなライブラリを書いたから


3. 事前準備


  1. urlパースがよくわからない人はURLを取得できる$SERVER['PATHINFO']

  2. 動的言語機能が良くわからない人は動的に呼ぶクラスを変更できる動的言語機能


4. 作ってみよう


今回実装する内容

1.urlの初めに来るurlに相対したmodelとviewを呼ぶオートローダー機能

例:localhost/blogでリクエスト


index.php

include('./models/blog.php');



index.php

include('./views/blog.php');


2.modelはファイル名と同じクラスで作成し、その中のindex(@params)メソッドが呼ばれる

例:localhost/blogでリクエスト


models/blog.php

<?php

class blog {
function index($params) {
return array('str'=>'Hello World!');
}
}

3.リクエストに対してのviewファイルが存在しなかった場合、定番の404 Not Foundを見せる

4.トップページはどーん!とカッコよく宣伝する!


ソースコード全容


index.php

<?php

if (empty($_SERVER['PATH_INFO'])) {
//紹介ページを表示
include('./views/index.php');
exit;
}

//スラッシュで区切られたurlを取得します
$analysis = explode('/', $_SERVER['PATH_INFO']);
$call;

foreach ($analysis as $value) {

if ($value !== "") {
$call = $value;
break;
}
}

//modelをインクルードします
if (file_exists('./models/'.$call.'.php')) {

include('./models/'.$call.'.php');
//$call名のクラスをインスタンス化します
$class = new $call();
//modelのindexメソッドを呼ぶ仕様です
$ret = $class->index($analysis);
//配列キーが設定されている配列なら展開します
if (!is_null($ret)) {
if(is_array($ret)){
extract($ret);
}
}
}

//viewをインクルードします
if (file_exists('./views/'.$call.'.php')) {
include('./views/'.$call.'.php');
} else {
include('./views/error.php');
}



解説

1.パラメーター1つ目が呼ばれるmvと相対します。

//スラッシュで区切られたurlを取得します

$analysis = explode('/', $_SERVER['PATH_INFO']);
$call;

foreach ($analysis as $value) {
if($value !== ""){
$call = $value;
break;
}
}

2.モデルを呼び、viewに渡す値があれば展開する事で実現します

//modelをインクルードします

if (file_exists('./models/'.$call.'.php')) {

include('./models/'.$call.'.php');
//$call名のクラスをインスタンス化します
$class = new $call();
//modelのindexメソッドを呼ぶ仕様です
$ret = $class->index($analysis);
//配列キーが設定されている配列なら展開します
if (!is_null($ret)) {
if(is_array($ret)){
extract($ret);
}
}
}

3.viewを呼んで終わり

//viewをインクルードします

if (file_exists('./views/'.$call.'.php')) {
include('./views/'.$call.'.php');
} else {
include('./views/error.php');
}

ポイントはelse文かなぁ

4.localhost/やlocalhost////って入力された際の対策

if(empty($_SERVER['PATH_INFO'])){

//紹介ページを表示
include('./views/index.php');
exit;
}


結論

頑張って皆が使ってくれる凄いもの作りたいなぁ。

あ、私はLaravel派ですよ!


GitHub

https://github.com/k-okina/FirstMVFramework


参考しまくったサイト