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

<?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 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 17

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

8个月前

你别说代码写的挺抽象

8个月前

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

8个月前
chowjiawei

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

8个月前 评论
阿珂 (楼主) 8个月前
laaa 8个月前
阿珂 (楼主) 8个月前

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

8个月前 评论
阿珂 (楼主) 8个月前
chowjiawei

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

8个月前 评论
阿珂 (楼主) 8个月前

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

8个月前 评论
阿珂 (楼主) 8个月前

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

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

8个月前 评论
晏南风 8个月前

花里胡哨 :joy:没卵用

8个月前
sanders

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

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

8个月前

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