LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-29

簡易的な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

1
0
0

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
1
0