Я реализую API в Laravel, используя спецификацию JSON: API.
В нем у меня есть ресурс, назовем его Ponds, со связями «многие ко многим» с другим ресурсом, назовем его «Утки».
Согласно JSON: спецификации API, чтобы удалить такую связь, я должен использовать DELETE / ponds / {id} / relations / ducks конечная точка, с запросом следующего тела:
{
"data": [
{ "type": "ducks", "id": "123" },
{ "type": "ducks", "id": "987" }
]
}
Это обрабатывается PondRemoveDucksRequest, который выглядит следующим образом:
<?php
...
class PondRemoveDucksRequest extends FormRequest
{
public function authorize()
{
return $this->allDucksAreRemovableByUser();
}
public function rules()
{
return [
"data.*.type" => "required|in:ducks",
"data.*.id" => "required|string|min:1"
];
}
protected function allDucksAreRemovableByUser(): bool
{
// Here goes the somewhat complex logic determining if the user is authorized
// to remove each and every relationship passed in the data array.
}
}
Проблема в том, что если я отправлю такое тело, как:
{
"data": [
{ "type": "ducks", "id": "123" },
{ "type": "ducks" }
]
}
, я получаю 500, потому что сначала запускается проверка авторизации, и она зависит от наличия идентификаторов в каждом элементе массива. В идеале я хотел бы получить ошибку 422 со стандартным сообщением из проверки правил.
Быстрое исправление, которое я вижу, заключается в добавлении проверки наличия идентификатора в метод allDucksAreRemovableByUser (), но это выглядит несколько странно.
Есть ли лучший способ сначала проверить правила валидации, а только потом переходить к части авторизации?
Заранее спасибо!