1. 定义一个契约(接口)

app\Contracts\SuperModuleContract.php

<?php
namespace App\Contracts; interface SuperModuleContract
{
//激活超能力,这里参数必须是array,这就是一个规范
public function activate(array $target);
}

2. 一个实现这个接口的类

app\Services\FlyPower.php

<?php
namespace App\Services; use App\Contracts\SuperModuleContract; class FlyPower implements SuperModuleContract
{
public function activate(array $target)
{
//..可以根据$target 参数进行一些操作 $ability = 'fly ability';
return $ability;
}
}

3. 创建服务提供者

app\Providers\SuperPowerProvider.php

<?php
namespace App\Providers; use Illuminate\Support\ServiceProvider;
use App\Services\FlyPower; class SuperPowerProvider extends ServiceProvider
{
public function boot()
{
//
}
public function register()
{
//singleton绑定单例
//如何使用:App::make('fly_power')方法时调用
$this->app->singleton('fly_power',function(){
return new FlyPower();
}); //bind绑定实例到接口以便依赖注入
// 如何使用:在类构造方法中实例化,并指定接口类型
$this->app->bind('App\Contracts\SuperModuleContract',function(){
return new FlyPower();
});
}
}

4. 注册服务提供者

配置文件config/app.php的providers数组中:

'providers' => [
//其他服务提供者
App\Providers\SuperPowerProvider::class,
],

5. 创建facades

app\Facades\FlyPower.php

<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class FlyPower extends Facade
{
protected static function getFacadeAccessor()
{
return 'fly_power';
}
}

6. 再然后需要到配置文件config/app.php中注册门面类别名:

'aliases' => [
...//其他门面类别名映射
'FlyPower' => App\Facades\FlyPower::class,
],

7. 写一个控制器进行测试

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Contracts\SuperModuleContract;
use App;
use FlyPower; class TestController extends Controller
{ protected $superower; public function __construct(SuperModuleContract $super_power)
{
$this->super_power = $super_power;
} public function getPower(Request $request){
//实现超人的几种方式 # 使用make方式
$superman1 = App::make('fly_power')->activate(array()); # 使用facades
$superman2 = FlyPower::activate(array()); # 构造函数,类型提示,依赖注入
$superman3 = $this->super_power->activate(array()); dd($superman1, $superman2, $superman3);
} }

结果:

"fly ability"
"fly ability"
"fly ability"

证明三个超人类都实现了。

8. 进一步分析

当有超人有多种超能力的时候怎么办

8.1 定义一个获取超能力的接口

app\Contracts\GetPowerContract.php

<?php
namespace App\Contracts; interface GetPowerContract
{
public function init();
}

8.2 一个实现获取超能力接口的类

app\Services\GetPower.php

<?php
namespace App\Services; use App\Contracts\GetPowerContract;
use App; class GetPower implements GetPowerContract
{
public function init()
{
$config = config('power');
$ability = $config['ability']; $ability = App::make($ability);
return $ability;
}
}

8.3 创建配置文件

app\config\power.php

<?php

return [
'ability' => 'fly_power',
];

8.4 增加一个超能力类,需要实现超能力接口

app\Services\ShotPower.php

<?php
namespace App\Services; use App\Contracts\SuperModuleContract; class ShotPower implements SuperModuleContract
{
public function activate(array $target)
{
//..可以根据$target 参数进行一些操作 $ability = 'shot ability';
return $ability;
}
}

8.5 修改服务提供器

app\Providers\SuperPowerProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\FlyPower;
use App\Services\ShotPower;
use App\Services\GetPower; class SuperPowerProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
} /**
* Register the application services.
*
* @return void
*/
public function register()
{
//singleton绑定单例
//如何使用:App::make('fly_power')方法时调用
$this->app->singleton('fly_power',function(){
return new FlyPower();
}); $this->app->singleton('shot_power',function(){
return new ShotPower();
}); //bind绑定实例到接口以便依赖注入
// 如何使用:在类构造方法中实例化,并指定接口类型
$this->app->bind('App\Contracts\SuperModuleContract',function(){
return new FlyPower();
}); $this->app->bind('App\Contracts\GetPowerContract',function(){
//return new FlightPower();
return new GetPower();
});
}
}

8.6 修改控制器测试代码

app\Services\ShotPower.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
//use App\Services\XPower;
use App\Contracts\SuperModuleContract;
use App\Contracts\GetPowerContract;
use App;
use FlyPower; class TestController extends Controller
{ protected $superower; //public function __construct(XPower $XPower)
//{
// $this->XPower = $XPower;
//} //public function __construct(SuperModuleContract $super_power)
//{
// $this->super_power = $super_power;
//} public function __construct(GetPowerContract $super_power)
{
$this->super_power = $super_power;
} public function getPower(Request $request){
//实现超人的几种方式
$superman1 = App::make('fly_power')->activate(array());
$superman2 = FlyPower::activate(array());
$superman3 = $this->super_power->init()->activate(array());
$superman4 = App::make('shot_power')->activate(array()); d($superman1, $superman2, $superman3, $superman4);
} }

结果

"fly ability"
"fly ability"
"fly ability"
"shot ability"

