我有一个控制器,在名为“UserController”的控制器中具有“getUsers”函数,在其中我想调用“CarController”控制器的名为“getCars”的函数,我有两个选项是:
a)将第二个调用设置为“静态”,然后我可以在不实例化类的情况下调用它
b)不要做静态类的那个函数,我这样调用它
$ car_id = 100;
$ userController = new UserController ();
$ userController-> getCars ($ car_id);
我不知道哪种是最佳做法,也不知道有什么优缺点。
我正在使用 Laravel。 谢谢。
从另一个控制器调用一个控制器是一种不好的做法,这通常表明您的代码设计得很糟糕,您应该考虑一种不同的方法来实现您想要的。
尽管如此,你可以这样做:
app()->call('App\Http\Controllers\CarController@getCars');
如果您的控制器方法有参数,您可以将它们作为第二个参数传递:
app()->call('App\Http\Controllers\CarController@getCars', [$param1, $param2]);
要回答您的问题,您不应从一种控制器方法调用另一种方法。正如 @elfu 提到的,这无论如何都不是控制器的预期功能。他的帖子是正确的,在您的情况下,您可能应该使用用户模型作为此方法的位置,但我想我会稍微关注一下。
如果您确实想在多个控制器之间共享方法,那么通过 Trait 是一个好地方。在某些情况下,您没有引用控制器之间共享的模型,而 Trait 将是您的最佳选择。
要包含一个特征,您可以通过将其包含在控制器的顶部来引用它,然后在控制器的类声明之后使用“use”语句。这是一个例子:
use App\Traits\ExampleTrait;
class CarController extends Controller
{
use ExampleTrait;
...
您可以在 UserController 中执行相同的操作。然后,您放置在 ExampleTrait 中的任何方法都可以通过将其引用为 $this->methodName() 直接从 CarController 和 UserController 访问,就像引用同一控制器中的任何其他方法一样。
在您的特定情况下,我想说您的逻辑可能应该存储在用户模型中,因为用户的汽车实际上是用户模型的属性,但上面为您提供了另一种选择。
以我的愚见,你不应该在控制器中调用另一个控制器。
看起来您在该控制器中有“一些业务逻辑”。因此,您应该将逻辑移至实体 (User.php
) 并在两个控制器方法中调用它。
常规控制器返回一个视图(至少这是预期的),因此如果您想调用另一个控制器,您应该将该路由发送到该方法(在
web.php
文件中),而不是在另一个控制器中调用它。
希望对您有帮助。
trait
并在两个控制器中使用它,例如: 特质 常见 { 公共函数方法(){} }
class FirstController extends Controller
{
use Common;
}
class SecondController extends Controller
{
use Common;
}
$videos = app()->call('App\Http\Controllers\StorageController@returnViewVideo',[
'course'=>$course,
'lesson'=>$lesson,
]);
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]);
}
// 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);