[Laravel] 讓你的 Helper 更有彈性 (使用 facades)
在 Laravel 中,有些常使用的 class 像是: Cache
在進行單元測試的時候,因為 Cache 本身繼承 Facade
所以可以很容易地在單元測試中 mock Cache
ex:
如果像是我們自己實作的 Helper,也想要在靜態類別也可以有 mockery 的 shouldReceive
該如何實作?
官方文件有提到可以使用 Facades
舉我們自己建立的 HttpHelper 為例
1. 建立 HttpHelper class
3. 建立一個自定義的 Facades,路徑: app/Facades/HttpHelper.php
因為要繼承 Facade,必須先實作 getFacadeAccessor()
4. 設定 config/app.php
這樣就可以在程式碼內直接
參考來源:
https://hdtuto.com/article/laravel-55-create-custom-facade-example-from-scratch
在進行單元測試的時候,因為 Cache 本身繼承 Facade
所以可以很容易地在單元測試中 mock Cache
ex:
Cache::shouldReceive('get')
->once()
->with('key')
->andReturn('value');
如果像是我們自己實作的 Helper,也想要在靜態類別也可以有 mockery 的 shouldReceive
該如何實作?
官方文件有提到可以使用 Facades
舉我們自己建立的 HttpHelper 為例
1. 建立 HttpHelper class
<?php
namespace App\Helpers;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Http\Request;
class HttpHelper
{
// ... 功能略
}
2. 建立 Provider,並且將 HttpHelper 綁定到這個 HttpServiceProviderphp artisan make:provider HttpServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\App;
class HttpHelperServiceProvider extends ServiceProvider
{
public function boot()
{
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
App::bind('HttpHelper', function()
{
return new \App\Helpers\HttpHelper;
});
}
}
3. 建立一個自定義的 Facades,路徑: app/Facades/HttpHelper.php
因為要繼承 Facade,必須先實作 getFacadeAccessor()
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class HttpHelperFacades extends Facade
{
protected static function getFacadeAccessor() { return 'HttpHelper'; }
}
4. 設定 config/app.php
<?php
return [
....
'providers' => [
....
App\Providers\HttpHelperServiceProvider::class
],
'aliases' => [
....
'HttpHelper'=> App\Facades\HttpHelperFacade::class,
]
這樣就可以在程式碼內直接
<?php
use HttpHelper;
參考來源:
https://hdtuto.com/article/laravel-55-create-custom-facade-example-from-scratch
留言
張貼留言