3 回答
TA贡献1851条经验 获得超4个赞
您可以这样访问控制器方法:
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)
您可以在这里阅读更多有关特征的信息。
TA贡献1796条经验 获得超4个赞
如果您需要在另一个控制器中使用该方法,则意味着您需要对其进行抽象并使其可重用。将该实现移到服务类(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
}
}
对需要该实现的其他控制器执行相同的操作。从其他控制器获取控制器方法是一种代码味道。
TA贡献1900条经验 获得超5个赞
不建议从另一个控制器调用一个控制器,但是,如果由于某种原因必须这样做,则可以执行以下操作:
Laravel 5兼容方法
return \App::call('bla\bla\ControllerName@functionName');
注意:这不会更新页面的URL。
最好改为调用Route并让它调用控制器。
return \Redirect::route('route-name-here');
添加回答
举报