首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【译】深入研究 Laravel 的依赖注入容器

原文地址:Laravel's Dependency Injection Container in Depth 下面是中文翻译。 Laravel拥有强大的控制反转(IoC)/依赖注入(DI) 容器。...例如,Laravel使用它来确保无论什么时候将单实例Container实例注入到类中都会返回它: $container->instance(Container::class, $container);...,并且可以用于创建具有不同参数的类的多个实例,同时依然注入依赖关系: class Post { public function __construct(Database $db, int $id...下面这些是对其余共用方法的总结: bound() 如果类或名称使用 bind(), singleton(), instance() 或 alias()绑定, bound()将会返回true if (!...() - 清除所有实例对象 flush() - 清除所有绑定和实例,有效的重置容器 setInstance() - 使用 getInstance()替换使用的实例 Note: 最后一节的方法都不是 Container

4.6K70
您找到你想要的搜索结果了吗?
是的
没有找到

Laravel神奇的服务容器

Laravel的核心是IocContainer, 文档中称其为“服务容器”,服务容器是一个用于管理类依赖和执行依赖注入的强大工具,Laravel中的功能模块比如 Route、Eloquent ORM、Request...、Response等等等等,实际上都是与核心无关的类模块提供的,这些类从注册到实例化,最终被我们所使用,其实都是 laravel 的服务容器负责的。...本篇就来探讨一下Laravel中的服务绑定和解析是如何实现的 服务绑定 常用的绑定服务到容器的方法有instance, bind, singleton, alias。下面我们分别来看一下。...instance 将一个已存在的对象绑定到服务容器里,随后通过名称解析该服务时,容器将总返回这个绑定的实例。...} singleton 方法是bind方法的变种,绑定一个只需要解析一次的类或接口到容器,然后接下来对于容器的调用该服务将会返回同一个实例 alias 把服务和服务别名注册到容器: public function

1.5K30

详解Laravel服务容器的绑定与解析

在这种情况下,将返回MailSender的实例。  ...从最终的使用方式来看,laravel容器对服务实例的管理主要包括以下几个方面: 服务的绑定与解析 服务提供者的管理 别名的作用 依赖注入 先了解如何在代码中获取到容器实例,再学习上面四个关键 如何在代码中获取到容器实例...{ protected $app;   laravel实例化服务提供者的时候,会把laravel容器实例注入到这个$app上面。...,是bind的一种特殊情况(第三个参数为true),绑定到容器的对象只会被解析一次,之后的调用都返回相同的实例 public function singleton($abstract, $concrete...),第三个参数就表示这个服务是否在多次解析的时候,始终返回第一次解析出的实例(也就是单例绑定singleton)。

1.9K31

Laravel的生命周期

现在我们知道了,每次请求之后php的变量都会unset(),laravelsingleton只是在某一次请求中singleton,在php中的静态变量也不能在多个请求之间共享,不像Java静态变量拥有全局作用...It feels great to relax. | */ 阶段二:创建laravel实例(服务器容器) 这个阶段是由 bootstrap/app.php 来完成创建实例(服务器容器)的,实际就是项目初始化的过程..../') ); // 绑定内核到服务器容器 // http内核 $app->singleton( Illuminate\Contracts\Http\Kernel::class, App...,拿到用户请求中的报文信息;还是HttpKernel这个类文件,$kernel->handle()拿到用户的请求数据后,返回一个响应实例。...至此,Laravel就完成了一次请求处理。 阶段四:返回响应数据 经过上面漫长的处理之后,HTTP请求终于迎来了最终章,将得到的响应数据输出给用户。

1.6K10

Laravel 非常规教程之1 生命周期

上一节老高零(瞎)散(扯)的讲了一下laravel的基本知识,不知道你现在搞清楚symfony vs laravel的关系了吗?...本节关注一次请求在Laravel中的生命周期!就是从接收到请求到返回请求整个过程中都发生了哪些比较重要的事件。 入口 让我们先把目光移向程序的入口,index.php的内容如下 <?.../bootstrap/autoload.php'; # $app就是后面要提到的容器 $app = require_once __DIR__.'/.....这个share值会影响make的时候的某一步逻辑,具体代码如下,针对singleton实例化之后会被$app缓存起来,提高了性能,而通过bind方法绑定的类被实例化时每次返回的都是不同的对象。...的启动过程中服务容器——laravel真正的核心一节。

49820

Laravel系列6.3】框架启动与服务容器源码

框架启动与服务容器源码 了解了服务容器的原理,要处理的问题,以及 Laravel 中如何使用服务容器以及服务提供者之后,我们就进入到了源码的学习中。...其实服务容器的源码还是比较好理解的,毕竟我们已经自己实现过一个简单的服务容器了。在这里,我们也顺便看一下 Laravel 框架启动时的容器加载情况。...,在 bind() 方法中直接进行了判断,如果是实例则直接放到 instances 数组中,而在 Laravel 中,则是分开了,必须在 instance() 方法中才会将实例保存到 instances...,如果是的话,直接调用这个回调函数并且返回了。...ServiceProvider 服务提供者 通过上面的几个方法学习,我们了解到了整个 Laravel 容器中最重要的几个方法,也就是绑定实现以及获得具体的实例对象,是不是和我们自己实现的那个服务容器非常像

1.9K20

Laravel服务容器绑定的几种方法总结

简单的绑定 在一个服务提供者中,可以通过 $this- app 变量访问容器,然后使用 bind 方法注册一个绑定,该方法需要两个参数,第一个参数是我们想要注册的类名或接口名称,第二个参数是返回类的实例的闭包...绑定一个单例 singleton 方法绑定一个只会解析一次的类或接口到容器,然后接下来对容器的调用将会返回同一个对象实例: $this- app- singleton('HelpSpot\API', function...Laravel 为此定义了简单、平滑的接口: use Illuminate\Support\Facades\Storage; use App\Http\Controllers\VideoController...class) - give(function () { return Storage::disk('s3'); }); 标签 少数情况下,我们需要解析特定分类下的所有绑定,例如,你正在构建一个接收多个不同...($service); }); 总结 到此这篇关于Laravel服务容器绑定的文章就介绍到这了,更多相关Laravel服务容器绑定内容请搜索ZaLou.Cn

