我有两个控制器SubmitPerformanceController和PrintReportController。
在PrintReportController中,我有一个叫做getPrintReport的方法。
如何在submitperformanceccontroller中访问此方法?
我有两个控制器SubmitPerformanceController和PrintReportController。
在PrintReportController中,我有一个叫做getPrintReport的方法。
如何在submitperformanceccontroller中访问此方法?
当前回答
这种方法也适用于相同层次的Controller文件:
$printReport = new PrintReportController;
$prinReport->getPrintReport();
其他回答
你不应该。这是反模式。如果你在一个控制器中有一个方法,你需要在另一个控制器中访问,那么这是你需要重构的标志。
考虑将方法重构到一个服务类中,然后可以在多个控制器中实例化该服务类。所以如果你需要为多个模型提供打印报告,你可以这样做:
class ExampleController extends Controller
{
public function printReport()
{
$report = new PrintReport($itemToReportOn);
return $report->render();
}
}
在我看来最优雅的方法是:
app(YourController::class)->yourControllerMethod()
//In Controller A <br >
public static function function1(){
}
//In Controller B, View or anywhere <br>
A::function1();
当然,你可以实例化另一个控制器并调用你想要的方法。也许这不是一个好的做法,但我不知道为什么:
$otherController = new OtherController();
$otherController->methodFromOtherController($param1, $param2 ...);
但是,这样做,你会有一个问题:另一个方法返回类似response()->json($result)的东西,这不是你想要的。 为了解决这个问题,定义另一个控制器的方法的第一个参数为:
public function methodFromOtherController(Request $request = null, ...
当你从主控制器调用methodFromOtherController时,你将把null作为第一个参数值:
$otherController = new OtherController();
$otherController->methodFromOtherController(null, $param1, $param2 ...);
最后,在methodFromOtherController方法的末尾创建一个条件:
public function methodFromOtherController(Request $request = null, ...)
{
...
if (is_null($request)) {
return $result;
} else {
return response()->json($result);
}
}
一旦Laravel在通过直接路由调用时设置$request,您就可以区分每种情况并返回相应的值。
不建议从另一个控制器调用一个控制器,但是如果出于任何原因你必须这样做,你可以这样做:
Laravel 5兼容方法
return \App::call('bla\bla\ControllerName@functionName');
注意:这不会更新页面的URL。
最好是调用Route,让它调用控制器。
return \Redirect::route('route-name-here');