Laravel (IOC)服务容器 laravle设计模式

首先大家想一想什么是容器,字面意思就是盛放东西的东西,常见的变量,对象属性都是容器,一个容器能够装什么东西,完全在于你对这个容器的定义。有的容器不仅仅只是存文本,变量,而是对象,属性,那么我们通过这种容器就可以进行很多高级的功能。

依赖注入模式

我们知道,对象与对象存在的依赖关系,我们通常通过将被依赖的对象通过方法调用等手段。 而在实现控制反转的过程中,我们也会遇到对象依赖的问题,这就需要反转后的控制者,需要拥有对依赖管理的能力。

对于依赖处理,常见的有两种实现思路:

  • 依赖注入 ( Dependency Injection )
  • 依赖查找 ( Dependency Lookup )

在控制反转的程序结构中,我们最常用的就是依赖注入。 在控制反转中,程序控制者拥有者对依赖管理的能力,所以可以很方便的为对象准备所需的依赖,这就能够让我们省略对以来处理的代码。

控制反转的实现方式

依赖注入的方式有很多,如构造器注入、调用注入、参数注入等等。 在 Laravel 中,主要实现了构造器注入和调用注入。

Laravel 的服务容器

在依赖注入的过程中,依赖管理非常重要的一个环节,而容器 (Container) 正是为管理依赖而生。

容器也可以称为依赖注入容器 ( Dependency Injection Container ) ,容器能够完成对象实例化和依赖注入的过程。 而在这个过程中,被创建的对象本身,却并不知道容器的存在,也不知道自己正受到容器的管理。 这样的实现,就让控制反转后,程序与控制者的耦合性降到了最低。

正因为容器拥有着这样举足轻重的地位,所以目前各个语言最优秀的框架,几乎都离不开容器的支持。 例如 Java 领域的 Spring ,以及我们的主角 Laravel ,都是以容器为核心进行设计的。

在 Laravel 中,容器类 \Illuminate\Container\Container 实现构造器注入和调用注入两个方法分别为:

/**
 * 使用容器解析并返回对象
 */
protected function resolve($abstract, $parameters = [])
{
    // 当被解析的对象需要创建时,就会通过对象的构造方法进行依赖注入
}

/**
 * 使用容器调用方法
 */
protected function call($callback, array $parameters = [], $defaultMethod = null)
{
    // 对指定函数或方法的依赖参数进行注入,然后调用它并返回结果
}

在 Laravel 中,将不同的模块以服务 ( Service ) 的形式进行封装,所以 Laravel 的容器,就成为服务容器 ( Service Container ) 。

容器对依赖注入的实现

依赖注入的关键部分,就是对依赖的分析。 在 Laravel 的 \Illuminate\Container\Container 中,通过 resolveDependencies 来分析和查找依赖参数。

/**
 * 分析依赖参数
 */
protected function resolveDependencies(array $dependencies)
{
    $results = [];

    foreach ($dependencies as $dependency) {
        // 如果存在传入参数覆盖,使用自定义的参数
        if ($this->hasParameterOverride($dependency)) {
            $results[] = $this->getParameterOverride($dependency);
            continue;
        }

        // 分析依赖参数的类型,根据不同的类型使用不同的参数解析方法
        $results[] = is_null($dependency->getClass())
                        ? $this->resolvePrimitive($dependency)
                        : $this->resolveClass($dependency);
    }

    return $results;
}

在 Laravel 中,会根据依赖参数的类型,选择获取依赖的方式。 其中,对于基础类型的参数,Laravel 会从传入参数和参数默认值中进行选择。 而对于需要的对象,Laravel 则会继续从容器中查找。 这样就形成了完整的通过容器,实现依赖处理逻辑。

小结

如果要解释我们为什么要使用依赖注入模式,那就是因为我们需要使用控制反转。 控制反转的程序设计思想,完全符合程序设计的依赖倒置原则,能够帮助我们实现的解耦。

未经允许不得转载:张艺博的个人博客 » Laravel (IOC)服务容器 laravle设计模式

赞 (4) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