2017-02-22 19 views
-1

コントローラ内で(必要に応じて)さまざまなコントローラをロードするためのローダーをビルドしようとしています。私は、私の家のコントローラでLeftController(今はダミーのコントローラですが、私はこのコントローラをメニューとして使うつもりです)を呼び出すための簡単なコードを描きました。ローダーからコントローラのさまざまなメソッドを呼び出す

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

これはHomeController内で機能します。 LeftControllerコントローラをロードし、メソッドindex()を表示します。

これは私が今

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

これはあまりにも動作し、コントローラがインスタンス化されるまで行われてきたものである上記のコードで私のローダを基づか。私はvar_dump()を使って結果を見る。

今度は、最上部のコード$LeftController->index();に表示されているように、このメソッドを呼び出す必要がありますが、今回はこのメソッドを呼び出す必要があります。

$controller = new $class();の直後に$controller->index()を追加すると、コントローラのindex()メソッドが呼び出されます。

このメソッド部分を、index()だけでなく、コントローラに関連付けられたメソッドを呼び出せるようにコーディングするにはどうすればよいですか。

+0

これは** **広すぎる方法です。 – yivi

答えて

0

あなたのコントローラとメソッドの引数に渡すことができます。それはしかし

$controller->$method() 

public function controller($controller, $method) 

をして、新しく作成されたオブジェクト上でそれを呼び出しますあなたは車輪を再発明しようとしているようだ。ファイルが存在し、クラスをインスタンス化してクラスをインスタンス化するかどうかを確認する部分は、autoloadingと呼ばれます。

コードは次のようになります。

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

オートロード部分が見つけ、ファイルなどの管理するspl_autoload_register()を利用しながら。

spl_autoload_register()関数は任意の数のオートローダーを登録し、クラスとインタフェースが現在定義されていない場合に自動的にロードできるようにします。

だから、クラスをインスタンス化の作用から、あなたが既に持っているコード、およびそれ抽象を使用することができます。

spl_autoload_register(function autoloader($controller) { 
    $file = 'controller/' . $controller . '.php'; 
    if (file_exists($file)) { require($file); } 
}); 
関連する問題