2016-11-06 5 views
2

私はPHPでフロントコントローラを作成しようとしています。ここでクラスが見つかりません

は私のコードです:

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

} 

次のように私はプロパティを持つルートオブジェクトに渡しているとき:

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

PHPクラスUserModelが見つからないことを私に伝えます。

私は、静的な表現で上記を置き換える場合は、:

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

コードは、おそらくクラスが私のコードで使用するために利用可能であることを私に語った、うまく動作します。

私は迷っています。私は見落としているものはありますか?コード

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

のこの作品で

さらなるお問い合わせは、クラスが存在しないことを教えてください。 new UserModel()でそれをどのように構築することができますか?どのように修正できますか?編集 - -

申し訳ありませんが、私は誤解falseを返す場合

+0

私は '$ model = new $ modelName();'とするべきだと思います。 – mseifert

+0

@mseifert:いいえ、そうではありません。 – Fang

答えて

2

さらに、プロジェクトが成長するにつれて依存関係を追跡するのがますます困難になります。 autoloadingシステムを実装するか、Composerなどの既存のソリューションを使用することをおすすめします。

0

多分uが、それは

get_declared_classes(); 

チェックし、コードの下 使用が必要なクラス名を取得し、

class_exists("UserModel"); 

を確認することができますあなたが意味するもの

コード

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

PHPは確実にあなたが動的クラス名の暗黙のネームスペースを検出することはできません:あなたは、彼らが実行時に解決されているので、変数に格納されているクラス名の名前空間を指定する必要が

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

私はすでにそれをしており、クラスは利用できないと私に伝えます。ただし、名前で呼び出すと、正しく含まれ、使用できるようになります。 – Fang

関連する問題