diff options
author | polo <ordipolo@gmx.fr> | 2024-08-13 23:45:21 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2024-08-13 23:45:21 +0200 |
commit | bf6655a534a6775d30cafa67bd801276bda1d98d (patch) | |
tree | c6381e3f6c81c33eab72508f410b165ba05f7e9c /vendor/doctrine/orm/src/Mapping/MappingException.php | |
parent | 94d67a4b51f8e62e7d518cce26a526ae1ec48278 (diff) | |
download | AppliGestionPHP-bf6655a534a6775d30cafa67bd801276bda1d98d.zip |
VERSION 0.2 doctrine ORM et entités
Diffstat (limited to 'vendor/doctrine/orm/src/Mapping/MappingException.php')
-rw-r--r-- | vendor/doctrine/orm/src/Mapping/MappingException.php | 691 |
1 files changed, 691 insertions, 0 deletions
diff --git a/vendor/doctrine/orm/src/Mapping/MappingException.php b/vendor/doctrine/orm/src/Mapping/MappingException.php new file mode 100644 index 0000000..9b73242 --- /dev/null +++ b/vendor/doctrine/orm/src/Mapping/MappingException.php | |||
@@ -0,0 +1,691 @@ | |||
1 | <?php | ||
2 | |||
3 | declare(strict_types=1); | ||
4 | |||
5 | namespace Doctrine\ORM\Mapping; | ||
6 | |||
7 | use BackedEnum; | ||
8 | use Doctrine\ORM\Exception\ORMException; | ||
9 | use Doctrine\Persistence\Mapping\MappingException as PersistenceMappingException; | ||
10 | use LibXMLError; | ||
11 | use ReflectionException; | ||
12 | use ValueError; | ||
13 | |||
14 | use function array_keys; | ||
15 | use function array_map; | ||
16 | use function array_values; | ||
17 | use function get_debug_type; | ||
18 | use function get_parent_class; | ||
19 | use function implode; | ||
20 | use function sprintf; | ||
21 | |||
22 | use const PHP_EOL; | ||
23 | |||
24 | /** | ||
25 | * A MappingException indicates that something is wrong with the mapping setup. | ||
26 | */ | ||
27 | class MappingException extends PersistenceMappingException implements ORMException | ||
28 | { | ||
29 | /** @param class-string $entityName */ | ||
30 | public static function identifierRequired(string $entityName): self | ||
31 | { | ||
32 | $parent = get_parent_class($entityName); | ||
33 | if ($parent !== false) { | ||
34 | return new self(sprintf( | ||
35 | 'No identifier/primary key specified for Entity "%s" sub class of "%s". Every Entity must have an identifier/primary key.', | ||
36 | $entityName, | ||
37 | $parent, | ||
38 | )); | ||
39 | } | ||
40 | |||
41 | return new self(sprintf( | ||
42 | 'No identifier/primary key specified for Entity "%s". Every Entity must have an identifier/primary key.', | ||
43 | $entityName, | ||
44 | )); | ||
45 | } | ||
46 | |||
47 | public static function invalidAssociationType(string $entityName, string $fieldName, int $type): self | ||
48 | { | ||
49 | return new self(sprintf( | ||
50 | 'The association "%s#%s" must be of type "ClassMetadata::ONE_TO_MANY", "ClassMetadata::MANY_TO_MANY" or "ClassMetadata::MANY_TO_ONE", "%d" given.', | ||
51 | $entityName, | ||
52 | $fieldName, | ||
53 | $type, | ||
54 | )); | ||
55 | } | ||
56 | |||
57 | public static function invalidInheritanceType(string $entityName, int $type): self | ||
58 | { | ||
59 | return new self(sprintf("The inheritance type '%s' specified for '%s' does not exist.", $type, $entityName)); | ||
60 | } | ||
61 | |||
62 | public static function generatorNotAllowedWithCompositeId(): self | ||
63 | { | ||
64 | return new self("Id generators can't be used with a composite id."); | ||
65 | } | ||
66 | |||
67 | public static function missingFieldName(string $entity): self | ||
68 | { | ||
69 | return new self(sprintf( | ||
70 | "The field or association mapping misses the 'fieldName' attribute in entity '%s'.", | ||
71 | $entity, | ||
72 | )); | ||
73 | } | ||
74 | |||
75 | public static function missingTargetEntity(string $fieldName): self | ||
76 | { | ||
77 | return new self(sprintf("The association mapping '%s' misses the 'targetEntity' attribute.", $fieldName)); | ||
78 | } | ||
79 | |||
80 | public static function missingSourceEntity(string $fieldName): self | ||
81 | { | ||
82 | return new self(sprintf("The association mapping '%s' misses the 'sourceEntity' attribute.", $fieldName)); | ||
83 | } | ||
84 | |||
85 | public static function missingEmbeddedClass(string $fieldName): self | ||
86 | { | ||
87 | return new self(sprintf("The embed mapping '%s' misses the 'class' attribute.", $fieldName)); | ||
88 | } | ||
89 | |||
90 | public static function mappingFileNotFound(string $entityName, string $fileName): self | ||
91 | { | ||
92 | return new self(sprintf("No mapping file found named '%s' for class '%s'.", $fileName, $entityName)); | ||
93 | } | ||
94 | |||
95 | /** | ||
96 | * Exception for invalid property name override. | ||
97 | * | ||
98 | * @param string $className The entity's name. | ||
99 | */ | ||
100 | public static function invalidOverrideFieldName(string $className, string $fieldName): self | ||
101 | { | ||
102 | return new self(sprintf("Invalid field override named '%s' for class '%s'.", $fieldName, $className)); | ||
103 | } | ||
104 | |||
105 | /** | ||
106 | * Exception for invalid property type override. | ||
107 | * | ||
108 | * @param string $className The entity's name. | ||
109 | */ | ||
110 | public static function invalidOverrideFieldType(string $className, string $fieldName): self | ||
111 | { | ||
112 | return new self(sprintf( | ||
113 | "The column type of attribute '%s' on class '%s' could not be changed.", | ||
114 | $fieldName, | ||
115 | $className, | ||
116 | )); | ||
117 | } | ||
118 | |||
119 | public static function mappingNotFound(string $className, string $fieldName): self | ||
120 | { | ||
121 | return new self(sprintf("No mapping found for field '%s' on class '%s'.", $fieldName, $className)); | ||
122 | } | ||
123 | |||
124 | public static function queryNotFound(string $className, string $queryName): self | ||
125 | { | ||
126 | return new self(sprintf("No query found named '%s' on class '%s'.", $queryName, $className)); | ||
127 | } | ||
128 | |||
129 | public static function resultMappingNotFound(string $className, string $resultName): self | ||
130 | { | ||
131 | return new self(sprintf("No result set mapping found named '%s' on class '%s'.", $resultName, $className)); | ||
132 | } | ||
133 | |||
134 | public static function emptyQueryMapping(string $entity, string $queryName): self | ||
135 | { | ||
136 | return new self(sprintf('Query named "%s" in "%s" could not be empty.', $queryName, $entity)); | ||
137 | } | ||
138 | |||
139 | public static function nameIsMandatoryForQueryMapping(string $className): self | ||
140 | { | ||
141 | return new self(sprintf("Query name on entity class '%s' is not defined.", $className)); | ||
142 | } | ||
143 | |||
144 | public static function missingQueryMapping(string $entity, string $queryName): self | ||
145 | { | ||
146 | return new self(sprintf( | ||
147 | 'Query named "%s" in "%s requires a result class or result set mapping.', | ||
148 | $queryName, | ||
149 | $entity, | ||
150 | )); | ||
151 | } | ||
152 | |||
153 | public static function missingResultSetMappingEntity(string $entity, string $resultName): self | ||
154 | { | ||
155 | return new self(sprintf( | ||
156 | 'Result set mapping named "%s" in "%s requires a entity class name.', | ||
157 | $resultName, | ||
158 | $entity, | ||
159 | )); | ||
160 | } | ||
161 | |||
162 | public static function missingResultSetMappingFieldName(string $entity, string $resultName): self | ||
163 | { | ||
164 | return new self(sprintf( | ||
165 | 'Result set mapping named "%s" in "%s requires a field name.', | ||
166 | $resultName, | ||
167 | $entity, | ||
168 | )); | ||
169 | } | ||
170 | |||
171 | public static function oneToManyRequiresMappedBy(string $entityName, string $fieldName): MappingException | ||
172 | { | ||
173 | return new self(sprintf( | ||
174 | "OneToMany mapping on entity '%s' field '%s' requires the 'mappedBy' attribute.", | ||
175 | $entityName, | ||
176 | $fieldName, | ||
177 | )); | ||
178 | } | ||
179 | |||
180 | public static function joinTableRequired(string $fieldName): self | ||
181 | { | ||
182 | return new self(sprintf("The mapping of field '%s' requires an the 'joinTable' attribute.", $fieldName)); | ||
183 | } | ||
184 | |||
185 | /** | ||
186 | * Called if a required option was not found but is required | ||
187 | * | ||
188 | * @param string $field Which field cannot be processed? | ||
189 | * @param string $expectedOption Which option is required | ||
190 | * @param string $hint Can optionally be used to supply a tip for common mistakes, | ||
191 | * e.g. "Did you think of the plural s?" | ||
192 | */ | ||
193 | public static function missingRequiredOption(string $field, string $expectedOption, string $hint = ''): self | ||
194 | { | ||
195 | $message = "The mapping of field '" . $field . "' is invalid: The option '" . $expectedOption . "' is required."; | ||
196 | |||
197 | if (! empty($hint)) { | ||
198 | $message .= ' (Hint: ' . $hint . ')'; | ||
199 | } | ||
200 | |||
201 | return new self($message); | ||
202 | } | ||
203 | |||
204 | /** | ||
205 | * Generic exception for invalid mappings. | ||
206 | */ | ||
207 | public static function invalidMapping(string $fieldName): self | ||
208 | { | ||
209 | return new self(sprintf("The mapping of field '%s' is invalid.", $fieldName)); | ||
210 | } | ||
211 | |||
212 | /** | ||
213 | * Exception for reflection exceptions - adds the entity name, | ||
214 | * because there might be long classnames that will be shortened | ||
215 | * within the stacktrace | ||
216 | * | ||
217 | * @param string $entity The entity's name | ||
218 | */ | ||
219 | public static function reflectionFailure(string $entity, ReflectionException $previousException): self | ||
220 | { | ||
221 | return new self(sprintf('An error occurred in %s', $entity), 0, $previousException); | ||
222 | } | ||
223 | |||
224 | public static function joinColumnMustPointToMappedField(string $className, string $joinColumn): self | ||
225 | { | ||
226 | return new self(sprintf( | ||
227 | 'The column %s must be mapped to a field in class %s since it is referenced by a join column of another class.', | ||
228 | $joinColumn, | ||
229 | $className, | ||
230 | )); | ||
231 | } | ||
232 | |||
233 | public static function joinColumnNotAllowedOnOneToOneInverseSide(string $className, string $fieldName): self | ||
234 | { | ||
235 | return new self(sprintf( | ||
236 | '%s#%s is a OneToOne inverse side, which does not allow join columns.', | ||
237 | $className, | ||
238 | $fieldName, | ||
239 | )); | ||
240 | } | ||
241 | |||
242 | /** @param class-string $className */ | ||
243 | public static function classIsNotAValidEntityOrMappedSuperClass(string $className): self | ||
244 | { | ||
245 | $parent = get_parent_class($className); | ||
246 | if ($parent !== false) { | ||
247 | return new self(sprintf( | ||
248 | 'Class "%s" sub class of "%s" is not a valid entity or mapped super class.', | ||
249 | $className, | ||
250 | $parent, | ||
251 | )); | ||
252 | } | ||
253 | |||
254 | return new self(sprintf( | ||
255 | 'Class "%s" is not a valid entity or mapped super class.', | ||
256 | $className, | ||
257 | )); | ||
258 | } | ||
259 | |||
260 | /** | ||
261 | * @param string $entity The entity's name. | ||
262 | * @param string $fieldName The name of the field that was already declared. | ||
263 | */ | ||
264 | public static function duplicateFieldMapping(string $entity, string $fieldName): self | ||
265 | { | ||
266 | return new self(sprintf( | ||
267 | 'Property "%s" in "%s" was already declared, but it must be declared only once', | ||
268 | $fieldName, | ||
269 | $entity, | ||
270 | )); | ||
271 | } | ||
272 | |||
273 | public static function duplicateAssociationMapping(string $entity, string $fieldName): self | ||
274 | { | ||
275 | return new self(sprintf( | ||
276 | 'Property "%s" in "%s" was already declared, but it must be declared only once', | ||
277 | $fieldName, | ||
278 | $entity, | ||
279 | )); | ||
280 | } | ||
281 | |||
282 | public static function duplicateQueryMapping(string $entity, string $queryName): self | ||
283 | { | ||
284 | return new self(sprintf( | ||
285 | 'Query named "%s" in "%s" was already declared, but it must be declared only once', | ||
286 | $queryName, | ||
287 | $entity, | ||
288 | )); | ||
289 | } | ||
290 | |||
291 | public static function duplicateResultSetMapping(string $entity, string $resultName): self | ||
292 | { | ||
293 | return new self(sprintf( | ||
294 | 'Result set mapping named "%s" in "%s" was already declared, but it must be declared only once', | ||
295 | $resultName, | ||
296 | $entity, | ||
297 | )); | ||
298 | } | ||
299 | |||
300 | public static function singleIdNotAllowedOnCompositePrimaryKey(string $entity): self | ||
301 | { | ||
302 | return new self('Single id is not allowed on composite primary key in entity ' . $entity); | ||
303 | } | ||
304 | |||
305 | public static function noIdDefined(string $entity): self | ||
306 | { | ||
307 | return new self('No ID defined for entity ' . $entity); | ||
308 | } | ||
309 | |||
310 | public static function unsupportedOptimisticLockingType(string $entity, string $fieldName, string $unsupportedType): self | ||
311 | { | ||
312 | return new self(sprintf( | ||
313 | 'Locking type "%s" (specified in "%s", field "%s") is not supported by Doctrine.', | ||
314 | $unsupportedType, | ||
315 | $entity, | ||
316 | $fieldName, | ||
317 | )); | ||
318 | } | ||
319 | |||
320 | public static function fileMappingDriversRequireConfiguredDirectoryPath(string|null $path = null): self | ||
321 | { | ||
322 | if (! empty($path)) { | ||
323 | $path = '[' . $path . ']'; | ||
324 | } | ||
325 | |||
326 | return new self( | ||
327 | 'File mapping drivers must have a valid directory path, ' . | ||
328 | 'however the given path ' . $path . ' seems to be incorrect!', | ||
329 | ); | ||
330 | } | ||
331 | |||
332 | /** | ||
333 | * Returns an exception that indicates that a class used in a discriminator map does not exist. | ||
334 | * An example would be an outdated (maybe renamed) classname. | ||
335 | * | ||
336 | * @param string $className The class that could not be found | ||
337 | * @param string $owningClass The class that declares the discriminator map. | ||
338 | */ | ||
339 | public static function invalidClassInDiscriminatorMap(string $className, string $owningClass): self | ||
340 | { | ||
341 | return new self(sprintf( | ||
342 | "Entity class '%s' used in the discriminator map of class '%s' " . | ||
343 | 'does not exist.', | ||
344 | $className, | ||
345 | $owningClass, | ||
346 | )); | ||
347 | } | ||
348 | |||
349 | /** | ||
350 | * @param string[] $entries | ||
351 | * @param array<string,string> $map | ||
352 | */ | ||
353 | public static function duplicateDiscriminatorEntry(string $className, array $entries, array $map): self | ||
354 | { | ||
355 | return new self( | ||
356 | 'The entries ' . implode(', ', $entries) . " in discriminator map of class '" . $className . "' is duplicated. " . | ||
357 | 'If the discriminator map is automatically generated you have to convert it to an explicit discriminator map now. ' . | ||
358 | 'The entries of the current map are: @DiscriminatorMap({' . implode(', ', array_map( | ||
359 | static fn ($a, $b) => sprintf("'%s': '%s'", $a, $b), | ||
360 | array_keys($map), | ||
361 | array_values($map), | ||
362 | )) . '})', | ||
363 | ); | ||
364 | } | ||
365 | |||
366 | /** | ||
367 | * @param class-string $rootEntityClass | ||
368 | * @param class-string $childEntityClass | ||
369 | */ | ||
370 | public static function missingInheritanceTypeDeclaration(string $rootEntityClass, string $childEntityClass): self | ||
371 | { | ||
372 | return new self(sprintf( | ||
373 | "Entity class '%s' is a subclass of the root entity class '%s', but no inheritance mapping type was declared.", | ||
374 | $childEntityClass, | ||
375 | $rootEntityClass, | ||
376 | )); | ||
377 | } | ||
378 | |||
379 | public static function missingDiscriminatorMap(string $className): self | ||
380 | { | ||
381 | return new self(sprintf( | ||
382 | "Entity class '%s' is using inheritance but no discriminator map was defined.", | ||
383 | $className, | ||
384 | )); | ||
385 | } | ||
386 | |||
387 | public static function missingDiscriminatorColumn(string $className): self | ||
388 | { | ||
389 | return new self(sprintf( | ||
390 | "Entity class '%s' is using inheritance but no discriminator column was defined.", | ||
391 | $className, | ||
392 | )); | ||
393 | } | ||
394 | |||
395 | public static function invalidDiscriminatorColumnType(string $className, string $type): self | ||
396 | { | ||
397 | return new self(sprintf( | ||
398 | "Discriminator column type on entity class '%s' is not allowed to be '%s'. 'string' or 'integer' type variables are suggested!", | ||
399 | $className, | ||
400 | $type, | ||
401 | )); | ||
402 | } | ||
403 | |||
404 | public static function nameIsMandatoryForDiscriminatorColumns(string $className): self | ||
405 | { | ||
406 | return new self(sprintf("Discriminator column name on entity class '%s' is not defined.", $className)); | ||
407 | } | ||
408 | |||
409 | public static function cannotVersionIdField(string $className, string $fieldName): self | ||
410 | { | ||
411 | return new self(sprintf( | ||
412 | "Setting Id field '%s' as versionable in entity class '%s' is not supported.", | ||
413 | $fieldName, | ||
414 | $className, | ||
415 | )); | ||
416 | } | ||
417 | |||
418 | public static function duplicateColumnName(string $className, string $columnName): self | ||
419 | { | ||
420 | return new self("Duplicate definition of column '" . $columnName . "' on entity '" . $className . "' in a field or discriminator column mapping."); | ||
421 | } | ||
422 | |||
423 | public static function illegalToManyAssociationOnMappedSuperclass(string $className, string $field): self | ||
424 | { | ||
425 | return new self("It is illegal to put an inverse side one-to-many or many-to-many association on mapped superclass '" . $className . '#' . $field . "'."); | ||
426 | } | ||
427 | |||
428 | public static function cannotMapCompositePrimaryKeyEntitiesAsForeignId(string $className, string $targetEntity, string $targetField): self | ||
429 | { | ||
430 | return new self("It is not possible to map entity '" . $className . "' with a composite primary key " . | ||
431 | "as part of the primary key of another entity '" . $targetEntity . '#' . $targetField . "'."); | ||
432 | } | ||
433 | |||
434 | public static function noSingleAssociationJoinColumnFound(string $className, string $field): self | ||
435 | { | ||
436 | return new self(sprintf("'%s#%s' is not an association with a single join column.", $className, $field)); | ||
437 | } | ||
438 | |||
439 | public static function noFieldNameFoundForColumn(string $className, string $column): self | ||
440 | { | ||
441 | return new self(sprintf( | ||
442 | "Cannot find a field on '%s' that is mapped to column '%s'. Either the " . | ||
443 | 'field does not exist or an association exists but it has multiple join columns.', | ||
444 | $className, | ||
445 | $column, | ||
446 | )); | ||
447 | } | ||
448 | |||
449 | public static function illegalOrphanRemovalOnIdentifierAssociation(string $className, string $field): self | ||
450 | { | ||
451 | return new self(sprintf( | ||
452 | "The orphan removal option is not allowed on an association that is part of the identifier in '%s#%s'.", | ||
453 | $className, | ||
454 | $field, | ||
455 | )); | ||
456 | } | ||
457 | |||
458 | public static function illegalOrphanRemoval(string $className, string $field): self | ||
459 | { | ||
460 | return new self('Orphan removal is only allowed on one-to-one and one-to-many ' . | ||
461 | 'associations, but ' . $className . '#' . $field . ' is not.'); | ||
462 | } | ||
463 | |||
464 | public static function illegalInverseIdentifierAssociation(string $className, string $field): self | ||
465 | { | ||
466 | return new self(sprintf( | ||
467 | "An inverse association is not allowed to be identifier in '%s#%s'.", | ||
468 | $className, | ||
469 | $field, | ||
470 | )); | ||
471 | } | ||
472 | |||
473 | public static function illegalToManyIdentifierAssociation(string $className, string $field): self | ||
474 | { | ||
475 | return new self(sprintf( | ||
476 | "Many-to-many or one-to-many associations are not allowed to be identifier in '%s#%s'.", | ||
477 | $className, | ||
478 | $field, | ||
479 | )); | ||
480 | } | ||
481 | |||
482 | public static function noInheritanceOnMappedSuperClass(string $className): self | ||
483 | { | ||
484 | return new self("It is not supported to define inheritance information on a mapped superclass '" . $className . "'."); | ||
485 | } | ||
486 | |||
487 | public static function mappedClassNotPartOfDiscriminatorMap(string $className, string $rootClassName): self | ||
488 | { | ||
489 | return new self( | ||
490 | "Entity '" . $className . "' has to be part of the discriminator map of '" . $rootClassName . "' " . | ||
491 | "to be properly mapped in the inheritance hierarchy. Alternatively you can make '" . $className . "' an abstract class " . | ||
492 | 'to avoid this exception from occurring.', | ||
493 | ); | ||
494 | } | ||
495 | |||
496 | public static function lifecycleCallbackMethodNotFound(string $className, string $methodName): self | ||
497 | { | ||
498 | return new self("Entity '" . $className . "' has no method '" . $methodName . "' to be registered as lifecycle callback."); | ||
499 | } | ||
500 | |||
501 | /** @param class-string $className */ | ||
502 | public static function illegalLifecycleCallbackOnEmbeddedClass(string $event, string $className): self | ||
503 | { | ||
504 | return new self(sprintf( | ||
505 | <<<'EXCEPTION' | ||
506 | Context: Attempt to register lifecycle callback "%s" on embedded class "%s". | ||
507 | Problem: Registering lifecycle callbacks on embedded classes is not allowed. | ||
508 | EXCEPTION, | ||
509 | $event, | ||
510 | $className, | ||
511 | )); | ||
512 | } | ||
513 | |||
514 | public static function entityListenerClassNotFound(string $listenerName, string $className): self | ||
515 | { | ||
516 | return new self(sprintf('Entity Listener "%s" declared on "%s" not found.', $listenerName, $className)); | ||
517 | } | ||
518 | |||
519 | public static function entityListenerMethodNotFound(string $listenerName, string $methodName, string $className): self | ||
520 | { | ||
521 | return new self(sprintf('Entity Listener "%s" declared on "%s" has no method "%s".', $listenerName, $className, $methodName)); | ||
522 | } | ||
523 | |||
524 | public static function duplicateEntityListener(string $listenerName, string $methodName, string $className): self | ||
525 | { | ||
526 | return new self(sprintf('Entity Listener "%s#%s()" in "%s" was already declared, but it must be declared only once.', $listenerName, $methodName, $className)); | ||
527 | } | ||
528 | |||
529 | /** @param class-string $className */ | ||
530 | public static function invalidFetchMode(string $className, string $fetchMode): self | ||
531 | { | ||
532 | return new self("Entity '" . $className . "' has a mapping with invalid fetch mode '" . $fetchMode . "'"); | ||
533 | } | ||
534 | |||
535 | public static function invalidGeneratedMode(int|string $generatedMode): self | ||
536 | { | ||
537 | return new self("Invalid generated mode '" . $generatedMode . "'"); | ||
538 | } | ||
539 | |||
540 | public static function compositeKeyAssignedIdGeneratorRequired(string $className): self | ||
541 | { | ||
542 | return new self("Entity '" . $className . "' has a composite identifier but uses an ID generator other than manually assigning (Identity, Sequence). This is not supported."); | ||
543 | } | ||
544 | |||
545 | public static function invalidTargetEntityClass(string $targetEntity, string $sourceEntity, string $associationName): self | ||
546 | { | ||
547 | return new self('The target-entity ' . $targetEntity . " cannot be found in '" . $sourceEntity . '#' . $associationName . "'."); | ||
548 | } | ||
549 | |||
550 | /** @param string[] $cascades */ | ||
551 | public static function invalidCascadeOption(array $cascades, string $className, string $propertyName): self | ||
552 | { | ||
553 | $cascades = implode(', ', array_map(static fn (string $e): string => "'" . $e . "'", $cascades)); | ||
554 | |||
555 | return new self(sprintf( | ||
556 | "You have specified invalid cascade options for %s::$%s: %s; available options: 'remove', 'persist', 'refresh', and 'detach'", | ||
557 | $className, | ||
558 | $propertyName, | ||
559 | $cascades, | ||
560 | )); | ||
561 | } | ||
562 | |||
563 | public static function missingSequenceName(string $className): self | ||
564 | { | ||
565 | return new self( | ||
566 | sprintf('Missing "sequenceName" attribute for sequence id generator definition on class "%s".', $className), | ||
567 | ); | ||
568 | } | ||
569 | |||
570 | public static function infiniteEmbeddableNesting(string $className, string $propertyName): self | ||
571 | { | ||
572 | return new self( | ||
573 | sprintf( | ||
574 | 'Infinite nesting detected for embedded property %s::%s. ' . | ||
575 | 'You cannot embed an embeddable from the same type inside an embeddable.', | ||
576 | $className, | ||
577 | $propertyName, | ||
578 | ), | ||
579 | ); | ||
580 | } | ||
581 | |||
582 | public static function illegalOverrideOfInheritedProperty(string $className, string $propertyName, string $inheritFromClass): self | ||
583 | { | ||
584 | return new self( | ||
585 | sprintf( | ||
586 | 'Overrides are only allowed for fields or associations declared in mapped superclasses or traits. This is not the case for %s::%s, which was inherited from %s.', | ||
587 | $className, | ||
588 | $propertyName, | ||
589 | $inheritFromClass, | ||
590 | ), | ||
591 | ); | ||
592 | } | ||
593 | |||
594 | public static function invalidIndexConfiguration(string $className, string $indexName): self | ||
595 | { | ||
596 | return new self( | ||
597 | sprintf( | ||
598 | 'Index %s for entity %s should contain columns or fields values, but not both.', | ||
599 | $indexName, | ||
600 | $className, | ||
601 | ), | ||
602 | ); | ||
603 | } | ||
604 | |||
605 | public static function invalidUniqueConstraintConfiguration(string $className, string $indexName): self | ||
606 | { | ||
607 | return new self( | ||
608 | sprintf( | ||
609 | 'Unique constraint %s for entity %s should contain columns or fields values, but not both.', | ||
610 | $indexName, | ||
611 | $className, | ||
612 | ), | ||
613 | ); | ||
614 | } | ||
615 | |||
616 | public static function invalidOverrideType(string $expectdType, mixed $givenValue): self | ||
617 | { | ||
618 | return new self(sprintf( | ||
619 | 'Expected %s, but %s was given.', | ||
620 | $expectdType, | ||
621 | get_debug_type($givenValue), | ||
622 | )); | ||
623 | } | ||
624 | |||
625 | public static function backedEnumTypeRequired(string $className, string $fieldName, string $enumType): self | ||
626 | { | ||
627 | return new self(sprintf( | ||
628 | 'Attempting to map a non-backed enum type %s in entity %s::$%s. Please use backed enums only', | ||
629 | $enumType, | ||
630 | $className, | ||
631 | $fieldName, | ||
632 | )); | ||
633 | } | ||
634 | |||
635 | public static function nonEnumTypeMapped(string $className, string $fieldName, string $enumType): self | ||
636 | { | ||
637 | return new self(sprintf( | ||
638 | 'Attempting to map non-enum type %s as enum in entity %s::$%s', | ||
639 | $enumType, | ||
640 | $className, | ||
641 | $fieldName, | ||
642 | )); | ||
643 | } | ||
644 | |||
645 | /** | ||
646 | * @param class-string $className | ||
647 | * @param class-string<BackedEnum> $enumType | ||
648 | */ | ||
649 | public static function invalidEnumValue( | ||
650 | string $className, | ||
651 | string $fieldName, | ||
652 | string $value, | ||
653 | string $enumType, | ||
654 | ValueError $previous, | ||
655 | ): self { | ||
656 | return new self(sprintf( | ||
657 | <<<'EXCEPTION' | ||
658 | Context: Trying to hydrate enum property "%s::$%s" | ||
659 | Problem: Case "%s" is not listed in enum "%s" | ||
660 | Solution: Either add the case to the enum type or migrate the database column to use another case of the enum | ||
661 | EXCEPTION | ||
662 | , | ||
663 | $className, | ||
664 | $fieldName, | ||
665 | $value, | ||
666 | $enumType, | ||
667 | ), 0, $previous); | ||
668 | } | ||
669 | |||
670 | /** @param LibXMLError[] $errors */ | ||
671 | public static function fromLibXmlErrors(array $errors): self | ||
672 | { | ||
673 | $formatter = static fn (LibXMLError $error): string => sprintf( | ||
674 | 'libxml error: %s in %s at line %d', | ||
675 | $error->message, | ||
676 | $error->file, | ||
677 | $error->line, | ||
678 | ); | ||
679 | |||
680 | return new self(implode(PHP_EOL, array_map($formatter, $errors))); | ||
681 | } | ||
682 | |||
683 | public static function invalidAttributeOnEmbeddable(string $entityName, string $attributeName): self | ||
684 | { | ||
685 | return new self(sprintf( | ||
686 | 'Attribute "%s" on embeddable "%s" is not allowed.', | ||
687 | $attributeName, | ||
688 | $entityName, | ||
689 | )); | ||
690 | } | ||
691 | } | ||