Facades 工作原理
在 Laravel 应用中,Facade 就是一个可以从容器访问对象的类。其中核心的部件就是 Facade 类。不管是 Laravel 自带的 Facades,还是自定义的 Facades,都继承自 Illuminate\Support\Facades\Facade 类。
比如:
看吧,必须要继承于Facade,如果没有继承,那就没有方法工作的。
所以,在我们想要定义门面的时候,也必须要继承
自定义门面
由于门面都是Facade代表,所以我创建了一个Facades目录,在app\Facades
里面都是我自定义的门面,
由于里面会有很多门面,使用不能直接写在里面吧,所以,我还需要去创建一个app\Facades\Express这个目录就是专门放我这一个门面的,如果想要定义其他的门面的话,可以再去定义一个目录
然后就可以放类放进去,比如:app\Facades\Express\Express.php这个是我的一个真实类
这个就是我要把这个类定义成门面的代码。
这个是我封装的类,是一个快递查询类
<?php
namespace App\Facades\Express;
use Illuminate\Support\Facades\Http;
class Express
{
//商户id
protected $EBusinessID;
//API KEY
protected $AppKey;
//模式
protected $mode;
//构造方法
public function __construct()
{
$config = config('express');
$this->EBusinessID = $config['EBusinessID'];
$this->AppKey = $config['AppKey'];
$this->mode = $config['mode'] ?: 'product';
}
/*
* 即时查询快递
* @param ShipperCode 快递公司
* @param LogisticCode 快递单号
*/
public function track($ShipperCode, $LogisticCode)
{
//准备请求参数
// 组装应用级参数
$requestData = "{" .
"'CustomerName': ''," .
"'OrderCode': ''," .
"'ShipperCode': '{$ShipperCode}'," .
"'LogisticCode': '{$LogisticCode}'," .
"}";
//发送请求
$result = Http::asForm()->post($this->url('track'), $this->formatReqData($requestData, '1002'));
return $this->formatResData($result);
}
/*
*格式化响应参数
*/
protected function formatResData($result)
{
return json_decode(json_decode($result, true)['ResponseData'], true);
}
/*
* 格式化请求参数
* @param requestData 请求参数
* @param RequestType 查询类型
* @param DataType 数据类型
*/
protected function formatReqData($requestData, $RequestType = 1002, $DataType = 2)
{
$datas = array(
'EBusinessID' => $this->EBusinessID,
'RequestType' => $RequestType, //免费即时查询接口指令1002/在途监控即时查询接口指令8001/地图版即时查询接口指令8003
'RequestData' => urlencode($requestData),
'DataType' => $DataType,
);
$datas['DataSign'] = $this->encrypt($requestData, $this->AppKey);
return $datas;
}
/**
* 电商Sign签名生成
* @param data 内容
* @param ApiKey ApiKey
* @return DataSign签名
*/
protected function encrypt($data)
{
return urlencode(base64_encode(md5($data . $this->AppKey)));
}
/*
* 返回api url
*/
protected function url($type)
{
$url = [
'track' => [
//正式环境
'product' => ':https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx',
//沙箱调试
'dev' => 'http://www.kdniao.com/UserCenter/v2/SandBox/SandboxHandler.ashx?action=CommonExcuteInterface'
]
];
return $url[$type][$this->mode];
}
}
接下来,我还需要定义一个目录app\Facades\Express\Facade,在这个目录里面会放这个类app\Facades\Express\Facade\Express.php,我刚刚在上面说了,必须要继承Facade才可以定义成门面,所以,在这个文件中就是来继承Facade并且返回我自定义的Facade
看,这个就是返回Express这个门面。
当然,单单只有这样是不能使用我自定义的门面的,还需要去容器中注册我这个门面
在app\Providers\AppServiceProvider.php中的register()
/**
* 注册门面
*
* @return void
*/
public function register()
{
//注册自定义门面
$this->app->singleton('Express', function () {
return new Express();
});
}
值得注意的是,在这里new的类是真实的代码类,不是继承Facade的那一个
真实代码的命名空间是use App\Facades\Express\Express;
继承facade的命名空间是use \App\Facades\Express\Facade\Express
但是,在外部使用的话,就是要使用继承了facade这个的命名空间才可以
看,使用的都是这个
这样成功定义了,正常使用