Laravel5 建立自定義門面(Facade)
阿新 • • 發佈:2019-02-20
門面為應用服務容器中的繫結類提供了一個“靜態”介面。Laravel 內建了很多門面,你可能在不知道的情況下正在使用它們。Laravel 的門面作為服務容器中底層類的“靜態代理”,相比於傳統靜態方法,在維護時能夠提供更加易於測試、更加靈活、簡明優雅的語法。所謂門面就是 Facade 類利用了
__callStatic()
魔術方法來延遲呼叫容器中的物件的方法
接下來使用 Laravel 編寫一個自定義門面
首先建立一個需要繫結到服務容器的 TokenManageService 類
declare(strict_types=0);
/**
* app/Services/TokenMangeService.php
*
*/
namespace App\Services;
/**
* Token管理服務
*
* Class TokenManageService
* @package App\Services
*/
class TokenManageService
{
/**
* 定義token屬性
*
* @var
*/
public $token;
/**
* 定義token屬性
*
* @param $token
* @return mixed
*/
public function getToken ($token)
{
return $this->token = $token;
}
}
建立一個靜態指向 TokenManage 類的門面類 TokenManageFacade
declare(strict_types=0);
/**
* app/Facades/TokenManageFacade.php
*
*/
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
/**
* Class TokenManageFacade
* @package App\Facades
*/
class TokenManageFacade extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'token.manage';
}
}
在服務提供者中繫結 TokenManageService 類到服務容器
declare(strict_types=0);
/**
* app/Providers/TokenManageServiceProvider.php
*
*/
namespace App\Providers;
use App\Services\TokenManageService;
use Illuminate\Support\ServiceProvider;
/**
* token管理服務提供者
*
* Class TokenManageServiceProvider
* @package App\Providers
*/
class TokenManageServiceProvider extends ServiceProvider
{
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('token.manage', function ($app) {
return new TokenManageService();
});
}
}
修改配置檔案
config/app.php
return [
'providers' => [
...
/**
* 自定義
*/
App\Providers\TokenManageServiceProvider::class
],
'aliases' => [
...
/**
* 自定義
*/
'TokenManage' => \App\Facades\TokenManageFacade::class
],
]
接下來就可以測試了
declare(strict_types=0);
/**
* TestController.php.
*
*/
namespace App\Http\Controllers\Test;
use TokenManage;
/**
* Class TestController
* @package App\Http\Controllers\Test
*/
class TestController extends Controller
{
/**
* 測試自定義門面
*/
public function testFacade()
{
$res = TokenManage::getToken('Hello World');
dd($res);
}
}
Response
Class 'TokenManage' Not Found
WTF,當時心裡一萬隻草泥馬在奔騰著,why…why…why…
沒辦法啦,只能定位問題了,默默地找了定位了半個多小時,終於發現了問題所在,原來是 Laravel 的配置檔案有快取沒有更新到。
php artisan config:cache
重新測試一下,果然成功了。
Response
'Hello World'