numerik-laravel maintained by slashlab
numerik-laravel
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