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

hykeda7个月前ThinkPHP790

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

相关文章

thinkphp5 报错级别设置,屏蔽警告

本着严谨的原则,5.0版本默认情况下会对任何错误(包括警告错误)抛出异常,如果不希望如此严谨的抛出异常,可以在应用公共函数文件中(common.php)或者配置文件中使用error_report...

thinkphp5 导入第三方类库和导入扩展类库细节

在用到tp5之后,很多东西都不太一样了。在此记录些小经验: 类库的导入,tp5有两种类库,分别为第三方类库和扩展类库 导入扩展类库,tp的手册中有示例代码: extend目录下面...

phpqrcode防止输出乱码 thinkphp

/** * 封装生成二维码函数 * */ function getQrcode($url){ /*生成二维码*/ vendor("phpqrcod...

记录thinkphp3.13移植到php7过程

随着php7的兴起,越来越多的公司用php7了,下面记录一次thinkphp3.1.3项目移植到php7解决兼容性的过程。 先在thinkphp...

Thinkphp5 记录点,注意点

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

thinkphp6 前置和后置中间件的区别以及特殊情况

首先官方文档是这么描述的:中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身。下面是一个前置行为的中间件 (Before命名是随意的):<?php namespace&n...

发表评论    

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