laravel控制器中调用其他控制器

做spa应用的时候,首屏通常需要加载大量数据,这个时候如果可以将多个api请求合并为一个可以提高服务效率。有时候也有需求在一个控制器中调用其他控制器方法。

laravel中的Controller及其action都是由框架自动调用,并注入依赖的,如果手动new的话会比较麻烦,于是我写了一个Trait,在控制器中引入就可以很方便实现调用其他控制器了。

<?php

namespace App\Tools;

use Illuminate\Routing\RouteDependencyResolverTrait as DepResolver;

trait CallActionTrait {
    private function callControllerMethod($action = '', $routeParameters = []){
        return with(new Resolver)->callControllerMethod($action, $routeParameters);
    } 
}
class Resolver {
    use DepResolver;

    private $container;

    public function __construct(){
        $this->container = app();
    }

    public function callControllerMethod($action = '', $routeParameters = []){
        list($class, $method) = explode('@', $action);
        $instance = $this->container->make($class);
        $parameters = $this->resolveClassMethodDependencies($routeParameters, $instance, $method);
        return $instance->callAction($method, $parameters);
    }
}

在控制器中像这样使用它

    use \App\Tools\CallActionTrait;

    public function test(){
        return $this->callControllerMethod(
            'App\Http\Controllers\PostController@getRelatives',
            [
                'count'=>10
            ]);
    }

注意: 这样跳过了路由级权限验证,请注意鉴权

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 129,405评论 18 137
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,127评论 0 121
  • 必备品文档:DocumentationAPI: API Reference视频:Laracasts速查表:Lara...
    ethanzhang阅读 5,495评论 0 68
  • 0.1配置1.模板继承2.控制器3.git4.支付宝支付的流程5.路由6.中间件7.请求8.laravel 学习笔...
    小龙123阅读 639评论 0 5
  • 介绍 不要把所有处理请求的逻辑都放到一个单独的 routes.php 文件里,我们可以使用控制器去组织这些行为。C...
    伊Summer阅读 602评论 0 1
  • 博客:http://blog.csdn.net/zyfmeng/article/details/52057263
    飞天猪Pony阅读 1,084评论 0 2
  • 白起是与王翦、李牧、廉颇并称战国四大战将,并雄踞四将之首。后世之人对其不甚了解,多以杀神、战神称之,犹记长平之...
    深水之下阅读 1,651评论 14 18
  • 一米阳光 时光无言, 岁月无声, 阳光、空气、微笑,花香, 所有的美好都沁入心房, 安...
    别具一格格阅读 173评论 3 4