[laravel源码] Container/resolve 解析

说明

本章说明容器中 resolve 的流程。

源码

vendor\laravel\framework\src\Illuminate\Container\Container.php

protected function resolve($abstract, $parameters = [])
{
    // 1. aliases获取别名
    $abstract = $this->getAlias($abstract);

    // 2. 判断是否需要匿名函数
    $needsContextualBuild = ! empty($parameters) || ! is_null(
        $this->getContextualConcrete($abstract)
    );

    // 3. instances已存在且已有匿名函数,直接返回
    if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {
        return $this->instances[$abstract];
    }
    $this->with[] = $parameters;

    // 4. 获取匿名函数
    $concrete = $this->getConcrete($abstract);

    // 5.条件判断,进入不同流程
    if ($this->isBuildable($concrete, $abstract)) {
        $object = $this->build($concrete);
    } else {
        $object = $this->make($concrete);
    }

    // 6. 获取扩展回调,有,则执行
    foreach ($this->getExtenders($abstract) as $extender) {
        $object = $extender($object, $this);
    }

    // 7.判断share并赋值
    if ($this->isShared($abstract) && ! $needsContextualBuild) {
        $this->instances[$abstract] = $object;
    }

    // 8. 执行解析到的回调函数
    $this->fireResolvingCallbacks($abstract, $object);

    // 9. 赋值
    $this->resolved[$abstract] = true;
    array_pop($this->with);
    return $object;
}

分析

本作品采用《CC 协议》,转载必须注明作者和本文链接
城里的野山参
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
文章
68
粉丝
10
喜欢
29
收藏
41
排名:562
访问:1.4 万
私信
所有博文
社区赞助商