服务器测评网
我们一直在努力
广告
广告
广告
广告
广告
广告

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

广告
广告

有的时候为了复用方法会在一个控制器中调用另一个控制器的方法。
比如,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);

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

好主机测评广告位招租-300元/3月
赞(0) 打赏
未经允许不得转载:好主机测评网 » ThinkPHP8中如何在控制器中调用另一个控制器?
好主机测评广告位招租-200元/3月
好主机测评广告位招租-100元/3月

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