Minor【 PHP框架】4.服务容器与服务提供者
框架Github地址:github.com/Orlion/Minor
(如果觉得还不错给个star哦(^-^)V)
框架作者: Orlion
知乎:https://www.zhihu.com/people/orlion
Github: https://github.com/Orlion
4.1 服务提供者
关于服务容器可以参考我的另外一篇文章:http://www.cnblogs.com/orlion/p/4797422.html
Minor使用IoC(Inversion of Control,控制倒转,这是一个设计模式,可以先查看下百科)容器这个强有力的工具管理类依赖。依赖注入(也是一种设计模式,一般用于实现IoC)是 一个不用编写固定代码来处理类之间依赖的方法,相反的,这些依赖是在运行时注入的,这样允许处理依赖时具有更大的灵活性。
服务提供者是服务容器中的单元,是一个普通的类,任何类都可以被注册为服务,前提是这个类的依赖可以被服务容器解析而且必须有一个boot()方法用于服务容器自动注入该服务提供者需要的依赖。(例如循环依赖就可能会导致应用异常)。
4.1.1 创建一个服务提供者
可以在app/Lib/目录下或者是其他任何app目录下创建一个服务提供者类:
<?php namespace App\Lib; class MailProvider
{
private $from; private $username; private $password; public function boot($from, $username, $password)
{
$this->from = $from;
$this->username = $username;
$this->password = $password;
} public function send($to)
{
echo '[MailProvider] send email from ' . $this->from . ' to ' . $to . ' use username:' . $this->username . ' and password:' . $this->password . '<br/><br/>';
}
}
这个服务提供者提供了一个发送邮件的服务,它的boot方法指明了这个类需要$from\$username\$password三个依赖。注意:服务提供者的构造函数不能带有参数,因为服务容器在实例化服务提供者时并不会根据构造方法的参数去解析依赖。
4.1.2 注册服务
上一步定义好了一个服务提供者,这一步就需要将这个服务提供者注册到App中
打开app/Config/providers.php文件,添加一下内容:
<?php
return [
'mailer' => [
'class' => 'App\\Lib\\MailProvider',
'arguments' => ['orlionml@gmail.com', 'username', 'password'],
'singleton' => true,
],
];
class指的就是这个服务提供者的全名。这里你也可以指定一个匿名函数例:
'test' => [
'class' => function(){
$mail = new App\...\Mail;
$mail->boot('...', '...' ,'...');
return $mail;
}
],
arguments指的就是服务提供者的boot方法需要的参数。假如你的服务提供者依赖于另外一个依赖,你也可以使用'@serviceName'的语法来注入一个依赖,例Shop类依赖Mail:
<?php
return [
'mailer' => [
'class' => 'App\\Lib\\MailProvider',
'arguments' => ['orlionml@gmail.com', 'username', 'password'],
'singleton' => true,
], 'shop' => [
'class' => 'App\\Lib\\Shop',
'arguments' => ['@mailer'],
],
];
singleton表示每次从服务容器中取出这个服务时都是同一个对象(单例),如果设置为false则每次都会重新创建这个服务。
4.1.3 获取服务
将服务注册到App中后就可以通过服务容器(Minor\Ioc\ServiceContainer)的get($serviceName)方法来获取这个服务了,在控制器中可以这样获取一个上边我们的"mailer"服务:
class HelloController extends Controller
{
public function hello()
{
$container = $this-app->getServiceContainer();
$mail = $container->get('mailer');
$mail->send('somemsg');
...
}
}
4.2 服务容器
服务容器的初始化是在App的初始化时,即public/index.php文件中
$app = \Minor\Framework\App::getInstance(
...
$providers = require APP_DIR . 'Config/providers.php',
...
);
这样你就可以通过调用App的getServiceContainer()方法来获取服务容器。
class HelloController extends Controller
{
public function hello()
{
$container = $this-app->getServiceContainer();
...
}
}
Minor【 PHP框架】4.服务容器与服务提供者的更多相关文章
- 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
laravel被称为最优雅的框架,最近正在学习中,对于用惯了thinkphp.ci框架的人来说,服务容器.服务提供者,依赖注入这些概念简直是一脸懵逼.我花了些时间梳理了一下,也不敢确定自己说的是对 ...
- ASP.NET Web API 框架研究 服务容器 ServicesContainer
ServicesContainer是一个服务的容器,可以理解为—个轻量级的IoC容器,其维护着一个服务接口类型与服务实例之间的映射关系,可以根据服务接口类型获取对应的服务实例.构成ASP.NET We ...
- Laravel 学习笔记 —— 神奇的服务容器 [转]
容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...
- laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)
首先大家想一想什么是容器,字面意思就是盛放东西的东西,常见的变量,对象属性都是容器,一个容器能够装什么东西,完全在于你对这个容器的定义.有的容器不仅仅只是存文本,变量,而是对象,属性,那么我们通过这种 ...
- laravel-神奇的服务容器(转)
原文地址: http://www.insp.top/learn-laravel-container ,转载务必保留来源,谢谢了! 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器 ...
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...
- laravel 学习笔记 —— 神奇的服务容器
转载自:https://www.insp.top/learn-laravel-container 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于 ...
- laravel 学习笔记 — 神奇的服务容器
2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...
- laravel框架总结(四) -- 服务容器
1.依赖 我们定义两个类:class Supperman 和 class Power,现在我们要使用Supperman ,而Supperman 依赖了Power class Supperman { p ...
随机推荐
- linux菜鸟日记
本地yum源的安装: 要安装本地yum源,首先需要熟悉本地yum文件的配置和光盘的挂载 第一步挂载光盘: 首先需要指定一个光盘挂载目录 通常情况下我习惯使用默认挂载目录,所以一般我使用的光盘挂载命令是 ...
- 【SRM】649 t2
题意 一个数列\(A\),数的范围均在\([0, 2^N-1]\)内,求一个\(B\),使得新生成的数列\(C\)中逆序对最多(\(C_i = A_i xor B\)),输出最多的逆序对.(\(|A| ...
- BZOJ4597: [Shoi2016]随机序列
Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...
- JavaScript_js模拟键盘输入
function fireKeyEvent(el, evtType, keyCode) { var evtObj; if (document.createEvent) { if (window.Key ...
- Linux Shell 编程中的特殊符号
一.井号 # 1.在脚本文件中对一行进行注释. 2.在引号和\符号后不是注释,只是#号本身: echo "12 # hehe" echo '12 # hehe' echo 12 \ ...
- 【转】安全传输协议SSL和TLS及WTLS的原理
一.首先要澄清一下名字的混淆 1.SSL(Secure Socket Layer)是Netscape公司设计的主要用于WEB的安全传输协议.这种协议在WEB上获得了广泛的应用. 2.IETF将SSL作 ...
- 【Beta】Daily Scrum Meeting第四次
1.任务进度 学号 已完成 接下去要做 502 修复和完善任务列表界面:将几个数据库操作封装起来 登陆时将返回的个人信息更新到本地数据库 509 创建报课表的API 给所有api添加注释:发布任务到服 ...
- [LintCode] Intersection of Two Linked Lists 求两个链表的交点
Write a program to find the node at which the intersection of two singly linked lists begins. Notice ...
- [LintCode] Find Peak Element 求数组的峰值
There is an integer array which has the following features: The numbers in adjacent positions are di ...
- centos7开机自动联网设置
/etc/sysconfig/network-scripts/目录下ifcfg-eth0这个 文件,把ONBOOT="no"改为yes