/** * {@inheritdoc} */ public function loadClassMetadata(ClassMetadataInterface $metadata) { if ($this->getBaseMetadataFactory()->isTransient($metadata->getClassName())) { return; } $this->loadExtendedClassMetadata($this->getBaseMetadataFactory()->getMetadataFor($metadata->getClassName()), $metadata); }
/** * {@inheritdoc} */ protected function loadExtendedClassMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata) { $classReflection = $extendedClassMetadata->getClassReflection(); foreach ($classReflection->getProperties() as $property) { if ($baseClassMetadata->isMappedSuperclass && !$property->isPrivate() || $baseClassMetadata->isInheritedField($property->name) || isset($baseClassMetadata->associationMappings[$property->name]['inherited'])) { continue; } if ($uploadableAnnotation = $this->getAnnotationReader()->getPropertyAnnotation($property, self::UPLOADABLE)) { $extendedClassMetadata->addUploadableProperty($property->getName(), $uploadableAnnotation->targetField, $uploadableAnnotation->filesystem, $uploadableAnnotation->keymaker, $uploadableAnnotation->keyLength, $uploadableAnnotation->keyPattern); } } }
/** * {@inheritDoc} */ protected function loadExtendedClassMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata) { $classReflection = $extendedClassMetadata->getClassReflection(); foreach ($classReflection->getProperties() as $property) { if ($baseClassMetadata->isMappedSuperclass && !$property->isPrivate() || $baseClassMetadata->isInheritedField($property->name) || isset($baseClassMetadata->associationMappings[$property->name]['inherited'])) { continue; } if ($translatableAnnotation = $this->getAnnotationReader()->getPropertyAnnotation($property, self::TRANSLATABLE)) { if (!isset($translatableAnnotation->mappedBy)) { throw new AnnotationException('Annotation \'Translatable\' in property \'' . $property . '\' of class \'' . $baseClassMetadata->name . '\' does not have required \'mappedBy\' attribute'); } $extendedClassMetadata->addTranslatableProperty($translatableAnnotation->mappedBy, $property->getName(), $translatableAnnotation->targetField); } if ($languageAnnotation = $this->getAnnotationReader()->getPropertyAnnotation($property, self::LOCALE)) { $extendedClassMetadata->localeProperty = $property->getName(); } } }
/** * {@inheritDoc} */ protected function validateExtendedMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata) { if ($extendedClassMetadata->hasTranslatableProperties()) { if (!isset($extendedClassMetadata->localeProperty)) { throw new Exception\MappingException('Entity \'' . $baseClassMetadata->name . '\' has translatable properties so it must have property marked with @Translatable\\Language annotation'); } $translatableProperties = $extendedClassMetadata->getTranslatableProperties(); foreach ($translatableProperties as $translation => $properties) { if (!$baseClassMetadata->hasAssociation($translation) || !$baseClassMetadata->isCollectionValuedAssociation($translation)) { throw new Exception\MappingException('Field \'' . $translation . '\' in entity \'' . $baseClassMetadata->name . '\' has to be a OneToMany association'); } } } if (isset($extendedClassMetadata->localeProperty)) { if ($extendedClassMetadata->hasTranslatableProperties() && ($baseClassMetadata->hasField($extendedClassMetadata->localeProperty) || $baseClassMetadata->hasAssociation($extendedClassMetadata->localeProperty))) { throw new Exception\MappingException('Entity \'' . $baseClassMetadata->name . '\' seems to be a translatable entity so its \'' . $extendedClassMetadata->localeProperty . '\' field must not be persistent'); } else { if (!$extendedClassMetadata->hasTranslatableProperties() && !$baseClassMetadata->hasField($extendedClassMetadata->localeProperty) && !$baseClassMetadata->hasAssociation($extendedClassMetadata->localeProperty)) { throw new Exception\MappingException('Entity \'' . $baseClassMetadata->name . '\' seems to be a translation entity so its \'' . $extendedClassMetadata->localeProperty . '\' field must be persistent'); } } } }
/** * {@inheritdoc} */ protected function validateExtendedMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata) { foreach ($extendedClassMetadata->getUploadableProperties() as $field => $options) { if (empty($options['targetField'])) { throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" does not have required "targetField" attribute, or attribute is empty.', $field, $baseClassMetadata->name)); } if (!property_exists($baseClassMetadata->name, $options['targetField'])) { throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" has "targetField" set to "%s", which doesn\'t exist.', $field, $baseClassMetadata->name, $options['targetField'])); } if ($baseClassMetadata->hasField($options['targetField'])) { throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" have "targetField" that points at already mapped field ("%s").', $field, $baseClassMetadata->name, $options['targetField'])); } if (!$baseClassMetadata->hasField($field)) { throw new MappingException(sprintf('Property "%s" of class "%s" have mapping "Uploadable" but isn\'t mapped as Doctrine\'s column.', $field, $baseClassMetadata->name, $options['targetField'])); } if (!is_null($options['keyLength']) and !is_numeric($options['keyLength'])) { throw new MappingException(sprintf('Property "%s" of class "%s" have mapping "Uploadable" with key length is not a number.', $field, $baseClassMetadata->name, $options['targetField'])); } if (!is_null($options['keyLength']) and $options['keyLength'] < 1) { throw new MappingException(sprintf('Property "%s" of class "%s" have mapping "Uploadable" with key length less than 1.', $field, $baseClassMetadata->name, $options['targetField'])); } if (!is_null($options['keymaker']) and !$options['keymaker'] instanceof KeymakerInterface) { throw new MappingException(sprintf('Mapping "Uploadable" in property "%s" of class "%s" does have keymaker that isn\'t instance of expected FSi\\DoctrineExtensions\\Uploadable\\Keymaker\\KeymakerInterface ("%s" given).', $field, $baseClassMetadata->name, is_object($options['keymaker']) ? get_class($options['keymaker']) : gettype($options['keymaker']))); } } }
/** * {@inheritDoc} */ protected function validateExtendedMetadata(ClassMetadata $baseClassMetadata, ClassMetadataInterface $extendedClassMetadata) { if ($extendedClassMetadata->hasTranslatableProperties()) { $this->validateTranslatableLocaleProperty($baseClassMetadata, $extendedClassMetadata); $this->validateTranslatableProperties($baseClassMetadata, $extendedClassMetadata); } elseif (isset($extendedClassMetadata->localeProperty)) { $this->validateTranslationLocaleProperty($baseClassMetadata, $extendedClassMetadata); } }