门面为应用服务容器中的绑定类提供了一个“静态”接口。Laravel 内置了很多门面,你可能在不知道的情况下正在使用它们。Laravel 的门面作为服务容器中底层类的“静态代理”,相比于传统静态方法,在维护时能够提供更加易于测试、更加灵活、简明优雅的语法。所谓门面就是 Facade 类利用了
__callStatic()
魔术方法来延迟调用容器中的对象的方法
接下来使用 Laravel 编写一个自定义门面
首先创建一个需要绑定到服务容器的 TokenManageService 类
declare(strict_types=0);
/**
* app/Services/TokenMangeService.php
*
*/
namespace AppServices;
/**
* Token管理服务
*
* Class TokenManageService
* @package AppServices
*/
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 AppFacades;
use IlluminateSupportFacadesFacade;
/**
* Class TokenManageFacade
* @package AppFacades
*/
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 AppProviders;
use AppServicesTokenManageService;
use IlluminateSupportServiceProvider;
/**
* token管理服务提供者
*
* Class TokenManageServiceProvider
* @package AppProviders
*/
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' => [
...
/**
* 自定义
*/
AppProvidersTokenManageServiceProvider::class
],
'aliases' => [
...
/**
* 自定义
*/
'TokenManage' => AppFacadesTokenManageFacade::class
],
]
接下来就可以测试了
declare(strict_types=0);
/**
* TestController.php.
*
*/
namespace AppHttpControllersTest;
use TokenManage;
/**
* Class TestController
* @package AppHttpControllersTest
*/
class TestController extends Controller
{
/**
* 测试自定义门面
*/
public function testFacade()
{
$res = TokenManage::getToken('Hello World');
dd($res);
}
}
Response
Class 'TokenManage' Not Found
- 1
php artisan config:cache
- 1
重新测试一下,果然成功了。
Response
'Hello World'