From 93a4624ab02dd528d35c88b9a04ad8770d87d190 Mon Sep 17 00:00:00 2001 From: August Miller Date: Thu, 4 Jun 2026 16:47:47 -0700 Subject: [PATCH 1/3] Relocate ValidationRulesResolving event for non-element use Also makes compatible with usage in place of FormRequest --- CHANGELOG.md | 4 +++ .../Events/ValidationRulesResolving.php | 36 +++++++++++++++---- src/Validation/Ruleset.php | 4 +-- 3 files changed, 36 insertions(+), 8 deletions(-) rename src/{Element => }/Validation/Events/ValidationRulesResolving.php (53%) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb10d3a408d..d33f3072351 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ ## Unreleased - Fixed a bug where the `craft:install` command would hang if run within a production environment. +- Relocated `CraftCms\Cms\Element\Validation\Events\ValidationRulesResolving` to `CraftCms\Cms\Validation\Events\ValidationRulesResolving` to reflect its broader applicability to components and rulesets. +- Relaxed the allowed types in the `ValidationRulesResolving` event to include any implementation `ValidatesWithRuleset` or a `Illuminate\Http\Request` object. +- Renamed `CraftCms\Cms\Validation\Events\ValidationRulesResolving::$component` to `$subject` +- Added `CraftCms\Cms\Validation\Events\ValidationRulesResolving::$ruleset` ## 6.0.0-alpha.6 - 2026-06-03 diff --git a/src/Element/Validation/Events/ValidationRulesResolving.php b/src/Validation/Events/ValidationRulesResolving.php similarity index 53% rename from src/Element/Validation/Events/ValidationRulesResolving.php rename to src/Validation/Events/ValidationRulesResolving.php index 5ee825e02e0..6b0b3549448 100644 --- a/src/Element/Validation/Events/ValidationRulesResolving.php +++ b/src/Validation/Events/ValidationRulesResolving.php @@ -2,26 +2,50 @@ declare(strict_types=1); -namespace CraftCms\Cms\Element\Validation\Events; +namespace CraftCms\Cms\Validation\Events; -use CraftCms\Cms\Validation\Contracts\Validatable; +use CraftCms\Cms\Validation\Ruleset; +use CraftCms\RulesetValidation\Contracts\ValidatesWithRuleset; use Illuminate\Foundation\Events\Dispatchable; +use Illuminate\Http\Request; /** - * Event dispatched when an element's validation rules are being defined. + * Event dispatched when validation rules are being defined. * - * Plugins can listen to this event to add custom validation rules. + * Plugins can listen to this event to add custom validation rules: + * + * ```php + * use CraftCms\Cms\Validation\Events\ValidationRulesResolving; + * use CraftCms\Cms\Entry\Elements\Entry; + * + * Event::listen(function (ValidationRulesResolving $event) { + * // Suppose we’re only interested in entries: + * if (! $event->component instanceof Entry) { + * return; + * } + * + * // Ignore nested entries: + * if ($event->component->ownerId !== null) { + * return; + * } + * + * // Enforce short slugs: + * $event->addRule('slug', 'max:40'); + * }); + * ``` */ class ValidationRulesResolving { use Dispatchable; /** - * @param Validatable $component The component being validated + * @param ValidatesWithRuleset|Request $subject The object being validated + * @param Ruleset $ruleset The ruleset that produced the attached {@see $rules} * @param array> $rules The current validation rules */ public function __construct( - public readonly Validatable $component, + public readonly ValidatesWithRuleset|Request $subject, + public readonly Ruleset $ruleset, public array $rules, ) {} diff --git a/src/Validation/Ruleset.php b/src/Validation/Ruleset.php index 32aaf85f5d2..bd877b08d46 100644 --- a/src/Validation/Ruleset.php +++ b/src/Validation/Ruleset.php @@ -4,7 +4,7 @@ namespace CraftCms\Cms\Validation; -use CraftCms\Cms\Element\Validation\Events\ValidationRulesResolving; +use CraftCms\Cms\Validation\Events\ValidationRulesResolving; use CraftCms\Cms\Validation\Contracts\Validatable; use Illuminate\Validation\Validator; use Override; @@ -33,7 +33,7 @@ protected function validationRules(): array { $rules = parent::validationRules(); - event($event = new ValidationRulesResolving($this->subject, $rules)); + event($event = new ValidationRulesResolving($this->resolveSubject(), $this, $rules)); return $event->rules; } From 998056100fb3e57d60e34d42a75db8f142ebafc3 Mon Sep 17 00:00:00 2001 From: August Miller Date: Thu, 4 Jun 2026 17:07:13 -0700 Subject: [PATCH 2/3] Fix property name in docblock/example --- src/Validation/Events/ValidationRulesResolving.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Validation/Events/ValidationRulesResolving.php b/src/Validation/Events/ValidationRulesResolving.php index 6b0b3549448..afba746ae41 100644 --- a/src/Validation/Events/ValidationRulesResolving.php +++ b/src/Validation/Events/ValidationRulesResolving.php @@ -20,12 +20,12 @@ * * Event::listen(function (ValidationRulesResolving $event) { * // Suppose we’re only interested in entries: - * if (! $event->component instanceof Entry) { + * if (! $event->subject instanceof Entry) { * return; * } * * // Ignore nested entries: - * if ($event->component->ownerId !== null) { + * if ($event->subject->ownerId !== null) { * return; * } * From 69db835fa99c569f718aa89db59844d738d89f45 Mon Sep 17 00:00:00 2001 From: August Miller Date: Thu, 4 Jun 2026 17:12:17 -0700 Subject: [PATCH 3/3] Pint :) --- src/Validation/Ruleset.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Validation/Ruleset.php b/src/Validation/Ruleset.php index bd877b08d46..544c0e1958b 100644 --- a/src/Validation/Ruleset.php +++ b/src/Validation/Ruleset.php @@ -4,8 +4,8 @@ namespace CraftCms\Cms\Validation; -use CraftCms\Cms\Validation\Events\ValidationRulesResolving; use CraftCms\Cms\Validation\Contracts\Validatable; +use CraftCms\Cms\Validation\Events\ValidationRulesResolving; use Illuminate\Validation\Validator; use Override;