首先,需要?jiǎng)?chuàng)建一個(gè)類來集成Facade類
<?php
namespace App\Facades\GeoIP\Facade;
use Illuminate\Support\Facades\Facade;
class GeoIP extends Facade
{
? ? protected static function getFacadeAccessor()
? ? {
? ? ? ? return 'geoip';
? ? }
}
其次需要注冊(cè)服務(wù),我們可以通過php artisan來創(chuàng)建,也可以在app\providers創(chuàng)建。app/Providers/FacadesServiceProvider.php 代碼如下:
<?php
namespace App\Providers;
use App\Service\ApiService;
use Illuminate\Support\ServiceProvider;
// include the class facade binded
use App\Facades\GeoIP\GeoIP;
class FacadesServiceProvider extends ServiceProvider
{
? ? /**
? ? * 在容器中注冊(cè)綁定。
? ? *
? ? * @return void
? ? */
? ? public function register()
? ? {
? ? ? ? $this->app->singleton('geoip', function ($app) {
? ? ? ? ? ? return new GeoIP($app);
? ? ? ? });
? ? }
}
上面代碼可知,服務(wù)提供者注冊(cè)時(shí)會(huì)注冊(cè)一個(gè)單例,標(biāo)號(hào)為 'geoip',也就是我們自己的 facade 返回的那個(gè),然后回調(diào)函數(shù)會(huì)返回一個(gè)對(duì)象,也就是我們封裝 geoip 功能的那個(gè)類的實(shí)例,不明白的同學(xué)可以看看 laravel 的服務(wù)提供者和服務(wù)容器相關(guān)知識(shí)哦。(注意要 use 將 facade 和封裝類的命名空間引用一下哦)。
在config\app.php中找到providers和aliases將provider和Facade命名配置一下
在providers中加入
App\Providers\FacadeServiceProvider::class,
在aliases中加入
'GeoIP' => App\Facades\GeoIP\Facade\GeoIP::class,
注冊(cè)完畢后,每次使用 facade::function 的時(shí)候,laravel 會(huì)自動(dòng)解析 facade, 然后創(chuàng)建一個(gè)對(duì)象給用戶使用,,而無需用戶自己去 new 一個(gè)對(duì)象出來