门面为应用服务容器中的绑定类提供了一个“静态”接口。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'

Laravel5 创建自定义门面(Facade)的更多相关文章

  1. Laravel开发:Laravel框架门面Facade源码分析

    前言 这篇文章我们开始讲 laravel 框架中的门面 Facade,什么是门面呢?官方文档: Facades(读音:/fəˈsäd/ )为应用程序的服务容器中可用的类提供了一个「静态」接口.Lara ...

  2. 谈谈thinkphp5.1中容器(Container)和门面(Facade)的实现

    tp5.1中引入了容器(Container)和门面(Facade)这两个新的类 官方文档已经给出了定义: 容器(Container)实现类的统一管理,确保对象实例的唯一性. 门面(Facade)为容器 ...

  3. laravel5.2总结--门面(facades)

    Facades 为应用程序的服务容器中可用的类提供了一个「静态」接口.   Laravel 本身附带许多的 facades,甚至你可能在不知情的状况下已经在使用他们!   xpower的静态接口(门面 ...

  4. 5.1中容器(Container)和门面(Facade)的实现

    tp5.1中引入了容器(Container)和门面(Facade)这两个新的类 官方文档已经给出了定义: 容器(Container)实现类的统一管理,确保对象实例的唯一性. 门面(Facade)为容器 ...

  5. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  6. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  7. [转]maven创建自定义的archetype

    创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...

  8. ArcGIS Engine环境下创建自定义的ArcToolbox Geoprocessing工具

    在上一篇日志中介绍了自己通过几何的方法合并断开的线要素的ArcGIS插件式的应用程序.但是后来考虑到插件式的程序的配置和使用比较繁琐,也没有比较好的错误处理机制,于是我就把之前的程序封装成一个类似于A ...

  9. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

随机推荐

  1. Windows10反安装报错error code 2502 2503

    先找系统TEMP目录,一般为C:\windows\temp,打开这个目录的权限,为这个目录中的User用户添加权限为完全控制,现在再反安装就不会报错了. 注:原因就是因为系统运行时需要用到临时文件的目 ...

  2. nodejs前后分离

    proxy: { '/api': { target: 'http://localhost:3000/', pathRewrite: {'^/api' : ''}, changeOrigin: true ...

  3. Gulp的简单使用

    我比较喜欢使用Gulp,因为简单好用! 今天的任务是:使用Gulp来压缩 jQuery源码,各输出一个压缩的和未压缩的版本 第一步:安装 cnpm install gulp --save-dev cn ...

  4. UVA211-The Domino Effect(dfs)

    Problem UVA211-The Domino Effect Accept:536  Submit:2504 Time Limit: 3000 mSec  Problem Description ...

  5. CSAPP:第六章 存储器层次结构

    存储器层次结构 关键点:内存 6.1 随机访问存储器6.2 局部性6.3 存储器层次结构 6.1 随机访问存储器   随机访问存储器(Random-Access Memory,RAM)分为两类:静态的 ...

  6. spring boot 注解方式 idea报could not autowire

    File-Project Structure 页面 Facets下删掉 Spring(直接右键Delete) 这个解答是对的.并不会降低安全性!!因为创建项目的时候,都是先创建空项目再创建web mo ...

  7. wxWidgets与其它GUI工具库比较

    WxWidgets Compared To Other Toolkits   Some general notes: wxWidgets not only works for C++, but als ...

  8. Java关系运算

    关系运算符用来比较两个值的关系.关系运算符是二元运算符,运算结果是 boolean 型.当运算符对应的关系成立时,运算结果是 true,否则是 false. 关系表达式是由关系运算符连接起来的表达式. ...

  9. [BZOJ 3709] Bohater

    Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降 ...

  10. .Net架构篇:实用中小型公司支付中心设计

    前言 说起支付平台,支付宝量级的支付平台和一个小型公司的支付不可同日耳语.一个初创或刚创业一两年的公司,一没人力,二没财力的情况下,如果也想对接支付那怎么办呢?感谢支付宝和微信支付,两大行业巨头提供了 ...