来自Laravel 5中另一个控制器的访问控制器方法

2022-08-30 06:17:28

我有两个控制器和.SubmitPerformanceControllerPrintReportController

在我有一个名为.PrintReportControllergetPrintReport

如何在?SubmitPerformanceController


答案 1

您可以像这样访问控制器方法:

app('App\Http\Controllers\PrintReportController')->getPrintReport();

这将起作用,但在代码组织方面很糟糕(请记住为您的使用正确的命名空间PrintReportController)

您可以扩展 so 将继承该方法PrintReportControllerSubmitPerformanceController

class SubmitPerformanceController extends PrintReportController {
     // ....
}

但这也将继承来自 的所有其他方法。PrintReportController

最好的方法是创建一个(例如 in ),实现那里的逻辑,并告诉你的控制器使用它:traitapp/Traits

trait PrintReport {

    public function getPrintReport() {
        // .....
    }
}

告诉您的控制器使用此特征:

class PrintReportController extends Controller {
     use PrintReport;
}

class SubmitPerformanceController extends Controller {
     use PrintReport;
}

这两种解决方案都使方法具有,因此您可以从控制器内部或直接将其作为路由调用(如果您在SubmitPerformanceControllergetPrintReport$this->getPrintReport();routes.php)

您可以在此处阅读有关特征的更多信息。


答案 2

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

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


推荐