Laravel:如何在控制器的几种方法中重用代码段

时间:2018-08-29 17:30:41

标签: php laravel methods controller

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

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

因此,假设在我的控制器中create()方法中,我像这样调用该信息:

MyController.php

create()方法:

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()方法或其他方法?

3 个答案:

答案 0 :(得分:3)

您可以将它们放在类中的单独方法中,该方法仅将数据作为数组返回,然后从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());

答案 1 :(得分:1)

您可以创建一种方法来单独处理该零件,例如:

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

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

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

答案 2 :(得分:0)

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

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

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

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