2017-02-22 3 views
-1

Ich versuche einen Lader zu bauen, um verschiedene Controller mit ihren Methoden (wie benötigt) in einem Controller zu laden. Ich habe einen einfachen Code auf meinem Home-Controller entworfen, um den LeftController aufzurufen (jetzt ein Dummy-Controller, aber ich beabsichtige, diesen Controller als Menü zu verwenden).Aufruf verschiedener Methoden eines Controllers vom Lader

require 'controller/LeftController.php'; 
$LeftController = new LeftController(); 
$LeftController->index(); 

Dies funktioniert im HomeController. Es lädt den Controller von LeftController und zeigt den Methodenindex() an.

Gründend meinen Loader auf dem obigen Code das ist, was ich bis jetzt

class Loader 
{ 

    public function controller($controller) 
    { 
     $file = 'controller/' . $controller . '.php'; 
     $class = $controller; 

     if (file_exists($file)) { 
      require($file); // require 'controller/LeftController.php'; 
      $controller = new $class(); //$LeftController = new LeftController(); 

      var_dump($controller); 
     } 
    } 
} 

Auch dies funktioniert getan habe und die Controller instanziiert wird. Ich sehe das Ergebnis mit dem var_dump().

Jetzt muss ich die Methode aufrufen, wie wir an der Spitze Code $LeftController->index(); aber auf der Loader-Klasse dieses Mal sehen.

Eine Möglichkeit, dies zu tun ist, wenn ich $controller->index() direkt nach dem $controller = new $class(); hinzufügen, aber dies wird immer die index() -Methode des Controllers aufrufen.

Wie kann ich diesen Methodenteil so codieren, dass ich jede Methode aufrufen kann, die mit dem Controller verbunden ist, und nicht nur den Index().

+0

Dieser ** Art und Weise ist ** zu breit. – yivi

Antwort

0

Sie können eine Methode Argument mit dem Controller übergeben:

public function controller($controller, $method) 

und nennen es dann auf Ihrem neu Objekt erstellt:

$controller->$method() 

jedoch,

es scheint, du versuchst, das Rad neu zu erfinden. Der Teil, in dem Sie überprüfen, ob eine Datei existiert, sie enthält und die Klasse instanziiert, heißt autoloading.

Der Code könnte wie folgt aussehen:

public function controller($controller, $method) 
{ 
    $instance = new $controller(); 
    return $instance->$method(); 
} 

Während der automatische Laden Teil Verwendung von spl_autoload_register() macht Dateien zu verwalten finden und darunter.

Die spl_autoload_register() Funktion registriert eine beliebige Anzahl von Autoloader für Klassen und Schnittstellen ermöglicht, automatisch geladen werden, wenn sie noch nicht definiert sind.

So können Sie den Code verwenden, die Sie bereits haben, und abstrahieren von der Aktion der Klasse instanziieren:

spl_autoload_register(function autoloader($controller) { 
    $file = 'controller/' . $controller . '.php'; 
    if (file_exists($file)) { require($file); } 
}); 
Verwandte Themen