资讯专栏INFORMATION COLUMN

Laravel服务容器

oogh / 3087人阅读

摘要:框架底层解析本文参考陈昊框架关键技术解析,搭建一个属于自己的简化版服务容器。服务容器建立项目空文件夹如添加,执行目的是为了学习利用的自动加载。

laravel框架底层解析

本文参考陈昊《Laravel框架关键技术解析》,搭建一个属于自己的简化版服务容器。
其中涉及到反射、自动加载,还是需要去了解一下。

laravel服务容器

建立项目空文件夹(如 mylaravel)

添加composer.json,执行composer install

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "autoload": {
        "classmap": [
        ],
        "psr-4": {
            "App": "app/"
        }
    }
}

目的是为了学习、利用composer的自动加载。

文件路径如下所示

mylaravel

app

Traveller

Traveller.php

Visit

Leg.php

Visit.php

Container.php

Index.php

vendor

composer.json

简化版Container.php

getClosure($abstract, $concrete);
        }
    
        $this->bindings[$abstract] = compact("concrete", "shared");
    
    }
    //默认的回调函数
    protected function getClosure($abstract, $concrete)
    {
        //生成实例的回调函数, $c一般为ioc容器对象
        return function($c) use ($abstract, $concrete)
        {
            $method = ($abstract == $concrete) ? "build" : "make";
            return $c->$method($concrete);
        };
    }
    //生成实例对象,首先解决接口和要实例化类之间的依赖
    public function make($abstract)
    {
        $concrete = $this->getConcrete($abstract);
        if ($this->isBuildable($concrete, $abstract)) {
            $object = $this->build($concrete);
        } else {
            $object = $this->make($concrete);
        }
        return $object;
    }
    protected function isBuildable($concrete, $abstract)
    {
        return $concrete === $abstract || $concrete instanceof Closure;
    }
    //获取绑定的回调函数
    protected function getConcrete($abstract)
    {
        if ( ! isset($this->bindings[$abstract]))
        {
            return $abstract;
        }
        return $this->bindings[$abstract]["concrete"];
    }
    //实例化对象
    public function build($concrete)
    {
        if ($concrete instanceof Closure) {
            return $concrete($this);
        }
        $reflector = new ReflectionClass($concrete);
        if ( ! $reflector->isInstantiable()) {
            echo $message = "Target [$concrete] is not instantiable.";
        }
        $constructor = $reflector->getConstructor();
        if (is_null($constructor)) {
            return new $concrete;
        }
        $dependencies = $constructor->getParameters();
        $instances = $this->getDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }
    protected function getDependencies($parameters)
    {
        $dependencies = [];
        foreach ($parameters as $parameter)
        {
            $denpendency = $parameter->getClass();
            if (is_null($denpendency)) {
                $dependencies[] = NULL;
            } else {
                $dependencies[] = $this->resolveClass($parameter);
            }
        }
        return (array) $dependencies;
    }
    protected function resolveClass(ReflectionParameter $parameter)
    {
        return $this->make($parameter->getClass()->name);
    }
}

Visit.php接口


Leg.php接口的一种实现


Traveller.php相当于Controller下的方法

trafficTool = $visit;
    }
    public function visitTibet()
    {
        $this->trafficTool->go();
    }
}

Index.php

bind("AppVisitVisit", "AppVisitLeg");
            $app->bind("Traveller", "AppTravellerTraveller");
            //通过容器实现依赖注入,完成类的实例化
            $tra = $app->make("AppTravellerTraveller");
            $tra->visitTibet();
    }
}

$b = new Index;
$b->index();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22433.html

相关文章

  • 深入剖析 Laravel 服务容器

    摘要:划下重点,服务容器是用于管理类的依赖和执行依赖注入的工具。类的实例化及其依赖的注入,完全由服务容器自动的去完成。 本文首发于 深入剖析 Laravel 服务容器,转载请注明出处。喜欢的朋友不要吝啬你们的赞同,谢谢。 之前在 深度挖掘 Laravel 生命周期 一文中,我们有去探究 Laravel 究竟是如何接收 HTTP 请求,又是如何生成响应并最终呈现给用户的工作原理。 本章将带领大...

    abson 评论0 收藏0
  • Laravel思维导图之Laravel核心概念

    摘要:的核心概念包括服务容器服务提供者门面契约。所有服务提供者都需要继承类。可以为服务提供者的方法设置类型提示。方法将在所有其他服务提供者均已注册之后调用。同样会整理成思维导图的形式以方便记忆与回顾。 showImg(https://segmentfault.com/img/remote/1460000010771201); Laravel 的核心概念包括:服务容器、服务提供者、门面(Fac...

    wthee 评论0 收藏0
  • 使用 Laravel 服务容器的优势

    摘要:理解服务容器的概念,对于我们使用太重要了,应该说是否理解服务容器的概念是区分是否入门的重要条件。因为整个框架正是在服务容器这一基础上构建起来的。 本篇文章转载自我的个人博客原文地址SampsonBlog 如果说laravel框架的核心是什么,那么无疑是服务容器。理解服务容器的概念,对于我们使用laravel太重要了,应该说是否理解服务容器的概念是区分是否入门laravel的重要条件。因...

    jeffrey_up 评论0 收藏0
  • 在 Docker 中运行 Laravel 项目

    摘要:本篇承接使用构建环境,介绍如何在该文所用的容器中运行项目。接下来可以新建一个项目或是通过转移项目。从上同步项目一般服务器中运行的项目都是在本地开发完成后同步上去的。生成文件文件含有项目所需的配置以及用于加密解密的随机字符串。 本篇承接 使用 Docker 构建 LNMP 环境,介绍如何在该文所用的容器中运行 Laravel 项目。主要步骤为:转移 Laravel 项目到数据卷 => 配...

    luxixing 评论0 收藏0
  • PHPer面试指南-Laravel

    摘要:简述的生命周期采用了单一入口模式,应用的所有请求入口都是文件。分发请求一旦应用完成引导和所有服务提供者都注册完成,将会移交给路由进行分发。此外,由于对动态方法的独特用法,也使测试起来非常容易。 本书的 GitHub 地址:https://github.com/todayqq/PH... Laravel 作为现在最流行的 PHP 框架,其中的知识较多,所以单独拿出来写一篇。 简述 La...

    alaege 评论0 收藏0
  • Laravel修炼:服务容器绑定与解析

    摘要:用匿名函数的好处在于,这个服务绑定到容器以后,并不会立即产生服务最终的对象,只有在这个服务解析的时候,匿名函数才会执行,此时才会产生这个服务对应的服务实例。 前言   老实说,第一次老大让我看laravel框架手册的那天早上,我是很绝望的,因为真的没接触过,对我这种渣渣来说,laravel的入门门槛确实有点高了,但还是得硬着头皮看下去(虽然到现在我还有很多没看懂,也没用过)。  后面慢...

    The question 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<