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
  • 1
  • WTF,当时心里一万只草泥马奔腾着,why…why…why…

  • 没办法啦,只能定位问题了,默默地找了定位了半个多小时,终于发现了问题所在,原来是 Laravel 的配置文件有缓存没有更新到。

php artisan config:cache
  • 1

重新测试一下,果然成功了。

Response

'Hello World'
posted @ 2019-03-15 15:42  brady-wang  阅读(1101)  评论(0编辑  收藏  举报