11<?php
2-
32namespace Gravity \Engine ;
43
54use Gravity \Collections \ErrorCollection ;
1211 * ErrorManager
1312 *
1413 * Responsible for error creation, message translation, and parameter extraction.
14+ * Optimized with metadata caching to avoid repeated lookups.
1515 */
1616class ErrorManager
1717{
18+ private ?TranslationManager $ translationManager = null ;
19+
20+ /**
21+ * Cache for resolved metadata (validation name → metadata)
22+ * Avoids repeated registry lookups for the same validation
23+ * @var array<string, ValidationMetadata|null>
24+ */
25+ private array $ metadataCache = [];
26+
1827 public function __construct (
1928 private ErrorCollection $ errors ,
20- private TranslationManager $ translationManager ,
21- private LazyValidationRegistry $ registry
22- ) {}
29+ private LazyValidationRegistry $ registry ,
30+ ?TranslationManager $ translationManager = null
31+ ) {
32+ $ this ->translationManager = $ translationManager ;
33+ }
2334
2435 /**
2536 * Add validation error with translated message
@@ -36,7 +47,7 @@ public function addError(
3647
3748 if (!$ errorMessage ) {
3849 $ params = $ this ->buildValidationParams ($ testName , $ args );
39- $ errorMessage = $ this ->translationManager ->getValidationMessage (
50+ $ errorMessage = $ this ->getTranslationManager () ->getValidationMessage (
4051 $ testName ,
4152 $ alias ,
4253 $ value ,
@@ -51,32 +62,48 @@ public function addError(
5162
5263 /**
5364 * Build parameters from args for error messages
65+ * Optimized with metadata caching
5466 */
5567 private function buildValidationParams (string $ testName , array $ args ): array
5668 {
69+ if (empty ($ args )) {
70+ return [];
71+ }
72+
5773 $ metadata = $ this ->resolveMetadata ($ testName );
58- if (!$ metadata ) {
74+ if (!$ metadata || empty ( $ metadata -> parameters ) ) {
5975 return [];
6076 }
6177
6278 return $ this ->mapArgsToParams ($ metadata , $ args );
6379 }
6480
65-
81+ /**
82+ * Resolve metadata with caching
83+ */
6684 private function resolveMetadata (string $ testName ): ?ValidationMetadata
6785 {
68- return $ this ->registry ->get ($ testName )
86+ if (array_key_exists ($ testName , $ this ->metadataCache )) {
87+ return $ this ->metadataCache [$ testName ];
88+ }
89+
90+ $ metadata = $ this ->registry ->get ($ testName )
6991 ?? GlobalStrategyRegistry::instance ()->getAllMetadata ()[$ testName ]
7092 ?? null ;
93+
94+ $ this ->metadataCache [$ testName ] = $ metadata ;
95+
96+ return $ metadata ;
7197 }
7298
99+ /**
100+ * Map args to parameter names
101+ * ✅ Optimisation : early return si pas de parameters
102+ */
73103 private function mapArgsToParams (ValidationMetadata $ metadata , array $ args ): array
74104 {
75- if (empty ($ metadata ->parameters )) {
76- return [];
77- }
78-
79105 $ params = [];
106+
80107 foreach ($ metadata ->parameters as $ i => $ p ) {
81108 $ name = $ p ['name ' ];
82109 $ value = $ args [$ i ] ?? ($ p ['default ' ] ?? null );
@@ -93,9 +120,21 @@ private function mapArgsToParams(ValidationMetadata $metadata, array $args): arr
93120
94121 /**
95122 * Get translation manager for external configuration
123+ * Lazy-loads if not already set
96124 */
97125 public function getTranslationManager (): TranslationManager
98126 {
127+ if ($ this ->translationManager === null ) {
128+ $ this ->translationManager = new TranslationManager ();
129+ }
99130 return $ this ->translationManager ;
100131 }
132+
133+ /**
134+ * Set translation manager (for user customization)
135+ */
136+ public function setTranslationManager (TranslationManager $ translationManager ): void
137+ {
138+ $ this ->translationManager = $ translationManager ;
139+ }
101140}
0 commit comments