Как разделить метод контроллера в Laravel?

Я начинаю с Laravel, я пишу API. У меня есть метод в TestController, который проверяет, правильно ли студент вставил данные и имеет ли он доступ к решению экзамена. Я не думаю, что это хорошая идея иметь весь метод в контроллере, но я не знаю, как его разделить. Я думаю о политике, но у меня должно быть несколько моделей для одной политики, может быть, я могу попытаться поместить часть метода в 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.'];


}

2

Решение

Я бы посоветовал вам скорее передать первичные ключи выбранным $exam, $student а также $classroom моделирует ваш контроллер из формы и проверяет, существуют ли они в соответствующих таблицах, вместо того, чтобы проверять их наличие, используя несколько разных столбцов.

Если вы передадите первичные ключи, вы можете использовать «существует» правило проверки чтобы проверить, если они существуют. Например, в вашем классе AuthorizeStudentRequest у вас может быть следующая функция:

public function rules()
{
return [
'exam_id' => 'required|exists:exams',
'student_id' => 'required|exists:students',
'classroom_id' => 'required|exists:classrooms',
];
}

В противном случае, если вам действительно нужно использовать разные столбцы для проверки наличия экзамена, студента и аудитории, вы можете создать пользовательские правила проверки и использовать их в своем классе 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 ...
]
}

Чтобы проверить, есть ли у ученика доступ к классу или у класса есть доступ к экзамену, вы можете использовать полисы.

0

Другие решения

Ресурсы API предоставляют способ легко преобразовать наши модели в ответы JSON. Он действует как слой преобразования, который находится между нашими моделями Eloquent и ответами JSON, которые фактически возвращаются нашим API. Ресурсы API состоят из двух объектов: класса ресурсов и коллекции ресурсов. Класс ресурсов представляет собой отдельную модель, которую необходимо преобразовать в структуру JSON, в то время как коллекция ресурсов используется для преобразования коллекций моделей в структуру JSON.

И класс ресурса, и коллекция ресурса могут быть созданы с помощью команд ремесленника:

 // create a resource class
$ php artisan make:resource UserResource

// create a resource collection using either of the two commands
$ php artisan make:resource Users --collection
$ php artisan make:resource UserCollection

Прежде чем углубляться во все опции, доступные вам при написании ресурсов, давайте сначала рассмотрим, как ресурсы используются в Laravel. Класс ресурса представляет собой единую модель, которую необходимо преобразовать в структуру JSON. Например, вот простой класс ресурсов пользователя:

 public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}

Каждый класс ресурсов определяет метод toArray, который возвращает массив атрибутов, которые должны быть преобразованы в JSON при отправке ответа. Обратите внимание, что мы можем получить доступ к свойствам модели непосредственно из переменной $ this. Больше информации здесь

https://laravel.com/docs/5.7/eloquent-resources

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector