控制器内调用别的控制器的方法,并传参

<?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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 17

为什么不把那个方法抽出来呢

2周前
陈先生

你别说代码写的挺抽象

2周前

直接在路由那调控制器不就可以了?

2周前
chowjiawei

为什么不写个服务 你这还不如服务呢

2周前 评论
阿珂 (楼主) 2周前
laaa 2周前
阿珂 (楼主) 2周前

你的业务逻辑全在控制器里写着吗

2周前 评论
阿珂 (楼主) 2周前
chowjiawei

起码展示了 怎么合理的调用控制器 帖子还是ok的 我收藏了 以后面试说不定会遇到这种问题

2周前 评论
阿珂 (楼主) 2周前

好奇什么时候会有控制器调用控制器的时候。

2周前 评论
阿珂 (楼主) 2周前

控制器的方法调用另外一个控制器的方法,本质上还是操作数据库或者对数据进行处理。很多朋友说的,要么就是封装,使用trait,然后use,要么就封装成静态函数或者放到父类里进行继承,都好过你之前的引入方式。

但是有个问题,如果你的业务很复杂或者需要复用的地方很多,那么就可以考虑引入服务的概念了,可以看看这篇文章的回复:laravel 怎么规划多应用喃?

2周前 评论
晏南风 2周前

花里胡哨 :joy:没卵用

2周前
sanders

能否请楼主讲一下这样做的优势是什么?

如果遇到控制器方法参数注入的情况如何解决哪?

2周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!