2017-05-12 6 views
2

J'ai mon fichier PHP principal qui est exécuté chaque fois que quelqu'un frappe mon serveur. Il ressemble à ceci:Autoriser la classe instanciée à accéder à la classe include dans le créateur

<?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 trouve la meilleure classe « routage » pour gérer l'URL demandée. Il instancie cette classe puis transmet l'information de demande à l'instance de la classe de routeur qu'elle a créée pour qu'elle soit gérée.

Tous les routeurs étendent une classe de base:

<?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(); 
    } 
} 

Un exemple routeur:

<?php 
namespace Blaze; 
class GeneralRouter extends Router { 

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

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

lorsque je tente de lancer l'application, il échoue parce que la classe Router ne voit pas inclus Logger classe de log4php (les instructions de journal dans le fichier principal s'exécutent bien, bien sûr). Je ne peux pas ré-inclure la classe Logger par routeur car log4php ne permet que d'être inclus une fois dans une application (probablement pour éviter les conflits de verrouillage de fichiers). Comment puis-je laisser le routeur accéder/voir la classe Logger?

La solution doit être extensible, c'est-à-dire que j'aurai plus de classes plus tard, comme la classe Router qui devra également accéder à la classe Logger.

Répondre

1

Dans votre Router classe, import la classe Logger:

<?php 

namespace Blaze; 

use Logger; 

class Router{ 
    public function __construct(){ 
     $this->log = Logger::getLogger(__CLASS__); 
    } 
} 

Si vous n'importez pas Logger, lorsque vous essayez de l'appeler, PHP tente de récupérer la classe Logger dans le même espace:

Blaze\Logger 

Si vous ne voulez pas l'importer, vous pouvez faire:

$this->log = \Logger::getLogger(__CLASS__); 

Puis dans votre GeneralRouter:

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

Merci! C'est ce que je reçois pour ne pas programmer en PHP depuis presque 3 ans lol –

+0

@KeithM Vous êtes les bienvenus :) –