在thinkphp6中使用依赖注入或容器来创建对象

hykeda8个月前ThinkPHP993

很多时候,在自己的控制器中需要调用另一个控制器中的方法,但是没有直接的继承关系,比如两个控制器同时继承了一个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

相关文章

Thinkphp6中在构造函数中返回json数据

return json($arr)->send();如果直接在构造函数中使用return json()是不会返回json格式的数据的。必须调用send方法。...

ThinkPHP6 事件的简单应用

ThinkPHP6 事件的简单应用

一、序章ThinkPHP6的手册中关于【事件】章节的介绍都是直接文字说明,给出创建的类文件,并没有一个好的示例来进行补充说明。对于刚接触【事件】的同学在阅读理解上增加了一点点困难,本文就在此结合示例简...

关于thinkphp6 where以数组形式查询,其中有or,and的处理

最近在写tp6的查询语句时,如果查询条件以数组形式传入,比如:$where[] = ['id','=',$id]; $where[] =...

Thinkphp5 记录点,注意点

json对象转成数组 先用$flag->getContent() $flag = json_decode($flag->getContent(),true); 控制器: 1、当控制器...

composer安装插件包的时候提示PHP 版本不匹配

因为安装的 PHP 是 8.0 ,不匹配 composer.json 要求的版本,所以使用 composer 进行安装时会报错。在安装命令后加上 --ignore-pla...

thinkphp6 中间件使用笔记

最近开发三频道打通程序时用到了中间件,现总结一下:第一步:首先用命令行生成中间件php think make:middleware Check这个指令会 app...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。