Laravel,如何从另一个控制器调用函数

时间:2018-11-08 14:01:59

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

我在名为“ UserController”的控制器中有一个具有“ getUsers”功能的控制器,并且在其中要调用名为“ getCars”的“ CarController”控制器的功能,我有两个选择:

a)将第二个调用设为“静态”,那么我可以在不实例化类的情况下调用它

b)不要执行静态类的功能,我以这种方式调用它

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

我不知道哪种是最佳做法,或者哪种利弊是另一种。

我正在使用laravel。 感谢。

6 个答案:

答案 0 :(得分:1)

根据我的拙见,您不应在控制器中呼叫另一个控制器

您似乎在该控制器中具有一些业务逻辑。因此,您应该将逻辑移到实体(User.php)上,并在两个控制器方法中调用它。

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

希望对您有帮助。

答案 1 :(得分:1)

从另一个控制器中调用一个控制器是一种不好的做法,这通常表示您对代码的设计不正确,应该考虑采用另一种方法来实现所需的功能。

还是这样,您可以这样做:

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

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

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

答案 2 :(得分:0)

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

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

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

use App\Traits\ExampleTrait;

class CarController extends Controller
{
    use ExampleTrait;
...

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

在您的特定情况下,我想说您的逻辑可能应该存储在User模型中,因为针对用户的汽车实际上是User模型的ATTRIBUTE,但是以上所述为您提供了另一种选择。 / p>

答案 3 :(得分:0)

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

class FirstController extends Controller
{
    use Common;
}

class SecondController extends Controller
{
    use Common;
}

答案 4 :(得分:0)

以下代码对我来说效果很好。并且它也可以在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]);
}

答案 5 :(得分:0)

如果要将参数绑定到调用中,可以使用:

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