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

相关文章
相关标签/搜索