2016-11-06 3 views
2

Ich versuche einen Frontcontroller in PHP zu schreiben.Klasse nicht gefunden

Hier ist mein Code:

<?php 

require_once('Controller/LoginController.php'); 
require_once('View/LoginView.php'); 
require_once('Model/UserModel.php'); 

class FrontController 
{ 
    private $controller; 
    private $view; 

    public function __construct(Router $router, $routeName, $action = null) 
    { 
     $route = $router->getRoute($routeName); 

     $modelName = $route->model; 
     $controllerName = $route->controller; 
     $viewName = $route->view; 

     $model = new $modelName; 
     $this->controller = new $controllerName($model); 
     $this->view = new $viewName($routeName, $model); 

     if (!empty($action)) $this->controller->{$action}(); 
    } 

    public function output() { 

     if (!empty($this->view)) 
     { 
      return $this->view->output(); 
     } 
    } 

} 

Wenn ich in einer Route Objekt mit Eigenschaften, vorbei wie folgt:

route-> model = 'UserModel' 
    route-> view = 'LoginView' 
    route-> controller = 'LoginController' 

PHP sagt mir, dass Klasse UserModel kann nicht gefunden werden.

Wenn ich jedoch die oben mit statischen Ausdrücke ersetzen:

$model = new UserModel(); 
$this->controller = new LoginController(); 
$this->view = new LoginView(); 

der Code funktioniert gut, das sagt mir, vermutlich, dass die Klassen für die Verwendung in meinem Code zur Verfügung stehen.

Ich bin verloren. Gibt es etwas, das ich übersehe?

Weitere Untersuchungen mit diesem Stück Code

if (!class_exists("UserModel")) die("No UserModel"); 

mir sagen, dass die Klasse nicht existiert. Wie ist es dann möglich, dass ich es mit new UserModel() konstruieren kann und wie kann ich es beheben?

+0

Ich denke, es sollte '$ model = new $ modelName();' Fügen Sie die Klammern – mseifert

+0

@mseifert: Nein, das ist es nicht. – Fang

Antwort

2

Sie haben Namespaces für die Klassennamen angeben, die in Variablen gespeichert werden, da sie zur Laufzeit aufgelöst werden:

$class = 'Your\Full\Namespace\Path\UserModel'; 
// ... 
$object = new $class; 

PHP nicht zuverlässig den Namespace Sie für die dynamischen Klassennamen implizierten erkennen .

Außerdem wird es immer schwieriger, Abhängigkeiten zu verfolgen, wenn das Projekt wächst. Ich empfehle, ein autoloading System zu implementieren oder eine vorhandene Lösung wie Composer zu verwenden.

0

vielleicht kann u

class_exists("UserModel"); 

überprüfen, ob false zurück, Verwendung unter Code erforderlichen Klassennamen erhalten, überprüfen Sie es

get_declared_classes(); 

- bearbeiten -

Sorry, ich falsch verstanden was meinst du

unter code

route-> model = new 'UserModel'; 
route-> view = new 'LoginView'; 
route-> controller = new 'LoginController'; 
+0

Ich habe das schon gemacht und es sagt mir, dass die Klasse nicht verfügbar ist. Es ist jedoch korrekt eingebunden und verfügbar, wenn ich es mit seinem Namen anrufe. – Fang