Every two weeks I send out a newsletter containing lots of interesting stuff for the modern PHP developer. You can expect quick tips, links to interesting tutorials, opinions and packages. Want to learn the cool stuff? Then sign up now!

Validate (almost) anything in Laravel

Laravel ships with some good validation capabilties. Form request validation is a nice way to make sure http requests pass valid data. To validate stuff that enters the application in some other way validators can be created manually. Unfortunately this is kinda verbose:

$validator = Validator::make(['myDate' => '201502028'], ['myDate' => 'date']);

$isValidDate = $validator->passes();           

We can do better than that by defining our own helper function:

 * Validate some data.
 * @param string|array $fields
 * @param string|array $rules
 * @return bool
function validate($fields, $rules)
    if (! is_array($fields)) {
        $fields = ['default' => $fields];

    if (! is_array($rules)) {
        $rules = ['default' => $rules];

    return Validator::make($fields, $rules)->passes();

Take a look at this Stack Overflow question if you’re wondering where the function could be stored.

Once the function is loaded the validation from the previous example can be written like this:

validate('20150230', 'date'); //returns false   
validate('20150227', 'date'); //returns true            

Nice, ‘n’ easy! Because the function hooks into Laravel’s validator almost anything can be validated:

validate('[email protected]', 'email'); //returns true   
validate('', 'ip'); //returns true
Freek Van der Herten is a partner and developer at Spatie, an Antwerp based company that specializes in creating web apps with Laravel. After hours he writes about modern PHP and Laravel on this blog. When not coding he’s probably rehearsing with his kraut rock band. He loves waffles and butterflies.
  • Just wondering why
    return ! Validator::make($fields, $rules)->fails();

    Instead of
    return Validator::make($fields, $rules)->passes();

    • Believe it or not, I didn’t know the passes method. Updated the blogpost. Thanks!

  • Aden Fraser

    Hopefully this PR gets merged in for 5.2:

    While it’s not as elegant as:
    validate(‘[email protected]’, ’email’)

    The ability to:
    if (validator([’email’ => ‘[email protected]’], [’email’ => ‘required|email’])->passes()) {

    Is certainly helpful, regardless of where the validatiob rules and data is coming from.

  • When a dev on my team mistakenly converted a Carbon instance into an array before running validation, I discovered some unexpected behaviour from this helper when a single rule is run on an array value.

    validate((array) new DateTime('now'), 'date');
    // true

    which would call:

    'date' => '2017-05-19 17:27:01.000000',
    'timezone_type' => 3,
    'timezone' => 'UTC',
    ], [
    'default' => 'date',
    // true

    This returns `true` since the ‘date’ rule misses any ‘default’ $data array key.

    It seems the default behaviour can just be decided on what type of rule was passed in?

    function validate($fields, $rules)
    if (! is_array($rules)) {
    $fields = ['default' => $fields];
    $rules = ['default' => $rules];

    return Validator::make($fields, $rules)->passes();

    So giving a string ‘rule’, L5.3+ `IlluminateValidationRules*` class-based rule instance, or no rules at all will decide when a single field is being checked.

    The spatie/laravel-collection-macros validate() macro could probably use a pull request for this fix.