craftcms/laravel-ruleset-validation
Validate Laravel request data against Craft CMS field rulesets. Map Craft-style constraints (required, min/max, regex, etc.) into Laravel’s validator, keeping validation logic consistent between Craft and Laravel apps.
FormRequest, Validator facade) while introducing a declarative, reusable ruleset pattern. Reduces coupling between validation logic and controllers/forms.draft vs. published validation) via scenarios avoids bloated rules() methods with conditional logic.FormRequest behavior (e.g., authorize(), messages(), validated()), so teams familiar with Laravel validation can adopt this with minimal learning.FormRequest classes—no forced migration. Rulesets can coexist with traditional validation.FormRequest), enabling seamless integration into existing routing.| Risk Area | Mitigation Strategy |
|---|---|
| Learning Curve | Low for Laravel devs (familiar with FormRequest); higher for teams new to DDD/DTOs. |
| Performance Overhead | Minimal—rulesets reuse Laravel’s Validator under the hood. Benchmark if validating large payloads. |
| Testing Complexity | Rulesets are isolated and testable; recommend unit tests for each ruleset class. |
| Breaking Changes | Package is stable (1.0+), with clear deprecation policies. Monitor Laravel version compatibility. |
| Scenario Logic Errors | Risk of scenario misconfiguration (e.g., typos in scenario names). Use IDE autocompletion or enums. |
FormRequest classes, or only complex ones? (Avoid over-engineering simple forms.)Rule objects.Validator::make())?FormRequest classes migrate to rulesets? (Incremental refactor recommended.)Rule objects seamlessly.validate()) or non-throwing (fails()) validation flow? Document team preference.FormRequest features).#[Ruleset]) and named arguments, so ensure your stack supports it.Laravel Sanctum, Laravel Passport, or Spatie API Resources.Livewire, Inertia.js, or Filament for frontend validation.Pest or PHPUnit for validation testing.| Phase | Action | Effort | Risk |
|---|---|---|---|
| Assessment | Audit existing FormRequest classes to identify reusable rulesets. |
Low | Low |
| Pilot | Refactor one complex endpoint (e.g., user registration with multi-step validation). | Medium | Medium |
| Incremental | Replace FormRequest classes with rulesets one at a time, starting with high-reuse cases. |
High | Medium |
| Full Adoption | Standardize new validation logic to use rulesets; deprecate old FormRequest classes. |
High | High |
Example Migration:
// Before: FormRequest
class StoreUserRequest extends FormRequest {
public function rules() {
return [
'email' => ['required', 'email'],
'password' => ['required', 'min:8'],
];
}
}
// After: Ruleset + Controller
class StoreUserRuleset extends Ruleset {
public function rules() {
return [
'email' => ['required', 'email'],
'password' => ['required', 'min:8'],
];
}
}
class UserController {
public function store(StoreUserRuleset $ruleset) {
$validated = $ruleset->validate();
// ...
}
}
CreateUserCommand) before touching FormRequest classes.admin vs. user flows).FormRequest classes in favor of rulesets.FormRequest.rules() arrays.validationData(), scenarios).*Ruleset suffix (e.g., UserProfileRuleset).App\Rulesets namespace.required rule failing?").dd($ruleset->getValidator()->errors()) for troubleshooting.useScenario() is called before validate().validationData() returns the correct array structure.Validator is optimized).laravel-debugbar to monitor Validator execution time.How can I help you explore Laravel packages today?