Php 基类和派生类中的依赖注入

Php 基类和派生类中的依赖注入,php,dependency-injection,base-class,Php,Dependency Injection,Base Class,我有一个抽象的基本控制器类,所有动作控制器都是从它派生的 构造时的基本控制器类初始化视图对象。此视图对象由所有动作控制器使用。每个动作控制器都有不同的依赖关系,这可以通过使用DI容器来解决 问题是基本控制器类还需要一些依赖项或参数, 例如,查看文件夹的路径。问题是-在哪里以及如何将参数传递给基本控制器类 $dic = new Dic(); // Register core objects: request, response, config, db, ... class View {

我有一个抽象的基本控制器类,所有动作控制器都是从它派生的

构造时的基本控制器类初始化视图对象。此视图对象由所有动作控制器使用。每个动作控制器都有不同的依赖关系,这可以通过使用DI容器来解决

问题是基本控制器类还需要一些依赖项或参数, 例如,查看文件夹的路径。问题是-在哪里以及如何将参数传递给基本控制器类

$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();

这只是一个基本的例子。为什么$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();

这只是一个基本的例子。为什么$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();

私人$view;为什么$view是私有的?您何时知道要加载哪个视图路径?在动作控制器内部?这样做很容易。private$view;为什么$view是私有的?您何时知道要加载哪个视图路径?在动作控制器内部?这样做很容易。谢谢你的快速回复!视图是私有的,因此不能从外部重写,只能通过getView方法访问。很抱歉,我忘了提到引导文件中只有一个视图路径,例如“views/”定义为常量。从动作控制器的构造函数传递视图路径感觉是正确的。但是,如果路径不变,是否有其他有利于DI的解决方案,这样每个动作控制器就不需要调用父构造函数并再次传递相同的视图路径?最好的方法是在父抽象控制器内定义默认路径。私有$view->path=somepath@Hemaulo您正在重写动作控制器内的构造函数,请记住这一点。在不调用父控制器的情况下,如何调用视图?基本控制器类是框架的一部分,视图路径由应用程序定义。您的解决方案是最简单的方法,但视图路径将是硬编码和相对的。首选绝对路径,但每个应用程序位于不同的文件夹中。仅当子类定义了自己的构造方法时,才需要调用父构造函数。有些控制器可能没有依赖项,因此也可能没有构造函数,在这种情况下,将自动调用parent::\u构造函数。感谢您的快速回复!视图是私有的,因此不能从外部重写,只能通过getView方法访问。很抱歉,我忘了提到引导文件中只有一个视图路径,例如“views/”定义为常量。从动作控制器的构造函数传递视图路径感觉是正确的。但是,如果路径不变,是否有其他有利于DI的解决方案,这样每个动作控制器就不需要调用父构造函数并再次传递相同的视图路径?最好的方法是在父抽象控制器内定义默认路径。私有$view->path=somepath@Hemaulo您正在重写动作控制器内的构造函数,请记住这一点。在不调用父控制器的情况下,如何调用视图?基本控制器类是框架的一部分,视图路径由应用程序定义。您的解决方案是最简单的方法,但视图路径将是硬编码和相对的。首选绝对路径,但每个应用程序位于不同的文件夹中。仅当子类定义了自己的构造方法时,才需要调用父构造函数。有些控制器可能没有依赖项,因此也可能没有构造函数,在这种情况下,将自动调用parent::\u构造函数。