laravel5.5探究容器的秘密
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探究容器的秘密的更多相关文章
- laravel5.8 IoC 容器
网上 对容器的解释有很多,这里只是记录,搬运! 1.简单理解: 2019-10-10 11:24:09 解析 lavarel 容器 IoC 容器 作用 就是 “解耦” .“依赖注入(DI) IoC 容 ...
- Linux中以单容器部署Nginx+ASP.NET Core
引言 正如前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程. Ng ...
- 深入理解Docker容器执行引擎runC
1 简介 根据官方的定义:runC是一个根据OCI标准创建并运行容器的CLI tool. Docker就是基于runC创建的,简单地说,runC就是docker中最为核心的部分,容器的创建,运行,销毁 ...
- 老Python带你从浅入深探究List
列表 Python中的列表(list)是最常用的数据类型之一. Python中的列表可以存储任意类型的数据,这与其他语言中的数组(array)不同. 被存入列表中的内容可称之为元素(element)或 ...
- 【震惊】padding-top的百分比值参考对象竟是父级元素的宽度
引言 书写页面样式与布局是前端工程师Coding 中必不可少的一项工作,在定义页面元素的样式时,padding 属性也是经常被使用到的. padding 属性用于设置元素的内边距,其值可以是lengt ...
- docker-compose v3版本命令详解参考
参考和指南 这些主题描述了Compose文件格式的第3版.这是最新的版本. Compose and Docker 兼容性矩阵 有几个版本的Compose文件格式 - 1,2,2.x和3.x.下表是快速 ...
- 031、none和host网络的适用场景(2019-02-18 周一)
参考https://www.cnblogs.com/CloudMan6/p/7053617.html 本节开始,会学习docker的几种原生网络,以及如何创建自定义网络.然后探究容器之间如何通信, ...
- Kubernetes集群安全概述
API的访问安全性 API Server的端口和地址 在默认情况下,API Server通过本地端口和安全端口两个不同的HTTP端口,对外提供API服务,其中本地端口是基于HTTP协议的,用于在本机( ...
- Linus与陈庆
Linus 1969年末,李纳斯出生于芬兰的赫尔辛基市,算是赶上了60后的尾巴.小时候他是个其貌不扬的孩子,除了一个鼻子长的「富丽堂皇」之外乏善可陈.他为了让鼻子看上去小一些,经常戴上眼镜就不愿意摘下 ...
随机推荐
- Js parsetInt() 字符串转换,只能转换字符串,数字开头的才会返回数值,否则为NaN,空字符串也返回NaN
alert(parseInt('456lee')); //456,返回正数部分 alert(parseInt('lee456lee')); //NaN alert(parseInt('lee456le ...
- HTC vive VR设备软硬件安装+运行unity开发的VR程序
总结在HTC vive VR开发过程中的HTC vive的安装调试 1.首先确保电脑的配置满足要求: 进入官网,测试电脑是否满足要求 链接:https://www.vive.com/us/produc ...
- miller——rabin
突然发现自己在线性筛素数中有这个,忘了好久: #include<iostream> #include<cstdio> using namespace std; long lon ...
- java并发多线程(摘自网络)
1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...
- 第二天了,由于博主太分心了,看看就跑去研究了一下ssh和ufw以及nmap,现在急需记录一下啦,哈哈!
昨天看到了视频的ssh远程连接,因为我点电脑上装的是一个ubuntu的虚拟机,我根据视频看了一下,自己又试用了一下,我发现自己的ubuntu是能够远程到自己的Mac电脑上,一开始主要是因为自己不能连接 ...
- 理解golang中的function types
先找个例子来看一下: package main import "fmt" // Greeting function types type Greeting func(name st ...
- 漂亮提醒框js
<script type="text/javascript"> var filename = "PICC_V2.1.3.0_新增功能操作手册.doc" ...
- BZOJ2683: 简单题(cdq分治 树状数组)
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2142 Solved: 874[Submit][Status][Discuss] Descripti ...
- cncert阅读报告
信息安全阅读报告 Problem 1: 国家计算机网络应急技术处理协调中心(简称“国家互联网应急中心”,英文缩写为“CNCERT”或“CNCERT/CC”)作为我国非政府层面网络安全应急体系核心技术协 ...
- hasOwnProperty自我理解
暂时不考虑ES6中symbol,hasOwnProperty()方法返回的是一个对象上是否包含一个指定属性,如果含有则返回true,如果没有则返回false. 和 in 运算符不同,该方法会忽略掉 ...