【问题标题】:Laravel , how to call a function from another controllerLaravel,如何从另一个控制器调用函数
【发布时间】:2019-04-12 01:17:13
【问题描述】:

我在一个名为“UserController”的控制器中有一个带有“getUsers”功能的控制器,在它里面我想调用一个名为“getCars”的“CarController”控制器的函数,我有两个选项:

a) 将第二个调用设为 "static" ,然后我可以在不实例化类的情况下调用它

b) 不要做静态类的那个功能,我这样称呼它

    $ car_id = 100;
    $ userController = new UserController ();
    $ userController-> getCars ($ car_id);

我不知道哪种做法是最佳做法,或者各有什么优缺点。

我正在使用 laravel。 谢谢。

【问题讨论】:

    标签: php laravel-5 laravel-5.2 php-7


    【解决方案1】:

    从另一个控制器调用一个控制器是一种不好的做法,这通常表明你的代码设计得很糟糕,你应该想一种不同的方法来实现你想要的。

    不过,你可以这样做:

    app()->call('App\Http\Controllers\CarController@getCars');
    

    如果你的控制器方法有参数,你可以将它们作为第二个参数传递:

    app()->call('App\Http\Controllers\CarController@getCars', [$param1, $param2]);
    

    【讨论】:

      【解决方案2】:

      要回答您的问题,您不应调用另一个控制器方法。正如@elfu 提到的,这无论如何都不是控制器的预期功能。他的帖子是正确的,在您的情况下,您可能应该使用 User 模型作为此方法的位置,但我想我会稍微考虑一下。

      如果您确实想在多个控制器之间共享方法,那么通过 Trait 是一个不错的选择。在某些情况下,您没有引用在控制器之间共享的模型,而 Trait 将是您的最佳选择。

      要包含特征,您可以通过将其包含在控制器的顶部来引用它,然后在控制器的类声明之后使用“use”语句。这是一个例子:

      use App\Traits\ExampleTrait;
      
      class CarController extends Controller
      {
          use ExampleTrait;
      ...
      

      您可以在 UserController 中执行相同的操作。然后,您放置在 ExampleTrait 中的任何方法都可以通过将其引用为 $this->methodName() 直接从 CarController 和 UserController 访问,就像在同一控制器中引用任何其他方法一样。

      在您的特定情况下,我会说您的逻辑可能应该存储在 User 模型中,因为用户的汽车实际上是 User 模型的属性,但上面为您提供了另一种使用选项。

      【讨论】:

        【解决方案3】:

        以我的拙见,您不应该在控制器中调用另一个控制器

        看起来您在该控制器中有一些业务逻辑。因此,您应该将您的逻辑移至实体 (User.php) 并在两个控制器方法中调用它。

        常规控制器返回一个视图(至少这是预期的),因此如果您想调用另一个控制器,您应该将该路由发送到该方法(在web.php 文件中)而不是在另一个控制器中调用它.

        希望对你有所帮助。

        【讨论】:

          【解决方案4】:

          您可以从另一个控制器调用一个控制器函数,但最好的方法是创建一个 trait 并在两个控制器中使用它,例如: 特质 共同点 { 公共函数方法(){} }

          class FirstController extends Controller
          {
              use Common;
          }
          
          class SecondController extends Controller
          {
              use Common;
          }
          

          【讨论】:

            【解决方案5】:

            如果要给调用绑定参数,可以使用:

                $videos = app()->call('App\Http\Controllers\StorageController@returnViewVideo',[
                    'course'=>$course,
                    'lesson'=>$lesson,
                ]);
            

            【讨论】:

              【解决方案6】:

              以下代码对我很有效。也可以在routes.php中使用

               public function mobileImageUpload(Request $request){
                  $this->validate($request,[
                      'data'=>'required',
                      'filetype'=>'required',
                      'userid'=>'required',
                  ]);
                  $namespace = 'App\Http\Controllers';
                  $controller = app()->make($namespace.'\ImageController');
                  return $controller->callAction('mobileImageUpload',[$request]);
              }
              

              【讨论】:

                猜你喜欢
                • 2021-12-28
                • 2014-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多