【问题标题】: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]);
}