框架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. swift 上手

    学习swift的笔记,偶尔会更新一下 变量与常量 变量定义使用var,常量使用let,类型安全,有自动类型推导,注意赋值的=号两边必须有空格. 变量和常量名是可以几乎所有字符,这些都非常像javasc ...

  2. LintCode 77: 最长公共子序列

    public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...

  3. Java:单例模式的七种写法

    第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton ( ...

  4. winfrom自定义滚动条

    panel或图片什么的跟着鼠标走,这里panel自己可以加背景图或直接搞个图就行了.为了演示清楚,有个滚动条控件做对比,与自定义的同步. using System; using System.Coll ...

  5. Flex DataGrid可编辑对象实现Enter跳转

    来源:http://blog.sina.com.cn/s/blog_5ed17a730100vrja.html 在Flex DataGrid中实现点击Enter键可编辑对象跳转<?xml ver ...

  6. Mac系统中配置Tomcat环境

    第一步:下载Tomcat 下载地址:http://tomcat.apache.org/download-80.cgi 直接下载如图选中的即可 第二步: 下载完成后,解压,随意放入目录.如我就把它放在/ ...

  7. Java 用程序给出随便大小的10 个数,序号为1-10,按从小到大顺序输出,并输出相应的序号?

    import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.uti ...

  8. iOS 按钮上的标题设置向左向右对齐的方法

    Button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;//左对齐(UIControlContentHo ...

  9. 实现滑动条与表单中的input中的value交互

    最近在写一个考试系统的项目,遇到一些比较有意思的小知识,在这里分享给大家 下面是一个滑动条与input中的value值的交互,即滑动条的颜色会跟随给定input的value值实时变化,虽然表单中的ra ...

  10. 解决bootstrap模态框内输入框无法获取焦点

    bootstrap 模态框中的input标签在某些情况下会无法获取焦点. 最终解决方法:去除模态框的 tabindex="-1" 属性即可