猿问

Laravel 5中另一个控制器的Access Controller方法

我有两个控制器SubmitPerformanceControllerPrintReportController

PrintReportController我有一个称为的方法getPrintReport

如何访问此方法SubmitPerformanceController


慕莱坞森
浏览 673回答 3
3回答

繁花不似锦

您可以这样访问控制器方法:app('App\Http\Controllers\PrintReportController')->getPrintReport();这可以工作,但是在代码组织方面很不好(请记住为您使用正确的名称空间PrintReportController)您可以扩展,PrintReportController以便SubmitPerformanceController将继承该方法class SubmitPerformanceController extends PrintReportController {     // ....}但这也会继承的所有其他方法PrintReportController。最好的方法是创建一个trait(例如app/Traits),在其中实现逻辑并告诉您的控制器使用它:trait PrintReport {    public function getPrintReport() {        // .....    }}告诉您的控制器使用此特征:class PrintReportController extends Controller {     use PrintReport;}class SubmitPerformanceController extends Controller {     use PrintReport;}两种解决方案都SubmitPerformanceController具有getPrintReport方法,因此您可以$this->getPrintReport();在控制器内使用或直接将其作为路径调用(如果您在中将其映射routes.php)您可以在这里阅读更多有关特征的信息。

慕的地8271018

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