Form validation

rule

model-form uses lavel's validation rules to validate data submitted by the form

$form->text('title')->rules('required|min:3');

// Complex validation rules can be implemented inside callbacks
$form->text('title')->rules(function (Form $form) {

    // Add field unique validation if not edit status
    if (!$id = $form->model()->id) {
        return 'unique:users,email_address';
    }

});

Custom error messages can also be given for validation rules:

$form->text('code')->rules('required|regex:/^\d+$/|min:10', [
    'regex' => 'The code must be all numeric',
    'min'   => 'Code cannot be less than 10 characters',
]);

If you want to allow the field to be empty, first set the field to NULL in the database table, then

$form->text('title')->rules('nullable');

See Validation for more rules.

creationRules

This method is exactly the same as Form\Field::rule, except that it only works when data is added.

{tip} If the creationRules method is called, the validation rules set by the rule method will be ignored.

updateRules

This method is exactly the same as Form\Field::rule, except that it only works when you update the data.

{tip} If the updateRules method is called, the validation rules set by the rule method will be ignored.

responseValidationMessages

A custom validation error message can be returned via the Form::responseValidationMessages method, as follows:

// "PUT" method for editing submissions
if (request()->getMethod() == 'PUT') {
    if (...) { // Your validation logic
        $form->responseValidationMessages('title', 'Wrong title format');

        // If there are multiple error messages, the second parameter can be passed as an array.
        $form->responseValidationMessages('content', ['content format error', 'content cannot be empty']);
    }
}

$form->text('title');
$form->text('content');

$form->submitted(function ($form) {
    if (...) { 
        $form->responseValidationMessages('title', '...');
    }
});

Front-end verification

The system inherits bootstrap-validator for front-end form validation and supports validation of H5 form types.

{tip} Browsers that don't support H5 can also use front-end validation, and the system has been made compatible. Most forms support both front-end and back-end validation, both can work at the same time without conflict, a few forms front-end validation is invalid.

H5 verification

required

mandatory fields

$form->text('title')->required();

number

Only numbers are allowed

$form->text('age')->type('number');

limits

// Only numbers in the range of 10-60 are allowed.
$form->text('age')
    ->type('number')
    ->attribute('min', 10)
    ->attribute('max', 60);

email

email address

$form->email('email');

url

links

$form->text('website')->type('url');

Other

minLength

Limit minimum character length

$form->text('title')->minLength(20);

// Setting error messages
$form->text('title')->minLength(20, 'Minimum of 20 characters');

maxLength

Limit the maximum length of characters

$form->text('title')->maxLength(50);

// Setting error messages
$form->text('title')->maxLength(50, 'No more than 50 characters.');

same

Limits the value of the current field to be equal to the value of the given field.

$form->password('password');

$form->password('password_confirm')->same('password');

// Setting error messages
$form->password('password_confirm')->same('password', 'Two inconsistent password entries');

Custom

Developers can customize front-end validation rules in the following ways

Add the following code to app/Admin/bootstrap.php.

use Dcat\Admin\Form\Field;

Field\Text::macro('len', function (int $length, ?string $error = null) {
    // Extensions to the front-end verification logic
    Admin::script(
                <<<'JS'
Dcat.validator.extend('len', function ($el) {
    return $el.val().length != $el.attr('data-len');
});
JS
        );

        // Also add back-end verification logic, depending on the need
        $this->rules('size:'.$length);

        return $this->attribute([
            'data-len'       => $length,
            'data-len-error' => str_replace(
                [':attribute', ':len'],
                [$this->label, $length],
                $error ?: "Only :len characters can be entered."
            ),
        ]);
});

use

$form->text('name')->len(10);