Промежуточное программное обеспечение Laravel Слишком мало аргументов для ошибки функционирования

#php #laravel

Вопрос:

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

 Too few arguments to function AppHttpMiddlewareAdminUserUpdate::handle(), 2 passed in /var/www/market/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php on line 167 and exactly 3 expected
 

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

Промежуточный слой:

 
public function handle(Request $request, Closure $next, $id)
    {
        if($request->input('username') == NULL) {
            return redirect()->route('admin.members.view', $id)->with('error', 'You must enter a username for this user in order to update their account!');
        } elseif($request->input('email') == NULL) {
            return redirect()->route('admin.members.view', $id)->with('error', 'You must enter a email for this user in order to update their account!');
        } elseif($request->input('admin') == NULL) {
            return redirect()->route('admin.members.view', $id)->with('error', 'You must select whether this user is a root admin or not in order to update their account!');
        } elseif($request->input('banned') == NULL) {
            return redirect()->route('admin.members.view', $id)->with('error', 'You must select whether this user is banned or not in order to update their account!');
        } elseif($request->input('role') == NULL) {
            return redirect()->route('admin.members.view', $id)->with('error', 'You must select a role for this user in order to update their account!');
        }

        return $next($request);
    }
 

Ядро:

 'AdminUserUpdate' => AppHttpMiddlewareAdminUserUpdate::class,
 

Маршрут:

 Route::middleware(['AdminUserUpdate'])->group(function () {
        Route::post('/app/members/{id}/submit', 'AppHttpControllersAdminMembersIndexController@Submit')->name('admin.members.submit'); 
    });
 

Мне передали идентификатор, чтобы я мог вернуть их обратно на страницу просмотра для определенного идентификатора пользователя, но по какой-то причине это не нравится. У кого-нибудь есть какие-нибудь мысли?

Ответ №1:

Промежуточные программы не считывают параметры маршрута. Используйте двоеточие для передачи параметра в промежуточное программное обеспечение.

 Route::middleware(['AdminUserUpdate:123'])->group(function () {
 

Ссылка на документы о параметрах промежуточного программного обеспечения

Комментарии:

1. Как именно это будет работать с моей страницей просмотра для каждого идентификатора пользователя?

2. Вместо использования промежуточного программного обеспечения добавьте проверку/перенаправление в начале метода контроллера.

3. Да, это то, что я обычно делаю, но хотел, чтобы функция контроллера была короткой и чистой — думаю, это не вариант с тем, как я пытаюсь это сделать. Спасибо за помощь!

Ответ №2:

Я предлагаю изменить способ проверки ваших полей.

В вашем случае эта команда создаст файл средства проверки формы

 php artisan make:request UpdateUserRequest
 

В файле UpdateUserRequest.php

В этом блоке есть все правила, которые вы хотите проверить

 public function rules()
{
    return [
        'username' => 'required',
        'email' => 'required',
        ... other fields for validation ...
    ];
}
 

и внутри store метода в вашем контроллере требуется только эта строка для обработки всех данных после проверки:

$validated = $request->validated();

а для пользовательских сообщений добавьте это в свой UpdateUserRequest :

 public function messages()
{
    return [
        'username.required' => 'You must enter a username for this user in order to update their account!',
        'email.required' => 'You must enter a email for this user in order to update their account!',
        ... and other validation messages ...
    ];
}
 

Для получения более подробной информации и способов проверки ваших форм перейдите по ссылке:

Проверка запроса Формы