为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

我有两个控制器SubmitPerformanceController和PrintReportController。在PrintReportController我有一个称为的方法getPrintReport。如何访问此方法SubmitPerformanceController?
查看完整描述

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)


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


查看完整回答
反对 回复 2019-11-25
?
慕的地8271018

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

  }

}

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


查看完整回答
反对 回复 2019-11-25
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

不建议从另一个控制器调用一个控制器,但是,如果由于某种原因必须这样做,则可以执行以下操作:


Laravel 5兼容方法


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

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


最好改为调用Route并让它调用控制器。


return \Redirect::route('route-name-here');


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 672 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信