php - Laravel 中如何分离 Controller 方法?

标签 php laravel api

我从 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/

相关文章:

php - 用于测验的 MySql 数据库设计

javascript - 如何获取 iframe 父页面的 referrer 来源?

laravel - 请求过时版本的 PayPal。与 laravel 集成

php - Dropbox API 限制

api - LinkedIn API - 获取有关我所有连接的信息

php - 在 Phalcon Response 中设置二进制数据

php - 根据 'closest' 匹配 'earlier' 行替换当前行中的 NULL 值。 (基于日期的表格)

php - Laravel 5.2 Eloquent create() 方法显示外键异常但 save() 不显示任何错误

php - 如何在 laravel 的布局中将数据传递到我的标题?

javascript - 在需要时加载谷歌地图 api 脚本? jquery.getScript()?