Laravel 5.1: Обработка пропущенных полей в RESTful API

В моем приложении Laravel 5.1 у меня есть контроллер, который служит RESTful API. Многие методы этого контроллера имеют следующий фрагмент кода:

foreach (['email', 'password', 'firstName', 'lastName'] as $parameter) {
if (!$this->request->has($parameter)) {
throw new InputException(400, $parameter, 'Missing ' . $parameter . ' parameter.');
}
}

Я знаю, что не самая лучшая идея повторять один и тот же кусок кода (с различным содержимым массива). Вместо этого я ищу какой-то элегантный способ добиться того же.

Я думал о промежуточном программном обеспечении с параметрами, что-то вроде этого в routs.php:

'middleware' => 'parameters:email,password,firstName,lastName'

В настоящее время я использую неявные контроллеры, поэтому мои методы не упоминаются в routes.php файл.

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

0

Решение

Валидатор Ларавела это то, что вам нужно.

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

 $this->validate($this->request, [
'email' => 'required|email',
'password' => 'required',
'firstname' => 'required',
'lastname' => 'required',
]);

Это подтвердит входящий запрос и выбросит HttpResponseException если правила проверки не соблюдены.

Laravel’s Validator — это мощный инструмент, о котором вы можете прочитать здесь: http://laravel.com/docs/5.1/validation

1

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

Я думаю, что Middleware будет лучшим вариантом. Промежуточное программное обеспечение удивительно.
Просто создайте промежуточное ПО, используя php artisan make:middleware SomeMiddlewareName

и поместите этот код в функцию дескриптора

public function handle($request, Closure $next)
{

$data = array(
'email' => $request->input('email'),
'password' => $request->input('password'),
'firstname' => $request->input('firstname'),
'lastname' => $request->input('lastname'),
);

//Delete array fields that Have null or empty values
$data = array_filter($data);

if (sizeof($data) == 4) {
//Send the user to the required controller
return $next($request);
} else {
//Else, throw whatever error you want to throw
throw new InputException("Enter all required parameters");
}
}

Я думаю, что это будет работать для вас.

0

По вопросам рекламы [email protected]