来自Laravel 5中另一个控制器的访问控制器方法
2022-08-30 06:17:28
我有两个控制器和.SubmitPerformanceController
PrintReportController
在我有一个名为.PrintReportController
getPrintReport
如何在?SubmitPerformanceController
我有两个控制器和.SubmitPerformanceController
PrintReportController
在我有一个名为.PrintReportController
getPrintReport
如何在?SubmitPerformanceController
您可以像这样访问控制器方法:
app('App\Http\Controllers\PrintReportController')->getPrintReport();
这将起作用,但在代码组织方面很糟糕(请记住为您的使用正确的命名空间PrintReportController
)
您可以扩展 so 将继承该方法PrintReportController
SubmitPerformanceController
class SubmitPerformanceController extends PrintReportController {
// ....
}
但这也将继承来自 的所有其他方法。PrintReportController
最好的方法是创建一个(例如 in ),实现那里的逻辑,并告诉你的控制器使用它: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
)
您可以在此处阅读有关特征的更多信息。
如果您在另一个控制器中需要该方法,这意味着您需要将其抽象化并使其可重用。将该实现移动到服务类(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
}
}
对需要该实现的其他控制器执行相同的操作。从其他控制器获取控制器方法是一种代码异味。