在thinkphp6中使用依赖注入或容器来创建对象
很多时候,在自己的控制器中需要调用另一个控制器中的方法,但是没有直接的继承关系,比如两个控制器同时继承了一个common类。如果我们直接new一个控制器中的类,就会提示
Too few arguments to function app\common\controller\WechatApi::__construct(), 0 passed
当前在 Login 控制器中的方法里这样使用了 WechatApi:
$wxapi = new WechatApi();
$wxapi->WechatOAuth('snsapi_base');但WechatApi 类定义如下:
class WechatApi extends Hub{    
public function __construct(App $app)    {        
    parent::__construct($app);    
}    
public function WechatOAuth()    {        // ...    }
}这里 new WechatApi() 没有传入 $app 参数,所以会报错,或者是Hub中有构造函数被继承了。
在 ThinkPHP 6.1 中,建议使用依赖注入或容器来创建对象,而不是手动 new。你可以使用框架提供的容器来自动解析 WechatApi,前提是它的依赖能被容器解析。
public function checkWechatLogin(){    
    // 使用容器创建 WechatApi 实例,自动注入 App    
    $wxapi = Container::getInstance()->make(WechatApi::class);        
    $wxapi->WechatOAuth('snsapi_base');
}或者更简洁一点(适用于控制器方法):
public function checkWechatLogin(WechatApi $wxapi){    
    $wxapi->WechatOAuth('snsapi_base');
}这种方式是 依赖注入,由框架自动帮你实例化并传入 App。


