有的时候为了复用方法会在一个控制器中调用另一个控制器的方法。
比如,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提供的基础控制器,它有个构造函数
<?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);
这一行代码就可以解决我的需求啦,至于后面有没有问题,这个不清楚,起码问题现在是解决了!