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

PHPで簡易的なフレームワークを作ってみた

簡易的なPHPフレームワークを作ってみた

簡易的なフレームワークを実際手を動かして作ることで多少なりとも、
現在使っているフレームワーク(Laravel・自社フレームワーク)の理解の助けになればよいと思い作ってみました。

リクエストの処理をindex.phpに集中させる

.htaccessですべてのリクエストに対してindex.phpが実行されるようにします。
https://sample.jp.localhost/blog/hogehoge
たとえば、上記のようなアクセスがあったら、以下のようなURLにリダイレクトされます。
https://sample.jp.localhost/index.php?url=blog/hogehoge

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

index.phpはリクエスト時最初に実行されるPHPプログラムです。
.htaccessでリダイレクトされることによってどのリクエストもまずはこのプログラムを通ります。

/index.php
require __DIR__ . '/action.php';

$app = new action();
$app->run();

index.phpで読み込ませているaction.phpです。
ここでリクエストを判別してmodels以下にあるclassを呼び出しています。

/action.php
<?php
class action {
    public function run() {
        $GET = filter_input(INPUT_GET, 'url');
        $params    = explode('/', $GET);
        $fileName  = array_shift($params);
        $filePath  = './models/' . $fileName . '.php';
        $className = $fileName . '_action';

        if ($fileName && file_exists($filePath)) {
            require './models/' . $fileName . '.php';
            $app = new $className();
            extract($app->handle($params)); //viewに変数をアサイン
            require './views/' . $fileName . '.php';
        } else if(!$fileName || !file_exists($filePath)){
            require './models/index.php';
            $app = new index_action();
            extract($app->handle($params)); //viewに変数をアサイン
            require './views/index.php';
        }
    }
}

models

modelsはGETパラメータが無い時や存在しないURLにリクエストがあったときはindex.phpが読み込まれ、GETパラメータに対応するclassが存在する場合はそれが読み込まれます。
例:https://sample.jp.localhost/blog/
上記のようなリクエストがあった時はblog_actionClassが読み込まれる。

/models/blog.php
class blog_action{
  function handle($params){
      return array(
        'title'=>'Hello World! (blog)',
        'h1'=>'Hello World! (blog)'
      );
  }
}
/models/index.php
class index_action {
  function handle($params) {
      return array(
        'title'=>'Hello World! (index)',
        'h1'=>'Hello World! (index)'
      );
  }
}

views

viewsはmodelsの方で設定した配列のキーが変数として使用できます。

/views/blog.php
<html>
<head>
<meta charset="utf-8">
<title><?php echo $title; ?></title>
</head>
<body>
<h1><?php echo $h1; ?></h1>
</body>
</html>

まとめ

「PHP フレームワーク 自作」とかで検索して色んなサイト参考にさせて頂きました。
フレームワークが実際どういう原理で動いているのかいまいち理解できていなかったのですが、
手を動かすことによって多少は理解の助けになった気がします。

普段の業務ではLaravelや自社製のフレームワークなんかを触る機会が多いですが、
フレームワーク機能を極限まで削るとこんな感じなのかなぁと思います。

課題

classを読み込む時はrequireでなくて、autoloaderを使いたかったけどなぜか認識されず要調査。

GitHub

https://github.com/ysk/php_framework2

ikdysk
IE6とかない時代になってよかった。
https://github.com/ysk
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした