我有两个控制器SubmitPerformanceController和PrintReportController。

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

如何在submitperformanceccontroller中访问此方法?


当前回答

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

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

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

其他回答

如果您在另一个控制器中需要该方法,这意味着您需要抽象它并使其可重用。将该实现移动到服务类(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
  }
}

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

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

Laravel 5兼容方法

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

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

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

return \Redirect::route('route-name-here');
\App::call('App\Http\Controllers\MyController@getFoo')

晚回复,但我一直在寻找这个时间。这现在可以用一种非常简单的方式实现。

如果没有参数

return redirect()->action('HomeController@index');

与参数

return redirect()->action('UserController@profile', ['id' => 1]);

文档:https://laravel.com/docs/5.6/responses # redirecting-controller-actions

在5.0中,它需要完整的路径,现在它简单多了。

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

$printReport = new PrintReportController;

$prinReport->getPrintReport();