1. 程式人生 > >Laravel5 建立自定義門面(Facade)

Laravel5 建立自定義門面(Facade)

門面為應用服務容器中的繫結類提供了一個“靜態”介面。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'