Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laminas Validator Laravel Package

laminas/laminas-validator

Validation component for PHP and Laminas applications. Provides a wide range of ready-to-use validators (strings, numbers, dates, files, and more), consistent error messages, and an extensible API to create custom validators and input filtering rules.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require laminas/laminas-validator
    

    Add to composer.json under require if not using global install.

  2. First Use Case: Validate a user input (e.g., email, file upload) in a Laravel controller:

    use Laminas\Validator\EmailAddress;
    
    $validator = new EmailAddress();
    $isValid = $validator->isValid($request->input('email'));
    
  3. Where to Look First:

    • Laminas Validator Docs
    • Built-in validators (e.g., EmailAddress, NotEmpty, File\MimeType) in Laminas\Validator\.
    • laminas-inputfilter or laminas-form integration if using forms.

Implementation Patterns

Core Workflows

  1. Basic Validation:

    $validator = new \Laminas\Validator\NotEmpty();
    if (!$validator->isValid($value)) {
        return redirect()->back()->withErrors(['field' => $validator->getMessages()]);
    }
    
  2. Chaining Validators:

    $validator = new \Laminas\Validator\Composite([
        new \Laminas\Validator\NotEmpty(),
        new \Laminas\Validator\EmailAddress(),
    ]);
    
  3. Custom Validation Logic:

    $validator = new \Laminas\Validator\Callback(function ($value) {
        return strlen($value) >= 8;
    }, ['message' => 'Password must be at least 8 characters.']);
    
  4. File Validation (e.g., uploads):

    $validator = new \Laminas\Validator\File\MimeType([
        'mimeType' => 'image/jpeg,image/png',
    ]);
    $isValid = $validator->isValid($request->file('avatar'));
    
  5. Integration with Laravel Forms: Use laravel-form (if installed) or manually bind to Laravel’s FormRequest:

    public function rules()
    {
        return [
            'email' => ['required', 'email'],
            'avatar' => ['required', 'mimes:jpeg,png'],
        ];
    }
    

Integration Tips

  • Laravel Service Providers: Bind validators to Laravel’s IoC container for reuse:

    $this->app->bind(\Laminas\Validator\EmailAddress::class, function () {
        return new \Laminas\Validator\EmailAddress();
    });
    
  • Form Request Validation: Extend FormRequest and use Laminas validators in rules() or withValidator():

    public function withValidator($validator, $data, $messages)
    {
        $validator->add(new \Laminas\Validator\Callback(function ($value) {
            return $value === 'secret';
        }));
    }
    
  • API Responses: Return validator messages in JSON:

    return response()->json([
        'errors' => $validator->getMessages()
    ], 422);
    

Gotchas and Tips

Pitfalls

  1. File Validation Quirks:

    • File\MimeType requires the fileinfo PHP extension. Check with:
      if (!extension_loaded('fileinfo')) {
          throw new \RuntimeException('FileInfo extension is required.');
      }
      
    • Uploaded files must be temporary or moved to storage before validation:
      $file = $request->file('avatar');
      $file->store('avatars'); // Store first, then validate
      
  2. Callback Scope Issues:

    • Unbound callbacks (bind: false) cannot access validator methods (e.g., setMessage()). Use bind: true for dynamic messages:
      $validator = new \Laminas\Validator\Callback([...], ['bind' => true]);
      
  3. Performance:

    • Avoid chaining heavy validators (e.g., File\Hash on large files) in loops. Cache results if reused.
  4. Message Localization:

    • Default messages are English. Override in Laravel’s resources/lang or set custom messages:
      $validator->setMessage('isInvalid', 'Custom error message.');
      

Debugging Tips

  • Validator Messages: Dump messages for debugging:

    dd($validator->getMessages());
    
  • Context in Callbacks: Ensure the $context array is passed when using standalone validators (not via laminas-inputfilter):

    $validator->isValid($value, $request->all());
    
  • Exception Handling: Use throwExceptions: true in Callback for development:

    $validator = new \Laminas\Validator\Callback([...], ['throwExceptions' => true]);
    

Extension Points

  1. Custom Validators: Extend \Laminas\Validator\AbstractValidator:

    class CustomValidator extends \Laminas\Validator\AbstractValidator
    {
        public function isValid($value)
        {
            return $value === 'custom';
        }
    }
    
  2. Validator Factories: Use Laravel’s Validator facade to create instances dynamically:

    $validator = \Validator::make($data, [
        'field' => ['custom_validator'],
    ]);
    
  3. PSR-7 Uploads: For PSR-7 apps (e.g., Lumen), use UploadedFileInterface:

    $validator = new \Laminas\Validator\File\MimeType([...]);
    $isValid = $validator->isValid($psr7UploadedFile);
    
  4. Testing: Mock validators in PHPUnit:

    $validator = $this->createMock(\Laminas\Validator\EmailAddress::class);
    $validator->method('isValid')->willReturn(true);
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
nexmo/api-specification
capell-app/block-library
axium/identity
cetria/laravel-dummy-models
cetria/reflection-helper
agropredict/sso-auth-bundle
evolvestudio/spam-protection
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
ecotone/kafka
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata