当前位置: 首页 > 编程日记 > 正文

又一个强大的PHP5.3依赖注入容器

简单的服务容器

一个简单的 php 5.3 依赖注入容器。

项目地址:https://github.com/godruoyi/easy-container

Why

目前比较流行的 PHP 容器:

  • Pimple
  • Laravel Container
  • 其他依赖注入容器

Pimple 是一个简单优秀的 php 5.3 容器,也是目前用得最多的服务容器,在 packagist 的安装量也达到 1000 w+。但是 Pimple 只是一个简单的服务容器,不支持很多特性如:

class Cache
{public function __construct(Config $config){}
}class Config
{
}// 不支持
$cache = $container->make('Cache');复制代码

Pimple 不支持自动注入依赖参数,当你需要的对象依赖其他对象时,你只能依次实例化所需参数。

Laravel Container 是目前功能最全的服务容器了,支持的功能也比较全面,包括自动注入、赖加载、别名、TAG等。但是官方不推荐在非 laravel 项目中使用该组件。

如果你有留意该组件下的 composer.json 文件,你会发现他依赖 illuminate/contracts 组件。(参见)

基于此,诞生了 easy-container,该项目代码大部分依赖于 Laravel Container :smile:。你可以像使用 Laravel Container 容器般来使用它。

安装

composer require godruoyi/easy-container复制代码

使用

你可以前往 Laravel-china 获取更多关于 容器使用 的帮助。

初始化容器


$app = new Godruoyi\Container\Container;复制代码

以下文档支持来自 laravel-china,转载请注明出处。

简单绑定

可以通过 bind 方法注册绑定,传递我们想要注册的类或接口名称再返回类的实例的 Closure

$app->bind('HelpSpot\API', function ($app) {return new HelpSpot\API($app->make('HttpClient'));
});复制代码

注意,所有匿名函数都接受服务容器实例作为参数。

绑定一个单例

singleton 方法将类或接口绑定到只能解析一次的容器中。绑定的单例被解析后,相同的对象实例会在随后的调用中返回到容器中:

$app->singleton('HelpSpot\API', function ($app) {return new HelpSpot\API($app->make('HttpClient'));
});复制代码

每次调用 $app['HelpSpot\API'] 都将返回统一对象。

绑定实例

你也可以使用 instance 方法将现有对象实例绑定到容器中。给定的实例会始终在随后的调用中返回到容器中:

$api = new HelpSpot\API(new HttpClient);$app->instance('HelpSpot\API', $api);复制代码

绑定接口到实现

服务容器有一个强大的功能,就是将接口绑定到给定实现。例如,如果我们有一个 EventPusher 接口和一个 RedisEventPusher 实现。编写完接口的 RedisEventPusher 实现后,我们就可以在服务容器中注册它,像这样:

$app->bind('App\Contracts\EventPusher','App\Services\RedisEventPusher'
);复制代码

这么做相当于告诉容器:当一个类需要实现 EventPusher 时,应该注入 RedisEventPusher。现在我们就可以在构造函数或者任何其他通过服务容器注入依赖项的地方使用类型提示注入 EventPusher 接口:

use App\Contracts\EventPusher;/*** 创建一个新的类实例,此处将注入 App\Services\RedisEventPusher 的实例。** @param  EventPusher  $pusher* @return void*/
public function __construct(EventPusher $pusher)
{$this->pusher = $pusher;
}复制代码

解析

make 方法

你可以使用 make 方法将容器中的类实例解析出来 (无论该对象需要什么类型的参数)。make 方法接受要解析的类或接口的名称:

$api = $app->make('HelpSpot\API');复制代码

mark 方法是我认为最重要的方法,你可以简单地使用「类型提示」的方式在由容器解析的类的构造函数中添加依赖项,容器将自动解析你所需要的一切参数。


// 自动解析UserController构造函数所需的依赖
$userController = $app->make(UserController::class);class UserController
{public function __construct(UserRepository $users, HttpClient $client, $other = 'default'){}
}复制代码

PSR-11

Laravel 的服务容器实现了 PSR-11 接口。因此,你可以对 PSR-11容器接口类型提示来获取 Laravel 容器的实例:

use Psr\Container\ContainerInterface;$service = $app->get('Service');复制代码

LISTEN

MIT

Thanks

laravel-china

相关文章:

软件测试培训:如何搭建测试环境

如何搭建测试环境?这是很多测试人员都需要了解的,测试是每个产品上线前必备的一个检验,不管是什么产品,做好有效的测试是对产品质量的一个负责,软件测试环境要考虑的就是软件在什么软硬件下能正常运行,什么环境下不能…

技术图文:如何爬取一个地区的气象数据(上)?

背景 架空线路主要指架空明线,架设在地面之上,是用绝缘子将输电导线固定在直立于地面的杆塔上以传输电能的输电线路。架设及维修比较方便,成本较低,但容易受到气象和环境(如大风、雷击、污秽、冰雪等)的影…

