我有两个控制器SubmitPerformanceController和PrintReportController。

在PrintReportController中,我有一个叫做getPrintReport的方法。

如何在submitperformanceccontroller中访问此方法?


当前回答

//In Controller A <br >
public static function function1(){

}


//In Controller B, View or anywhere <br>
A::function1();

其他回答

尝试在SubmitPerformanceController中创建一个新的PrintReportController对象,并直接调用getPrintReport方法。

例如,假设我在SubmitPerformanceController中有一个名为“Test”的函数,然后我可以这样做:

public function test() { 
  $prc = new PrintReportController();
  $prc->getPrintReport();
 }

不建议从另一个控制器调用一个控制器,但是如果出于任何原因你必须这样做,你可以这样做:

Laravel 5兼容方法

return \App::call('bla\bla\ControllerName@functionName');

注意:这不会更新页面的URL。

最好是调用Route,让它调用控制器。

return \Redirect::route('route-name-here');

如果您在另一个控制器中需要该方法,这意味着您需要抽象它并使其可重用。将该实现移动到服务类(ReportingService或类似的东西)并将其注入到控制器中。

例子:

class ReportingService
{
  public function getPrintReport()
  {
    // your implementation here.
  }
}
// don't forget to import ReportingService at the top (use Path\To\Class)
class SubmitPerformanceController extends Controller
{
  protected $reportingService;
  public function __construct(ReportingService $reportingService)
  {
     $this->reportingService = $reportingService;
  }

  public function reports() 
  {
    // call the method 
    $this->reportingService->getPrintReport();
    // rest of the code here
  }
}

对需要该实现的其他控制器执行相同的操作。从其他控制器中获取控制器方法是一种代码气味。

这种方法也适用于相同层次的Controller文件:

$printReport = new PrintReportController;

$prinReport->getPrintReport();

当然,你可以实例化另一个控制器并调用你想要的方法。也许这不是一个好的做法,但我不知道为什么:

$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,您就可以区分每种情况并返回相应的值。