使用容器进行依赖注入

时间:2013-04-24 11:09:36

标签: php oop design-patterns dependency-injection ioc-container

阅读了很多关于依赖注入的内容,现在我正在努力创造一些东西。我想到了一个简单的表单提交。基本上是一个表单,标题为input字段,正文为textarea

然后我有一个容器,像这样:

class IoC
{
  protected $db;

  public static function newPost()
  {
     $post = new Post(); // Instantiate post class so we can use the methods in there
     $input = $post->getInput(); // Method that gets the POST values
     $post->insertInput($input, $db); // Method that adds the post values to a database
  }
}
//Call IoC::newPost(); on the page the form submits to

这是Post类:

class Post
{
  protected $db;

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

  public function getInput()
  {
    // Should I get the post input here? Like $_POST['title'] etc. and put it 
    // into an array and then return it?
    return $input;
  }

  public function insertIntoDB($db, $input)
  {
    // Should I hardcode the connection and query here?
  }
}

正如您所看到的,我对连接的来源感到困惑。考虑一下,我想有一个单独的,可重用的Database类来创建连接并在容器中调用该类是明智的吗?

我真的不知道,随时告诉我你会怎么做,如果有的话可以举例说明。

1 个答案:

答案 0 :(得分:1)

依赖注入背后的想法是你真正注入任何依赖项。说你有Post课程。这个类 - 在您的情况下 - 取决于数据库,因此您在构造函数中注入Database对象(或者如果您愿意,请设置setter,有关详细信息,请参阅symfony2)。您的数据库类需要参数来设置连接,您可以通过注入配置(提供者)对象来执行此操作(是的!)。

您的容器只不过是管理对象并可能初始化它们的容器。初始化Database对象是容器的任务,因此可以将其插入Post对象中。

我不知道你的IoC做了什么,但如果它是你的容器,我不会建议它私下这样做。您可以将容器传递给您要求post对象的控制器。

http://symfony.com/doc/current/book/service_container.html