95820

深入剖析 Laravel 服务容器

bind 简单绑定 singleton 单例绑定 instance 实例绑定 contextual-binding 上下文绑定 自动注入和解析 Laravel 服务容器实现原理 注册基础服务...,并返回服务实例。...从 Laravel 服务容器解析 - 绑定 这部分的文档我们知道常用的绑定方式有: bind($abstract, $concrete) 简单绑定:将实现绑定到接口,解析时每次返回新的实例singleton...is_null( $this->getContextualConcrete($abstract) ); // 如果给定的类型已单例模式绑定,直接从服务容器返回这个实例而无需重新实例化...,解析出扩展绑定结果; 如果绑定服务为单例绑定类型(singleton),将解析到的服务加入到单例对象池; 其它处理如触发绑定监听器、将服务标记为已解析状态等,并返回服务实例

8.9K10

基于 RoadRunner 驱动 Octane 构建高性能 Laravel 应用

/vendor/bin/sail up -d 这个时候,容器中的 Laravel 应用就是基于 RoadRunner 驱动的了。...六、注意事项 由于一个 Worker 会处理多个请求,而在同一个 Worker 中,只会在初始化时加载一次 Laravel 应用,后面的请求会复用第一次加载的服务容器(意味着所有服务提供者的 register...和 boot 方法只有第一次加载时会被调用,这就是所谓的「常驻内存」),所以我们在切换到基于 Laravel Octane 驱动 的 HTTP 服务器时,对于服务注入要格外小心,不要将后续会变动的对象以单例模式注入服务容器...容器注入 不要将服务容器、请求实例或者其他会发生变动的对象以单例模式注入到某个服务的构造函数: use App\Service; /** * Register any application services..., function () { return new Service(fn () => Container::getInstance()); }); 这样一来,每次解析出来的都将是最新的对象实例

1.8K30

Laravel框架源码解析之入口文件原理分析

本文实例讲述了Laravel框架源码解析之入口文件原理。分享给大家供大家参考,具体如下: 前言 提升能力的方法并非使用更多工具,而是解刨自己所使用的工具。...随后就是加载内核,载入服务提供者、门面所映射的实体类,中间件,最后到接收http请求并返回结果。...而$app这个在服务提供者的核心变量则就是Application实例化所得,而你在服务提供者内使用的make,bind,singleton来自他的父类Container,都说容器laravel的核心概念...'/../') ); 上面我们已经获得app的实例化了,现在通过app来注册核心类、异常类,并将 $app- singleton( Illuminate\Contracts\Http\Kernel::...的启动,至于结果的返回则有开发者自行通过控制器或其他可访问类返回

1.9K30

laravel源码解读学习(一)Application的实例

bootstrap/app.php读注释可以理解到14~16行代码new了一个Illuminate\Foundation\Application实例,该实例作用是粘合laravel各组件和作为系统的依赖注入容器...的IOC容器对外开放的注册实例的入口(之一)。...2.registerBaseBindings()这一步的逻辑是把Illuminate\Foundation\Application自身注册为Laravel的IOC容器实例把自身注册为'app'的实例、把自身注册为...bind()和singleton()的实现,目前只需要了解它会关联到IOC容器注册且实例化类的核心,且在第一次显示获取实例前不会实例化对应类,即是注册时并不会实例化类或执行注册的回调函数,不了解反射的请先学习一下...()的逻辑结束总结这次内容只看了Application的实例化,做的事情不多,可以概括为基于IoC容器,组织项目目录结构,注册Application作为IoC容器实例,注册路由、Event、日志三大模块的

10510

Laravel源码解析之HTTP Kernel

应用解析内核 在将应用初始化阶段将Http内核绑定至应用的服务容器后,紧接着在 public/index.php中我们可以看到使用了服务容器的 make方法将Http内核实例解析了出来: $kernel...请求实例,在后续应用剩余的生命周期中 Request请求实例就是对本次HTTP请求的抽象,关于Laravel Request请求实例的讲解可以参考以前的章节。...之前的文章里一直在说服务容器Laravel框架的核心,这篇文章讲讲 Laravel的 HTTP内核有的人可能会问到底哪个才是 Laravel的核心,实际上服务容器是一切的基础,框架中每时每刻都在用到它提供的依赖注入和控制反转的能力...Laravel 刚刚启动时先启动容器对象 Application,然后加载配置、通过 ServiceProvider往容器对象里填充一些对象为接下来处理请求做准备,但是真正干活的是 Kernel, Application...所以,依赖注入(IoC 容器) 是 Laravel 的基石,真正干活的是 Kernel。

1.4K30

Laravel核心概念:服务容器(ServiceContainer),服务提供者(Service Provider),门面(Facade),契约(Contracts)

写在前面 学了两个多月的laravel一直没有去研究他的核心概念,在文档上看到些名词 “服务容器”,“服务提供者”...整个人人都是懵的下面结合我这几天的学习谈谈我的理解。...laravel的核心架构:服务容器,服务提供者,门面,契约。...在laravel中应用本身就是一个容器容器管理调用各种服务 laravel在运行的时候会创建一个app对象 这个对象就是容器 所有的服务都是在app中调用的。...绑定后的类可直接依赖注入,自动处理依赖关系 Route::get('test',function(Family $family){ }); 上面只是一个基本绑定 bind的第一个参数为 要绑定的类名,第二个参数为闭包函数返回类的实例...这个 provides 方法返回该提供者注册的服务容器绑定: 以laravel框架的CacheServiceProvider为例 <?

2.5K31

Laravel 服务提供者指南

Laravel 服务提供者指南 如果你使用过 Laravel 框架的话,那么,你不可能没听说过服务容器和服务提供者。...理解服务容器和服务提供者 什么是服务容器 简而言之,Laravel 服务容器 是一个用于存储绑定组件的盒子,它还会为应用提供所需的服务。...,然后在使用时从服务容器中自动解析出所需实例及其依赖!...然后,当我们需要在 Laravel 中使用 cache 服务是,服务容器会解析出 CacheManager 实例返回。也就是说我们仅仅是提供了一个可以从 $this->app 访问的对应关系表。...这样,当需要使用 App\Library\Services\DemoOne 服务而被解析时,就回调用闭包方法,创建实例返回 App\Library\Services\DemoOne 对象。

1.8K00

Laravel源码解析之Console内核

上一篇文章我们介绍了Laravel的HTTP内核,详细概述了网络请求从进入应用到应用处理完请求返回HTTP响应整个生命周期中HTTP内核是如何调动Laravel各个核心组件来完成任务的。...php // 第一部分: 创建应用实例 $app = new Illuminate\Foundation\Application( realpath(__DIR__....执行命令类的 run方法来完成任务处理并返回状态码。 和命令行脚本的规范一样,如果执行命令任务程序成功会返回0, 抛出异常退出则返回1。...结束应用 执行完命令程序返回状态码后, 在 artisan中会直接通过 exit($status)函数输出状态码并结束PHP进程,接下来shell进程会根据返回的状态码是否为0来判断脚本命令是否执行成功...中定义的各种命令类程序中,然后在命令类里面我们就可以写其他程序一样自由地使用Laravel中的各个组件和注册到服务容器里的服务了。

1.7K20
领券