Как избежать дублирования в правилах проверки Laravel - PullRequest
0 голосов
/ 10 июня 2019

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Вы можете попробовать использовать валидацию laravel Документация laravel

Это действительно легко использовать и поддерживать, просто следуйте этим шагам:

Запустите команду artisan: php artisan make:request StoreYourModelName, котораясоздаст файл в App/Http/Requests

в функции авторизации, установите для него значение:

public function authorize()
{
   return true;
}

, затем запишите свою логику проверки в функции правил:

public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

Пользовательские сообщения об ошибках, добавьте это ниже вашей функции правил:

public function messages()
{
    return [
        'title.required' => 'A title is required',
        'body.required'  => 'A message is required',
    ];
}

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

public function create(Request $request, StoreYourModelName $storeYourModelName)
{
  //
}

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

0 голосов
/ 10 июня 2019

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

trait HasRules
{
    public static function getValidationRules(): array
    {
        if (! property_exists(static::class, 'rules')) {
            return [];
        }

        if (func_num_args() === 0) {
            return static::$rules;
        }

        if (func_num_args() === 1 && is_string(func_get_arg(0))) {
            return array_get(static::$rules, func_get_arg(0), []);
        }

        $attributes = func_num_args() === 1 && is_array(func_get_arg(0))
            ? func_get_arg(0)
            : func_get_args();

        return array_only(static::$rules, $attributes);
    }
}

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

class User extends Model
{
    use HasRules;

    public static $rules = [
        'name' => ['required'],
        'age' => ['min:16']
    ];

    ...
}

Затем в вашей валидации (например, в вашем FormRequest * * * * * * * или в ваших контроллерах при подготовке массива правил) вы можете вызвать это getValidationRules() различными способами:

 $allRules = User::getValidationRules(); // if called with no parameters all rules will be returned.

 $onlySomeRules = [
     'controller_specific_field' => ['required'],
     'name' => User::getValidationRules('name'); // if called with one string parameter only rules for that attribute will be returned.
 ];

 $multipleSomeRules = User::getValidationRules('name', 'age'); // will return array of rules for specified attributes.

 // You can also call it with array as first parameter:
 $multipleSomeRules2 = User::getValidationRules(['name', 'age']);

Не бойтесь написать какой-нибудь код для генерации определенных правил вашего пользовательского контроллера.Используйте array_merge и другие помощники, реализуйте свои собственные (например, помощник, который добавляет значение 'required' в массив, если его там нет, или удаляет его и т. Д.).Я настоятельно рекомендую вам использовать FormRequest классы для инкапсуляции этой логики.

...