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

<?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 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 17

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

1个月前

你别说代码写的挺抽象

1个月前

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

1个月前
chowjiawei

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

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

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

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

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

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

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

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

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

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

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

花里胡哨 :joy:没卵用

1个月前
sanders

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

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

1个月前

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