【问题标题】:How to Call a controller function in another Controller in Laravel 5如何在 Laravel 5 的另一个控制器中调用控制器函数
【发布时间】:2015-08-11 18:09:20
【问题描述】:

我正在使用 laravel 5。

我需要调用一个控制器函数,但这应该在另一个控制器中完成。

我不知道该怎么做

public function examplefunction(){

   //stuff

}

我有一个用于这个功能的路线,所以在

public function otherfunctioninothercontroller(){
// I need examplefunction here
}

我该怎么做?

【问题讨论】:

  • 如果是这种情况,您可能应该考虑将函数提取到它应该在的某个位置,例如在适用的帮助器或模型中。
  • 您应该从另一个控制器方法中调用控制器方法。这是一个清晰的信号,您需要重新考虑。

标签: laravel


【解决方案1】:

1) 第一种方式

use App\Http\Controllers\OtherController;

class TestController extends Controller
{
    public function index()
    {
        //Calling a method that is from the OtherController
        $result = (new OtherController)->method();
    }
}

2) Second way

app('App\Http\Controllers\OtherController')->method();

Both way you can get another controller function.

【讨论】:

    【解决方案2】:

    如果它们不在同一个文件夹中,请将use namespace\to\ExampleClass; 放在文件顶部,然后您就可以实例化您的控制器。

    【讨论】:

      【解决方案3】:

      假设我有 Controller1 和 Controller2。我想从 Controller2 中的函数内部调用 Controller1 的函数。

      // Controller1.php
      class Controller1 {
          public static function f1()
          {
      
          }
      }
      

      在另一个控制器上:

      // Controller2.php
      use App\Http\Controllers\Controller1;
      
      class Controller2 {
          public function f2()
          {
              return Controller1::f1();
          }
      }
      

      注意事项:

      1. f1() 被声明为静态

      【讨论】:

        【解决方案4】:

        从另一个控制器内部调用一个控制器是个坏主意。那时就没有控制器的意义。您应该只重定向到 web.php 以保存安全的整个架构,如下所示:

        class MyController {
          public function aSwitchCaseFunction(Request $requestPrm){
            ...
            //getting path string from request here
            ...
            switch($myCase){
                case CASE_1:
                     return redirect()->route('/a/route/path');
                ....
            }
          }
        }
        

        【讨论】:

          【解决方案5】:

          您可以简单地实例化控制器并调用所需的方法,如下所示

          FirstController.php:

          namespace App\Http\Controllers;
          
          class FirstController extends Controller {
              public function examplefunction() {
                  // TODO: implement functionality
              }
          }
          

          SecondController.php:

          namespace App\Http\Controllers;
          
          class SecondController extends Controller {
              public function test() {
                  $object = new FirstController();
                  $object->examplefunction();
              }
          }
          

          现在,在我回答完问题后,我想添加以下评论:

          控制器是类,适用于普通类的所有规则都可以应用于它们

          但是,直接在另一个控制器中实例化一个控制器以调用所需的方法意味着您的设计存在问题,原因如下:

          1. 控制器无法直接获取另一个控制器的实例
          2. 控制器应该包含尽可能少的业务逻辑,如果可能的话

          最接近您想要的解决方案(不破坏 MVC)是向指向所需方法的路由发出 HTTP 请求(例如,使用 cURL)并将响应读取为返回的数据

          但这在这种情况下仍然没有多大意义,因为毕竟您是从服务器上项目中控制器中的方法向服务器上项目中控制器中的方法发出 HTTP 请求,似乎是不必要的开销,对吧?

          正如我之前所说,控制器应该包含尽可能少的业务逻辑,因为逻辑位于专门的类(通常称为 Service Classes 中,并且当请求处理时,控制器只需委托处理到适当的服务类的工作,该类进行处理并将结果返回给控制器,控制器又将其作为响应发送回

          现在想象一下,如果你有以下场景:

          我们有一个包含 3 个功能的应用程序:

          • 用户可以从 Web 应用程序注册帐户
          • 有一个移动应用程序与 API 对话以注册用户
          • 有一个管理面板,他可以用来添加新用户

          显然你需要创建 3 个控制器,但是这些控制器包含重复的逻辑,你会复制/粘贴代码到处吗?

          为什么不将此逻辑封装在服务类中,并在需要时从控制器调用它?

          【讨论】:

            猜你喜欢
            • 2017-04-23
            • 2019-08-27
            • 2021-12-28
            • 1970-01-01
            • 2019-04-12
            • 1970-01-01
            • 2017-07-22
            • 2014-12-11
            • 1970-01-01
            相关资源
            最近更新 更多