Featured image of post Elegantly Validate Date Must Be Greater Than Today in Laravel

Elegantly Validate Date Must Be Greater Than Today in Laravel

Form validation sometimes requires special validation requirements

  • We often encounter scenarios like ticket purchasing queries that require date range validation: the start date must be greater than or equal to today, and the end date must be greater than or equal to the start date.

Version

  • Laravel 5.5.40
  • PHP 7.1

Implementation Steps

  1. Create a Form Request:


    Note: Remember to return true in the authorize() method since we’re handling authentication elsewhere

  2. Basic validation rules:

  3. Special validation challenge:
    Initial attempt to validate start_date using an extra field:


    Testing shows this approach doesn’t work as expected

  4. Debugging reveals the validation data is captured before custom rules:


  5. Solution: Override prepareForValidation()


    This ensures curr_date is available during validation

  6. Final working validation:


Technical Analysis

  1. IoC Container handles dependency injection for form requests
  2. Validation Workflow:
    • prepareForValidation() (custom preparation)
    • Create validator instance with current request data
    • Execute validation rules
  3. Key implementation detail:
    protected function prepareForValidation()
    {
        $this->merge(['curr_date' => date('Y-m-d')]);
    }
    
  4. Alternative approach using built-in today keyword:
    'start_date' => 'required|date|after_or_equal:today',
    

    Leverages PHP’s strtotime() recognition of “today”


Validation Flowchart

graph TD
    A[Request Initiated] --> B[Resolve FormRequest]
    B --> C[Prepare Validation Data]
    C --> D[Execute Validation Rules]
    D --> E{Validation Pass?}
    E -->|Yes| F[Process Request]
    E -->|No| G[Return Validation Errors]

This approach ensures robust date validation while maintaining Laravel’s elegant syntax and validation capabilities.