【Web】オレオレフレームワークを作ってみる~大枠完成編~

プログラミング PHP Web

【Web】オレオレフレームワークを作ってみる~大枠完成編~

今年に入ってからコロナについては注視していたが、やはりこうなったか。
という感じ。

中国は「コロナをやっつけた」状態になっているようだが、他国はパニック。
おまけに中国ときたら「マスク外交」を始める始末。
落ち着いたら「進む中国離れ」の状態になるような。

それよりも、ヨーロッパ(特にEU加盟国)が心配。
想像以上にやられている。

さてさて、オレオレフレームワーク。
とりあえず大枠の完成に向け、少々の手直しをする。


.htaccess

このままではディレクトリにアクセスできてしまうので、ディレクトリをリダイレクトの対象とする。

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

コメントアウトして対応。


config.php作成

configディレクトリにconfig.phpを作成。
内容を以下のようにした。

<?php
/*
開始ページ
*/
define('STARTUP_PAGE','login');

/*
クラス自動ロード対象ディレクトリ
コントローラ
モデル
データクラス
基本クラス
*/ 
define('AUTOLOAD_DIRECTRY',
            [
                'CONTROLLER_DIRECTRY' => './controllers',
                'MODEL_DIRECTRY' => './models',
                'DATA_DIRECTRY' => './datas',
                'BASE_DIRECTRY' => './bases'
            ]
      );

// テンプレートファイルディレクトリ
define('TEMPLATE_DIRECTRY','templates/');

/*
テンプレートコンパイルデータディレクトリ
Smartyのコンパイルに使用されるため、書込み権限が必要。
*/
define('TEMPLATE_COMPILE_DIRECTRY','tmp/smarty');

/*
その他クラス
その他ライブラリ等を読み込む場合に設定する。
*/
define('OTHRER_CLASS', 
            ['Smarty' => './libralies/smarty/Smarty.php']
      );

AutoLoader.php手直し

AutoLoader.phpでは、Config.phpの読み込み、自動クラスロードの対象ディレクトリをコンストラクタで行うように修正。

<?php

/**
 * AutoLoader
 * 自動ロードクラス
 */
class AutoLoader
{    

    /**
     * directries
     * 対象ディレクトリ。
     * 
     * @var mixed
     */
    protected $directries;

    /**
     * __construct
     * コンストラクタ
     * 
     * @return void
     */
    function __construct() {

        // 設定ファイル
        require_once('./config/config.php');

        // 対象ディレクトリ
        foreach ( AUTOLOAD_DIRECTRY as $key => $value )
        {
            $this->addTargetDirectry($value);
        }

        // 自動ロード設定
        $this->registAutoload();
    }

    /**
     * __destruct
     * デストラクタ
     * 
     * @return void
     */
    function __destruct() {
        unset($this->directries);
    }

    /**
     * registAutoload
     * autoLoadメソッド登録。
     * 
     * @return void
     */
    private function registAutoload()
    {
        spl_autoload_register(array($this, 'autoLoad'));
    }

    /**
     * addTargetDirectry
     * 対象ディレクトリ追加。
     *  
     * @param  mixed $dir
     * @return void
     */
    private function addTargetDirectry($dir)
    {
        $this->directries[] = $dir;
    }

    /**
     * autoLoad
     * 自動クラスロード処理。
     * @param  mixed $className
     * @return void
     */
    private function autoLoad($className)
    {
        // ディレクトリ
        foreach ($this->directries as $dir) {
            $file = $dir . '/' . $className . '.php';
            if (is_readable($file))
            {
                require_once $file;
                return;
            }
        }

        // その他ファイル
        foreach ( OTHRER_CLASS as $key => $value )
        {

            // 呼び出しクラスと定義クラスの一致判定
            if ( $className !== $key )
            {
                continue;
            }

            if (is_readable($value))
            {
                require_once $value;
                return;
            }
        }
    }
}

index.php手直し

index.phpでは、AutoLoader.phpの読み込み、パラメタがない場合にはConfig.phpに設定した開始ページを表示するように修正。
コントローラが無い等のエラー時には、ExceptionContorollerを処理する。

<?php
// AutoLoader
require_once('./loader/AutoLoader.php');
$autoLoader = new AutoLoader();

// Get url
if ( isset($_GET['params']) === true )
{
    $params = explode('/', $_GET['params']);
} else {
    $params = [STARTUP_PAGE];
}

// Get Controllername and parameters.
// To lower case
$controller = ucfirst(array_shift($params));

// Create controller instance 
$controller = $controller . 'Controller';

try
{
    // Create instance of controller
    $class = new $controller;
}
catch (Throwable $t)
{
    $class = new ExceptionController();
    $params = $t;
}
catch (Exception $e)
{
    $class = new ExceptionController();
    $params = $e;
}

// Call run method
$ret = $class->run($params);

んむ。
こんなもんかな。
データベースへの接続やら、そんなのは自前で組んでくれたらそれでいいだろうし。

このオレオレフレームワークを使ってブログ書こうかな。

前の記事 次の記事