我想提交一个表单,然后按下提交按钮,然后运行一些代码。 在这段“代码”中,其工作的一部分将是创建一个学生,并创建一个午餐订单。 (信息从表单中提取)。
根据我一直在阅读的内容,我的目标应该是使用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;
}
答案 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
文件是因为我不喜欢“笨重”的控制器。另外,我不太确定您要在这里完成什么,但是根据创建午餐订单的相同请求创建学生似乎就像在自找麻烦