Проверка правил проверки FormRequest перед авторизацией в Laravel - PullRequest
1 голос
/ 11 марта 2019

Я реализую 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 (), но это выглядит несколько странно.

Есть ли лучший способ сначала проверить правила валидации, а только потом переходить к части авторизации?

Заранее спасибо!

1 Ответ

0 голосов
/ 25 апреля 2019

Этот подход несколько отличается от того, что вы пытаетесь, но он может достичь желаемого для вас результата.

Если вы пытаетесь проверить, принадлежит ли данный идентификатор утки пользователю, это может бытьвыполняется в самом правиле следующим образом:

"data.*.id" => "exists:ducks,id,user_id,".Auth::user()->id

Это правило спрашивает, существует ли в таблице уток запись, которая соответствует идентификатору и где user_id является текущим, зарегистрированным в user_id.

Если вы связываете его с существующими правилами (обязательно | string | min: 1), используя 'bail', тогда запрос не будет выполнен, если он сначала не передал три других правила:

"data.*.id" => "bail|required|string|min:1|exists:ducks,id,user_id,".Auth::user()->id
...