【问题标题】:Laravel Calling Multiple Controllers from Form SubmitLaravel 从表单提交调用多个控制器
【发布时间】:2021-01-30 22:03:12
【问题描述】:

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

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

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

如果我以“糟糕”的方式执行此操作,则表单将具有 [action="/students" method=POST]。然后在那个路由中,它会调用 /lunchorder/ POST,然后返回一个页面(redirect('students'))。

但是,如上所述,我不想从控制器调用控制器。因此,最初的 [action="/students" method=POST] 应该是别的东西,然后这个新实体将调用 StudentController,然后调用 LunchOrderController,然后再重定向('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;  

    }

【问题讨论】:

  • 据我所知,您不能将 2 个控制器设置为一个路由。您可以使用观察者进行此操作。或者,您可以为 luncorder 函数创建一个特征,并从学生控制器和午餐订单控制器调用该特征函数。或者你可以创建事件/监听器。
  • 能不能发个小代码
  • 您应该立即在 lunchController 上执行此操作,因为您应该可以控制您的模型以及它们的创建方式,请这样想:如果您的学生将创建并且由于某种原因您的午餐创建没有t 成功完成,您应该能够恢复创建的学生。
  • 我添加了一些代码作为我的目标示例。据我了解,我想让控制器坐在对 SQL 表所做的任何更改之间。我也不想在一个控制器中创建两组不同的数据。可能存在一个单独创建学生的实例,可能是由管理员创建的,我只想创建一个学生记录。

标签: laravel controller


【解决方案1】:

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

app/Logic/StudentLogic.php

学生逻辑

<?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');

}

假设

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

我将其拆分为Logic 文件的原因是因为我不喜欢“重型”控制器。另外,我不完全确定您要在这里完成什么,但是根据您创建LunchOrder 的相同请求创建学生似乎是在自找麻烦

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 2020-06-21
    • 2020-03-05
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多