Я знаю, это сложный случай, но, возможно, кто-то из вас знает, как это сделать.
Концепция
В моем API есть следующий процесс:
- Process query string parameters (
FormRequest
)- Replace key aliases by preferred keys
- Сопоставьте строковые параметры с массивами, если массив не ожидается
- Установить значения по умолчанию (включая
Auth::user()
для параметров на основеid
) - и Т. Д.
- Check if the user is allowed to do the request (
Middleware
)- Using processed (validated and sanitized) query params → otherwise I had to do exceptions for every possible alias and mapping as well as checking if the paramter is checked and that doesn't seem reasonable to me.
Проблема
Тем не менее, если вы просто назначаете промежуточное программное обеспечение через ->middleware('middlewareName')
маршруту, а FormRequest через внедрение зависимостей в метод контроллера, сначала вызывается промежуточное программное обеспечение, а затем - FormRequest. Как описано выше, мне это не нужно.
Подход к решению
Сначала я попробовал внедрение зависимостей в промежуточном программном обеспечении, но это не сработало.
Мое решение заключалось в назначении промежуточного программного обеспечения в конструкторе контроллера. Здесь работает внедрение зависимостей, но внезапно Auth::user()
возвращает null
.
Затем я наткнулся на метод FormRequest::createFrom($request)
в \Illuminate\Foundation\Providers\FormRequestServiceProvider.php:34
и возможность передать объект $request
методу handle()
промежуточного программного обеспечения. Результат выглядит так:
public function __construct(Request $request)
{
$middleware = new MyMiddleware();
$request = MyRequest::createFrom($request);
$middleware->handle($request, function() {})
}
Но сейчас запрос еще не подтвержден. Просто вызов $request->validated()
ничего не возвращает. Итак, я копнул немного глубже и обнаружил, что $resolved->validateResolved();
выполняется в \Illuminate\Foundation\Providers\FormRequestServiceProvider.php:30
, но это, похоже, не запускает проверку, поскольку выдает исключение, в котором говорится, что этот метод не может быть вызван на null
, но $ request не null
:
Вызов функции-члена validated () при нулевом значении
Теперь я в полном тупике. Кто-нибудь знает, как это решить или я просто не так делаю?
Заранее спасибо!
user_id
может быть целым числом или массивом целых чисел, кроме того,user_id
также можно передавать какuser.id
. Было бы неприятно, если бы одна и та же логика выполнялась как в промежуточном программном обеспечении, так и в FormRequest. Итак, я собираюсь изучить политику. Может они решат мою проблему. Спасибо! - person shaedrich   schedule 19.03.2021Gate
. Агрегированные данные поступают из нескольких моделей, поэтому мне придется проверять их все по отдельности. Поскольку это не простое действие CRUD, мне оно кажется немного громоздким. Думаю,Gate
- это то, что я собираюсь попробовать, и, вероятно, это сработает лучше всего в моем случае. Спасибо за подсказки! - person shaedrich   schedule 22.03.2021FormRequest
, но я считаю, что это не предназначено для выполненияFormRequest
из-за разделения ответственности. Когда я закончу с изменениями, я отправлю результат в качестве ответа. - person shaedrich   schedule 22.03.2021