В моем приложении 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
файл.
Какой самый гибкий и элегантный способ реализовать эту функциональность, не повторяя себя?
Валидатор Ларавела это то, что вам нужно.
Если у вас есть класс контроллера, вы можете просто добавить следующее в метод действия:
$this->validate($this->request, [
'email' => 'required|email',
'password' => 'required',
'firstname' => 'required',
'lastname' => 'required',
]);
Это подтвердит входящий запрос и выбросит HttpResponseException если правила проверки не соблюдены.
Laravel’s Validator — это мощный инструмент, о котором вы можете прочитать здесь: http://laravel.com/docs/5.1/validation
Я думаю, что 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");
}
}
Я думаю, что это будет работать для вас.