控制反转?

今年准备毕业,到公司实习,接手了一些代码,但存在一些疑惑,同事也不是很了解。
主要问题是这样的,公司做游戏,游戏平台需要使用多个 sdk。
比如说登录:

统一接口
$sdkManager = SdkManager::resolve();
$resp = $sdkManager->login();

SdkManager 使用服务提供者注册了门面

$this->app->singleton('sdk_manager', function () {
    return new SdkManager();
});
class SdkManager
{
    protected $managers = [];

    /**
     * @param null $sdk_type
     * @param $data
     * @return mixed
     * @throws Exceptions
     */
    public  function resolve($sdk_type = null){
        $sdk_type = $sdk_type ?: request('sdk_type');
        if (isset($this->managers[$sdk_type])) {
            return new $this->managers[$sdk_type];
        }
        throw new Exceptions(Exceptions::SDK_MANAGER_NOT_FOUND);
    }
}

根据 request 中的参数去实例化不同的 SDK 实现类(这些类也都实现了 SDK 的契约)

namespace App\Contracts;
interface  SdkManage
{
    public function login();
    public function pay();
    public function generateSign(array $data = [], $orderId = null, $os = null);
}

各式各样的实现类都实现SdkManage?
因为一些隐私问题,实现类都有对应的 key(有点奇怪,不写在 env 里)


我想咨询一些

  • 这算不算是一种控制反转?
  • SdkManager 中 managers 不应该是空数组吗,按道理不应该是抛出异常吗?为什么会进入到 if 里,实例化 SDK
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

回答一:这算是一种反转控制
回答二: 这里需要你断点调试或者打印数组

5年前 评论
讨论数量: 3

是不是漏掉一些代码?从上面看 $managers 肯定为空啊。 你运行打印一下 $managers 看一下。

5年前 评论

回答一:这算是一种反转控制
回答二: 这里需要你断点调试或者打印数组

5年前 评论

嗯呢 谢谢大家 是我漏了一点,有另一个文件,在服务提供者 boot () 的时候进行了配置读取赋值。
另外我想问问大家 关于这种多个 sdk 的有没有更好的,更加规范的的写法?

5年前 评论