Laravel从表单提交中调用多个控制器

时间:2020-10-16 11:22:42

标签: laravel controller

我想提交一个表单,然后按下提交按钮,然后运行一些代码。 在这段“代码”中,其工作的一部分将是创建一个学生,并创建一个午餐订单。 (信息从表单中提取)。

根据我一直在阅读的内容,我的目标应该是使用CRUD,这意味着我应该有一个学生控制器和一个LunchOrderController。

我想在每个控制器中调用@store方法。

如果我以“不良”方式进行操作,则表单将具有[action =“ / students” method = POST]。然后在该路由中,它将调用/ lunchorder / POST,然后返回到页面(redirect('students'))。

但是,如上所述,我不想从控制器中调用控制器。因此,最初的[action =“ / students” method = POST]应该是其他名称,然后这个新实体将调用StudentController,然后调用LunchOrderController,然后redirect('students')。

但是,我不知道这个新实体是什么,应该是什么,或者如何链接到它。

这只是通向新控制器的新路线,可以从中调用其他控制器吗? 还是我应该将表单数据发送到其他地方(也许是模型?),让他们调用控制器?还是我离开基地需要采取一些措施?

我对Laravel还是陌生的,但是我想尽可能多地使用最佳实践。我对其他帖子的所有阅读似乎都不足以解释它,以至于使我无法理解其含义。

编辑:一些代码可以让我大致了解。

Student_edit.blade.php

  <form action="/student" method="POST">
    {{ csrf_field() }}

    <label>First Name</label><input name="firstname"  value="">
    <label>Last Name</label><input name="lastname"  value="">
    <label>Lunch Order</label>
    <select name="lunch_value" id="">
        <option value="1" >Meat Pie</option>
        <option value="2" >Sandwich</option>
        <option value="3" >Salad</option>
        <option value="4" >Pizza</option>
    </select>


    <input type="submit" value="Submit" class="btn btn-primary btn-lg">
</form>

web.php

Route::resource('/students', 'StudentController');
Route::resource('/lunchorder', 'LunchOrderController');

学生控制器

public function store(Request $request)
{
    Student::create(request(['firstname', 'lastname']));

    LunchOrderController::store($request, $student_id); //<- This isn't the correct syntax

    return redirect('/students');  

}

LunchOrderController

public function store(Request $request, $student_id)
    {

        LunchOrder::create(array_merge(request(['lunch_value']), ['student_id' => $student_id]));

        return null;  

    }

1 个答案:

答案 0 :(得分:0)

我个人将创建一个“逻辑”目录,例如:app / Logic。有些人喜欢存储库等,但这是我的偏爱。 根据您的特定要求,我将创建以下文件:

app / Logic / StudentLogic.php

StudentLogic

<?php

namespace App\Logic\StudentLogic;

use App\Student;
use App\LunchOrder;

class StudentLogic
{
    public function handleStudentLunch(Request $request): bool
    {
        $student = Student::create(request(['firstname', 'lastname']));

        if(is_null($student)) {
            return false;
        }
        
        LunchOrder::create(array_merge(request(['lunch_value']), ['student_id' => $student->id]));

        return true;
    }
}

StudentController

public function store(Request $request)
{
    $logic = new StudentLogic();

    $valid = $logic->handleStudentLunch($request);
    if($valid) {
        return redirect('/students');  
    }
    abort(404, 'Student Not Found');

}

假设

学生存储在App / LunchOrder下,学生和LunchOrder存储在App \ LunchOrder下 您还需要在StudentController中use App\Logic\StudentLogic

之所以将其拆分为Logic文件是因为我不喜欢“笨重”的控制器。另外,我不太确定您要在这里完成什么,但是根据创建午餐订单的相同请求创建学生似乎就像在自找麻烦