PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / doctrine / orm / src / Mapping / Driver / AttributeDriver.php
mailpoet / vendor-prefixed / doctrine / orm / src / Mapping / Driver Last commit date
AnnotationDriver.php 9 months ago AttributeDriver.php 9 months ago AttributeReader.php 9 months ago CompatibilityAnnotationDriver.php 9 months ago DriverChain.php 9 months ago PHPDriver.php 9 months ago ReflectionBasedDriver.php 9 months ago RepeatableAttributeCollection.php 9 months ago StaticPHPDriver.php 9 months ago index.php 9 months ago
AttributeDriver.php
457 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Doctrine\ORM\Mapping\Driver;
4 if (!defined('ABSPATH')) exit;
5 use MailPoetVendor\Doctrine\Deprecations\Deprecation;
6 use MailPoetVendor\Doctrine\ORM\Events;
7 use MailPoetVendor\Doctrine\ORM\Mapping;
8 use MailPoetVendor\Doctrine\ORM\Mapping\Builder\EntityListenerBuilder;
9 use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata;
10 use MailPoetVendor\Doctrine\ORM\Mapping\MappingAttribute;
11 use MailPoetVendor\Doctrine\ORM\Mapping\MappingException;
12 use MailPoetVendor\Doctrine\Persistence\Mapping\ClassMetadata as PersistenceClassMetadata;
13 use MailPoetVendor\Doctrine\Persistence\Mapping\Driver\ColocatedMappingDriver;
14 use LogicException;
15 use ReflectionClass;
16 use ReflectionMethod;
17 use function class_exists;
18 use function constant;
19 use function defined;
20 use function get_class;
21 use const PHP_VERSION_ID;
22 class AttributeDriver extends CompatibilityAnnotationDriver
23 {
24 use ColocatedMappingDriver;
25 use ReflectionBasedDriver;
26 private const ENTITY_ATTRIBUTE_CLASSES = [Mapping\Entity::class => 1, Mapping\MappedSuperclass::class => 2];
27 protected $entityAnnotationClasses = self::ENTITY_ATTRIBUTE_CLASSES;
28 protected $reader;
29 public function __construct(array $paths, bool $reportFieldsWhereDeclared = \false)
30 {
31 if (PHP_VERSION_ID < 80000) {
32 throw new LogicException('The attribute metadata driver cannot be enabled on PHP 7. Please upgrade to PHP 8 or choose a different' . ' metadata driver.');
33 }
34 $this->reader = new AttributeReader();
35 $this->addPaths($paths);
36 // @phpstan-ignore property.deprecated
37 if ($this->entityAnnotationClasses !== self::ENTITY_ATTRIBUTE_CLASSES) {
38 Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/10204', 'Changing the value of %s::$entityAnnotationClasses is deprecated and will have no effect in Doctrine ORM 3.0.', self::class);
39 }
40 if (!$reportFieldsWhereDeclared) {
41 Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/10455', 'In ORM 3.0, the AttributeDriver will report fields for the classes where they are declared. This may uncover invalid mapping configurations. To opt into the new mode today, set the "reportFieldsWhereDeclared" constructor parameter to true.', self::class);
42 }
43 $this->reportFieldsWhereDeclared = $reportFieldsWhereDeclared;
44 }
45 public function getReader()
46 {
47 Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/9587', '%s is deprecated with no replacement', __METHOD__);
48 return $this->reader;
49 }
50 public function isTransient($className)
51 {
52 $classAttributes = $this->reader->getClassAttributes(new ReflectionClass($className));
53 foreach ($classAttributes as $a) {
54 $attr = $a instanceof RepeatableAttributeCollection ? $a[0] : $a;
55 // @phpstan-ignore property.deprecated
56 if (isset($this->entityAnnotationClasses[get_class($attr)])) {
57 return \false;
58 }
59 }
60 return \true;
61 }
62 public function loadMetadataForClass($className, PersistenceClassMetadata $metadata) : void
63 {
64 $reflectionClass = $metadata->getReflectionClass() ?? new ReflectionClass($metadata->name);
65 $classAttributes = $this->reader->getClassAttributes($reflectionClass);
66 // Evaluate Entity attribute
67 if (isset($classAttributes[Mapping\Entity::class])) {
68 $entityAttribute = $classAttributes[Mapping\Entity::class];
69 if ($entityAttribute->repositoryClass !== null) {
70 $metadata->setCustomRepositoryClass($entityAttribute->repositoryClass);
71 }
72 if ($entityAttribute->readOnly) {
73 $metadata->markReadOnly();
74 }
75 } elseif (isset($classAttributes[Mapping\MappedSuperclass::class])) {
76 $mappedSuperclassAttribute = $classAttributes[Mapping\MappedSuperclass::class];
77 $metadata->setCustomRepositoryClass($mappedSuperclassAttribute->repositoryClass);
78 $metadata->isMappedSuperclass = \true;
79 } elseif (isset($classAttributes[Mapping\Embeddable::class])) {
80 $metadata->isEmbeddedClass = \true;
81 } else {
82 throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className);
83 }
84 $primaryTable = [];
85 if (isset($classAttributes[Mapping\Table::class])) {
86 $tableAnnot = $classAttributes[Mapping\Table::class];
87 $primaryTable['name'] = $tableAnnot->name;
88 $primaryTable['schema'] = $tableAnnot->schema;
89 if ($tableAnnot->options) {
90 $primaryTable['options'] = $tableAnnot->options;
91 }
92 }
93 if (isset($classAttributes[Mapping\Index::class])) {
94 foreach ($classAttributes[Mapping\Index::class] as $idx => $indexAnnot) {
95 $index = [];
96 if (!empty($indexAnnot->columns)) {
97 $index['columns'] = $indexAnnot->columns;
98 }
99 if (!empty($indexAnnot->fields)) {
100 $index['fields'] = $indexAnnot->fields;
101 }
102 if (isset($index['columns'], $index['fields']) || !isset($index['columns']) && !isset($index['fields'])) {
103 throw MappingException::invalidIndexConfiguration($className, (string) ($indexAnnot->name ?? $idx));
104 }
105 if (!empty($indexAnnot->flags)) {
106 $index['flags'] = $indexAnnot->flags;
107 }
108 if (!empty($indexAnnot->options)) {
109 $index['options'] = $indexAnnot->options;
110 }
111 if (!empty($indexAnnot->name)) {
112 $primaryTable['indexes'][$indexAnnot->name] = $index;
113 } else {
114 $primaryTable['indexes'][] = $index;
115 }
116 }
117 }
118 if (isset($classAttributes[Mapping\UniqueConstraint::class])) {
119 foreach ($classAttributes[Mapping\UniqueConstraint::class] as $idx => $uniqueConstraintAnnot) {
120 $uniqueConstraint = [];
121 if (!empty($uniqueConstraintAnnot->columns)) {
122 $uniqueConstraint['columns'] = $uniqueConstraintAnnot->columns;
123 }
124 if (!empty($uniqueConstraintAnnot->fields)) {
125 $uniqueConstraint['fields'] = $uniqueConstraintAnnot->fields;
126 }
127 if (isset($uniqueConstraint['columns'], $uniqueConstraint['fields']) || !isset($uniqueConstraint['columns']) && !isset($uniqueConstraint['fields'])) {
128 throw MappingException::invalidUniqueConstraintConfiguration($className, (string) ($uniqueConstraintAnnot->name ?? $idx));
129 }
130 if (!empty($uniqueConstraintAnnot->options)) {
131 $uniqueConstraint['options'] = $uniqueConstraintAnnot->options;
132 }
133 if (!empty($uniqueConstraintAnnot->name)) {
134 $primaryTable['uniqueConstraints'][$uniqueConstraintAnnot->name] = $uniqueConstraint;
135 } else {
136 $primaryTable['uniqueConstraints'][] = $uniqueConstraint;
137 }
138 }
139 }
140 $metadata->setPrimaryTable($primaryTable);
141 // Evaluate #[Cache] attribute
142 if (isset($classAttributes[Mapping\Cache::class])) {
143 $cacheAttribute = $classAttributes[Mapping\Cache::class];
144 $cacheMap = ['region' => $cacheAttribute->region, 'usage' => constant('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::CACHE_USAGE_' . $cacheAttribute->usage)];
145 $metadata->enableCache($cacheMap);
146 }
147 // Evaluate InheritanceType attribute
148 if (isset($classAttributes[Mapping\InheritanceType::class])) {
149 $inheritanceTypeAttribute = $classAttributes[Mapping\InheritanceType::class];
150 $metadata->setInheritanceType(constant('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::INHERITANCE_TYPE_' . $inheritanceTypeAttribute->value));
151 if ($metadata->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) {
152 // Evaluate DiscriminatorColumn attribute
153 if (isset($classAttributes[Mapping\DiscriminatorColumn::class])) {
154 $discrColumnAttribute = $classAttributes[Mapping\DiscriminatorColumn::class];
155 $columnDef = ['name' => isset($discrColumnAttribute->name) ? (string) $discrColumnAttribute->name : null, 'type' => isset($discrColumnAttribute->type) ? (string) $discrColumnAttribute->type : 'string', 'length' => isset($discrColumnAttribute->length) ? (int) $discrColumnAttribute->length : 255, 'columnDefinition' => isset($discrColumnAttribute->columnDefinition) ? (string) $discrColumnAttribute->columnDefinition : null, 'enumType' => isset($discrColumnAttribute->enumType) ? (string) $discrColumnAttribute->enumType : null];
156 if ($discrColumnAttribute->options) {
157 $columnDef['options'] = (array) $discrColumnAttribute->options;
158 }
159 $metadata->setDiscriminatorColumn($columnDef);
160 } else {
161 $metadata->setDiscriminatorColumn(['name' => 'dtype', 'type' => 'string', 'length' => 255]);
162 }
163 // Evaluate DiscriminatorMap attribute
164 if (isset($classAttributes[Mapping\DiscriminatorMap::class])) {
165 $discrMapAttribute = $classAttributes[Mapping\DiscriminatorMap::class];
166 $metadata->setDiscriminatorMap($discrMapAttribute->value);
167 }
168 }
169 }
170 // Evaluate DoctrineChangeTrackingPolicy attribute
171 if (isset($classAttributes[Mapping\ChangeTrackingPolicy::class])) {
172 $changeTrackingAttribute = $classAttributes[Mapping\ChangeTrackingPolicy::class];
173 $metadata->setChangeTrackingPolicy(constant('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::CHANGETRACKING_' . $changeTrackingAttribute->value));
174 }
175 foreach ($reflectionClass->getProperties() as $property) {
176 if ($this->isRepeatedPropertyDeclaration($property, $metadata)) {
177 continue;
178 }
179 $mapping = [];
180 $mapping['fieldName'] = $property->name;
181 // Evaluate #[Cache] attribute
182 $cacheAttribute = $this->reader->getPropertyAttribute($property, Mapping\Cache::class);
183 if ($cacheAttribute !== null) {
184 $mapping['cache'] = $metadata->getAssociationCacheDefaults($mapping['fieldName'], ['usage' => (int) constant('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::CACHE_USAGE_' . $cacheAttribute->usage), 'region' => $cacheAttribute->region]);
185 }
186 // Check for JoinColumn/JoinColumns attributes
187 $joinColumns = [];
188 $joinColumnAttributes = $this->reader->getPropertyAttributeCollection($property, Mapping\JoinColumn::class);
189 foreach ($joinColumnAttributes as $joinColumnAttribute) {
190 $joinColumns[] = $this->joinColumnToArray($joinColumnAttribute);
191 }
192 // Field can only be attributed with one of:
193 // Column, OneToOne, OneToMany, ManyToOne, ManyToMany, Embedded
194 $columnAttribute = $this->reader->getPropertyAttribute($property, Mapping\Column::class);
195 $oneToOneAttribute = $this->reader->getPropertyAttribute($property, Mapping\OneToOne::class);
196 $oneToManyAttribute = $this->reader->getPropertyAttribute($property, Mapping\OneToMany::class);
197 $manyToOneAttribute = $this->reader->getPropertyAttribute($property, Mapping\ManyToOne::class);
198 $manyToManyAttribute = $this->reader->getPropertyAttribute($property, Mapping\ManyToMany::class);
199 $embeddedAttribute = $this->reader->getPropertyAttribute($property, Mapping\Embedded::class);
200 if ($columnAttribute !== null) {
201 $mapping = $this->columnToArray($property->name, $columnAttribute);
202 if ($this->reader->getPropertyAttribute($property, Mapping\Id::class)) {
203 $mapping['id'] = \true;
204 }
205 $generatedValueAttribute = $this->reader->getPropertyAttribute($property, Mapping\GeneratedValue::class);
206 if ($generatedValueAttribute !== null) {
207 $metadata->setIdGeneratorType(constant('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::GENERATOR_TYPE_' . $generatedValueAttribute->strategy));
208 }
209 if ($this->reader->getPropertyAttribute($property, Mapping\Version::class)) {
210 $metadata->setVersionMapping($mapping);
211 }
212 $metadata->mapField($mapping);
213 // Check for SequenceGenerator/TableGenerator definition
214 $seqGeneratorAttribute = $this->reader->getPropertyAttribute($property, Mapping\SequenceGenerator::class);
215 $customGeneratorAttribute = $this->reader->getPropertyAttribute($property, Mapping\CustomIdGenerator::class);
216 if ($seqGeneratorAttribute !== null) {
217 $metadata->setSequenceGeneratorDefinition(['sequenceName' => $seqGeneratorAttribute->sequenceName, 'allocationSize' => $seqGeneratorAttribute->allocationSize, 'initialValue' => $seqGeneratorAttribute->initialValue]);
218 } elseif ($customGeneratorAttribute !== null) {
219 $metadata->setCustomGeneratorDefinition(['class' => $customGeneratorAttribute->class]);
220 }
221 } elseif ($oneToOneAttribute !== null) {
222 if ($this->reader->getPropertyAttribute($property, Mapping\Id::class)) {
223 $mapping['id'] = \true;
224 }
225 $mapping['targetEntity'] = $oneToOneAttribute->targetEntity;
226 $mapping['joinColumns'] = $joinColumns;
227 $mapping['mappedBy'] = $oneToOneAttribute->mappedBy;
228 $mapping['inversedBy'] = $oneToOneAttribute->inversedBy;
229 $mapping['cascade'] = $oneToOneAttribute->cascade;
230 $mapping['orphanRemoval'] = $oneToOneAttribute->orphanRemoval;
231 $mapping['fetch'] = $this->getFetchMode($className, $oneToOneAttribute->fetch);
232 $metadata->mapOneToOne($mapping);
233 } elseif ($oneToManyAttribute !== null) {
234 $mapping['mappedBy'] = $oneToManyAttribute->mappedBy;
235 $mapping['targetEntity'] = $oneToManyAttribute->targetEntity;
236 $mapping['cascade'] = $oneToManyAttribute->cascade;
237 $mapping['indexBy'] = $oneToManyAttribute->indexBy;
238 $mapping['orphanRemoval'] = $oneToManyAttribute->orphanRemoval;
239 $mapping['fetch'] = $this->getFetchMode($className, $oneToManyAttribute->fetch);
240 $orderByAttribute = $this->reader->getPropertyAttribute($property, Mapping\OrderBy::class);
241 if ($orderByAttribute !== null) {
242 $mapping['orderBy'] = $orderByAttribute->value;
243 }
244 $metadata->mapOneToMany($mapping);
245 } elseif ($manyToOneAttribute !== null) {
246 $idAttribute = $this->reader->getPropertyAttribute($property, Mapping\Id::class);
247 if ($idAttribute !== null) {
248 $mapping['id'] = \true;
249 }
250 $mapping['joinColumns'] = $joinColumns;
251 $mapping['cascade'] = $manyToOneAttribute->cascade;
252 $mapping['inversedBy'] = $manyToOneAttribute->inversedBy;
253 $mapping['targetEntity'] = $manyToOneAttribute->targetEntity;
254 $mapping['fetch'] = $this->getFetchMode($className, $manyToOneAttribute->fetch);
255 $metadata->mapManyToOne($mapping);
256 } elseif ($manyToManyAttribute !== null) {
257 $joinTable = [];
258 $joinTableAttribute = $this->reader->getPropertyAttribute($property, Mapping\JoinTable::class);
259 if ($joinTableAttribute !== null) {
260 $joinTable = ['name' => $joinTableAttribute->name, 'schema' => $joinTableAttribute->schema];
261 if ($joinTableAttribute->options) {
262 $joinTable['options'] = $joinTableAttribute->options;
263 }
264 foreach ($joinTableAttribute->joinColumns as $joinColumn) {
265 $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumn);
266 }
267 foreach ($joinTableAttribute->inverseJoinColumns as $joinColumn) {
268 $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumn);
269 }
270 }
271 foreach ($this->reader->getPropertyAttributeCollection($property, Mapping\JoinColumn::class) as $joinColumn) {
272 $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumn);
273 }
274 foreach ($this->reader->getPropertyAttributeCollection($property, Mapping\InverseJoinColumn::class) as $joinColumn) {
275 $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumn);
276 }
277 $mapping['joinTable'] = $joinTable;
278 $mapping['targetEntity'] = $manyToManyAttribute->targetEntity;
279 $mapping['mappedBy'] = $manyToManyAttribute->mappedBy;
280 $mapping['inversedBy'] = $manyToManyAttribute->inversedBy;
281 $mapping['cascade'] = $manyToManyAttribute->cascade;
282 $mapping['indexBy'] = $manyToManyAttribute->indexBy;
283 $mapping['orphanRemoval'] = $manyToManyAttribute->orphanRemoval;
284 $mapping['fetch'] = $this->getFetchMode($className, $manyToManyAttribute->fetch);
285 $orderByAttribute = $this->reader->getPropertyAttribute($property, Mapping\OrderBy::class);
286 if ($orderByAttribute !== null) {
287 $mapping['orderBy'] = $orderByAttribute->value;
288 }
289 $metadata->mapManyToMany($mapping);
290 } elseif ($embeddedAttribute !== null) {
291 $mapping['class'] = $embeddedAttribute->class;
292 $mapping['columnPrefix'] = $embeddedAttribute->columnPrefix;
293 $metadata->mapEmbedded($mapping);
294 }
295 }
296 // Evaluate AssociationOverrides attribute
297 if (isset($classAttributes[Mapping\AssociationOverrides::class])) {
298 $associationOverride = $classAttributes[Mapping\AssociationOverrides::class];
299 foreach ($associationOverride->overrides as $associationOverride) {
300 $override = [];
301 $fieldName = $associationOverride->name;
302 // Check for JoinColumn/JoinColumns attributes
303 if ($associationOverride->joinColumns) {
304 $joinColumns = [];
305 foreach ($associationOverride->joinColumns as $joinColumn) {
306 $joinColumns[] = $this->joinColumnToArray($joinColumn);
307 }
308 $override['joinColumns'] = $joinColumns;
309 }
310 if ($associationOverride->inverseJoinColumns) {
311 $joinColumns = [];
312 foreach ($associationOverride->inverseJoinColumns as $joinColumn) {
313 $joinColumns[] = $this->joinColumnToArray($joinColumn);
314 }
315 $override['inverseJoinColumns'] = $joinColumns;
316 }
317 // Check for JoinTable attributes
318 if ($associationOverride->joinTable) {
319 $joinTableAnnot = $associationOverride->joinTable;
320 $joinTable = ['name' => $joinTableAnnot->name, 'schema' => $joinTableAnnot->schema, 'joinColumns' => $override['joinColumns'] ?? [], 'inverseJoinColumns' => $override['inverseJoinColumns'] ?? []];
321 unset($override['joinColumns'], $override['inverseJoinColumns']);
322 $override['joinTable'] = $joinTable;
323 }
324 // Check for inversedBy
325 if ($associationOverride->inversedBy) {
326 $override['inversedBy'] = $associationOverride->inversedBy;
327 }
328 // Check for `fetch`
329 if ($associationOverride->fetch) {
330 $override['fetch'] = constant(ClassMetadata::class . '::FETCH_' . $associationOverride->fetch);
331 }
332 $metadata->setAssociationOverride($fieldName, $override);
333 }
334 }
335 // Evaluate AttributeOverrides attribute
336 if (isset($classAttributes[Mapping\AttributeOverrides::class])) {
337 $attributeOverridesAnnot = $classAttributes[Mapping\AttributeOverrides::class];
338 foreach ($attributeOverridesAnnot->overrides as $attributeOverride) {
339 $mapping = $this->columnToArray($attributeOverride->name, $attributeOverride->column);
340 $metadata->setAttributeOverride($attributeOverride->name, $mapping);
341 }
342 }
343 // Evaluate EntityListeners attribute
344 if (isset($classAttributes[Mapping\EntityListeners::class])) {
345 $entityListenersAttribute = $classAttributes[Mapping\EntityListeners::class];
346 foreach ($entityListenersAttribute->value as $item) {
347 $listenerClassName = $metadata->fullyQualifiedClassName($item);
348 if (!class_exists($listenerClassName)) {
349 throw MappingException::entityListenerClassNotFound($listenerClassName, $className);
350 }
351 $hasMapping = \false;
352 $listenerClass = new ReflectionClass($listenerClassName);
353 foreach ($listenerClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
354 // find method callbacks.
355 $callbacks = $this->getMethodCallbacks($method);
356 $hasMapping = $hasMapping ?: !empty($callbacks);
357 foreach ($callbacks as $value) {
358 $metadata->addEntityListener($value[1], $listenerClassName, $value[0]);
359 }
360 }
361 // Evaluate the listener using naming convention.
362 if (!$hasMapping) {
363 EntityListenerBuilder::bindEntityListener($metadata, $listenerClassName);
364 }
365 }
366 }
367 // Evaluate #[HasLifecycleCallbacks] attribute
368 if (isset($classAttributes[Mapping\HasLifecycleCallbacks::class])) {
369 foreach ($reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
370 foreach ($this->getMethodCallbacks($method) as $value) {
371 $metadata->addLifecycleCallback($value[0], $value[1]);
372 }
373 }
374 }
375 }
376 private function getFetchMode(string $className, string $fetchMode) : int
377 {
378 if (!defined('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::FETCH_' . $fetchMode)) {
379 throw MappingException::invalidFetchMode($className, $fetchMode);
380 }
381 return constant('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::FETCH_' . $fetchMode);
382 }
383 private function getGeneratedMode(string $generatedMode) : int
384 {
385 if (!defined('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::GENERATED_' . $generatedMode)) {
386 throw MappingException::invalidGeneratedMode($generatedMode);
387 }
388 return constant('MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata::GENERATED_' . $generatedMode);
389 }
390 private function getMethodCallbacks(ReflectionMethod $method) : array
391 {
392 $callbacks = [];
393 $attributes = $this->reader->getMethodAttributes($method);
394 foreach ($attributes as $attribute) {
395 if ($attribute instanceof Mapping\PrePersist) {
396 $callbacks[] = [$method->name, Events::prePersist];
397 }
398 if ($attribute instanceof Mapping\PostPersist) {
399 $callbacks[] = [$method->name, Events::postPersist];
400 }
401 if ($attribute instanceof Mapping\PreUpdate) {
402 $callbacks[] = [$method->name, Events::preUpdate];
403 }
404 if ($attribute instanceof Mapping\PostUpdate) {
405 $callbacks[] = [$method->name, Events::postUpdate];
406 }
407 if ($attribute instanceof Mapping\PreRemove) {
408 $callbacks[] = [$method->name, Events::preRemove];
409 }
410 if ($attribute instanceof Mapping\PostRemove) {
411 $callbacks[] = [$method->name, Events::postRemove];
412 }
413 if ($attribute instanceof Mapping\PostLoad) {
414 $callbacks[] = [$method->name, Events::postLoad];
415 }
416 if ($attribute instanceof Mapping\PreFlush) {
417 $callbacks[] = [$method->name, Events::preFlush];
418 }
419 }
420 return $callbacks;
421 }
422 private function joinColumnToArray($joinColumn) : array
423 {
424 $mapping = ['name' => $joinColumn->name, 'unique' => $joinColumn->unique, 'nullable' => $joinColumn->nullable, 'onDelete' => $joinColumn->onDelete, 'columnDefinition' => $joinColumn->columnDefinition, 'referencedColumnName' => $joinColumn->referencedColumnName];
425 if ($joinColumn->options) {
426 $mapping['options'] = $joinColumn->options;
427 }
428 return $mapping;
429 }
430 private function columnToArray(string $fieldName, Mapping\Column $column) : array
431 {
432 $mapping = ['fieldName' => $fieldName, 'type' => $column->type, 'scale' => $column->scale, 'length' => $column->length, 'unique' => $column->unique, 'nullable' => $column->nullable, 'precision' => $column->precision];
433 if ($column->options) {
434 $mapping['options'] = $column->options;
435 }
436 if (isset($column->name)) {
437 $mapping['columnName'] = $column->name;
438 }
439 if (isset($column->columnDefinition)) {
440 $mapping['columnDefinition'] = $column->columnDefinition;
441 }
442 if ($column->updatable === \false) {
443 $mapping['notUpdatable'] = \true;
444 }
445 if ($column->insertable === \false) {
446 $mapping['notInsertable'] = \true;
447 }
448 if ($column->generated !== null) {
449 $mapping['generated'] = $this->getGeneratedMode($column->generated);
450 }
451 if ($column->enumType) {
452 $mapping['enumType'] = $column->enumType;
453 }
454 return $mapping;
455 }
456 }
457