Skip to content

Laravel 5.4 API/Request Validate Boolean

Nov 17, 2017 1 min read #laravel #php

This post is more than 18 months old. Technology changes quickly, so some of this content may be out of date (but that's not always the case). Please verify any technical or programming information against the current release.

For some API work in Laravel, I wanted to validate that the incoming request parameter was a boolean value. At first I tried using the built in boolean slug validator but it didn’t accept all of the ‘boolean’ values I wanted to use. (Also there were weird scenarios where string values of false were triggering as true - like what I wrote about here.

In Laravel 5.4 (I mention this version because Laravel has recently updated so this validator format may not be the best anymore), I made the following validator:

app/Validators/AnyBooleanValueValidator.php
php
<?php
/**
 * Validator to test for any boolean value, not just ones that is_bool() tests for.
 */
declare(strict_types=1);

namespace App\Validators;

use Illuminate\Contracts\Validation\Validator;

/**
 * Class AnyBooleanValueValidator
 * @package App\Validators
 */
class AnyBooleanValueValidator
{
  /**
   * This is invoked by the validator rule 'any_boolean_value'
   * 
   * @param $attribute string the attribute name that is validating
   * @param $value mixed the value that we're testing
   * @param $parameters array 
   * @param $validator Validator The Validator instance
   * @return bool
   */
  public function validate($attribute, $value, $parameters = [], Validator $validator = null) {
    return in_array($value, [
      '1', 1, "true", true, 'yes', 'on', 
      '0', 0, "false", false, 'no', 'off', ''
    ], true);
  }
}

Then, I registered any_boolean_value in the AppServiceProvider using the following line:

Validator::extend('any_boolean_value', AnyBooleanValueValidator::class);
php

Finally, I added an error translation in the validation language resource file.

resources/lang/en/validation.php
php
'any_boolean_value' => 'The :attribute field must be a boolean type value. (Try true or false, 1 or 0).',

Now I can use that slug for validation on boolean values to allow in “acceptable” boolean values.

I do contract work - and specialize in Laravel. If you need a hand, let me know.