slashlab / numerik-laravel
Laravel validation rules for Polish identification numbers (PESEL, NIP, REGON, KRS, ID card, passport, VAT-EU, NRB, IBAN) — powered by slashlab/numerik.
Fund package maintenance!
Requires
- php: ^8.3
- illuminate/validation: ^11.0 || ^12.0 || ^13.0
- slashlab/numerik: ^1.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- orchestra/testbench: ^9.0 || ^10.0 || ^11.0
- phpstan/phpstan: ^2.0
- phpstan/phpstan-strict-rules: ^2.0
- phpunit/phpunit: ^12.0
This package is auto-updated.
Last update: 2026-05-09 13:51:37 UTC
README
Laravel validation rules for Polish identification numbers — PESEL, NIP, REGON, KRS, ID card, passport, VAT-EU, NRB, and IBAN. Powered by slashlab/numerik.
Requirements
- PHP 8.3+
- Laravel 11, 12, or 13
Installation
composer require slashlab/numerik-laravel
The service provider is auto-discovered — no manual registration needed.
Usage
Validation rules
Use the rules in form requests or Validator::make() calls:
// Personal use SlashLab\NumerikLaravel\Rules\PeselRule; use SlashLab\NumerikLaravel\Rules\IdCardRule; use SlashLab\NumerikLaravel\Rules\PassportRule; // Tax & Business use SlashLab\NumerikLaravel\Rules\NipRule; use SlashLab\NumerikLaravel\Rules\VatEuRule; use SlashLab\NumerikLaravel\Rules\RegonRule; use SlashLab\NumerikLaravel\Rules\KrsRule; // Banking use SlashLab\NumerikLaravel\Rules\NrbRule; use SlashLab\NumerikLaravel\Rules\IbanRule; public function rules(): array { return [ 'pesel' => ['required', new PeselRule()], 'id_card' => ['required', new IdCardRule()], 'passport' => ['required', new PassportRule()], 'nip' => ['required', new NipRule()], 'vat_eu' => ['required', new VatEuRule()], 'regon' => ['required', new RegonRule()], 'krs' => ['required', new KrsRule()], 'nrb' => ['required', new NrbRule()], 'iban' => ['required', new IbanRule()], ]; }
Strict mode
All rules accept an optional strict parameter (default true). In strict mode, PESELs with future birth dates or all-identical digits are rejected:
new PeselRule(strict: false)
Validation messages
Class-based rules return a specific message for each failure reason — for example, a NIP with a wrong checksum digit returns a different message than one with an invalid length.
Error messages use the field label registered in validation.attributes when one is found, matching the behaviour of Laravel's built-in rules. If no label is registered, the field name is humanised (underscores replaced with spaces, first letter capitalised).
The package ships with English (en) and Polish (pl) translations. To publish and customise them:
php artisan vendor:publish --tag=numerik-lang
String-based rules
Rules are also available as strings via the service provider:
// Personal 'pesel' => ['required', 'pesel'], 'id_card' => ['required', 'id_card'], 'passport' => ['required', 'passport'], // Tax & Business 'nip' => ['required', 'nip'], 'vat_eu' => ['required', 'vat_eu'], 'regon' => ['required', 'regon'], 'krs' => ['required', 'krs'], // Banking 'nrb' => ['required', 'nrb'], 'iban' => ['required', 'iban'],
String-based rules always return a generic message regardless of the failure reason. Use the class-based rules when specific messages matter.
Changelog
See CHANGELOG.md.
Contributing
See CONTRIBUTING.md.
Security
See SECURITY.md.
License
MIT — see LICENSE.
If this saved you time → ☕ Buy me a coffee