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
{
protected $EBusinessID;
protected $AppKey;
protected $mode;
public function __construct()
{
$config = config('express');
$this->EBusinessID = $config['EBusinessID'];
$this->AppKey = $config['AppKey'];
$this->mode = $config['mode'] ?: 'product';
}
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);
}
protected function formatReqData($requestData, $RequestType = 1002, $DataType = 2)
{
$datas = array(
'EBusinessID' => $this->EBusinessID,
'RequestType' => $RequestType,
'RequestData' => urlencode($requestData),
'DataType' => $DataType,
);
$datas['DataSign'] = $this->encrypt($requestData, $this->AppKey);
return $datas;
}
protected function encrypt($data)
{
return urlencode(base64_encode(md5($data . $this->AppKey)));
}
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()
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这个的命名空间才可以  看,使用的都是这个  这样成功定义了,正常使用 
|