layout: post title: "Symfony 2 依赖注入组件" date: 2015-01-22

categories: php

Dependency(依赖)

在面向对象编程,一个对象的运行可能依赖于其他对象


namespace Kittencup\Di;

class Article
{

    protected $title;
    protected $content;
    protected $id;

    public function __construct($id,Db $db)
    {
        $data = $db->findArticle($id);
        $this->id = $id;
        $this->title = $data['title'];
        $this->content = $data['content'];
    }

}

class Db
{
    public function findArticle($id)
    {
        // 数据库查询,返回数据库中文章的数据
        return [
            'title' => 'kittencup',
            'content' => 'kittencup.com'
        ];
    }
}

在此有一个Article类,保存文章的标题和内容数据,它初始化时需要传递Db对象来进行文章的数据查询,我们可以理解为Article类的运行依赖与Db类

Injection(注入)


$db = new Db();
$article = new Article(100,$db);

当我们实例化Article类时,我们需要注入$db对象

Dependency Injection(依赖注入)

所谓的依赖注入,对象在被创建的时候,由一个调控所有对象的对象,将其所依赖的对象的引用传递给它

Service Container(服务容器)

依赖注入的实现,需要通过一个调控对象来管理,在Symfony中Service Container就是这个调控对象,简称Container


$container->get('Article');

从container中获取Article的实例,当然在这只是模拟,Article类在Container注册及所依赖的对象配置过程都省去了。

安装组件

[shell] #使用composer下载组件 composer require symfony/dependency-injection [/shell]

Basic Usage(基本用法)


namespace Kittencup\Di;

use Symfony\Component\DependencyInjection\ContainerBuilder;

include "vendor/autoload.php";

class Article
{

    protected $title;
    protected $content;
    protected $id;

    public function __construct($id,Db $db)
    {
        $data = $db->findArticle($id);
        $this->id = $id;
        $this->title = $data['title'];
        $this->content = $data['content'];
    }

}

class Db
{
    public function findArticle($id)
    {
        return [
            'title' => 'kittencup',
            'content' => 'kittencup.com'
        ];
    }
}

$container = new ContainerBuilder();
$container->register('db', 'Kittencup\Di\Db');

$db = $container->get('db');

通过ContianerBuilder创建出Container用来管理对象及其依赖关系,在这里通过register()方法将类Kittencup\Di\Db注册进Container,并且取服务名为db,当想要获取Kittencup\Di\Db的实例时,通过get()方法,并传递需要取出的类所对应的服务名,用户不需要关心实例怎么创建的,Container会帮你完成整个创建过程