Merging
The following classes support merging via the merge() method:
The merge() method
The signature of the merge method looks as follows:
php
use LaraPkgs\Validation\Contracts\ProvidesValidatableCollection;
use LaraPkgs\Validation\ValidatableCollection;
public function merge(ValidatableCollection|ProvidesValidatableCollection ...$mergeables): selfValidatable classes implement the ProvidesValidatableCollection contract out of the box, meaning both raw collections and domain objects can be passed directly to merge().
Immutability
Calling the merge() method always returns a new instance of the class it is called on.
Example
The UserValidation class:
php
<?php
declare(strict_types=1);
namespace App\Validation;
final class UserValidation extends BaseValidatable
{
protected function makeValidatableCollection(): ValidatableCollection
{
return Validatable::collection(
Validatable::item('name')->required()->string(),
Validatable::item('email')->required()->email(),
);
}
}The AddressValidation class:
php
<?php
declare(strict_types=1);
namespace App\Validation;
final class AddressValidation extends BaseValidatable
{
protected function makeValidatableCollection(): ValidatableCollection
{
return Validatable::collection(
Validatable::item('street')->required()->string(),
Validatable::item('city')->required()->string(),
);
}
}The client code:
php
<?php
declare(strict_types=1);
use App\Validation\UserValidation;
use App\Validation\AddressValidation;
$userValidation = new UserValidation();
$addressValidation = new AddressValidation();
$merged = $userValidation->merge($addressValidation);
$data = [
'name' => 'John Doe',
'email' => 'j.doe@unknown.com',
'street' => 'some street',
'city' => 'somewhere'
];
$validated = $merged->validate($data);
// [
// 'name' => 'John Doe',
// 'email' => 'j.doe@unknown.com',
// 'street' => 'some street',
// 'city' => 'somewhere'
// ]Prefixing
Merging is extra powerful when used together with prefixing. More information about prefixing can be found here.