首先翻看手冊上的例子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