C#按关闭按钮实现最小化,按ESC才关闭的实现【含系统消息大全】

protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND 0x0112; const int SC_CLOSE 0xF060; if (m.Msg WM_SYSCOMMAND && (int)m.WParam SC_CLOSE) { // 屏蔽传入的消息事件 …

眠眠interview Question

1. Wkwebkit在异步回调 如何像webview的回调 一样在主线程回调。可以使用runloop 解决么? dispatch get main queue http://www.jianshu.com/p/a2fc399075e0 转载于:https://www.cnblogs.com/tufei7/p/7657617.html

哪些人适合参加软件测试培训

软件测试是现在很多企业需求都非常大的一个岗位,只要是互联网行业基本都是有需求的,那么想要学习软件测试,哪些人适合参加软件测试培训呢?来看看下面的详细介绍。 哪些人适合参加软件测试培训? 想从零开始进入软件技术行业 软件测试的优势是…

从iso镜像升级ubuntu

步骤: 1.从网上下载Alternate版本的ISO镜像 2.加载ubuntu镜像 # mount -t iso9660 -o loop ubuntu-11.10-alternate-i386.iso /mnt/cdrom/3.进入/mnt/cdrom/ 运行cdromupgrade 程序 # cd /mnt/cdrom/ # ./cdromupgrade转载于:https://www.cnblogs.com/dudp/archive…

技术图文:如何爬取一个地区的气象数据(下)?

背景 架空线路常见的故障有:风偏闪络故障、雷击跳闸故障、雷击断股故障、线路覆冰故障、线路污闪故障、线路外力破坏故障、线路鸟害故障等等。从这些故障中,我们可以看出天气对线路的安全运行起到非常重要的作用。 在上一篇图文 如何爬取一个地区的气象…

Android :landscape||portrait 切换

可在AndroidManifest.xml里面配置屏幕发现。 在<Activity>中加入这一行android:screenOrientation"landscape/portrait " android中每次屏幕的切换动会重启Activity&#xff08;可以在Activity销毁前保存当前活动的状态&#xff0c;在Activity再次Create的时候…

web前端开发培训完就业前景怎么样

很多人都在学习web前端技术&#xff0c;认为学好这一项编程技术&#xff0c;找工作是非常稳定的&#xff0c;那么到底web前端开发培训完就业前景怎么样呢?来看看下面的详细介绍就知道了。 web前端开发培训完就业前景怎么样? web前端薪资待遇 从图中我们能够看到web前端从业者…

技术图文:如何改进算法的运行效率?

背景 前段时间&#xff0c;一位好友发给我如下的文件&#xff1a; 每个CSV文件中的数据由三个属性组成&#xff0c;第一个属性为ID&#xff0c;第二个属性为X坐标&#xff0c;第三个属性为Y坐标。由于是二维数据&#xff0c;可以绘制出每个文件的散点图&#xff0c;把这些散点…

B树,B+树,B-树和B*树

B树 即二叉搜索树&#xff1a; 1.所有非叶子结点至多拥有两个儿子&#xff08;Left和Right&#xff09;&#xff1b; 2.所有结点存储一个关键字&#xff1b; 3.非叶子结点的左指针指向小于其关键字的子树&#xff0c;右指针指向大于其关键字的子树&#xff1b; 如&#xff1a; …

JS对象直接量,数组直接量和函数直接量

对象直接量创建一个对象&#xff1a; var obj {x:[1,2],y:23}; 代码跟下面是一样的。 var objnew Object(); obj.xnew Array(1,2); obj.y23; 测试&#xff1a;for(var i in obj) alert(obj[i]); 函数直接量&#xff1a;它是一个表达式而不是语句。 (function(){})() 如下例&am…

学习Java编程培训的书籍有哪些

学习java技术除了线上线下的培训学习&#xff0c;书籍的知识也是非常重要的&#xff0c;今天小编为大家整理的就是学习Java的一些书籍&#xff0c;Java书籍是程序员学习提升技能的重要学习渠道&#xff0c;通过书籍Java程序员可以学习当前流行、重要的相关技能。下面我们一起来…

Datawhale组队学习:数据结构与算法课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 数据结构与算法&…

live555学习笔记2-基础类

二 基础类 讲几个重要的基础类&#xff1a; BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类&#xff0e;比如UsageEnvironment代表了整个系统运行的环境&#xff0c;它提供了错误记录和错误报告的功能&#xff0c;无论哪一个类要输出错误&#x…

自己写的小工具集合

2019独角兽企业重金招聘Python工程师标准>>> 文件夹大小查看工具 用于查看文件夹下每个子文件和子文件夹的大小.以前想统计文件夹大小,只能点右键看属性,而且只能看到文总大小。这个小工具可以通过右键启动,而且能查看文件夹下所有文件和文件夹的大小. 以前用过类似…

哪些人适合学软件测试呢

软件测试是现在很多企业的一个刚需岗位&#xff0c;所以软件测试的发展前景是非常好的&#xff0c;想要了解哪些人适合学软件测试呢?来看看下面的详细介绍就知道了。 哪些人适合学软件测试呢? 1.无编程基础 测试的代码量仅为20%左右&#xff0c;无论是文科生还是非计算机专业…

javabean和EJB的区别

Java Bean 是可复用的组件&#xff0c;对Java Bean并没有严格的规范&#xff0c;理论上讲&#xff0c;任何一个Java类都可以是一个Bean。但通常情况下&#xff0c;由于Java Bean是被容器所创建(如Tomcat)的&#xff0c;所以Java Bean应具有一个无参的构造器&#xff0c;另外&am…

Datawhale组队学习:初级算法梳理课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 初级算法梳理 的任务…

CSS将长文字换行的方法 (转)

大家都知道连续的英文或数字能是容器被撑大&#xff0c;不能根据容器的大小自动换行&#xff0c;下面是 CSS如何将他们换行的方法&#xff01; 对于div 1.&#xff08;IE浏览器&#xff09;white-space:normal; word-break:break-all;这里前者是遵循标准。 #wrap{white-space:n…

学Java的软件哪些比较好用

很多java程序猿在工作的时候都会用一些辅助工具&#xff0c;辅助工具可以很好的帮助程序猿高效率的完成工作&#xff0c;那么具体学Java的软件哪些比较好用呢?来看看下面的详细介绍。 学Java的软件哪些比较好用? 1. Eclipse Eclipse做为一款开发源代码的Java扩展性开发平台&a…

DataTable的Compute功能详解

在为筛选器创建表达式时&#xff0c;用单引号将字符串括起来&#xff1a;"LastName Jones"下面的字符是特殊字符&#xff0c;如下面所解释的&#xff0c;如果它们用于列名称中&#xff0c;就必须进行转义&#xff1a;\n (newline)\t (tab)\r (carriage return)~()#\…

Datawhale第九期组队学习计划

Datawhale 组队学习 第九期Datawhale组队学习计划马上就要开始啦&#xff01; 这次共组织三个组队学习&#xff0c;涵盖了编程、机器学习理论以及动手实践的内容&#xff0c;大家可以按照需要选择参加。 数据结构与算法&#xff08;上&#xff09; 内容设计&#xff1a;光城…

Hibernate获取数据java.lang.StackOverflowError

原因&#xff1a;因为在重写toString()方法时&#xff0c;把关联的属性也放入到toString方法中了&#xff0c;去掉就可以了。 如&#xff1a;重写的toString方法中不能有关联关系IDCard属性idCard public class Person {private Integer id;private String name;private IDCard…

UI设计培训之UI设计系统知识

最近有很多小伙伴都在学习UI设计的相关知识&#xff0c;很多同学都是东边一学习一下&#xff0c;西边学习一下&#xff0c;根本没有明确的学习方法&#xff0c;对于这个问题小编为大家整理了一下学习UI设计的系统知识&#xff0c;一起看看吧! UI设计培训之UI设计系统知识&#…

java 中的 Enumeration 在Vector,Hashtable和web中的应用

public interface Enumeration<E> 实现 Enumeration 接口的对象&#xff0c;它生成一系列元素&#xff0c;一次生成一个。连续调用 nextElement方法将返回一系列的连续元素。 例如&#xff0c;要输出 Vector<E> v的所有元素&#xff0c;可使用以下方法&#xff1a;…

Datawhale组队学习 Task01:数组(1天)

Task01&#xff1a;数组&#xff08;1天&#xff09; 1. 数组的定义 数组是具有一定顺序关系的若干对象组成的集合&#xff0c;组成数组的对象称为数组元素。 例如&#xff1a; 向量对应一维数组矩阵对应二维数组 数组名表示群体的共性&#xff0c;即具有同一种数据类型&a…

IOS一些显示效果和动画效果资料

2019独角兽企业重金招聘Python工程师标准>>> 1.基于AutoLayout的UIScrollView悬停Tab 转载于:https://my.oschina.net/zhugenqiang/blog/1551389

零基础小白学Java难度大不大

零基础小白学Java难度大不大?有很多人都是非常关心这个问题的&#xff0c;如今java在IT互联网行业的快速发展&#xff0c;引起了很多人的注意&#xff0c;那么&#xff0c;哪些人适合入行Java?零基础学习Java难度大吗?下面&#xff0c;小编就为大家解答这些问题。 零基础小白…

Datawhale组队学习 Task02:顺序表和链表(2天)

Task02 顺序表和链表&#xff08;2天&#xff09; 1. 线性表的定义与操作 1.1 线性表的定义 线性表&#xff08;Linear List&#xff09;是由n&#xff08;n > 0&#xff09;个相同类型的数据元素a1,a2,...,an 组成的有序序列。即表中除首尾元素外&#xff0c;其它元素有…