I want a Laravel validation for specific condition (if the check box is checked then this validation should work)

Updated: Jan 25, 2025

I want a Laravel validation for specific condition (if the check box is checked then this validation should work)

To create a Laravel validation for a specific condition where a checkbox is checked, you can use the sometimes rule along with custom validation logic. Here's a step-by-step guide to help you achieve this:

  1. Define the validation rules in your Laravel controller's store() or update() method. In this example, we'll assume you have a User model and a request instance named $request.
public function update(Request $request, User $user)
{
    $rules = [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users,email,'.$user->id,
        'agree_terms' => 'sometimes|boolean',
    ];

    $messages = [
        'agree_terms.sometimes' => 'The :attribute field is required when agreeing to terms and conditions.',
    ];

    $this->validate($request, $rules, $messages);

    // Your logic for updating the user here
}

In the example above, we defined a rule for the agree_terms field using the sometimes rule. This rule will only be applied when the checkbox is submitted.

  1. Customize the validation logic by creating a custom validation rule. In your app/Providers/AppServiceProvider.php file, add the following code to the boot() method:
use Illuminate\Support\Facades\Validator;

public function boot()
{
    Validator::resolver(function ($translator, $data, $rules, $messages) {
        return new AgreeTermsRule($translator, $data, $rules, $messages);
    });
}
  1. Create the custom validation rule class named AgreeTermsRule.php in the app/Rules directory:
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class AgreeTermsRule implements Rule
{
    protected $data;
    protected $rules;
    protected $messages;

    public function __construct($translator, $data, $rules, $messages)
    {
        $this->translator = $translator;
        $this->data = $data;
        $this->rules = $rules;
        $this->messages = $messages;
    }

    public function passes($attribute, $value)
    {
        return isset($this->data['agree_terms']) && $this->data['agree_terms'] === true;
    }

    public function message()
    {
        return $this->messages('agree_terms.sometimes');
    }
}

In the example above, we defined the custom validation rule AgreeTermsRule that checks if the agree_terms checkbox is checked.

  1. Now, you can use the custom validation rule in your store() or update() method:
public function update(Request $request, User $user)
{
    $rules = [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users,email,'.$user->id,
        'agree_terms' => 'agree_terms',
    ];

    $this->validate($request, $rules);

    // Your logic for updating the user here
}

Now, when the agree_terms checkbox is not checked, the validation for this field will be skipped. However, if the checkbox is checked, the validation rule will be applied, and the user will be required to agree to the terms and conditions.