门面为应用服务容器中的绑定类提供了一个“静态”接口。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. vue使用JS的形式进行路由导航

    // 注意: 一定要区分 this.$route 和 this.$router 这两个对象, // 其中: this.$route 是路由[参数对象],所有路由中的参数, params, query ...

  2. 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题

    通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...

  3. 阿里云ECS配置踩坑之路

    1.利用shadowsocks配置SVN(用于软件部署环境) 2.安全组设置 3.FTP搭建 https://www.cnblogs.com/hexige/p/7809481.html

  4. node.js—File System(文件系统模块)

    文件系统模块概述 该模块是核心模块,提供了操作文件的一些API,需要使用require导入后使用,通过 require('fs') 使用该模块 文件 I/O 是由简单封装的标准 POSIX 函数提供的 ...

  5. F. Graph Without Long Directed Paths Codeforces Round #550 (Div. 3)

    F. Graph Without Long Directed Paths time limit per test 2 seconds memory limit per test 256 megabyt ...

  6. Linux系统在信息社会的发展

    Linux系统在信息社会的发展 随着信息技术的高速发展并迅速渗透到社会生活的各个方面,Linux日益成为人们学习.工作.生活不可缺少的基本工具,再过不了几年,不会使用Linux,就会象不识字一样使人举 ...

  7. P2690 接苹果 (DP)

    补一下dp的思路: dp[i][j]表示第 i 分钟转 j  次所得到的最大值.很容易得到这个dp的推导式. 图中¢()函数表示成立为1, 不成立为0的函数. #include<cmath> ...

  8. 最长回文(manacher模板)

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...

  9. 吴恩达课后作业学习1-week4-homework-two-hidden-layer -1

    参考:https://blog.csdn.net/u013733326/article/details/79767169 希望大家直接到上面的网址去查看代码,下面是本人的笔记 两层神经网络,和吴恩达课 ...

  10. node.js之express框架

    之前学习过node.js接触过express框架,最近为了编写一个mock server正好用到了express.下面正好就跟大家介绍一下关于express.今天的内容主要围绕这么几个方面? expr ...