2012-02-17 9 views
2

私は抽象ベースのコントローラクラスを持っています。すべてのアクションコントローラは、それから派生しています。ベースクラスと派生クラスの依存性注入

構築時のBase Controllerクラスは、Viewオブジェクトを初期化します。このViewオブジェクトは、すべてのアクションコントローラによって使用されます。各アクションコントローラには依存性があります(これはDIコンテナを使用して解決します)。

問題は、ベースコントローラークラスにもいくつかの依存関係(またはパラメーター)、つまり 、path to viewフォルダーが必要であるということです。そして、問題は - コントローラの基底クラスにパラメータを渡す場所と方法

$dic = new Dic(); 

// Register core objects: request, response, config, db, ... 

class View 
{ 
    // Getters and setters 
    // Render method 
} 

abstract class Controller 
{ 
    private $view; 

    public function __construct() 
    { 
     $this->view = new View; 

     // FIXME: How/from where to get view path? 
     // $this->view->setPath(); 
    } 

    public function getView() 
    { 
     return $this->view; 
    } 
} 

class Foo_Controller extends Controller 
{ 
    private $db; 

    public function __construct(Db $db) 
    { 
     $this->db = $db; 
    } 

    public function barAction() 
    { 
     $this->getView()->some_var = 'test'; 
    } 
} 

require_once 'controllers/Foo_Controller.php'; 

// Creates object with dependencies which are required in __construct() 
$ctrl = $dic->create('Foo_Controller'); 

$ctrl->barAction(); 
+0

private $ view;なぜ$ viewはプライベートですか?読み込むビューパスはいつ知っていますか?アクションコントローラの中に?これは簡単に行うことができます。 – busypeoples

答えて

0

これは単なる基本例です。 $ viewがプライベートなのはなぜですか?正当な理由はありますか?

class View { 
    protected $path; 
    protected $data = array(); 

    function setPath($path = 'standard path') { 
    $this->path = $path; 
    } 

    function __set($key, $value) { 
    $this->data[$key] = $value; 
    } 

    function __get($key) { 
    if(array_key_exists($key, $this->data)) { 
     return $this->data[$key]; 
    } 
    } 
} 

abstract class Controller { 
    private $view; 

    public function __construct($path) 
    { 
     $this->view = new View; 

     $this->view->setPath($path); 
    } 

    public function getView() 
    { 
     return $this->view; 
    } 
} 

class Foo_Controller extends Controller { 
    private $db; 


    public function __construct(Db $db, $path) 
    { 
     // call the parent constructor. 
     parent::__construct($path); 
     $this->db = $db; 
    } 

    public function barAction() 
    { 
     $this->getView()->some_var = 'test'; 
    } 

    public function getAction() { 
     return $this->getView()->some_var; 
    } 
} 

class DB { 

} 

$con = new DB; 
$ctrl = new Foo_Controller($con, 'main'); 

$ctrl->barAction(); 
print $ctrl->getAction(); 
+0

あなたの素早いアンサーに感謝します!ビューはプライベートなので、外部からオーバーライドすることはできず、getView()メソッドによってのみアクセスされます。申し訳ありませんが、ブートストラップファイルで定数として定義されているビューパスは1つだけです(例: 'views /')。アクションコントローラのコンストラクタからビューパスを渡すのが正しいと感じます。しかし、パスが変更されない場合は、他の解決策(DIを優先)があるので、各アクションコントローラは親コンストラクタを呼び出して、同じビューパスをもう一度渡す必要はありません。 – Hemaulo

+0

ベスト・アプローチは、親抽象コントローラの内部にデフォルト・パスを定義することです。プライベート$ビュー - >パス= "somepath"; – busypeoples

+0

@Hemauloアクションコントローラ内のコンストラクタをオーバーライドしています。親:: __コントローラを呼び出さなければ、ビューはどのように呼び出されますか? – busypeoples