2

誰かが私のサーバーにアクセスするたびに実行されるメインの PHP ファイルがあります。次のようになります。

<?php

$config = require_once('./config/general.php');

define('ROOT', __DIR__.'/');

include(constant('ROOT').'libraries/log4php/Logger.php');
Logger::configure(constant('ROOT').'config/logging.xml');
$log = Logger::getLogger('main');

$requested_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$route_url = str_replace($config['baseURL'], '', $requested_link);
$route_url = $route_url == '' ? '/' : $route_url;

define('ROUTE', $route_url);

require_once 'routeme.php';

routeme.php要求された URL を処理するのに最適な「ルーティング」クラスを見つけます。そのクラスをインスタンス化し、処理するために作成したルーター クラスのインスタンスに要求情報を渡します。

すべてのルーターは基本クラスを拡張します。

<?php
namespace Blaze;
class Router {
    private $log;

    public function __construct() {

        // The __CLASS__ constant holds the class name
        $this->log = Logger::getLogger(__CLASS__);
    }

    public function routes (){
        return array();
    }
}

ルーターの例:

<?php
namespace Blaze;
class GeneralRouter extends Router {

    public function RootRoute ($url){
        $log->info($url);
    }

    public function routes (){
        return array(
            '/' => 'RootRoute'
        );
    }
}

アプリケーションを実行しようとすると、クラスがlog4php からRouter含まれているクラスを認識しないため失敗します (もちろん、メイン ファイルのログ ステートメントは正常に実行されます)。Loggerlog4php では、自分自身をアプリケーションに一度だけ含めることができるため (おそらくファイル ロックの競合を防ぐため)、ルーターごとに Logger クラスを再含めることはできません。Router が Logger クラスにアクセス/参照できるようにするにはどうすればよいですか?

ソリューションは拡張可能であるRouter必要があります。つまり、Logger クラスにアクセスする必要があるクラスのように、後でさらに多くのクラスが必要になります。

4

1 に答える 1