[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 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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