说明我们赋予的shot超能力可以正常激活

修改config/power.php内容

<?php

return [
'ability' => 'shot_power',
];

结果

"fly ability"
"fly ability"
"shot ability"
"shot ability"

第三行的更改,说明我们可以通过更改config的方式实现快速切换超人拥有的超能力

laravel5.5探究容器的秘密的更多相关文章

  1. laravel5.8 IoC 容器

    网上 对容器的解释有很多,这里只是记录,搬运! 1.简单理解: 2019-10-10 11:24:09 解析 lavarel 容器 IoC 容器 作用 就是 “解耦” .“依赖注入(DI) IoC 容 ...

  2. Linux中以单容器部署Nginx+ASP.NET Core

    引言 正如前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程.   Ng ...

  3. 深入理解Docker容器执行引擎runC

    1 简介 根据官方的定义:runC是一个根据OCI标准创建并运行容器的CLI tool. Docker就是基于runC创建的,简单地说,runC就是docker中最为核心的部分,容器的创建,运行,销毁 ...

  4. 老Python带你从浅入深探究List

    列表 Python中的列表(list)是最常用的数据类型之一. Python中的列表可以存储任意类型的数据,这与其他语言中的数组(array)不同. 被存入列表中的内容可称之为元素(element)或 ...

  5. 【震惊】padding-top的百分比值参考对象竟是父级元素的宽度

    引言 书写页面样式与布局是前端工程师Coding 中必不可少的一项工作,在定义页面元素的样式时,padding 属性也是经常被使用到的. padding 属性用于设置元素的内边距,其值可以是lengt ...

  6. docker-compose v3版本命令详解参考

    参考和指南 这些主题描述了Compose文件格式的第3版.这是最新的版本. Compose and Docker 兼容性矩阵 有几个版本的Compose文件格式 - 1,2,2.x和3.x.下表是快速 ...

  7. 031、none和host网络的适用场景(2019-02-18 周一)

    参考https://www.cnblogs.com/CloudMan6/p/7053617.html   本节开始,会学习docker的几种原生网络,以及如何创建自定义网络.然后探究容器之间如何通信, ...

  8. Kubernetes集群安全概述

    API的访问安全性 API Server的端口和地址 在默认情况下,API Server通过本地端口和安全端口两个不同的HTTP端口,对外提供API服务,其中本地端口是基于HTTP协议的,用于在本机( ...

  9. Linus与陈庆

    Linus 1969年末,李纳斯出生于芬兰的赫尔辛基市,算是赶上了60后的尾巴.小时候他是个其貌不扬的孩子,除了一个鼻子长的「富丽堂皇」之外乏善可陈.他为了让鼻子看上去小一些,经常戴上眼镜就不愿意摘下 ...

随机推荐

  1. ARM实验6——ADC实验

    实验内容: 编写ADC程序,通过FS4412开发板上的电位器,改变ADC通道输入的电压值,经过ADC转换的值打印到终端. 实验目的: 熟悉开发环境: 掌握猎户座4412处理器ADC模块的使用和编程. ...

  2. 设定网页最小最大宽度和高度(兼容IE6)

    http://www.cnblogs.com/double-bin/archive/2011/12/19/2293093.html /* 最小寬度 */ .min_width{min-width:30 ...

  3. for循环研究

    for循环和递归是算法设计的重要结构之一: 两者具有相同的设计准则: 1.范围:开始和结束条件: 2.步增条件: 两者都用来处理顺序数据结构和计数计算: 递归也用于分而治之: for循环用于线性扫描: ...

  4. Ubuntu 16.04 安装札记

    写在前面的话:第一次写,有点紧张,不知道怎么写,就胡乱写了,主要是写给自己看的,感觉这里大神遍地都是,大牛更是数不胜数,我就一小白,记下来怕以后忘了,言归正传,我初步打算是把这篇博客写成安装指南(捂脸 ...

  5. 数长方形有多少个?POJ(1693)

    题目链接:http://poj.org/problem?id=1693 解题报告: 随机选两根横的,再找一下与这两根横线相交的竖线有多少根,m,那么就有(m-1)*m/2个长方形. #include ...

  6. 使用maven搭建ssm项目配置+tomact

    一.代码自动配置:https://www.cnblogs.com/weibanggang/p/10043201.html 二.手动配置 1.创建好maven项目,在pom.xml配置文件 <!- ...

  7. 第50章 读写内部FLASH—零死角玩转STM32-F429系列

    第50章     读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  8. React后台管理系统-订单管理

    1.订单管理页面和商品管理页面类似,都是一个搜索组件+列表组件 2.搜索框search组件 import React from 'react';   class ListSearch extends ...

  9. EL 和 JSTL 的使用

    EL Express Language 表达式语言 就是把<% 这里可以写java语言 %> 这种jsp的写法简化变为${ }的方式 例如 action="${pageConte ...

  10. 由fastRPC产生的DB服务

    根据整理的RPC模型,在此上,根据最近的项目,发布了DB服务,操作数据库.以RPC模型,发布数据库的操作服务,主要发送SQL语句,在服务端执行:同时引入了流行的数据库连接池:服务端还发布了文件接收服务 ...