【问题标题】:Laravel: How to reuse pieces of code in several methods of a controllerLaravel:如何在控制器的几种方法中重用代码片段
【发布时间】:2019-02-04 13:59:03
【问题描述】:

我正在构建一个表单以创建和编辑记录。

由于我使用了多个目录中的大量关系信息(表)并在 for 中显示为选择框 (Select2),因此我需要检索所有要在这些 HTML 选择标签中显示的数据。

所以,假设在我的控制器中的 create() 方法中,我这样称呼该信息:

create()MyController.php的方法:

public function create(Token $token){
    //Tags
    $universities      = University::orderBy('name')->get();
    $countries         = Country::orderBy('name')->get();
    $programs      = Program::orderBy('name')->get();
    //... and many more

    return view('my.form.create',[
        'universities' =>  $universities,
        'countries'    =>  $countries,
        'programs'     =>  $programs,
        'token'        =>  $token
    ]);
}

如何重用那段代码//Tags

//Tags
$universities      = University::orderBy('name')->get();
$countries         = Country::orderBy('name')->get();
$programs      = Program::orderBy('name')->get();
//... and many more

为了将它重用于edit() 方法或其他方法??

【问题讨论】:

    标签: php laravel methods controller


    【解决方案1】:

    您可以创建一个方法来单独处理该部分,例如:

    /**
     * Tags from universities.
     * 
     * @return \Illuminate\Database\Eloquent\Collection
     */
    protected function getUniversities() {
        return University::orderBy('name')->get();
    }
    

    然后你可以在类的其他方法中使用它,只需执行$universities = $this->getUniversities()

    getUniversities() 方法也可以存在于父类中。

    【讨论】:

      【解决方案2】:

      您可以将它们放在类中的单独方法中,该方法仅将数据作为数组返回,然后从您的 createedit 方法中调用该方法:

      protected function getFormData()
      {
          return [
              'universities' => University::orderBy('name')->get(),
              'countries'    => Country::orderBy('name')->get(),
              'programs'     => Program::orderBy('name')->get(),
          ];
      }
      

      那么您的 createedit 方法将类似于:

      public function create(Token $token)
      {
          $data = $this->getFormData();
      
          return view('my.form.create', $data);
      }
      
      public function edit(Token $token)
      {
          $data = $this->getFormData();
      
          return view('my.form.edit', $data);
      }
      

      如果您不打算向数据数组添加任何内容,那么您可以简单地内联调用:

      return view('my.form.edit', $this->getFormData());
      

      【讨论】:

      • 多亏了这种方法,我什至可以将 getFormData() 方法扩展到一个特征!!!
      • @Pathros 我只建议将它变成一个特征,如果你也打算在其他控制器中使用它。很高兴我能帮上忙!
      【解决方案3】:

      如果您要在控制器的主要部分重用代码,我会说使用控制器的构造函数

      function __construct()
      {
          $this->universities      = University::orderBy('name')->get();
          $this->countries         = Country::orderBy('name')->get();
          $this->programs      = Program::orderBy('name')->get();   
      }
      

      这将加载您在每个控制器方法中声明的所有值。

      如果不是,您可以在您的应用文件夹中创建一个帮助程序,返回您需要的值。

      【讨论】:

      • 还可以查看文档laravel.com/docs/5.6/container#resolving中的自动注入示例
      • 我不建议在控制器的构造函数中执行数据库查询或其他 I/O。如果您有不使用该数据的操作,他们将无缘无故地花时间加载该数据
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2017-06-16
      • 2020-09-04
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多