万维当云伯乐 CDN华纳云
ThinkPHP2024-06-091,583 阅读

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

本文摘要有的时候为了复用方法会在一个控制器中调用另一个控制器的方法。 比如,A控制器中调用B控制器的方法, 最简单的办法就是new一个B控制器
丽萨主机
AD:
【广告招商】文章正文文字广告位开放合作
有的时候为了复用方法会在一个控制器中调用另一个控制器的方法。 比如,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);
这一行代码就可以解决我的需求啦,至于后面有没有问题,这个不清楚,起码问题现在是解决了!
广告招商文章内容详情页下 · 优质席位开放中合作咨询