我在名为“ UserController”的控制器中有一个具有“ getUsers”功能的控制器,并且在其中要调用名为“ getCars”的“ CarController”控制器的功能,我有两个选择:>
a)将第二个调用设为“静态”,那么我可以在不实例化类的情况下调用它
b)不要执行静态类的功能,我以这种方式调用它
$ car_id = 100;
$ userController = new UserController ();
$ userController-> getCars ($ car_id);
我不知道哪种是最佳做法,或者哪种利弊是另一种。
我正在使用laravel。 感谢。
答案 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,
]);