У меня есть мой основной файл 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'
);
}
}
когда я пытаюсь запустить приложение, оно терпит неудачу, потому что Router
класс не видит включенного Logger
класс из log4php (операторы журнала в главном файле, конечно, работают нормально). Я не могу повторно включить класс Logger для каждого маршрутизатора, потому что log4php позволяет включать его только один раз в приложение (возможно, для предотвращения конфликтов блокировки файлов). Как я могу позволить маршрутизатору получить доступ / увидеть класс Logger?
Решение должно быть расширяемым, т. Е. Позже у меня будет больше классов, таких как Router
класс, который также должен получить доступ к классу Logger.
В вашем Router
учебный класс, Импортировать класс Logger:
<?php
namespace Blaze;
use Logger;
class Router{
public function __construct(){
$this->log = Logger::getLogger(__CLASS__);
}
}
Если вы не импортируете Logger, при попытке вызвать его, PHP пытается получить класс Logger в том же пространстве имен:
Blaze\Logger
Если вы не хотите импортировать его, вы можете сделать:
$this->log = \Logger::getLogger(__CLASS__);
Тогда в вашем GeneralRouter
:
public function RootRoute($url){
$this->log->info($url);
}
Других решений пока нет …