框架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. 【读书笔记】《编程珠玑》第一章之位向量&位图

    此书的叙述模式是借由一个具体问题来引出的一系列算法,数据结构等等方面的技巧性策略.共分三篇,基础,性能,应用.每篇涵盖数章,章内案例都非常切实棘手,解说也生动有趣. 自个呢也是头一次接触编程技巧类的书 ...

  2. expect脚本语言用法示例

    #!/usr/bin/expect set hostname [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $ar ...

  3. jQuery中设置form表单中action的值的方法

    下面介绍在jQuery中设置form表单中action的值的方法. $("#myFormId").attr("action", "userinfo.s ...

  4. JDBC驱动自身问题引发的FullGC

    公众号HelloJava刊出一篇<MySQL Statement cancellation timer 故障排查分享>,作者的某服务的线上机器报 502(502是 nginx 做后端健康检 ...

  5. Sublime Text3的安装

    作为一名前端开发小白,使用Sublime两年多了,从当初的Sublime Text 2到如今的Sublime Text 3,非常喜欢这款轻量级编译器,它不像Dreamweaver那样动辄几百M,只有仅 ...

  6. Django 权限管理

    对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分 Django对于权限这块的部分验证方法 user = request.user user.is_ ...

  7. [LintCode] Product of Array Except Self 除本身之外的数组之积

    Given an integers array A. Define B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], calculate B WI ...

  8. centos上安装php运行环境

    可以参考,但我安装的过程不完全一样http://www.cnblogs.com/liulun/p/3535346.html 我先安装的apache,直接执行的yum -y install httpd ...

  9. .NET Core 跨平台发布(dotnet publish)

    .NET Core 跨平台发布(dotnet publish) ,无需安装.NET Core SDK,就可以运行. 前面讲解了.NET Core 的VSCode 开发.现在来讲讲发布(dotnet p ...

  10. 基于OWin的Web服务器Katana发布版本3

    当 ASP.NET 首次在 2002 年发布时,时代有所不同. 那时,Internet 仍处于起步阶段,大约有 5.69 亿用户,每个用户平均每天访问 Internet 的时间为 46 分钟,大约有 ...