我从 Laravel 开始,我编写 API。我在 TestController 中有一个方法,可以检查学生是否正确插入了数据并可以访问考试解决方案。我认为将整个方法放在 Controller 中不是一个好主意,但我不知道如何将其分离。我考虑政治,但一项政策必须有多个模型,也许我可以尝试将部分方法放在 AuthorizeStudentRequest 上或以不同的方式尝试?当然,现在我随消息返回 200,但我必须返回 422 或其他有错误的代码,但由于我的问题,我没有这样做。
public function authorizeStudent(AuthorizeStudentRequest $request)
{
$hash = $request->input('hash');
$token = $request->input('token');
$exam = Exam::where([['hash', $hash], ['token', $token]])->first();
if($exam == null)
return ['message' => 'Exam does not exist.'];
$user = $exam->user_id;
$studentFirstname = $request->input('firstname');
$studentLastname = $request->input('lastname');
$student = Student::where([
['firstname', $studentFirstname],
['lastname', $studentLastname],
['user_id', $user]
])->first();
if($student == null)
return ['message' => 'Student does not exist.'];
$classroom = Classroom::where([
['name', $classroomName],
['user_id', $user]
])->first();
if($classroom == null)
return ['message' => 'Classroom does not exist.'];
if($student->classroom_id != $classroom->id)
return ['message' => 'Student is not in classroom.'];
if($exam->classrooms()->where(['classroom_id', $classroom->id], ['access', 1])->first() == null)
return ['message' => 'Class does not access to exam yet.'];
}
最佳答案
我建议您将所选 $exam
、$student
和 $classroom
模型的主键从形成并验证它们是否存在于相应的表中,而不必使用一堆不同的列来检查它们的存在。
如果您传递主键,则可以使用'exists' validation rule检查它们是否存在。例如,在您的 AuthorizeStudentRequest 类中,您可以具有以下函数:
public function rules()
{
return [
'exam_id' => 'required|exists:exams',
'student_id' => 'required|exists:students',
'classroom_id' => 'required|exists:classrooms',
];
}
否则,如果您确实需要使用不同的列来检查考试、学生和教室是否存在,您可以创建 custom validation rules并在您的 AuthorizeStudentRequest 类中使用它们。例如,创建一个自定义验证规则来检查考试是否存在,如下所示:
$php artisan make:rule ExamExists
class ExamExists implements Rule
{
private $token;
private $hash;
public function __construct($token, $hash)
{
$this->token = $token;
$this->hash = $hash;
}
public function passes($attribute, $value)
{
return Exam::where([['hash', $hash], ['token', $token]])->count() > 0;
}
}
然后您可以在请求中使用自定义验证规则,如下所示:
public function rules()
{
return [
'hash' => ['required', new ExamExists($this->hash, $this->token)],
... other validation rules ...
]
}
要检查学生是否有权进入教室或类(class)是否有权参加考试,您可以使用 policies 。
关于php - Laravel 中如何分离 Controller 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53846193/