ThinkPHP8中如何在控制器中调用另一个控制器?

2024-06-09 358 0

有的时候为了复用方法会在一个控制器中调用另一个控制器的方法。
比如,A控制器中调用B控制器的方法,
最简单的办法就是new一个B控制器

<?php
....

class A extends BaseController {
	public function update(Request $request, $id) {
		$b = new \app\admin\controller\B();
		$b->update($request, $id);
	}
}

但是这样会报错,因为一般情况下所有控制器都会继承BaseController,
BaseController是ThinkPHP提供的基础控制器,它有个构造函数

thinkphp

thinkphp

<?php
....

/**
 * 控制器基础类
 */
abstract class BaseController
{
	....
	
    /**
     * 构造方法
     * @access public
     * @param  App  $app  应用对象
     */
    public function __construct(App $app)
    {
        $this->app     = $app;
        $this->request = $this->app->request;

        // 控制器初始化
        $this->initialize();
    }
}

只要想实例化BaseController或者BaseController的子类,必须要带App对象,就像这样

<?php
....

class A extends BaseController {
	public function update(Request $request, $id) {
		$app = new \think\App();
		$b = new app\admin\controller\B($app);
		$b->update($request, $id);
	}
}

只是这样手动实例化App再传入

比较麻烦
假设哪天构造函数需要的不再是App对象而是改成了Request对象,
上面的代码还得要改一遍
所以这种情况应该用ThinkPHP的依赖注入,
它可以根据需要自动进行依赖注入,不需要再手动实例化再传入,
怎么使用依赖注入呢?
ThinkPHP提供了一个invoke助手函数,它的第一个参数是类名,第二个参数是参数,
用invoke函数实现上面的代码如下:

<?php
....

class A extends BaseController {
	public function update(Request $request, $id) {
		invoke(app\admin\controller\B::class)->update($request, $id);
	}
}

明显这样更简洁,而且不用担心依赖的类发生改变。

最后小编简洁了下

 invoke(\app\index\controller\Base::class);

这一行代码就可以解决我的需求啦,至于后面有没有问题,这个不清楚,起码问题现在是解决了!

    相关文章

    使用PHP获取文件夹中所有文件
    thinkphp8中,数据库的字段是 api_node_id ,值是:多个用英文逗号区分,这种应如何来查询准确的数据取出唯一的主键ID?
    tp(thinkphp6)记录后台操作日志
    ThinkPHP6利用路由中间件记录用户操作日志
    ThinkPHP6实现上传图片带水印方法
    ThinkPHP6实现简单的记录网站后台管理操作日志方法

    发布评论