Help us understand the problem. What is going on with this article?

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

参考しまくったサイト

phper-oop
ペチオブはオブジェクト指向ワーキンググループです。様々なエンジニアの方に参加頂いております。
https://phper-oop.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away