caneara/axiom
Axiom is a Laravel package for adding finite state machines to Eloquent models. Define states, transitions, and guards in one place, then move records through workflows safely with expressive, testable code that keeps order, subscription, and approval status changes clean.
Package category: The release note ("Added Vietnamese citizen rule") confirms this is a Laravel validation-rule package with locale-specific identity validators. It extends the validator with a rule for Vietnamese citizen identity numbers (the 9-digit CMND legacy scheme and/or the 12-digit CCCD scheme introduced in 2016, including the 6-digit province code, gender/century digit, and YYMMDD date-of-birth encoding).
Architecture fit: Fits cleanly into Laravel's validation subsystem. Expect either a ValidationRule object or a string-keyed rule registered via a service provider. Neither pattern introduces a new runtime dependency, queue, cache, or storage layer — the package is stateless and synchronous, so it does not alter our application architecture. This is an additive, opt-in capability.
Integration feasibility: Low. A patch-level version bump (3.2.0 → 3.2.1) with one added rule is a composer update plus wiring the rule into the relevant FormRequest classes. Realistic effort: under one developer day, plus QA and a localisation/compliance read-through. No config publishing, no migrations, no published assets should be required.
Technical risk:
Key questions:
Validator::extend?Stack fit: Native to Laravel. Compatible with form requests, Validator::make, and inline $request->validate(). It composes with existing rule chains (required|string|vn_citizen_id|unique:users,id_number) and with bail. No conflict with our other validation packages expected, but confirm there is no duplicate rule-key collision if we already use a competing identity-rule library.
Migration path: Direct dependency bump. For a new release, no deprecations are in scope; the only migration concern is data, not code — existing stored ID values are unaffected because validation is write-path only unless we add a backfill or an admin-side re-validation job. Recommendation: do not retroactively validate existing records as part of this upgrade.
Compatibility: Verify PHP and Laravel version constraints from the package's composer.json against our current LTS. Check whether the rule is implemented against the modern ValidationRule/Rule contracts (Laravel 9+) or the legacy string signature; the latter can break under later framework versions. Confirm PHP 8.x support explicitly rather than inferring it from a patch bump.
Sequencing:
Maintenance: Very low surface area — no infrastructure, no schema, no background processes. The real maintenance burden is indirect: tracking the package's future releases for province-table updates and framework compatibility. Assign ownership of that dependency bump to the team owning VN onboarding, not to a central platform team.
Support: Determine whether this is a single-maintainer community package or vendor-backed. For a compliance-adjacent validator used in a regulated market, single-maintainer status is a material risk that should be recorded in the risk register, with a documented exit path (fork the rule locally — it is small enough that this is cheap).
Scaling: Negligible. Validation is CPU-bound string work executed in-request; it will not appear in capacity planning. If applied to bulk imports, run it in a queued job rather than synchronously per row.
Failure modes:
Ramp-up: Minimal for engineers — a Laravel developer is productive in under an hour. The non-obvious ramp-up is on the business side: product, support, and compliance stakeholders need to understand that this rule validates format, not identity, and that a valid-format ID is not a verified citizen. Set that expectation explicitly before launch, or the team will inherit a support queue of users with edge-case documents and an overstated sense of compliance coverage.
How can I help you explore Laravel packages today?