首先翻看手册上的例子php
<?php namespace app\facade; use think\Facade; class Test extends Facade { protected static function getFacadeClass() { return 'app\common\Test'; } }
getFacedeClass方法用来指定Facade类映射的实际执行类,那是否能够动态指定自定义门面类呢?答案是能够的。app
实现思路是建立一个trait类用于Facade类的继承,而后在该类中完善getFacadeClass方法,指定动态的类映射,代码以下:ide
<?php namespace app\facade; /** * Facade门面基类 * @package app\facade */ trait FacadeDefind { /** * 加上str_replace是为了适配basename函数 * 在Linux中的目录字符不识别\,须要替换为/ * @return string */ protected static function getFacadeClass() { return basename(str_replace('\\', '/', static::class)); } }
而后在自定义的Facade类中use FacadeDefind;便可,不过需保证Facade类跟实际执行类的名称要相同(不一样亦可,但为了方便定义跟调用最好仍是相同比较好)。函数
同时Facade类的底层是使用容器去进行加载的,这里设置了映射以后,由于容器已经找不到定义的实际执行类了,因此须要在自定义容器绑定配置中定义好容器映射,找到app目录中的provider.php,而后每增长一个Facade类就新加一条容器映射定义,好比:spa
<?php use app\ExceptionHandle; use app\Request; use app\service\DingHandle; // 容器Provider定义文件 return [ 'think\Request' => Request::class, 'think\exception\Handle' => ExceptionHandle::class, // 自定义容器映射 'DingHandle' => DingHandle::class, ];
而后就能够使用了。code