控制器内调用别的控制器的方法,并传参
<?php
namespace App\Tools;
use Illuminate\Routing\RouteDependencyResolverTrait as DepResolver;
trait CallActionTrait
{
use DepResolver;
private $container;
#调用别的控制器中的方法
public function callControllerMethod(string $class, string $method, array $routeParameters = [])
{
#指定容器,不指定,如果有参数传递时,会报错
$this->container = app();
#获取控制器完整路径
$controller = $this->namespace . '\\' . $class;
try {
#实例化控制器
$instance = app()->make($controller);
#获取并组装参数
$parameters = $this->resolveClassMethodDependencies($routeParameters, $instance, $method);
#调用
return $instance->callAction($method, $parameters);
}catch (\Exception $exception){
return abort(404);
}
}
}
使用
<?php
namespace App\Http\Controllers\Home;
use App\Http\Controllers\Controller;
use App\Tools\CallActionTrait;
use Illuminate\Http\Request;
class PageController extends Controller
{
use CallActionTrait;
#当前命名空间(必须要定义)
public $namespace = 'App\Http\Controllers\Home';
public function index(Request $request)
{
$controller = 'PlanController';
return $this->callControllerMethod($controller, 'index');
}
}
声明:这段代码没有优势,只是为了针对我在工作中遇到的问题的视线方案。仅此而已
本作品采用《CC 协议》,转载必须注明作者和本文链接
为什么不把那个方法抽出来呢
你别说代码写的挺
抽象
直接在路由那调控制器不就可以了?
为什么不写个服务 你这还不如服务呢
你的业务逻辑全在控制器里写着吗
起码展示了 怎么合理的调用控制器 帖子还是ok的 我收藏了 以后面试说不定会遇到这种问题
好奇什么时候会有控制器调用控制器的时候。
控制器的方法调用另外一个控制器的方法,本质上还是操作数据库或者对数据进行处理。很多朋友说的,要么就是封装,使用
trait
,然后use,要么就封装成静态函数或者放到父类里进行继承,都好过你之前的引入方式。但是有个问题,如果你的业务很复杂或者需要复用的地方很多,那么就可以考虑引入服务的概念了,可以看看这篇文章的回复:laravel 怎么规划多应用喃?
花里胡哨 :joy:没卵用
能否请楼主讲一下这样做的优势是什么?
如果遇到控制器方法参数注入的情况如何解决哪?