[Laravel] 讓你的 Helper 更有彈性 (使用 facades)

在 Laravel 中,有些常使用的 class 像是: Cache
在進行單元測試的時候,因為 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 綁定到這個 HttpServiceProvider
php 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






留言

這個網誌中的熱門文章

[MySQL] schema 與資料類型優化

[翻譯] 介紹現代網路負載平衡與代理伺服器