Builder
9 months ago
Driver
9 months ago
Exception
9 months ago
Reflection
9 months ago
Annotation.php
9 months ago
AnsiQuoteStrategy.php
9 months ago
AssociationOverride.php
9 months ago
AssociationOverrides.php
9 months ago
AttributeOverride.php
9 months ago
AttributeOverrides.php
9 months ago
Cache.php
9 months ago
ChainTypedFieldMapper.php
9 months ago
ChangeTrackingPolicy.php
9 months ago
ClassMetadata.php
9 months ago
ClassMetadataFactory.php
9 months ago
ClassMetadataInfo.php
9 months ago
Column.php
9 months ago
ColumnResult.php
9 months ago
CustomIdGenerator.php
9 months ago
DefaultEntityListenerResolver.php
9 months ago
DefaultNamingStrategy.php
9 months ago
DefaultQuoteStrategy.php
9 months ago
DefaultTypedFieldMapper.php
9 months ago
DiscriminatorColumn.php
9 months ago
DiscriminatorMap.php
9 months ago
Embeddable.php
9 months ago
Embedded.php
9 months ago
Entity.php
9 months ago
EntityListenerResolver.php
9 months ago
EntityListeners.php
9 months ago
EntityResult.php
9 months ago
FieldResult.php
9 months ago
GeneratedValue.php
9 months ago
HasLifecycleCallbacks.php
9 months ago
Id.php
9 months ago
Index.php
9 months ago
InheritanceType.php
9 months ago
InverseJoinColumn.php
9 months ago
JoinColumn.php
9 months ago
JoinColumnProperties.php
9 months ago
JoinColumns.php
9 months ago
JoinTable.php
9 months ago
ManyToMany.php
9 months ago
ManyToOne.php
9 months ago
MappedSuperclass.php
9 months ago
MappingAttribute.php
9 months ago
MappingException.php
9 months ago
NamedNativeQueries.php
9 months ago
NamedNativeQuery.php
9 months ago
NamedQueries.php
9 months ago
NamedQuery.php
9 months ago
NamingStrategy.php
9 months ago
OneToMany.php
9 months ago
OneToOne.php
9 months ago
OrderBy.php
9 months ago
PostLoad.php
9 months ago
PostPersist.php
9 months ago
PostRemove.php
9 months ago
PostUpdate.php
9 months ago
PreFlush.php
9 months ago
PrePersist.php
9 months ago
PreRemove.php
9 months ago
PreUpdate.php
9 months ago
QuoteStrategy.php
9 months ago
ReflectionEmbeddedProperty.php
9 months ago
ReflectionEnumProperty.php
9 months ago
ReflectionReadonlyProperty.php
9 months ago
SequenceGenerator.php
9 months ago
SqlResultSetMapping.php
9 months ago
SqlResultSetMappings.php
9 months ago
Table.php
9 months ago
TypedFieldMapper.php
9 months ago
UnderscoreNamingStrategy.php
9 months ago
UniqueConstraint.php
9 months ago
Version.php
9 months ago
MappingException.php
349 lines
| 1 | <?php |
| 2 | declare (strict_types=1); |
| 3 | namespace MailPoetVendor\Doctrine\ORM\Mapping; |
| 4 | if (!defined('ABSPATH')) exit; |
| 5 | use BackedEnum; |
| 6 | use MailPoetVendor\Doctrine\ORM\Exception\ORMException; |
| 7 | use LibXMLError; |
| 8 | use ReflectionException; |
| 9 | use ValueError; |
| 10 | use function array_keys; |
| 11 | use function array_map; |
| 12 | use function array_values; |
| 13 | use function get_debug_type; |
| 14 | use function get_parent_class; |
| 15 | use function implode; |
| 16 | use function sprintf; |
| 17 | use const PHP_EOL; |
| 18 | class MappingException extends ORMException |
| 19 | { |
| 20 | public static function pathRequired() |
| 21 | { |
| 22 | return new self('Specifying the paths to your entities is required ' . 'in the AnnotationDriver to retrieve all class names.'); |
| 23 | } |
| 24 | public static function identifierRequired($entityName) |
| 25 | { |
| 26 | $parent = get_parent_class($entityName); |
| 27 | if ($parent !== \false) { |
| 28 | return new self(sprintf('No identifier/primary key specified for Entity "%s" sub class of "%s". Every Entity must have an identifier/primary key.', $entityName, $parent)); |
| 29 | } |
| 30 | return new self(sprintf('No identifier/primary key specified for Entity "%s". Every Entity must have an identifier/primary key.', $entityName)); |
| 31 | } |
| 32 | public static function invalidInheritanceType($entityName, $type) |
| 33 | { |
| 34 | return new self(sprintf("The inheritance type '%s' specified for '%s' does not exist.", $type, $entityName)); |
| 35 | } |
| 36 | public static function generatorNotAllowedWithCompositeId() |
| 37 | { |
| 38 | return new self("Id generators can't be used with a composite id."); |
| 39 | } |
| 40 | public static function missingFieldName($entity) |
| 41 | { |
| 42 | return new self(sprintf("The field or association mapping misses the 'fieldName' attribute in entity '%s'.", $entity)); |
| 43 | } |
| 44 | public static function missingTargetEntity($fieldName) |
| 45 | { |
| 46 | return new self(sprintf("The association mapping '%s' misses the 'targetEntity' attribute.", $fieldName)); |
| 47 | } |
| 48 | public static function missingSourceEntity($fieldName) |
| 49 | { |
| 50 | return new self(sprintf("The association mapping '%s' misses the 'sourceEntity' attribute.", $fieldName)); |
| 51 | } |
| 52 | public static function missingEmbeddedClass($fieldName) |
| 53 | { |
| 54 | return new self(sprintf("The embed mapping '%s' misses the 'class' attribute.", $fieldName)); |
| 55 | } |
| 56 | public static function mappingFileNotFound($entityName, $fileName) |
| 57 | { |
| 58 | return new self(sprintf("No mapping file found named '%s' for class '%s'.", $fileName, $entityName)); |
| 59 | } |
| 60 | public static function invalidOverrideFieldName($className, $fieldName) |
| 61 | { |
| 62 | return new self(sprintf("Invalid field override named '%s' for class '%s'.", $fieldName, $className)); |
| 63 | } |
| 64 | public static function invalidOverrideFieldType($className, $fieldName) |
| 65 | { |
| 66 | return new self(sprintf("The column type of attribute '%s' on class '%s' could not be changed.", $fieldName, $className)); |
| 67 | } |
| 68 | public static function mappingNotFound($className, $fieldName) |
| 69 | { |
| 70 | return new self(sprintf("No mapping found for field '%s' on class '%s'.", $fieldName, $className)); |
| 71 | } |
| 72 | public static function queryNotFound($className, $queryName) |
| 73 | { |
| 74 | return new self(sprintf("No query found named '%s' on class '%s'.", $queryName, $className)); |
| 75 | } |
| 76 | public static function resultMappingNotFound($className, $resultName) |
| 77 | { |
| 78 | return new self(sprintf("No result set mapping found named '%s' on class '%s'.", $resultName, $className)); |
| 79 | } |
| 80 | public static function emptyQueryMapping($entity, $queryName) |
| 81 | { |
| 82 | return new self(sprintf('Query named "%s" in "%s" could not be empty.', $queryName, $entity)); |
| 83 | } |
| 84 | public static function nameIsMandatoryForQueryMapping($className) |
| 85 | { |
| 86 | return new self(sprintf("Query name on entity class '%s' is not defined.", $className)); |
| 87 | } |
| 88 | public static function missingQueryMapping($entity, $queryName) |
| 89 | { |
| 90 | return new self(sprintf('Query named "%s" in "%s requires a result class or result set mapping.', $queryName, $entity)); |
| 91 | } |
| 92 | public static function missingResultSetMappingEntity($entity, $resultName) |
| 93 | { |
| 94 | return new self(sprintf('Result set mapping named "%s" in "%s requires a entity class name.', $resultName, $entity)); |
| 95 | } |
| 96 | public static function missingResultSetMappingFieldName($entity, $resultName) |
| 97 | { |
| 98 | return new self(sprintf('Result set mapping named "%s" in "%s requires a field name.', $resultName, $entity)); |
| 99 | } |
| 100 | public static function nameIsMandatoryForSqlResultSetMapping($className) |
| 101 | { |
| 102 | return new self(sprintf("Result set mapping name on entity class '%s' is not defined.", $className)); |
| 103 | } |
| 104 | public static function oneToManyRequiresMappedBy(string $entityName, string $fieldName) : MappingException |
| 105 | { |
| 106 | return new self(sprintf("OneToMany mapping on entity '%s' field '%s' requires the 'mappedBy' attribute.", $entityName, $fieldName)); |
| 107 | } |
| 108 | public static function joinTableRequired($fieldName) |
| 109 | { |
| 110 | return new self(sprintf("The mapping of field '%s' requires an the 'joinTable' attribute.", $fieldName)); |
| 111 | } |
| 112 | public static function missingRequiredOption($field, $expectedOption, $hint = '') |
| 113 | { |
| 114 | $message = "The mapping of field '" . $field . "' is invalid: The option '" . $expectedOption . "' is required."; |
| 115 | if (!empty($hint)) { |
| 116 | $message .= ' (Hint: ' . $hint . ')'; |
| 117 | } |
| 118 | return new self($message); |
| 119 | } |
| 120 | public static function invalidMapping($fieldName) |
| 121 | { |
| 122 | return new self(sprintf("The mapping of field '%s' is invalid.", $fieldName)); |
| 123 | } |
| 124 | public static function reflectionFailure($entity, ReflectionException $previousException) |
| 125 | { |
| 126 | return new self(sprintf('An error occurred in %s', $entity), 0, $previousException); |
| 127 | } |
| 128 | public static function joinColumnMustPointToMappedField($className, $joinColumn) |
| 129 | { |
| 130 | return new self(sprintf('The column %s must be mapped to a field in class %s since it is referenced by a join column of another class.', $joinColumn, $className)); |
| 131 | } |
| 132 | public static function classIsNotAValidEntityOrMappedSuperClass($className) |
| 133 | { |
| 134 | $parent = get_parent_class($className); |
| 135 | if ($parent !== \false) { |
| 136 | return new self(sprintf('Class "%s" sub class of "%s" is not a valid entity or mapped super class.', $className, $parent)); |
| 137 | } |
| 138 | return new self(sprintf('Class "%s" is not a valid entity or mapped super class.', $className)); |
| 139 | } |
| 140 | public static function propertyTypeIsRequired($className, $propertyName) |
| 141 | { |
| 142 | return new self(sprintf("The attribute 'type' is required for the column description of property %s::\$%s.", $className, $propertyName)); |
| 143 | } |
| 144 | public static function duplicateFieldMapping($entity, $fieldName) |
| 145 | { |
| 146 | return new self(sprintf('Property "%s" in "%s" was already declared, but it must be declared only once', $fieldName, $entity)); |
| 147 | } |
| 148 | public static function duplicateAssociationMapping($entity, $fieldName) |
| 149 | { |
| 150 | return new self(sprintf('Property "%s" in "%s" was already declared, but it must be declared only once', $fieldName, $entity)); |
| 151 | } |
| 152 | public static function duplicateQueryMapping($entity, $queryName) |
| 153 | { |
| 154 | return new self(sprintf('Query named "%s" in "%s" was already declared, but it must be declared only once', $queryName, $entity)); |
| 155 | } |
| 156 | public static function duplicateResultSetMapping($entity, $resultName) |
| 157 | { |
| 158 | return new self(sprintf('Result set mapping named "%s" in "%s" was already declared, but it must be declared only once', $resultName, $entity)); |
| 159 | } |
| 160 | public static function singleIdNotAllowedOnCompositePrimaryKey($entity) |
| 161 | { |
| 162 | return new self('Single id is not allowed on composite primary key in entity ' . $entity); |
| 163 | } |
| 164 | public static function noIdDefined($entity) |
| 165 | { |
| 166 | return new self('No ID defined for entity ' . $entity); |
| 167 | } |
| 168 | public static function unsupportedOptimisticLockingType($entity, $fieldName, $unsupportedType) |
| 169 | { |
| 170 | return new self(sprintf('Locking type "%s" (specified in "%s", field "%s") is not supported by Doctrine.', $unsupportedType, $entity, $fieldName)); |
| 171 | } |
| 172 | public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) |
| 173 | { |
| 174 | if (!empty($path)) { |
| 175 | $path = '[' . $path . ']'; |
| 176 | } |
| 177 | return new self('File mapping drivers must have a valid directory path, ' . 'however the given path ' . $path . ' seems to be incorrect!'); |
| 178 | } |
| 179 | public static function invalidClassInDiscriminatorMap($className, $owningClass) |
| 180 | { |
| 181 | return new self(sprintf("Entity class '%s' used in the discriminator map of class '%s' " . 'does not exist.', $className, $owningClass)); |
| 182 | } |
| 183 | public static function duplicateDiscriminatorEntry($className, array $entries, array $map) |
| 184 | { |
| 185 | return new self('The entries ' . implode(', ', $entries) . " in discriminator map of class '" . $className . "' is duplicated. " . 'If the discriminator map is automatically generated you have to convert it to an explicit discriminator map now. ' . 'The entries of the current map are: @DiscriminatorMap({' . implode(', ', array_map(static function ($a, $b) { |
| 186 | return sprintf("'%s': '%s'", $a, $b); |
| 187 | }, array_keys($map), array_values($map))) . '})'); |
| 188 | } |
| 189 | public static function missingDiscriminatorMap($className) |
| 190 | { |
| 191 | return new self(sprintf("Entity class '%s' is using inheritance but no discriminator map was defined.", $className)); |
| 192 | } |
| 193 | public static function missingDiscriminatorColumn($className) |
| 194 | { |
| 195 | return new self(sprintf("Entity class '%s' is using inheritance but no discriminator column was defined.", $className)); |
| 196 | } |
| 197 | public static function invalidDiscriminatorColumnType($className, $type) |
| 198 | { |
| 199 | return new self(sprintf("Discriminator column type on entity class '%s' is not allowed to be '%s'. 'string' or 'integer' type variables are suggested!", $className, $type)); |
| 200 | } |
| 201 | public static function nameIsMandatoryForDiscriminatorColumns($className) |
| 202 | { |
| 203 | return new self(sprintf("Discriminator column name on entity class '%s' is not defined.", $className)); |
| 204 | } |
| 205 | public static function cannotVersionIdField($className, $fieldName) |
| 206 | { |
| 207 | return new self(sprintf("Setting Id field '%s' as versionable in entity class '%s' is not supported.", $fieldName, $className)); |
| 208 | } |
| 209 | public static function sqlConversionNotAllowedForIdentifiers($className, $fieldName, $type) |
| 210 | { |
| 211 | return new self(sprintf("It is not possible to set id field '%s' to type '%s' in entity class '%s'. The type '%s' requires conversion SQL which is not allowed for identifiers.", $fieldName, $type, $className, $type)); |
| 212 | } |
| 213 | public static function duplicateColumnName($className, $columnName) |
| 214 | { |
| 215 | return new self("Duplicate definition of column '" . $columnName . "' on entity '" . $className . "' in a field or discriminator column mapping."); |
| 216 | } |
| 217 | public static function illegalToManyAssociationOnMappedSuperclass($className, $field) |
| 218 | { |
| 219 | return new self("It is illegal to put an inverse side one-to-many or many-to-many association on mapped superclass '" . $className . '#' . $field . "'."); |
| 220 | } |
| 221 | public static function cannotMapCompositePrimaryKeyEntitiesAsForeignId($className, $targetEntity, $targetField) |
| 222 | { |
| 223 | return new self("It is not possible to map entity '" . $className . "' with a composite primary key " . "as part of the primary key of another entity '" . $targetEntity . '#' . $targetField . "'."); |
| 224 | } |
| 225 | public static function noSingleAssociationJoinColumnFound($className, $field) |
| 226 | { |
| 227 | return new self(sprintf("'%s#%s' is not an association with a single join column.", $className, $field)); |
| 228 | } |
| 229 | public static function noFieldNameFoundForColumn($className, $column) |
| 230 | { |
| 231 | return new self(sprintf("Cannot find a field on '%s' that is mapped to column '%s'. Either the " . 'field does not exist or an association exists but it has multiple join columns.', $className, $column)); |
| 232 | } |
| 233 | public static function illegalOrphanRemovalOnIdentifierAssociation($className, $field) |
| 234 | { |
| 235 | return new self(sprintf("The orphan removal option is not allowed on an association that is part of the identifier in '%s#%s'.", $className, $field)); |
| 236 | } |
| 237 | public static function illegalOrphanRemoval($className, $field) |
| 238 | { |
| 239 | return new self('Orphan removal is only allowed on one-to-one and one-to-many ' . 'associations, but ' . $className . '#' . $field . ' is not.'); |
| 240 | } |
| 241 | public static function illegalInverseIdentifierAssociation($className, $field) |
| 242 | { |
| 243 | return new self(sprintf("An inverse association is not allowed to be identifier in '%s#%s'.", $className, $field)); |
| 244 | } |
| 245 | public static function illegalToManyIdentifierAssociation($className, $field) |
| 246 | { |
| 247 | return new self(sprintf("Many-to-many or one-to-many associations are not allowed to be identifier in '%s#%s'.", $className, $field)); |
| 248 | } |
| 249 | public static function noInheritanceOnMappedSuperClass($className) |
| 250 | { |
| 251 | return new self("It is not supported to define inheritance information on a mapped superclass '" . $className . "'."); |
| 252 | } |
| 253 | public static function mappedClassNotPartOfDiscriminatorMap($className, $rootClassName) |
| 254 | { |
| 255 | return new self("Entity '" . $className . "' has to be part of the discriminator map of '" . $rootClassName . "' " . "to be properly mapped in the inheritance hierarchy. Alternatively you can make '" . $className . "' an abstract class " . 'to avoid this exception from occurring.'); |
| 256 | } |
| 257 | public static function lifecycleCallbackMethodNotFound($className, $methodName) |
| 258 | { |
| 259 | return new self("Entity '" . $className . "' has no method '" . $methodName . "' to be registered as lifecycle callback."); |
| 260 | } |
| 261 | public static function entityListenerClassNotFound($listenerName, $className) |
| 262 | { |
| 263 | return new self(sprintf('Entity Listener "%s" declared on "%s" not found.', $listenerName, $className)); |
| 264 | } |
| 265 | public static function entityListenerMethodNotFound($listenerName, $methodName, $className) |
| 266 | { |
| 267 | return new self(sprintf('Entity Listener "%s" declared on "%s" has no method "%s".', $listenerName, $className, $methodName)); |
| 268 | } |
| 269 | public static function duplicateEntityListener($listenerName, $methodName, $className) |
| 270 | { |
| 271 | return new self(sprintf('Entity Listener "%s#%s()" in "%s" was already declared, but it must be declared only once.', $listenerName, $methodName, $className)); |
| 272 | } |
| 273 | public static function invalidFetchMode(string $className, string $fetchMode) : self |
| 274 | { |
| 275 | return new self("Entity '" . $className . "' has a mapping with invalid fetch mode '" . $fetchMode . "'"); |
| 276 | } |
| 277 | public static function invalidGeneratedMode($generatedMode) : self |
| 278 | { |
| 279 | return new self("Invalid generated mode '" . $generatedMode . "'"); |
| 280 | } |
| 281 | public static function compositeKeyAssignedIdGeneratorRequired($className) |
| 282 | { |
| 283 | return new self("Entity '" . $className . "' has a composite identifier but uses an ID generator other than manually assigning (Identity, Sequence). This is not supported."); |
| 284 | } |
| 285 | public static function invalidTargetEntityClass($targetEntity, $sourceEntity, $associationName) |
| 286 | { |
| 287 | return new self('The target-entity ' . $targetEntity . " cannot be found in '" . $sourceEntity . '#' . $associationName . "'."); |
| 288 | } |
| 289 | public static function invalidCascadeOption(array $cascades, $className, $propertyName) |
| 290 | { |
| 291 | $cascades = implode(', ', array_map(static function ($e) { |
| 292 | return "'" . $e . "'"; |
| 293 | }, $cascades)); |
| 294 | return new self(sprintf("You have specified invalid cascade options for %s::\$%s: %s; available options: 'remove', 'persist', 'refresh', 'merge', and 'detach'", $className, $propertyName, $cascades)); |
| 295 | } |
| 296 | public static function missingSequenceName($className) |
| 297 | { |
| 298 | return new self(sprintf('Missing "sequenceName" attribute for sequence id generator definition on class "%s".', $className)); |
| 299 | } |
| 300 | public static function infiniteEmbeddableNesting($className, $propertyName) |
| 301 | { |
| 302 | return new self(sprintf('Infinite nesting detected for embedded property %s::%s. ' . 'You cannot embed an embeddable from the same type inside an embeddable.', $className, $propertyName)); |
| 303 | } |
| 304 | public static function illegalOverrideOfInheritedProperty($className, $propertyName) |
| 305 | { |
| 306 | return new self(sprintf('Overrides are only allowed for fields or associations declared in mapped superclasses or traits, which is not the case for %s::%s.', $className, $propertyName)); |
| 307 | } |
| 308 | public static function invalidIndexConfiguration($className, $indexName) |
| 309 | { |
| 310 | return new self(sprintf('Index %s for entity %s should contain columns or fields values, but not both.', $indexName, $className)); |
| 311 | } |
| 312 | public static function invalidUniqueConstraintConfiguration($className, $indexName) |
| 313 | { |
| 314 | return new self(sprintf('Unique constraint %s for entity %s should contain columns or fields values, but not both.', $indexName, $className)); |
| 315 | } |
| 316 | public static function invalidOverrideType(string $expectdType, $givenValue) : self |
| 317 | { |
| 318 | return new self(sprintf('Expected %s, but %s was given.', $expectdType, get_debug_type($givenValue))); |
| 319 | } |
| 320 | public static function enumsRequirePhp81(string $className, string $fieldName) : self |
| 321 | { |
| 322 | return new self(sprintf('Enum types require PHP 8.1 in %s::$%s', $className, $fieldName)); |
| 323 | } |
| 324 | public static function backedEnumTypeRequired(string $className, string $fieldName, string $enumType) : self |
| 325 | { |
| 326 | return new self(sprintf('Attempting to map a non-backed enum type %s in entity %s::$%s. Please use backed enums only', $enumType, $className, $fieldName)); |
| 327 | } |
| 328 | public static function nonEnumTypeMapped(string $className, string $fieldName, string $enumType) : self |
| 329 | { |
| 330 | return new self(sprintf('Attempting to map non-enum type %s as enum in entity %s::$%s', $enumType, $className, $fieldName)); |
| 331 | } |
| 332 | public static function invalidEnumValue(string $className, string $fieldName, string $value, string $enumType, ValueError $previous) : self |
| 333 | { |
| 334 | return new self(sprintf(<<<'EXCEPTION' |
| 335 | Context: Trying to hydrate enum property "%s::$%s" |
| 336 | Problem: Case "%s" is not listed in enum "%s" |
| 337 | Solution: Either add the case to the enum type or migrate the database column to use another case of the enum |
| 338 | EXCEPTION |
| 339 | , $className, $fieldName, $value, $enumType), 0, $previous); |
| 340 | } |
| 341 | public static function fromLibXmlErrors(array $errors) : self |
| 342 | { |
| 343 | $formatter = static function (LibXMLError $error) : string { |
| 344 | return sprintf('libxml error: %s in %s at line %d', $error->message, $error->file, $error->line); |
| 345 | }; |
| 346 | return new self(implode(PHP_EOL, array_map($formatter, $errors))); |
| 347 | } |
| 348 | } |
| 349 |