@@ -197,10 +197,18 @@ private function resolveFieldsMeta(ReflectionClass $rootClass, CompileMeta $meta
197197 $ sourceName = $ meta ->getSourceName ();
198198 foreach ($ meta ->getFields () as $ fieldMetas ) {
199199 $ this ->checkFieldInvariance ($ rootClass , $ fieldMetas , $ sourceName );
200+ $ firstFieldMeta = $ fieldMetas [0 ];
201+ $ ruleMeta = $ firstFieldMeta ->getRule ();
202+
203+ if ($ ruleMeta === null ) {
204+ $ this ->throwFieldHasNoRule ($ rootClass , $ meta , $ firstFieldMeta );
205+ }
206+
200207 foreach ($ fieldMetas as $ fieldMeta ) {
201208 $ resolved = $ this ->resolveFieldMeta (
202209 $ rootClass ,
203210 $ fieldMeta ,
211+ $ ruleMeta ,
204212 $ this ->getDefaultValue ($ fieldMeta ),
205213 );
206214
@@ -212,6 +220,30 @@ private function resolveFieldsMeta(ReflectionClass $rootClass, CompileMeta $meta
212220 return $ fields ;
213221 }
214222
223+ /**
224+ * @param ReflectionClass<MappedObject> $rootClass
225+ * @return never
226+ */
227+ public function throwFieldHasNoRule (
228+ ReflectionClass $ rootClass ,
229+ CompileMeta $ meta ,
230+ FieldCompileMeta $ firstFieldMeta
231+ ): void
232+ {
233+ $ propertyName = $ this ->getRelativePropertyName ($ firstFieldMeta ->getProperty (), $ rootClass );
234+
235+ $ message = Message::create ()
236+ ->withContext ("Resolving metadata of mapped object ' {$ rootClass ->getName ()}'. " )
237+ ->withProblem (
238+ "Property ' $ propertyName' has some mapped object definition "
239+ . " (in {$ meta ->getSourceName ()}), but no rule definition. " ,
240+ )
241+ ->withSolution ('Either remove the definition or add a rule definition. ' );
242+
243+ throw InvalidArgument::create ()
244+ ->withMessage ($ message );
245+ }
246+
215247 /**
216248 * @param ReflectionClass<MappedObject> $rootClass
217249 * @param list<FieldCompileMeta> $resolvedGroup
@@ -258,11 +290,12 @@ private function propertyNameToFieldName(FieldRuntimeMeta $fieldMeta)
258290 */
259291 private function resolveFieldMeta (
260292 ReflectionClass $ rootClass ,
261- FieldCompileMeta $ meta ,
293+ FieldCompileMeta $ fieldMeta ,
294+ RuleCompileMeta $ ruleMeta ,
262295 DefaultValueMeta $ defaultValue
263296 ): FieldRuntimeMeta
264297 {
265- $ fieldStructure = $ meta ->getProperty ();
298+ $ fieldStructure = $ fieldMeta ->getProperty ();
266299 $ reflector = $ fieldStructure ->getContextReflector ();
267300
268301 if ($ reflector ->isStatic ()) {
@@ -285,13 +318,10 @@ private function resolveFieldMeta(
285318 $ context = new MetaFieldContext ($ this ->loader , $ this , $ defaultValue );
286319
287320 return new FieldRuntimeMeta (
288- $ this ->resolveCallbacksMeta ($ meta , $ context , $ reflector ),
289- $ this ->resolveDocsMeta ($ meta , $ context ),
290- $ this ->resolveFieldModifiersMeta ($ meta , $ context ),
291- $ this ->resolveRuleMeta (
292- $ meta ->getRule (),
293- $ context ,
294- ),
321+ $ this ->resolveCallbacksMeta ($ fieldMeta , $ context , $ reflector ),
322+ $ this ->resolveDocsMeta ($ fieldMeta , $ context ),
323+ $ this ->resolveFieldModifiersMeta ($ fieldMeta , $ context ),
324+ $ this ->resolveRuleMeta ($ ruleMeta , $ context ),
295325 $ defaultValue ,
296326 PhpPropertyMeta::from ($ reflector ),
297327 );
0 commit comments