Skip to content

Validatable Collection

The ValidatableCollection defines the validation logic for one or more items (e.g. attribute, field, property).

Instantiation

php
<?php

declare(strict_types=1);

use LaraPkgs\Validation\ValidatableBuilder;
use LaraPkgs\Validation\ValidatableCollection;

$validatable = ValidatableCollection::make(
    ValidatableBuilder::make('name')->required()->string()->max(255),
    ValidatableBuilder::make('email')->required()->string()->email(),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
);

The ValidatableCollection can also be instantiated using the Facade or helper function. See the Facades & Helpers section here.

Add items

php
<?php

declare(strict_types=1);

use LaraPkgs\Validation\ValidatableBuilder;
use LaraPkgs\Validation\ValidatableCollection;

$validatable = ValidatableCollection::make()->add(
    ValidatableBuilder::make('name')->required()->string()->max(255),
    ValidatableBuilder::make('email')->required()->string()->email(),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
);

Get items

To get a cloned instance of the underlying items collection use the getItems method.

php
<?php

declare(strict_types=1);

use LaraPkgs\Validation\ValidatableBuilder;
use LaraPkgs\Validation\ValidatableCollection;

$validatable = ValidatableCollection::make()->add(
    ValidatableBuilder::make('name')->required()->string()->max(255),
    ValidatableBuilder::make('email')->required()->string()->email(),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
);

$items = $validatable->getItems(); // Illuminate\Support\Collection

Immutability

The ValidatableCollection is 100% immutable so every mutation returns a new object. Items will be cloned before adding them. More information on item immutability can be found here.

Validation methods

validate(array $data)

Tries to validate the given data and throws an Illuminate\Validation\ValidationException when it fails and an array of validated data if it passes.

php
<?php

declare(strict_types=1);

use LaraPkgs\Validation\ValidatableBuilder;
use LaraPkgs\Validation\ValidatableCollection;

$validatable = ValidatableCollection::make(
    ValidatableBuilder::make('name')->required()->string()->max(255),
    ValidatableBuilder::make('email')->required()->string()->email(),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
);

$data = [];
$validated = $validatable->validate($data); // Throws Illuminate\Validation\ValidationException;

$data = [
    'name' => 'John Doe',
    'email' => 'j.doe@unknown.com',
    'password' => 'XXXXXXXX',
    'password_confirmation' => 'XXXXXXXX'
];

$validated = $validatable->validate($data);

// [
//     'name' => 'John Doe',
//     'email' => 'j.doe@unknown.com',
//     'password' => 'XXXXXXXX',
// ]

fails(array $data)

Indicates if the given data will fail validation.

php
<?php

declare(strict_types=1);

use LaraPkgs\Validation\ValidatableBuilder;
use LaraPkgs\Validation\ValidatableCollection;

$validatable = ValidatableCollection::make(
    ValidatableBuilder::make('name')->required()->string()->max(255),
    ValidatableBuilder::make('email')->required()->string()->email(),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
);

$data = [];
$fails = $validatable->fails($data); // true

$data = [
    'name' => 'John Doe',
    'email' => 'j.doe@unknown.com',
    'password' => 'XXXXXXXX',
    'password_confirmation' => 'XXXXXXXX'
];

$fails = $validatable->fails($data); // false

passes(array $data)

Indicates if the given data will pass validation.

php
<?php

declare(strict_types=1);

use LaraPkgs\Validation\ValidatableBuilder;
use LaraPkgs\Validation\ValidatableCollection;

$validatable = ValidatableCollection::make(
    ValidatableBuilder::make('name')->required()->string()->max(255),
    ValidatableBuilder::make('email')->required()->string()->email(),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
);

$data = [];
$passes = $validatable->passes($data); // false

$data = [
    'name' => 'John Doe',
    'email' => 'j.doe@unknown.com',
    'password' => 'XXXXXXXX',
    'password_confirmation' => 'XXXXXXXX'
];

$passes = $validatable->passes($data); // true

toValidatorArguments()

Returns an array of arguments (rules, messages and attributes) that can be used to instantiate a Laravel Validator.

php
<?php

declare(strict_types=1);

$validatable = ValidatableCollection::make(
    ValidatableBuilder::make('name')->required()->string()->max(255)
        ->setCustomAttribute('username'),
    ValidatableBuilder::make('email')->required()->string()->email()
        ->addMessages(['required' => 'We need your email address to set up your account.']),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
        ->addMessages(['confirmed' => 'The password confirmation does not match.'])
);

$arguments = $validatable->toValidatorArguments();

// [
//     'rules' => [
//         'name' => ['required', 'string', 'max:255'],
//         'email' => ['required', 'string', 'email'],
//         'password' => ['required', 'string', 'min:8', 'confirmed']
//     ],
//     'messages' => [
//         'email.required' => 'We need your email address to set up your account.',
//         'password.confirmed' => 'The password confirmation does not match.'
//     ],
//     'attributes' => [
//         'name' => 'username',
//         'email' => 'email',
//         'password' => 'password'
//     ]
// ]

makeValidator(array $data)

Instantiates a Laravel Validator for the given data.

php
<?php

declare(strict_types=1);

use LaraPkgs\Validation\ValidatableBuilder;
use LaraPkgs\Validation\ValidatableCollection;

$validatable = ValidatableCollection::make(
    ValidatableBuilder::make('name')->required()->string()->max(255),
    ValidatableBuilder::make('email')->required()->string()->email(),
    ValidatableBuilder::make('password')->required()->string()->min(8)->confirmed()
);

$data = [
    'name' => 'John Doe',
    'email' => 'j.doe@unknown.com',
    'password' => 'XXXXXXXX',
    'password_confirmation' => 'XXXXXXXX'
];

$validator = $validatable->makeValidator($data); // Illuminate\Contracts\Validation\Validator;

Advanced usage