当前位置:网站首页>Laravel服务容器(上下文绑定的运用)
Laravel服务容器(上下文绑定的运用)
2022-07-29 05:19:00 【廖圣平】

上下文绑定,根据不同的策略依赖注入约定好的 服务。
从官网的例子说明了,不同的文件类型,使用的储存方案不一样。
use App\Http\Controllers\PhotoController;
use App\Http\Controllers\UploadController;
use App\Http\Controllers\VideoController;
use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Support\Facades\Storage;
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(function () {
return Storage::disk('local');
});
$this->app->when([VideoController::class, UploadController::class])
->needs(Filesystem::class)
->give(function () {
return Storage::disk('s3');
});
这个很好理解,这个还可以在什么场景下使用,怎么使用呢?下面举一个例子。
例子
比如我要配送一批电商商品,要配送 水果,和坚果。水果的时效性比较强,所以推荐配送顺丰。坚果保质期长就随便了,我这里选一个中通。
代码实现
创建接口:
<?php
namespace App\Contracts;
interface Express
{
/** * 获取第三方 物流配置的价格 * @return mixed */
public function getAmount();
}
目前我只需要获取快递的价格就好了。
创建顺丰:
<?php
namespace App\Services\express;
use App\Contracts\Express;
class Shunfeng implements Express
{
public function getAmount()
{
return 20;
}
}
圆通
<?php
namespace App\Services\express;
use App\Contracts\Express;
class Yuantong implements Express
{
public function getAmount()
{
return 10;
}
}
在Providers/AppServiceProvider.php 的register 方法中添加绑定信息
$this->app->when('App\Http\Controllers\Fruit')
->needs(Express::class)
->give(Shunfeng::class);
$this->app->when('App\Http\Controllers\Nut')
->needs(Express::class)
->give(Yuantong::class);
从上面的注册信息中可以看到,如果调用了水果的控制器,同时接口为 Express 时候,注入顺丰的实例。如果调用了坚果的控制器,同时接口为 Express 时候,注入圆通的实例。
控制器:
<?php
namespace App\Http\Controllers;
class Fruit
{
public $express;
public function __construct(\App\Contracts\Express $express)
{
$this->express = $express;
}
public function get()
{
return $this->express->getAmount();
}
}
这边举例一个水果,当路由到 Fruit 控制器的时候,会注入刚刚定义的顺丰的实例。
在routers/web.php 添加路由信息
Route::get('fruit',[\App\Http\Controllers\Fruit::class,'get']);
Route::get('nut',[\App\Http\Controllers\Nut::class,'get']);
请求 /fruit 获取到的数据为:
请求 /nut 获取到的数据为:
git源码
边栏推荐
- 字符类型转换
- uniapp组件之倒计时(如阅读协议倒计时、完成学习倒计时)
- DAY14:Upload-labs 通关教程
- ClickHouse学习(四)SQL操作
- sql-server 数据表的简单操作
- [typescript] in depth study of typescript functions
- Day14: upload labs customs clearance tutorial
- link与@import的关系
- js简单代码判断打开页面的设备是电脑PC端或手机H5端或微信端
- Wechat applet - component parameter transmission, state management
猜你喜欢

Playwright实战案例之爬取js加密数据

解决表单校验提示信息不消失问题以及赋值不生效问题

Fvuln automated web vulnerability detection tool
![[C language series] - realize the exchange of two numbers without creating the third variable](/img/7c/468000bcbf740c9dd3535f2734728a.png)
[C language series] - realize the exchange of two numbers without creating the third variable

ClickHouse学习(六)语法优化

DAY14:Upload-labs 通关教程

uniapp之常用提示弹框

Build msys2 environment with win10

Qt布局管理--部件拉伸(Stretch)原理及大小策略(sizePolicy)

QT setting background image method
随机推荐
link与@import导入外部样式的区别
Qt布局管理--部件拉伸(Stretch)原理及大小策略(sizePolicy)
Li Kou 994: rotten orange (BFS)
href与src的区别
组件传参与生命周期
【JS题解】牛客网JS篇1-10题
用threejs 技术做游戏跑酷
About local variables
【电子电路】ADC芯片如何选型
nmap是什么以及使用教程
B - identify floating point constant problems
uniapp组件之倒计时(如阅读协议倒计时、完成学习倒计时)
[electronic circuit] how to select ADC chip
ClickHouse学习(九)clickhouse整合mysql
Day 1
Fvuln-自动化web漏洞检测工具
[JS question solution] questions 1-10 in JS of niuke.com
Relative positioning and absolute positioning
重绘与回流的关系
ClickHouse学习(十一)clickhouseAPI操作