Laravel 框架中如何动态调用另一个控制器的方法?

1.现在有两个文件夹下的两个控制器,A,B 想要在A的一个方法中调用B控制器的方法

2.因为要在业务中,根据值的不同来调用不同控制器的方法 例如:

$temp;
if(true){
    requre_once($temp."Controller.php");
    (new $temp())->index();
}

use只能在顶部预先声明, 除了require和include,有什么基于laravel框架的方法或者特性来调用吗?让其优雅点. 貌似记得thinkphp3.2 框架有个R函数.

hiwangqi
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

不妨看看这段demo吧,laravel中有类自动加载,想必其它的所有控制器都在同一目录下, index 是主控制器,下面有 a 和 b两个控制器,通过给 index 控制器的 handle 方法传入参数来调用不同的控制器处理
<?php

namespace app;

// 处理控制器
class index
{
    function handle($action)
    {
        $action = __NAMESPACE__ . '\\' . $action;
        $class = new $action;
        $class->index();
    }
}

// 参数控制器
class a
{
    function index()
    {
        echo 'a-index';
    }

// 参数控制器
class b
{
    function index()
    {
        echo 'b-index';
    }
}

$index = new \app\index;
$index->handle('a');
$index->handle('b');

?>
2年前 评论
讨论数量: 6
JeffLi

试试在控制器中创建静态函数,然后在另一个控制器中调用。
这种操作应该用不到吧,我是没用过。

2年前 评论
shubiao-yao

一般是不会在一个Controller中使用另外一个Controller中的方法的.
//这里就是你的A控制器
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Api\FirstTestController;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class SecondTestController extends Controller
{

public function index()
{
    $firstTest = new FirstTestController();

    $result = $firstTest->index();
    dd($result);
}

}

//这里就是你的B控制器

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class FirstTestController extends Controller
{

public function index()
{
    return 'This is test';
}

}
//需要说明的是一把不会在Controller中use另外一个Controller,根据你的描述,我想你可能产生了代码冗余,需要把公共的code提取出来放在另外一个Class文件中(Reposity or Services),由两个Controller去调用公共的代码。

2年前 评论

建议重新考虑,重新设计,这种做法一般是不会用到的,一般都是你的设计不当

2年前 评论

不妨看看这段demo吧,laravel中有类自动加载,想必其它的所有控制器都在同一目录下, index 是主控制器,下面有 a 和 b两个控制器,通过给 index 控制器的 handle 方法传入参数来调用不同的控制器处理
<?php

namespace app;

// 处理控制器
class index
{
    function handle($action)
    {
        $action = __NAMESPACE__ . '\\' . $action;
        $class = new $action;
        $class->index();
    }
}

// 参数控制器
class a
{
    function index()
    {
        echo 'a-index';
    }

// 参数控制器
class b
{
    function index()
    {
        echo 'b-index';
    }
}

$index = new \app\index;
$index->handle('a');
$index->handle('b');

?>
2年前 评论

@畅畅 如果这样那还不如写个控制器工厂,只是这样做真的有必要么?

2年前 评论

@FMW 并不会呀,核心操作的方法只在 index 中的 handle 方法。

2年前 评论

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