LoginSignup
61
89

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-16

目的

フレームワークは、LaravelやRails、Djangoなど、機能満載な物ばかりが出ています。
その障害か、まるでフレームワークはすごい人が作った魔法かのように感じる初心者が多いかと思いますので、もっと身近にフレームワークを感じて頂けるようになれたらと思います。

1. メリット

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

2. どうやって?

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

3. 事前準備

  1. urlパースがよくわからない人はURLを取得できる$_SERVER['PATH_INFO']
  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

参考しまくったサイト

61
89
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
89