ThinkPHP實現自定義門面類(Facade)動態加載

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

相關文章
相關標籤/搜索