slashlab / numerik-laravel
Laravel validation rules for Polish identification numbers (PESEL, NIP, REGON, KRS) — powered by slashlab/numerik.
Fund package maintenance!
Requires
- php: ^8.3
- illuminate/validation: ^11.0 || ^12.0 || ^13.0
- slashlab/numerik: ^1.0
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
README
Laravel validation rules for Polish identification numbers — PESEL, NIP, REGON, and KRS. 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:
use SlashLab\NumerikLaravel\Rules\PeselRule; use SlashLab\NumerikLaravel\Rules\NipRule; use SlashLab\NumerikLaravel\Rules\RegonRule; use SlashLab\NumerikLaravel\Rules\KrsRule; public function rules(): array { return [ 'pesel' => ['required', new PeselRule()], 'nip' => ['required', new NipRule()], 'regon' => ['required', new RegonRule()], 'krs' => ['required', new KrsRule()], ]; }
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:
'pesel' => ['required', 'pesel'], 'nip' => ['required', 'nip'], 'regon' => ['required', 'regon'], 'krs' => ['required', 'krs'],
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