[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 协议》,转载必须注明作者和本文链接
城里的野山参
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
文章
68
粉丝
10
喜欢
29
收藏
41
排名:563
访问:1.4 万
私信
所有博文
社区赞助商