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.');
    }
}

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

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

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

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

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


person Robo Robok    schedule 30.07.2015    source источник
comment
То, что ответ вам не подходит, не означает, что вам нужно его понизить. Во всяком случае, отрицательный ответ на ваш вопрос тоже. Удачи   -  person Parthapratim Neog    schedule 31.07.2015
comment
Я проголосовал против, потому что ваш код просто плохой и намного хуже того, что у меня уже есть.   -  person Robo Robok    schedule 31.07.2015
comment
Кстати, отрицать хороший вопрос из-за батхёрта действительно жалко.   -  person Robo Robok    schedule 31.07.2015
comment
Мы считаем хороший вопрос по количеству положительных голосов, а не по количеству отрицательных...   -  person Parthapratim Neog    schedule 31.07.2015


Ответы (2)


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

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

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

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

Laravel Validator — мощный инструмент. Подробнее о нем можно прочитать здесь: http://laravel.com/docs/5.1/validation

person jedrzej.kurylo    schedule 30.07.2015
comment
Тому, кто отрицает ответ, я хотел бы узнать, почему это решение не подходит :) - person jedrzej.kurylo; 31.07.2015
comment
Парень, задающий вопрос, — это тот, кто голосует против ответов. я тоже минусую его вопрос - person Parthapratim Neog; 31.07.2015

Я думаю, что 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");
    }
}

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

person Parthapratim Neog    schedule 31.07.2015