框架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.服务容器与服务提供者的更多相关文章

  1. 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务

      laravel被称为最优雅的框架,最近正在学习中,对于用惯了thinkphp.ci框架的人来说,服务容器.服务提供者,依赖注入这些概念简直是一脸懵逼.我花了些时间梳理了一下,也不敢确定自己说的是对 ...

  2. ASP.NET Web API 框架研究 服务容器 ServicesContainer

    ServicesContainer是一个服务的容器,可以理解为—个轻量级的IoC容器,其维护着一个服务接口类型与服务实例之间的映射关系,可以根据服务接口类型获取对应的服务实例.构成ASP.NET We ...

  3. Laravel 学习笔记 —— 神奇的服务容器 [转]

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

  4. laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)

    首先大家想一想什么是容器,字面意思就是盛放东西的东西,常见的变量,对象属性都是容器,一个容器能够装什么东西,完全在于你对这个容器的定义.有的容器不仅仅只是存文本,变量,而是对象,属性,那么我们通过这种 ...

  5. laravel-神奇的服务容器(转)

    原文地址: http://www.insp.top/learn-laravel-container ,转载务必保留来源,谢谢了! 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器 ...

  6. Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

  7. laravel 学习笔记 —— 神奇的服务容器

    转载自:https://www.insp.top/learn-laravel-container 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于 ...

  8. laravel 学习笔记 — 神奇的服务容器

     2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...

  9. laravel框架总结(四) -- 服务容器

    1.依赖 我们定义两个类:class Supperman 和 class Power,现在我们要使用Supperman ,而Supperman 依赖了Power class Supperman { p ...

随机推荐

  1. 弱省互测#1 t3

    题意 给出一棵n个点的树,求包含1号点的第k小的连通块权值和.(\(n<=10^5\)) 分析 k小一般考虑堆... 题解 堆中关键字为\(s(x)+min(a)\),其中\(s(x)\)表示\ ...

  2. 闭包和重写函数 返回IE浏览器版本号

    开发过程中我们有时候需要知道IE的版本号,我们知道得到IE的版本号的方法: var v = 3, div = document.createElement('div'), all = div.getE ...

  3. 转载:Chrome调试折腾记_(1)调试控制中心快捷键详解!!!

    转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致…按下F12;还是熟悉的味道;  或者直接 Ctrl ...

  4. Jquery垂直下拉二级菜单

    自己做了一个基于Jquery 的垂直下拉二级菜单功能,直接看图: Html的代码如下: <!DOCTYPE html> <html> <head> <meta ...

  5. 安卓(android)之实现断点下载功能

    一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...

  6. python setup.py 管理

    发布项目遇到了坑……特此记录. How to write setup.py: https://docs.python.org/2/distutils/setupscript.html Setup.py ...

  7. Android事件分发小结

      ******** ******** 第一部分: 介绍说明 ******** ********        个人感觉在做交互的时候, 对于Android的按键分发的理解还是比较重要的. 这些内容在 ...

  8. Ubuntu14.04或16.04下安装JDK1.8+Scala+Hadoop2.7.3+Spark2.0.2

    为了将Hadoop和Spark的安装简单化,今日写下此帖. 首先,要看手头有多少机器,要安装伪分布式的Hadoop+Spark还是完全分布式的,这里分别记录. 1. 伪分布式安装 伪分布式的Hadoo ...

  9. JVM垃圾收集器

    JVM中垃圾的回收由垃圾收集器进行,随着JDK的不断升级,垃圾收集器也开发出了各种版本,垃圾收集器不断优化的动力,就是为了实现更短的停顿. 下面是7种不同的分代收集器,如果两个收集器之间有连线,则表示 ...

  10. ormlite的使用方法

    ormlite是什么? 简单来说,就是我们定义一个实体类,利用这个框架,它可以帮我们吧这个实体映射到我们的数据库中,在Android中是SQLite,数据中的字段就是我们定义实体的成员变量. 官网地址 ...