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

问题描述 投票:0回答:7

我有一个控制器,在名为“UserController”的控制器中具有“getUsers”函数,在其中我想调用“CarController”控制器的名为“getCars”的函数,我有两个选项是:

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

b)不要做静态类的那个函数,我这样调用它

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

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

我正在使用 Laravel。 谢谢。

php laravel-5 php-7
7个回答
10
投票

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

尽管如此,你可以这样做:

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

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

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

3
投票

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

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

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

use App\Traits\ExampleTrait;

class CarController extends Controller
{
    use ExampleTrait;
...

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

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


2
投票

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

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

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

web.php

文件中),而不是在另一个控制器中调用它。

希望对您有帮助。


1
投票
trait

并在两个控制器中使用它,例如: 特质 常见 { 公共函数方法(){} }

class FirstController extends Controller
{
    use Common;
}

class SecondController extends Controller
{
    use Common;
}



1
投票

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



0
投票

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]); }



0
投票

// Convert the array to a Request object $request = Request::create('/store', 'POST', $requestData); // Instantiate CustomerController $customerController = app(CustomerController::class); // Call the store method and pass the Request object and sync_process flag $response = $customerController->store($request);

	
© www.soinside.com 2019 - 2025. All rights reserved.