Каков правильный порядок проверки формы и получения входных значений? - PullRequest
0 голосов
/ 12 февраля 2019

Интересно, нужно ли мне проверять форму перед получением входных значений или наоборот?

Обычно я сначала проверяю, так как не вижу смысла пытаться получить доступ к входным значениям, которые могут быть недопустимыми.Однако коллега недавно посмотрел на мой код и нашел его странным.Есть ли правильный порядок для этих шагов?

public function createGroups(Request $request)
{
    $this->validate($request, [
        'courses' => 'required_without:sections',
        'sections' => 'required_without:courses',
        'group_set_name' => 'required',
        'group_number' => 'required|integer|min:1'
    ]);

    $courses = $request->input('courses');
    $sections = $request->input('sections');
    $group_set_name = $request->input('group_set_name');
    $group_number = $request->input('group_number');

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Я полностью согласен с ответом @ 1000Nettles , чтобы немного подробнее рассказать о его / ее ответе (который должен быть принятым): нет необходимости продолжать свою бизнес-логику, когдаданные не соответствуют вашим спецификациям.Допустим, вы ожидали строку длиной N символов, потому что вы определили свою базу данных с этим ограничением (чтобы оптимизировать дизайн базы данных), попытаетесь ли вы сохранить ее, даже если она сгенерирует исключение?Не совсем.

Кроме того, у Laravel есть особый способ извлечения классов проверки: Запрос формы .Это вводится в контроллеры.Когда вызов достигает контроллера, это означает, что уже прошел проверку, если нет, то будет возвращена ошибка 422.

0 голосов
/ 12 февраля 2019

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

php artisan make:request GroupRequest

В app/Http/Requests/GroupRequest.php:

public function authorize()
{
    // return true;
    return request()->user()-isAdmin; // <-- example, but true if anyone can use this form
}

public function rules()
{
    return [
        'courses'        => ['required_without:sections'],
        'sections'       => ['required_without:courses'],
        'group_set_name' => ['required'],
        'group_number'   => ['required', 'integer', 'min:1'],
    ];
}

Самое приятное то, что вы даже можете манипулировать данными здесь (GroupRequest.php) после того, как они были проверены:

public function validated()
{
    $validated = $this->getValidatorInstance()->validate();

    // EXAMPLE: hash password here then just use new hashed password in controller
    $validated['password'] = Hash::make($validated['password']);

    return $validated;
}

В вашем контроллере:

public function createUser(UserRequest $request) // <- in your case 'GroupRequest'
{
    $validated = $request->validated(); // <-- already passed validation

    $new_user = User::create($validated); // <-- password already hashed in $validated

    return view('dashboard.users.show')->with(compact('user'));
}

В вашем случае, если вы используете мой GroupRequest блок выше, вы можете вернуться к просмотру в 1 строке кода:

public function createGroups(GroupRequest $request)
{
    return view('example.groups.show')->with($request->validated()); // <-- already an array
}

Inвы просматриваете файл, затем вы можете использовать свои переменные, такие как {{ $group_set_name }} и {{ $group_number }}

0 голосов
/ 12 февраля 2019

Позиционирование проверки логики вашего контроллера в начале метода - это , вероятно, способ пойти сюда, поскольку у вас определены required параметры.Если вы получаете данные, которые не полностью соответствуют требованиям, вы выдаете ошибку проверки пользователю.Это соответствует продуктивному подходу «Fail Fast»: https://en.wikipedia.org/wiki/Fail-fast

Также важно, чтобы вы не использовали данные, которые не прошли строгие требования от проверки.Данные, которые не проходят проверку, больше не должны быть доверенными.Если нет какой-то другой причины, вам нужно, скажем, регистрировать любые входящие данные из внешнего интерфейса, порядок здесь выглядит хорошо для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...