diff --git a/UPGRADE-2.16.md b/UPGRADE-2.16.md index e2cd841772..f015afed23 100644 --- a/UPGRADE-2.16.md +++ b/UPGRADE-2.16.md @@ -1,5 +1,30 @@ # UPGRADE FROM 2.15 to 2.16 +## Attribute namespaces + +Doctrine annotations are already deprecated in favor of PHP attributes. +As of MongoDB ODM 2.16, the namespace of attribute classes has been changed from +`Doctrine\ODM\MongoDB\Mapping\Annotations` to `Doctrine\ODM\MongoDB\Mapping\Attribute`. +The old classes continue to work, but they are deprecated and will be removed in 3.0. + +```diff +- use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; ++ use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; + + #[ODM\Document] + class User + { + #[ODM\Id] + private string $id; + + #[ODM\Field] + public string $name; + } +``` + +The enum `Doctrine\ODM\MongoDB\Mapping\Annotations\EncryptQuery` has been moved to +`Doctrine\ODM\MongoDB\Mapping\Attribute\EncryptQuery`. + ## Package `doctrine/cache` no longer required If you use `Doctrine\ODM\MongoDB\Configuration::getMetadataCacheImpl()`, diff --git a/composer.json b/composer.json index d994a6ff55..879844894d 100644 --- a/composer.json +++ b/composer.json @@ -38,6 +38,7 @@ "psr/cache": "^1.0 || ^2.0 || ^3.0", "symfony/console": "^5.4 || ^6.4 || ^7.0 || ^8.0", "symfony/deprecation-contracts": "^2.2 || ^3.0", + "symfony/polyfill-php84": "^1.33", "symfony/var-dumper": "^5.4 || ^6.4 || ^7.0 || ^8.0", "symfony/var-exporter": "^6.4.1 || ^7.0 || ^8.0" }, diff --git a/docs/en/cookbook/mapping-classes-to-orm-and-odm.rst b/docs/en/cookbook/mapping-classes-to-orm-and-odm.rst index 4d6fd90883..de4f924a4b 100644 --- a/docs/en/cookbook/mapping-classes-to-orm-and-odm.rst +++ b/docs/en/cookbook/mapping-classes-to-orm-and-odm.rst @@ -113,7 +113,7 @@ Now map the same class to the Doctrine MongoDB ODM: namespace Documents\Blog; use Documents\Blog\Repository\ODM\BlogPostRepository; - use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; #[ODM\Document(repositoryClass: BlogPostRepository::class)] class BlogPost diff --git a/docs/en/cookbook/queryable-encryption.rst b/docs/en/cookbook/queryable-encryption.rst index cf0f0ed10b..2613607be1 100644 --- a/docs/en/cookbook/queryable-encryption.rst +++ b/docs/en/cookbook/queryable-encryption.rst @@ -47,9 +47,8 @@ fields that require encryption. namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Encrypt; - use Doctrine\ODM\MongoDB\Mapping\Annotations\EncryptQuery; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; + use Doctrine\ODM\MongoDB\Mapping\EncryptQuery; #[ODM\Document] class Patient @@ -69,7 +68,7 @@ fields that require encryption. * This allows us to find a patient by their exact SSN. */ #[ODM\Field(type: 'string')] - #[Encrypt(queryType: EncryptQuery::Equality)] + #[ODM\Encrypt(queryType: EncryptQuery::Equality)] public string $ssn; /** @@ -77,7 +76,7 @@ fields that require encryption. * By not specifying a queryType, we make it non-queryable. */ #[ODM\EmbedOne(targetDocument: Billing::class)] - #[Encrypt] + #[ODM\Encrypt] public Billing $billing; /** diff --git a/docs/en/cookbook/time-series-data.rst b/docs/en/cookbook/time-series-data.rst index 3614153f52..9cd225e7f1 100644 --- a/docs/en/cookbook/time-series-data.rst +++ b/docs/en/cookbook/time-series-data.rst @@ -47,7 +47,7 @@ First, we define the model for our data: 'vector', @@ -1501,14 +1498,14 @@ Example: )] class VectorEmbedding { - #[Id] + #[ODM\Id] public ?string $id = null; /** @var list */ - #[Field(type: Type::COLLECTION)] + #[ODM\Field(type: Type::COLLECTION)] public array $plotEmbeddingVoyage3Large = []; - #[Field] + #[ODM\Field] public string $category; } diff --git a/docs/en/reference/basic-mapping.rst b/docs/en/reference/basic-mapping.rst index f47d912cc3..9f1553edd4 100644 --- a/docs/en/reference/basic-mapping.rst +++ b/docs/en/reference/basic-mapping.rst @@ -57,9 +57,9 @@ to be designated as a document. This can be done through the namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; - #[Document] + #[ODM\Document] class User { } @@ -88,9 +88,9 @@ option as follows: namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; - #[Document(db: 'my_db', collection: 'users')] + #[ODM\Document(db: 'my_db', collection: 'users')] class User { } @@ -257,13 +257,12 @@ Here is an example: namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Id; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; - #[Document] + #[ODM\Document] class User { - #[Id] + #[ODM\Id] public string $id; } @@ -309,13 +308,12 @@ Here is an example how to manually set a string identifier for your documents: namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Id; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; - #[Document] + #[ODM\Document] class MyPersistentClass { - #[Id(strategy: 'NONE', type: 'string')] + #[ODM\Id(strategy: 'NONE', type: 'string')] public string $id; //... @@ -430,15 +428,14 @@ Example: namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Field; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; - #[Document] + #[ODM\Document] class User { // ... - #[Field] + #[ODM\Field] public string $username; } diff --git a/docs/en/reference/introduction.rst b/docs/en/reference/introduction.rst index c7a06ec622..baaa252618 100644 --- a/docs/en/reference/introduction.rst +++ b/docs/en/reference/introduction.rst @@ -46,7 +46,7 @@ the features. use DateTimeImmutable; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; - use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; #[ODM\MappedSuperclass] abstract class BaseEmployee diff --git a/docs/en/reference/storing-files-with-gridfs.rst b/docs/en/reference/storing-files-with-gridfs.rst index 044bfe4f07..73e3d86288 100644 --- a/docs/en/reference/storing-files-with-gridfs.rst +++ b/docs/en/reference/storing-files-with-gridfs.rst @@ -41,28 +41,27 @@ Mapping documents as GridFS files namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations\File; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Id; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; #[File(bucketName: 'image')] class Image { - #[Id] + #[ODM\Id] private ?string $id; - #[File\Filename] + #[ODM\File\Filename] private ?string $name; - #[File\UploadDate] + #[ODM\File\UploadDate] private \DateTimeInterface $uploadDate; - #[File\Length] + #[ODM\File\Length] private ?int $length; - #[File\ChunkSize] + #[ODM\File\ChunkSize] private ?int $chunkSize; - #[File\Metadata(targetDocument: ImageMetadata::class)] + #[ODM\File\Metadata(targetDocument: ImageMetadata::class)] private ImageMetadata $metadata; public function getId(): ?string @@ -131,13 +130,12 @@ The ``ImageMetadata`` class must be an embedded document: namespace Documents; - use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbeddedDocument; - use Doctrine\ODM\MongoDB\Mapping\Annotations\Field; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; - #[EmbeddedDocument] + #[ODM\EmbeddedDocument] class ImageMetadata { - #[Field(type: 'string')] + #[ODM\Field(type: 'string')] private string $contentType; public function __construct(string $contentType) diff --git a/docs/en/tutorials/getting-started.rst b/docs/en/tutorials/getting-started.rst index af64d5571f..e05ef484ae 100755 --- a/docs/en/tutorials/getting-started.rst +++ b/docs/en/tutorials/getting-started.rst @@ -86,7 +86,7 @@ You can provide your mapping information in Attribute or XML: use DateTimeImmutable; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; - use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; + use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; #[ODM\Document] class User diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 2c136844ca..7e725cb8a9 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -373,10 +373,10 @@ parameters: path: src/Iterator/IterableResult.php - - message: '#^Method Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\SearchIndex\:\:__construct\(\) has parameter \$fields with no value type specified in iterable type array\.$#' + message: '#^Method Doctrine\\ODM\\MongoDB\\Mapping\\Attribute\\SearchIndex\:\:__construct\(\) has parameter \$fields with no value type specified in iterable type array\.$#' identifier: missingType.iterableValue count: 1 - path: src/Mapping/Annotations/SearchIndex.php + path: src/Mapping/Attribute/SearchIndex.php - message: '#^Method Doctrine\\ODM\\MongoDB\\Mapping\\ClassMetadata\:\:addInheritedAssociationMapping\(\) has Doctrine\\ODM\\MongoDB\\Mapping\\MappingException in PHPDoc @throws tag but it''s not thrown\.$#' @@ -475,7 +475,7 @@ parameters: path: src/Mapping/Driver/XmlDriver.php - - message: '#^Parameter \#2 \$mapping of method Doctrine\\ODM\\MongoDB\\Mapping\\Driver\\XmlDriver\:\:addFieldMapping\(\) expects array\{type\?\: string, fieldName\?\: string, name\?\: string, strategy\?\: string, association\?\: int, id\?\: bool, isOwningSide\?\: bool, collectionClass\?\: class\-string, \.\.\.\}, array\, Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\EncryptQuery\|float\|int\|MongoDB\\BSON\\Decimal128\|MongoDB\\BSON\\Int64\|MongoDB\\BSON\\UTCDateTime\|string\|null\>\|bool\|string\> given\.$#' + message: '#^Parameter \#2 \$mapping of method Doctrine\\ODM\\MongoDB\\Mapping\\Driver\\XmlDriver\:\:addFieldMapping\(\) expects array\{type\?\: string, fieldName\?\: string, name\?\: string, strategy\?\: string, association\?\: int, id\?\: bool, isOwningSide\?\: bool, collectionClass\?\: class\-string, \.\.\.\}, array\, Doctrine\\ODM\\MongoDB\\Mapping\\EncryptQuery\|float\|int\|MongoDB\\BSON\\Decimal128\|MongoDB\\BSON\\Int64\|MongoDB\\BSON\\UTCDateTime\|string\|null\>\|bool\|string\> given\.$#' identifier: argument.type count: 1 path: src/Mapping/Driver/XmlDriver.php diff --git a/phpstan.neon.dist b/phpstan.neon.dist index a6f7ff93e1..fada396846 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -54,6 +54,10 @@ parameters: - message: '#MongoDB\\BSON\\VectorType#' - message: '#MongoDB\\BSON\\Binary\:\:(TYPE_VECTOR|getVectorType|toArray|fromVector)#' + - message: '#^Class Doctrine\\ODM\\MongoDB\\Mapping\\([a-zA-Z0-9\\]+) extends @final class Doctrine\\ODM\\MongoDB\\Mapping\\Attribute\\([a-zA-Z0-9\\]+)\.$#' + identifier: class.extendsFinalByPhpDoc + path: src/Mapping/Annotations/ + # To be removed when reaching phpstan level 6 checkMissingVarTagTypehint: true checkMissingTypehints: true diff --git a/src/Mapping/Annotations/AbstractDocument.php b/src/Mapping/Annotations/AbstractDocument.php index 8307a02e54..26695015e9 100644 --- a/src/Mapping/Annotations/AbstractDocument.php +++ b/src/Mapping/Annotations/AbstractDocument.php @@ -4,6 +4,14 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; -abstract class AbstractDocument implements Annotation -{ +use function class_exists; + +class_exists(\Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractDocument::class); + +// @phpstan-ignore-next-line if.alwaysFalse +if (false) { + /** @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractDocument instead */ + abstract class AbstractDocument extends \Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractDocument + { + } } diff --git a/src/Mapping/Annotations/AbstractField.php b/src/Mapping/Annotations/AbstractField.php index 77e9870e17..afc643191e 100644 --- a/src/Mapping/Annotations/AbstractField.php +++ b/src/Mapping/Annotations/AbstractField.php @@ -4,40 +4,14 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; -abstract class AbstractField implements Annotation -{ - /** @var string|null */ - public $name; +use function class_exists; - /** @var string|null */ - public $type; +class_exists(\Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractField::class); - /** @var bool */ - public $nullable; - - /** @var mixed[] */ - public $options; - - /** @var string|null */ - public $strategy; - - /** @var bool */ - public $notSaved; - - /** @param mixed[] $options */ - public function __construct( - ?string $name = null, - ?string $type = null, - bool $nullable = false, - array $options = [], - ?string $strategy = null, - bool $notSaved = false, - ) { - $this->name = $name; - $this->type = $type; - $this->nullable = $nullable; - $this->options = $options; - $this->strategy = $strategy; - $this->notSaved = $notSaved; +// @phpstan-ignore-next-line if.alwaysFalse +if (false) { + /** @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractField instead */ + abstract class AbstractField extends \Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractField + { } } diff --git a/src/Mapping/Annotations/AbstractIndex.php b/src/Mapping/Annotations/AbstractIndex.php index 8d3db18668..d1c8cfec7e 100644 --- a/src/Mapping/Annotations/AbstractIndex.php +++ b/src/Mapping/Annotations/AbstractIndex.php @@ -4,56 +4,14 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; -abstract class AbstractIndex implements Annotation -{ - /** @var string[] */ - public $keys; +use function class_exists; - /** @var string|null */ - public $name; +class_exists(\Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractIndex::class); - /** @var bool|null */ - public $background; - - /** @var int|null */ - public $expireAfterSeconds; - - /** @var bool */ - public $unique; - - /** @var bool */ - public $sparse; - - /** @var mixed[] */ - public $options; - - /** @var array */ - public $partialFilterExpression; - - /** - * @param string[] $keys - * @param string|int|null $order - * @param mixed[] $options - * @param array $partialFilterExpression - */ - public function __construct( - array $keys = [], - ?string $name = null, - ?bool $background = null, - ?int $expireAfterSeconds = null, - public $order = null, - bool $unique = false, - bool $sparse = false, - array $options = [], - array $partialFilterExpression = [], - ) { - $this->keys = $keys; - $this->name = $name; - $this->background = $background; - $this->expireAfterSeconds = $expireAfterSeconds; - $this->unique = $unique; - $this->sparse = $sparse; - $this->options = $options; - $this->partialFilterExpression = $partialFilterExpression; +// @phpstan-ignore-next-line if.alwaysFalse +if (false) { + /** @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractIndex instead */ + abstract class AbstractIndex extends \Doctrine\ODM\MongoDB\Mapping\Attribute\AbstractIndex + { } } diff --git a/src/Mapping/Annotations/AlsoLoad.php b/src/Mapping/Annotations/AlsoLoad.php index e847775cf7..5e6a31c2c3 100644 --- a/src/Mapping/Annotations/AlsoLoad.php +++ b/src/Mapping/Annotations/AlsoLoad.php @@ -6,18 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\AlsoLoad as AlsoLoadAttribute; /** * Loads data from a different field if the original field is not set * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\AlsoLoad instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_METHOD)] -final class AlsoLoad implements Annotation +final class AlsoLoad extends AlsoLoadAttribute implements Annotation { - /** @param string|string[] $value */ - public function __construct(public $value, public ?string $name = null) - { - } } diff --git a/src/Mapping/Annotations/Annotation.php b/src/Mapping/Annotations/Annotation.php index 2cc4e8a3de..3d12d9b471 100644 --- a/src/Mapping/Annotations/Annotation.php +++ b/src/Mapping/Annotations/Annotation.php @@ -4,6 +4,7 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; +/** @deprecated Annotation classes are deprecated, {@see MappingAttribute} */ interface Annotation { } diff --git a/src/Mapping/Annotations/ChangeTrackingPolicy.php b/src/Mapping/Annotations/ChangeTrackingPolicy.php index 059f24e66b..e18c8f7c5b 100644 --- a/src/Mapping/Annotations/ChangeTrackingPolicy.php +++ b/src/Mapping/Annotations/ChangeTrackingPolicy.php @@ -6,21 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\ChangeTrackingPolicy as ChangeTrackingPolicyAttribute; /** * Specifies the change tracking policy for a document * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\ChangeTrackingPolicy instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class ChangeTrackingPolicy implements Annotation +final class ChangeTrackingPolicy extends ChangeTrackingPolicyAttribute implements Annotation { - /** @var string */ - public $value; - - public function __construct(string $value) - { - $this->value = $value; - } } diff --git a/src/Mapping/Annotations/DefaultDiscriminatorValue.php b/src/Mapping/Annotations/DefaultDiscriminatorValue.php index 45faeea0e6..13258a5a2c 100644 --- a/src/Mapping/Annotations/DefaultDiscriminatorValue.php +++ b/src/Mapping/Annotations/DefaultDiscriminatorValue.php @@ -6,22 +6,18 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\DefaultDiscriminatorValue as DefaultDiscriminatorValueAttribute; /** * Specifies a default discriminator value to be used when the discriminator * field is not set in a document * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\DefaultDiscriminatorValue instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY)] -final class DefaultDiscriminatorValue implements Annotation +final class DefaultDiscriminatorValue extends DefaultDiscriminatorValueAttribute implements Annotation { - /** @var string */ - public $value; - - public function __construct(string $value) - { - $this->value = $value; - } } diff --git a/src/Mapping/Annotations/DiscriminatorField.php b/src/Mapping/Annotations/DiscriminatorField.php index ae57be43fe..fa49e72b8f 100644 --- a/src/Mapping/Annotations/DiscriminatorField.php +++ b/src/Mapping/Annotations/DiscriminatorField.php @@ -6,21 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\DiscriminatorField as DiscriminatorFieldAttribute; /** * Specify a field name to store a discriminator value * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\DiscriminatorField instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class DiscriminatorField implements Annotation +final class DiscriminatorField extends DiscriminatorFieldAttribute implements Annotation { - /** @var string */ - public $value; - - public function __construct(string $value) - { - $this->value = $value; - } } diff --git a/src/Mapping/Annotations/DiscriminatorMap.php b/src/Mapping/Annotations/DiscriminatorMap.php index 644e244432..a4cb27e53d 100644 --- a/src/Mapping/Annotations/DiscriminatorMap.php +++ b/src/Mapping/Annotations/DiscriminatorMap.php @@ -6,22 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\DiscriminatorMap as DiscriminatorMapAttribute; /** * Specify a map of discriminator values and classes * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\DiscriminatorMap instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY)] -final class DiscriminatorMap implements Annotation +final class DiscriminatorMap extends DiscriminatorMapAttribute implements Annotation { - /** @var array */ - public $value; - - /** @param array $value */ - public function __construct(array $value) - { - $this->value = $value; - } } diff --git a/src/Mapping/Annotations/DiscriminatorValue.php b/src/Mapping/Annotations/DiscriminatorValue.php index 069e0cffe6..a8a7c7b0c5 100644 --- a/src/Mapping/Annotations/DiscriminatorValue.php +++ b/src/Mapping/Annotations/DiscriminatorValue.php @@ -6,21 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\DiscriminatorValue as DiscriminatorValueAttribute; /** * Use the specified discriminator for this class * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\DiscriminatorValue instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class DiscriminatorValue implements Annotation +final class DiscriminatorValue extends DiscriminatorValueAttribute implements Annotation { - /** @var string */ - public $value; - - public function __construct(string $value) - { - $this->value = $value; - } } diff --git a/src/Mapping/Annotations/Document.php b/src/Mapping/Annotations/Document.php index c9754ce291..05a9506c4f 100644 --- a/src/Mapping/Annotations/Document.php +++ b/src/Mapping/Annotations/Document.php @@ -6,49 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Document as DocumentAttribute; /** * Identifies a class as a document that can be stored in the database * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Document instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class Document extends AbstractDocument +final class Document extends DocumentAttribute implements Annotation { - /** @var string|null */ - public $db; - - /** @var string|null */ - public $repositoryClass; - - /** @var Index[] */ - public $indexes; - - /** @var bool */ - public $readOnly; - - /** @var string|null */ - public $shardKey; - - /** - * @param string|array{name: string, capped?: bool, size?: int, max?: int}|null $collection - * @param Index[] $indexes - * @param int|string|null $writeConcern - */ - public function __construct( - ?string $db = null, - public $collection = null, - ?string $repositoryClass = null, - array $indexes = [], - bool $readOnly = false, - ?string $shardKey = null, - public $writeConcern = null, - ) { - $this->db = $db; - $this->repositoryClass = $repositoryClass; - $this->indexes = $indexes; - $this->readOnly = $readOnly; - $this->shardKey = $shardKey; - } } diff --git a/src/Mapping/Annotations/EmbedMany.php b/src/Mapping/Annotations/EmbedMany.php index e693929c9a..fad20901fa 100644 --- a/src/Mapping/Annotations/EmbedMany.php +++ b/src/Mapping/Annotations/EmbedMany.php @@ -6,60 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; -use Doctrine\ODM\MongoDB\Utility\CollectionHelper; +use Doctrine\ODM\MongoDB\Mapping\Attribute\EmbedMany as EmbedManyAttribute; /** * Embeds multiple documents * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\EmbedMany instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class EmbedMany extends AbstractField +final class EmbedMany extends EmbedManyAttribute implements Annotation { - /** @var bool */ - public $embedded = true; - - /** @var string|null */ - public $targetDocument; - - /** @var string|null */ - public $discriminatorField; - - /** @var array|null */ - public $discriminatorMap; - - /** @var string|null */ - public $defaultDiscriminatorValue; - - /** @var string|null */ - public $collectionClass; - - /** @var bool */ - public $storeEmptyArray; - - /** @param array|null $discriminatorMap */ - public function __construct( - ?string $name = null, - bool $nullable = false, - array $options = [], - string $strategy = CollectionHelper::DEFAULT_STRATEGY, - bool $notSaved = false, - ?string $targetDocument = null, - ?string $discriminatorField = null, - ?array $discriminatorMap = null, - ?string $defaultDiscriminatorValue = null, - ?string $collectionClass = null, - bool $storeEmptyArray = false, - ) { - parent::__construct($name, ClassMetadata::MANY, $nullable, $options, $strategy, $notSaved); - - $this->targetDocument = $targetDocument; - $this->discriminatorField = $discriminatorField; - $this->discriminatorMap = $discriminatorMap; - $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; - $this->collectionClass = $collectionClass; - $this->storeEmptyArray = $storeEmptyArray; - } } diff --git a/src/Mapping/Annotations/EmbedOne.php b/src/Mapping/Annotations/EmbedOne.php index 6a260ec0e2..512ccb8c81 100644 --- a/src/Mapping/Annotations/EmbedOne.php +++ b/src/Mapping/Annotations/EmbedOne.php @@ -6,49 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; +use Doctrine\ODM\MongoDB\Mapping\Attribute\EmbedOne as EmbedOneAttribute; /** * Embeds a single document * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\EmbedOne instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class EmbedOne extends AbstractField +final class EmbedOne extends EmbedOneAttribute implements Annotation { - /** @var bool */ - public $embedded = true; - - /** @var string|null */ - public $targetDocument; - - /** @var string|null */ - public $discriminatorField; - - /** @var array|null */ - public $discriminatorMap; - - /** @var string|null */ - public $defaultDiscriminatorValue; - - /** @param array|null $discriminatorMap */ - public function __construct( - ?string $name = null, - bool $nullable = false, - array $options = [], - ?string $strategy = null, - bool $notSaved = false, - ?string $targetDocument = null, - ?string $discriminatorField = null, - ?array $discriminatorMap = null, - ?string $defaultDiscriminatorValue = null, - ) { - parent::__construct($name, ClassMetadata::ONE, $nullable, $options, $strategy, $notSaved); - - $this->targetDocument = $targetDocument; - $this->discriminatorField = $discriminatorField; - $this->discriminatorMap = $discriminatorMap; - $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; - } } diff --git a/src/Mapping/Annotations/EmbeddedDocument.php b/src/Mapping/Annotations/EmbeddedDocument.php index 5b68f7a5a6..a307ac3026 100644 --- a/src/Mapping/Annotations/EmbeddedDocument.php +++ b/src/Mapping/Annotations/EmbeddedDocument.php @@ -6,22 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\EmbeddedDocument as EmbeddedDocumentAttribute; /** * Identifies a class as a document that can be embedded but not stored by itself * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\EmbeddedDocument instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class EmbeddedDocument extends AbstractDocument +final class EmbeddedDocument extends EmbeddedDocumentAttribute implements Annotation { - /** @var Index[] */ - public $indexes; - - /** @param Index[] $indexes */ - public function __construct(array $indexes = []) - { - $this->indexes = $indexes; - } } diff --git a/src/Mapping/Annotations/Encrypt.php b/src/Mapping/Annotations/Encrypt.php index 1f7fbc90e4..fd8c284de9 100644 --- a/src/Mapping/Annotations/Encrypt.php +++ b/src/Mapping/Annotations/Encrypt.php @@ -5,43 +5,20 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; use Attribute; -use DateTimeInterface; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use MongoDB\BSON\Decimal128; -use MongoDB\BSON\Int64; -use MongoDB\BSON\UTCDateTime; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Encrypt as EncryptAttribute; /** * Defines an encrypted field mapping. * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Encrypt instead + * * @see https://www.mongodb.com/docs/manual/core/queryable-encryption/fundamentals/encrypt-and-query/#configure-encrypted-fields-for-optimal-search-and-storage * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY)] -final class Encrypt implements Annotation +final class Encrypt extends EncryptAttribute implements Annotation { - public int|float|Int64|Decimal128|UTCDateTime|null $min; - public int|float|Int64|Decimal128|UTCDateTime|null $max; - - /** - * @param EncryptQuery|null $queryType Set the query type for the field, null if not queryable. - * @param int<1, 4>|null $sparsity - * @param positive-int|null $precision - * @param positive-int|null $trimFactor - * @param positive-int|null $contention - */ - public function __construct( - public ?EncryptQuery $queryType = null, - int|float|Int64|Decimal128|UTCDateTime|DateTimeInterface|null $min = null, - int|float|Int64|Decimal128|UTCDateTime|DateTimeInterface|null $max = null, - public ?int $sparsity = null, - public ?int $precision = null, - public ?int $trimFactor = null, - public ?int $contention = null, - ) { - $this->min = $min instanceof DateTimeInterface ? new UTCDateTime($min) : $min; - $this->max = $max instanceof DateTimeInterface ? new UTCDateTime($max) : $max; - } } diff --git a/src/Mapping/Annotations/EncryptQuery.php b/src/Mapping/Annotations/EncryptQuery.php index 71b5ea6d04..b1ed4825dd 100644 --- a/src/Mapping/Annotations/EncryptQuery.php +++ b/src/Mapping/Annotations/EncryptQuery.php @@ -4,10 +4,11 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; -use MongoDB\Driver\ClientEncryption; +use Doctrine\ODM\MongoDB\Mapping\EncryptQuery; -enum EncryptQuery: string -{ - case Equality = ClientEncryption::QUERY_TYPE_EQUALITY; - case Range = ClientEncryption::QUERY_TYPE_RANGE; -} +use function class_exists; +use function trigger_deprecation; + +trigger_deprecation('doctrine/mongodb-odm', '2.16', 'Enum %s\\EncryptQuery is deprecated, use %s instead.', __NAMESPACE__, EncryptQuery::class); + +class_exists(EncryptQuery::class); diff --git a/src/Mapping/Annotations/Field.php b/src/Mapping/Annotations/Field.php index 39c22362b7..b160109a5c 100644 --- a/src/Mapping/Annotations/Field.php +++ b/src/Mapping/Annotations/Field.php @@ -5,36 +5,18 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; use Attribute; -use BackedEnum; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Field as FieldAttribute; /** * Specifies a generic field mapping * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Field instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class Field extends AbstractField +final class Field extends FieldAttribute implements Annotation { - /** @var class-string|null */ - public $enumType; - - /** - * @param mixed[] $options - * @param class-string|null $enumType - */ - public function __construct( - ?string $name = null, - ?string $type = null, - bool $nullable = false, - array $options = [], - ?string $strategy = null, - bool $notSaved = false, - ?string $enumType = null, - ) { - parent::__construct($name, $type, $nullable, $options, $strategy, $notSaved); - - $this->enumType = $enumType; - } } diff --git a/src/Mapping/Annotations/File.php b/src/Mapping/Annotations/File.php index 2421cfe53a..4aa88088cd 100644 --- a/src/Mapping/Annotations/File.php +++ b/src/Mapping/Annotations/File.php @@ -6,57 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\File as FileAttribute; /** * Identifies a class as a GridFS file that can be stored in the database * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\File instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class File extends AbstractDocument +final class File extends FileAttribute implements Annotation { - /** @var string|null */ - public $db; - - /** @var string|null */ - public $bucketName; - - /** @var string|null */ - public $repositoryClass; - - /** @var Index[] */ - public $indexes; - - /** @var bool bool */ - public $readOnly; - - /** @var string|null */ - public $shardKey; - - /** @var int|null */ - public $chunkSizeBytes; - - /** - * @param Index[] $indexes - * @param string|int|null $writeConcern - */ - public function __construct( - ?string $db = null, - ?string $bucketName = null, - ?string $repositoryClass = null, - array $indexes = [], - bool $readOnly = false, - ?string $shardKey = null, - public $writeConcern = null, - ?int $chunkSizeBytes = null, - ) { - $this->db = $db; - $this->bucketName = $bucketName; - $this->repositoryClass = $repositoryClass; - $this->indexes = $indexes; - $this->readOnly = $readOnly; - $this->shardKey = $shardKey; - $this->chunkSizeBytes = $chunkSizeBytes; - } } diff --git a/src/Mapping/Annotations/File/ChunkSize.php b/src/Mapping/Annotations/File/ChunkSize.php index 0043be358a..5f7738f473 100644 --- a/src/Mapping/Annotations/File/ChunkSize.php +++ b/src/Mapping/Annotations/File/ChunkSize.php @@ -6,17 +6,16 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractField; +use Doctrine\ODM\MongoDB\Mapping\Annotations\Annotation; +use Doctrine\ODM\MongoDB\Mapping\Attribute\File\ChunkSize as ChunkSizeAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\File\ChunkSize instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class ChunkSize extends AbstractField +final class ChunkSize extends ChunkSizeAttribute implements Annotation { - public function __construct() - { - parent::__construct('chunkSize', 'int', false, [], null, true); - } } diff --git a/src/Mapping/Annotations/File/Filename.php b/src/Mapping/Annotations/File/Filename.php index 260a78afd3..702203150a 100644 --- a/src/Mapping/Annotations/File/Filename.php +++ b/src/Mapping/Annotations/File/Filename.php @@ -6,17 +6,16 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractField; +use Doctrine\ODM\MongoDB\Mapping\Annotations\Annotation; +use Doctrine\ODM\MongoDB\Mapping\Attribute\File\Filename as FilenameAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\File\Filename instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class Filename extends AbstractField +final class Filename extends FilenameAttribute implements Annotation { - public function __construct() - { - parent::__construct('filename', 'string', false, [], null, true); - } } diff --git a/src/Mapping/Annotations/File/Length.php b/src/Mapping/Annotations/File/Length.php index b960ae29bc..4590610b8d 100644 --- a/src/Mapping/Annotations/File/Length.php +++ b/src/Mapping/Annotations/File/Length.php @@ -6,17 +6,16 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractField; +use Doctrine\ODM\MongoDB\Mapping\Annotations\Annotation; +use Doctrine\ODM\MongoDB\Mapping\Attribute\File\Length as LengthAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\File\Length instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class Length extends AbstractField +final class Length extends LengthAttribute implements Annotation { - public function __construct() - { - parent::__construct('length', 'int', false, [], null, true); - } } diff --git a/src/Mapping/Annotations/File/Metadata.php b/src/Mapping/Annotations/File/Metadata.php index 16c06265ce..9992640bce 100644 --- a/src/Mapping/Annotations/File/Metadata.php +++ b/src/Mapping/Annotations/File/Metadata.php @@ -6,47 +6,16 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractField; -use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; +use Doctrine\ODM\MongoDB\Mapping\Annotations\Annotation; +use Doctrine\ODM\MongoDB\Mapping\Attribute\File\Metadata as MetadataAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\File\Metadata instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class Metadata extends AbstractField +final class Metadata extends MetadataAttribute implements Annotation { - /** @var bool */ - public $embedded = true; - - /** @var string|null */ - public $targetDocument; - - /** @var string|null */ - public $discriminatorField; - - /** @var array|null */ - public $discriminatorMap; - - /** @var string|null */ - public $defaultDiscriminatorValue; - - /** @param array|null $discriminatorMap */ - public function __construct( - bool $nullable = false, - array $options = [], - ?string $strategy = null, - bool $notSaved = false, - ?string $targetDocument = null, - ?string $discriminatorField = null, - ?array $discriminatorMap = null, - ?string $defaultDiscriminatorValue = null, - ) { - parent::__construct('metadata', ClassMetadata::ONE, $nullable, $options, $strategy, $notSaved); - - $this->targetDocument = $targetDocument; - $this->discriminatorField = $discriminatorField; - $this->discriminatorMap = $discriminatorMap; - $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; - } } diff --git a/src/Mapping/Annotations/File/UploadDate.php b/src/Mapping/Annotations/File/UploadDate.php index 1454fe993d..dfb4fcf48a 100644 --- a/src/Mapping/Annotations/File/UploadDate.php +++ b/src/Mapping/Annotations/File/UploadDate.php @@ -6,17 +6,16 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractField; +use Doctrine\ODM\MongoDB\Mapping\Annotations\Annotation; +use Doctrine\ODM\MongoDB\Mapping\Attribute\File\UploadDate as UploadDateAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\File\UploadDate instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class UploadDate extends AbstractField +final class UploadDate extends UploadDateAttribute implements Annotation { - public function __construct() - { - parent::__construct('uploadDate', 'date', false, [], null, true); - } } diff --git a/src/Mapping/Annotations/HasLifecycleCallbacks.php b/src/Mapping/Annotations/HasLifecycleCallbacks.php index aaa8dd6e31..e44a816339 100644 --- a/src/Mapping/Annotations/HasLifecycleCallbacks.php +++ b/src/Mapping/Annotations/HasLifecycleCallbacks.php @@ -5,14 +5,17 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; use Attribute; +use Doctrine\ODM\MongoDB\Mapping\Attribute\HasLifecycleCallbacks as HasLifecycleCallbacksAttribute; /** * Must be set on a document class to instruct Doctrine to check for lifecycle * callback annotations on public methods. * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\HasLifecycleCallbacks instead + * * @Annotation */ #[Attribute(Attribute::TARGET_CLASS)] -final class HasLifecycleCallbacks implements Annotation +final class HasLifecycleCallbacks extends HasLifecycleCallbacksAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/Id.php b/src/Mapping/Annotations/Id.php index ab48d9d8b2..3cfdc53eaa 100644 --- a/src/Mapping/Annotations/Id.php +++ b/src/Mapping/Annotations/Id.php @@ -6,27 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Id as IdAttribute; /** * Special field mapping to map document identifiers * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Id instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class Id extends AbstractField +final class Id extends IdAttribute implements Annotation { - /** @var bool */ - public $id = true; - - public function __construct( - ?string $name = null, - ?string $type = null, - bool $nullable = false, - array $options = [], - ?string $strategy = 'auto', - bool $notSaved = false, - ) { - parent::__construct($name, $type, $nullable, $options, $strategy, $notSaved); - } } diff --git a/src/Mapping/Annotations/Index.php b/src/Mapping/Annotations/Index.php index 378a67a3fc..7081c33590 100644 --- a/src/Mapping/Annotations/Index.php +++ b/src/Mapping/Annotations/Index.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Index as IndexAttribute; /** * Defines an index on a field * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Index instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] -final class Index extends AbstractIndex +final class Index extends IndexAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/InheritanceType.php b/src/Mapping/Annotations/InheritanceType.php index 45c14f1460..794652c0d6 100644 --- a/src/Mapping/Annotations/InheritanceType.php +++ b/src/Mapping/Annotations/InheritanceType.php @@ -6,21 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\InheritanceType as InheritanceTypeAttribute; /** * Specifies which inheritance type to use for a document * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\InheritanceType instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class InheritanceType implements Annotation +final class InheritanceType extends InheritanceTypeAttribute implements Annotation { - /** @var string */ - public $value; - - public function __construct(string $value) - { - $this->value = $value; - } } diff --git a/src/Mapping/Annotations/Lock.php b/src/Mapping/Annotations/Lock.php index ac5bd5ee48..412677ed00 100644 --- a/src/Mapping/Annotations/Lock.php +++ b/src/Mapping/Annotations/Lock.php @@ -5,13 +5,16 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; use Attribute; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Lock as LockAttribute; /** * Specifies a field to use for pessimistic locking * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Lock instead + * * @Annotation */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class Lock implements Annotation +final class Lock extends LockAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/MappedSuperclass.php b/src/Mapping/Annotations/MappedSuperclass.php index 012db54ba7..157cfa7884 100644 --- a/src/Mapping/Annotations/MappedSuperclass.php +++ b/src/Mapping/Annotations/MappedSuperclass.php @@ -6,26 +6,18 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\MappedSuperclass as MappedSuperclassAttribute; /** * Specifies a parent class that other documents may extend to inherit mapping * information * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\MappedSuperclass instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class MappedSuperclass extends AbstractDocument +final class MappedSuperclass extends MappedSuperclassAttribute implements Annotation { - /** @var string|null */ - public $repositoryClass; - - /** @var string|null */ - public $collection; - - public function __construct(?string $repositoryClass = null, ?string $collection = null) - { - $this->repositoryClass = $repositoryClass; - $this->collection = $collection; - } } diff --git a/src/Mapping/Annotations/PostLoad.php b/src/Mapping/Annotations/PostLoad.php index fe09676f82..5fc7b97174 100644 --- a/src/Mapping/Annotations/PostLoad.php +++ b/src/Mapping/Annotations/PostLoad.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PostLoad as PostLoadAttribute; /** * Marks a method as a postLoad lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PostLoad instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PostLoad implements Annotation +final class PostLoad extends PostLoadAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PostPersist.php b/src/Mapping/Annotations/PostPersist.php index c0436d1279..a6928dd3ec 100644 --- a/src/Mapping/Annotations/PostPersist.php +++ b/src/Mapping/Annotations/PostPersist.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PostPersist as PostPersistAttribute; /** * Marks a method as a postPersist lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PostPersist instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PostPersist implements Annotation +final class PostPersist extends PostPersistAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PostRemove.php b/src/Mapping/Annotations/PostRemove.php index dbdb6ee11a..7ef2993625 100644 --- a/src/Mapping/Annotations/PostRemove.php +++ b/src/Mapping/Annotations/PostRemove.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PostRemove as PostRemoveAttribute; /** * Marks a method as a postRemove lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PostRemove instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PostRemove implements Annotation +final class PostRemove extends PostRemoveAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PostUpdate.php b/src/Mapping/Annotations/PostUpdate.php index d4180be0d2..6a13a87a7e 100644 --- a/src/Mapping/Annotations/PostUpdate.php +++ b/src/Mapping/Annotations/PostUpdate.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PostUpdate as PostUpdateAttribute; /** * Marks a method as a postUpdate lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PostUpdate instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PostUpdate implements Annotation +final class PostUpdate extends PostUpdateAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PreFlush.php b/src/Mapping/Annotations/PreFlush.php index 671d0ad3a5..8c8ef39636 100644 --- a/src/Mapping/Annotations/PreFlush.php +++ b/src/Mapping/Annotations/PreFlush.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PreFlush as PreFlushAttribute; /** * Marks a method as a preFlush lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PreFlush instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PreFlush implements Annotation +final class PreFlush extends PreFlushAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PreLoad.php b/src/Mapping/Annotations/PreLoad.php index 301ae03185..047b7f5d2b 100644 --- a/src/Mapping/Annotations/PreLoad.php +++ b/src/Mapping/Annotations/PreLoad.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PreLoad as PreLoadAttribute; /** * Marks a method as a preLoad lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PreLoad instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PreLoad implements Annotation +final class PreLoad extends PreLoadAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PrePersist.php b/src/Mapping/Annotations/PrePersist.php index a83245f37f..42ed14181a 100644 --- a/src/Mapping/Annotations/PrePersist.php +++ b/src/Mapping/Annotations/PrePersist.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PrePersist as PrePersistAttribute; /** * Marks a method as a prePersist lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PrePersist instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PrePersist implements Annotation +final class PrePersist extends PrePersistAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PreRemove.php b/src/Mapping/Annotations/PreRemove.php index de11425c9a..acc18c64ea 100644 --- a/src/Mapping/Annotations/PreRemove.php +++ b/src/Mapping/Annotations/PreRemove.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PreRemove as PreRemoveAttribute; /** * Marks a method as a preRemove lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PreRemove instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PreRemove implements Annotation +final class PreRemove extends PreRemoveAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/PreUpdate.php b/src/Mapping/Annotations/PreUpdate.php index 1b75ac781d..15ff25eef9 100644 --- a/src/Mapping/Annotations/PreUpdate.php +++ b/src/Mapping/Annotations/PreUpdate.php @@ -6,14 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\PreUpdate as PreUpdateAttribute; /** * Marks a method as a preUpdate lifecycle callback * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\PreUpdate instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_METHOD)] -final class PreUpdate implements Annotation +final class PreUpdate extends PreUpdateAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/QueryResultDocument.php b/src/Mapping/Annotations/QueryResultDocument.php index 7039daf809..b84aa17add 100644 --- a/src/Mapping/Annotations/QueryResultDocument.php +++ b/src/Mapping/Annotations/QueryResultDocument.php @@ -6,12 +6,15 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\QueryResultDocument as QueryResultDocumentAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\QueryResultDocument instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class QueryResultDocument extends AbstractDocument +final class QueryResultDocument extends QueryResultDocumentAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/ReadPreference.php b/src/Mapping/Annotations/ReadPreference.php index 536f292e8b..a8641fb372 100644 --- a/src/Mapping/Annotations/ReadPreference.php +++ b/src/Mapping/Annotations/ReadPreference.php @@ -6,24 +6,15 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\ReadPreference as ReadPreferenceAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\ReadPreference instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class ReadPreference implements Annotation +final class ReadPreference extends ReadPreferenceAttribute implements Annotation { - /** @var string */ - public $value; - - /** @var string[][]|null */ - public $tags; - - /** @param string[][]|null $tags */ - public function __construct(string $value, ?array $tags = null) - { - $this->value = $value; - $this->tags = $tags; - } } diff --git a/src/Mapping/Annotations/ReferenceMany.php b/src/Mapping/Annotations/ReferenceMany.php index a4afe8c9ec..d21282ac25 100644 --- a/src/Mapping/Annotations/ReferenceMany.php +++ b/src/Mapping/Annotations/ReferenceMany.php @@ -6,117 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; -use Doctrine\ODM\MongoDB\Utility\CollectionHelper; +use Doctrine\ODM\MongoDB\Mapping\Attribute\ReferenceMany as ReferenceManyAttribute; /** * Specifies a one-to-many relationship to a different document * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\ReferenceMany instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class ReferenceMany extends AbstractField +final class ReferenceMany extends ReferenceManyAttribute implements Annotation { - /** @var bool */ - public $reference = true; - - /** @var string */ - public $storeAs; - - /** @var string|null */ - public $targetDocument; - - /** @var string|null */ - public $discriminatorField; - - /** @var array|null */ - public $discriminatorMap; - - /** @var string|null */ - public $defaultDiscriminatorValue; - - /** @var bool|null */ - public $orphanRemoval; - - /** @var string|null */ - public $inversedBy; - - /** @var string|null */ - public $mappedBy; - - /** @var string|null */ - public $repositoryMethod; - - /** @var array */ - public $sort; - - /** @var array */ - public $criteria; - - /** @var int|null */ - public $limit; - - /** @var int|null */ - public $skip; - - /** @var string|null */ - public $collectionClass; - - /** @var string[] */ - public $prime; - - /** @var bool */ - public $storeEmptyArray; - - /** - * @param array|null $discriminatorMap - * @param string[]|string|null $cascade - * @param array $sort - * @param array $criteria - * @param string[] $prime - */ - public function __construct( - ?string $name = null, - bool $nullable = false, - array $options = [], - string $strategy = CollectionHelper::DEFAULT_STRATEGY, - bool $notSaved = false, - string $storeAs = ClassMetadata::REFERENCE_STORE_AS_DB_REF, - ?string $targetDocument = null, - ?string $discriminatorField = null, - ?array $discriminatorMap = null, - ?string $defaultDiscriminatorValue = null, - public $cascade = null, - ?bool $orphanRemoval = null, - ?string $inversedBy = null, - ?string $mappedBy = null, - ?string $repositoryMethod = null, - array $sort = [], - array $criteria = [], - ?int $limit = null, - ?int $skip = null, - ?string $collectionClass = null, - array $prime = [], - bool $storeEmptyArray = false, - ) { - parent::__construct($name, ClassMetadata::MANY, $nullable, $options, $strategy, $notSaved); - - $this->storeAs = $storeAs; - $this->targetDocument = $targetDocument; - $this->discriminatorField = $discriminatorField; - $this->discriminatorMap = $discriminatorMap; - $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; - $this->orphanRemoval = $orphanRemoval; - $this->inversedBy = $inversedBy; - $this->mappedBy = $mappedBy; - $this->repositoryMethod = $repositoryMethod; - $this->sort = $sort; - $this->criteria = $criteria; - $this->limit = $limit; - $this->skip = $skip; - $this->collectionClass = $collectionClass; - $this->prime = $prime; - $this->storeEmptyArray = $storeEmptyArray; - } } diff --git a/src/Mapping/Annotations/ReferenceOne.php b/src/Mapping/Annotations/ReferenceOne.php index 7e89191fe8..7a311b6ecc 100644 --- a/src/Mapping/Annotations/ReferenceOne.php +++ b/src/Mapping/Annotations/ReferenceOne.php @@ -6,101 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; +use Doctrine\ODM\MongoDB\Mapping\Attribute\ReferenceOne as ReferenceOneAttribute; /** * Specifies a one-to-one relationship to a different document * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\ReferenceOne instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class ReferenceOne extends AbstractField +final class ReferenceOne extends ReferenceOneAttribute implements Annotation { - /** @var bool */ - public $reference = true; - - /** @var string */ - public $storeAs; - - /** @var class-string|null */ - public $targetDocument; - - /** @var string|null */ - public $discriminatorField; - - /** @var array|null */ - public $discriminatorMap; - - /** @var string|null */ - public $defaultDiscriminatorValue; - - /** @var bool|null */ - public $orphanRemoval; - - /** @var string|null */ - public $inversedBy; - - /** @var string|null */ - public $mappedBy; - - /** @var string|null */ - public $repositoryMethod; - - /** @var array */ - public $sort; - - /** @var array */ - public $criteria; - - /** @var int|null */ - public $limit; - - /** @var int|null */ - public $skip; - - /** - * @param class-string|null $targetDocument - * @param array|null $discriminatorMap - * @param string[]|string|null $cascade - * @param array $sort - * @param array $criteria - */ - public function __construct( - ?string $name = null, - bool $nullable = false, - array $options = [], - ?string $strategy = null, - bool $notSaved = false, - string $storeAs = ClassMetadata::REFERENCE_STORE_AS_DB_REF, - ?string $targetDocument = null, - ?string $discriminatorField = null, - ?array $discriminatorMap = null, - ?string $defaultDiscriminatorValue = null, - public $cascade = null, - ?bool $orphanRemoval = null, - ?string $inversedBy = null, - ?string $mappedBy = null, - ?string $repositoryMethod = null, - array $sort = [], - array $criteria = [], - ?int $limit = null, - ?int $skip = null, - ) { - parent::__construct($name, ClassMetadata::ONE, $nullable, $options, $strategy, $notSaved); - - $this->storeAs = $storeAs; - $this->targetDocument = $targetDocument; - $this->discriminatorField = $discriminatorField; - $this->discriminatorMap = $discriminatorMap; - $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; - $this->orphanRemoval = $orphanRemoval; - $this->inversedBy = $inversedBy; - $this->mappedBy = $mappedBy; - $this->repositoryMethod = $repositoryMethod; - $this->sort = $sort; - $this->criteria = $criteria; - $this->limit = $limit; - $this->skip = $skip; - } } diff --git a/src/Mapping/Annotations/SearchIndex.php b/src/Mapping/Annotations/SearchIndex.php index 77b6fa47d6..a3e9be130f 100644 --- a/src/Mapping/Annotations/SearchIndex.php +++ b/src/Mapping/Annotations/SearchIndex.php @@ -6,11 +6,14 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\SearchIndex as SearchIndexAttribute; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; /** * Defines a search index on a class. * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\SearchIndex instead + * * @see https://www.mongodb.com/docs/atlas/atlas-search/index-definitions/ * * @Annotation @@ -19,23 +22,6 @@ * @phpstan-import-type SearchIndexSynonym from ClassMetadata */ #[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -class SearchIndex implements Annotation +final class SearchIndex extends SearchIndexAttribute implements Annotation { - /** - * @param array|null $fields - * @param list|null $analyzers - * @param SearchIndexStoredSource|null $storedSource - * @param list|null $synonyms - */ - public function __construct( - public ?string $name = null, - public ?bool $dynamic = null, - public ?array $fields = null, - public ?string $analyzer = null, - public ?string $searchAnalyzer = null, - public ?array $analyzers = null, - public $storedSource = null, - public ?array $synonyms = null, - ) { - } } diff --git a/src/Mapping/Annotations/ShardKey.php b/src/Mapping/Annotations/ShardKey.php index 81ef9218ee..7f0bbacb13 100644 --- a/src/Mapping/Annotations/ShardKey.php +++ b/src/Mapping/Annotations/ShardKey.php @@ -6,28 +6,15 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\ShardKey as ShardKeyAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\ShardKey instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class ShardKey implements Annotation +final class ShardKey extends ShardKeyAttribute implements Annotation { - /** @var string[] */ - public $keys; - - /** @var bool|null */ - public $unique; - - /** @var int|null */ - public $numInitialChunks; - - /** @param string[] $keys */ - public function __construct(array $keys = [], ?bool $unique = null, ?int $numInitialChunks = null) - { - $this->keys = $keys; - $this->unique = $unique; - $this->numInitialChunks = $numInitialChunks; - } } diff --git a/src/Mapping/Annotations/TimeSeries.php b/src/Mapping/Annotations/TimeSeries.php index e4fe593eb4..cc02589e7f 100644 --- a/src/Mapping/Annotations/TimeSeries.php +++ b/src/Mapping/Annotations/TimeSeries.php @@ -6,24 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\TimeSeries\Granularity; +use Doctrine\ODM\MongoDB\Mapping\Attribute\TimeSeries as TimeSeriesAttribute; /** * Marks a document or superclass as a time series document * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\TimeSeries instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class TimeSeries implements Annotation +final class TimeSeries extends TimeSeriesAttribute implements Annotation { - public function __construct( - public readonly string $timeField, - public readonly ?string $metaField = null, - public readonly ?Granularity $granularity = null, - public readonly ?int $expireAfterSeconds = null, - public readonly ?int $bucketMaxSpanSeconds = null, - public readonly ?int $bucketRoundingSeconds = null, - ) { - } } diff --git a/src/Mapping/Annotations/UniqueIndex.php b/src/Mapping/Annotations/UniqueIndex.php index 371fe66e25..017ea4c816 100644 --- a/src/Mapping/Annotations/UniqueIndex.php +++ b/src/Mapping/Annotations/UniqueIndex.php @@ -6,36 +6,17 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\UniqueIndex as UniqueIndexAttribute; /** * Specifies a unique index on a field * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\UniqueIndex instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] -final class UniqueIndex extends AbstractIndex +final class UniqueIndex extends UniqueIndexAttribute implements Annotation { - public function __construct( - array $keys = [], - ?string $name = null, - ?bool $background = null, - ?int $expireAfterSeconds = null, - $order = null, - bool $sparse = false, - array $options = [], - array $partialFilterExpression = [], - ) { - parent::__construct( - $keys, - $name, - $background, - $expireAfterSeconds, - $order, - true, - $sparse, - $options, - $partialFilterExpression, - ); - } } diff --git a/src/Mapping/Annotations/Validation.php b/src/Mapping/Annotations/Validation.php index c773264b89..081419e94c 100644 --- a/src/Mapping/Annotations/Validation.php +++ b/src/Mapping/Annotations/Validation.php @@ -6,42 +6,16 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; -use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Validation as ValidationAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Validation instead + * * @Annotation * @NamedArgumentConstructor * @Target({"CLASS"}) */ #[Attribute(Attribute::TARGET_CLASS)] -class Validation implements Annotation +final class Validation extends ValidationAttribute implements Annotation { - /** @var string|null */ - public $validator; - - /** - * @var string|null - * @Enum({ - * ClassMetadata::SCHEMA_VALIDATION_ACTION_ERROR, - * ClassMetadata::SCHEMA_VALIDATION_ACTION_WARN, - * }) - */ - public $action; - - /** - * @var string|null - * @Enum({ - * ClassMetadata::SCHEMA_VALIDATION_LEVEL_OFF, - * ClassMetadata::SCHEMA_VALIDATION_LEVEL_STRICT, - * ClassMetadata::SCHEMA_VALIDATION_LEVEL_MODERATE, - * }) - */ - public $level; - - public function __construct(?string $validator = null, ?string $action = null, ?string $level = null) - { - $this->validator = $validator; - $this->action = $action; - $this->level = $level; - } } diff --git a/src/Mapping/Annotations/VectorSearchIndex.php b/src/Mapping/Annotations/VectorSearchIndex.php index ed8f281504..8857a70bc9 100644 --- a/src/Mapping/Annotations/VectorSearchIndex.php +++ b/src/Mapping/Annotations/VectorSearchIndex.php @@ -6,11 +6,14 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\VectorSearchIndex as VectorSearchIndexAttribute; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; /** * Defines a vector search index on a class. * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\VectorSearchIndex instead + * * @see https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-type/ * * @Annotation @@ -18,12 +21,6 @@ * @phpstan-import-type VectorSearchIndexField from ClassMetadata */ #[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)] -class VectorSearchIndex implements Annotation +final class VectorSearchIndex extends VectorSearchIndexAttribute implements Annotation { - /** @param list $fields */ - public function __construct( - public array $fields, - public ?string $name = null, - ) { - } } diff --git a/src/Mapping/Annotations/Version.php b/src/Mapping/Annotations/Version.php index fe6da61a70..bbf71704ec 100644 --- a/src/Mapping/Annotations/Version.php +++ b/src/Mapping/Annotations/Version.php @@ -5,13 +5,16 @@ namespace Doctrine\ODM\MongoDB\Mapping\Annotations; use Attribute; +use Doctrine\ODM\MongoDB\Mapping\Attribute\Version as VersionAttribute; /** * Specifies a field to use for optimistic locking * + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\Version instead + * * @Annotation */ #[Attribute(Attribute::TARGET_PROPERTY)] -final class Version implements Annotation +final class Version extends VersionAttribute implements Annotation { } diff --git a/src/Mapping/Annotations/View.php b/src/Mapping/Annotations/View.php index adab26dc92..64d21b6729 100644 --- a/src/Mapping/Annotations/View.php +++ b/src/Mapping/Annotations/View.php @@ -6,35 +6,15 @@ use Attribute; use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor; +use Doctrine\ODM\MongoDB\Mapping\Attribute\View as ViewAttribute; /** + * @deprecated Use \Doctrine\ODM\MongoDB\Mapping\Attribute\View instead + * * @Annotation * @NamedArgumentConstructor */ #[Attribute(Attribute::TARGET_CLASS)] -final class View extends AbstractDocument +final class View extends ViewAttribute implements Annotation { - /** @var string|null */ - public $db; - - /** @var string|null */ - public $view; - - /** @var string|null */ - public $rootClass; - - /** @var string|null */ - public $repositoryClass; - - public function __construct( - ?string $db = null, - ?string $view = null, - ?string $rootClass = null, - ?string $repositoryClass = null, - ) { - $this->db = $db; - $this->view = $view; - $this->rootClass = $rootClass; - $this->repositoryClass = $repositoryClass; - } } diff --git a/src/Mapping/Attribute/AbstractDocument.php b/src/Mapping/Attribute/AbstractDocument.php new file mode 100644 index 0000000000..acd694e3ab --- /dev/null +++ b/src/Mapping/Attribute/AbstractDocument.php @@ -0,0 +1,14 @@ +name = $name; + $this->type = $type; + $this->nullable = $nullable; + $this->options = $options; + $this->strategy = $strategy; + $this->notSaved = $notSaved; + } +} + +// @phpstan-ignore class.notFound +class_alias(AbstractField::class, \Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractField::class); diff --git a/src/Mapping/Attribute/AbstractIndex.php b/src/Mapping/Attribute/AbstractIndex.php new file mode 100644 index 0000000000..24e5c9e01d --- /dev/null +++ b/src/Mapping/Attribute/AbstractIndex.php @@ -0,0 +1,64 @@ + */ + public $partialFilterExpression; + + /** + * @param string[] $keys + * @param string|int|null $order + * @param mixed[] $options + * @param array $partialFilterExpression + */ + public function __construct( + array $keys = [], + ?string $name = null, + ?bool $background = null, + ?int $expireAfterSeconds = null, + public $order = null, + bool $unique = false, + bool $sparse = false, + array $options = [], + array $partialFilterExpression = [], + ) { + $this->keys = $keys; + $this->name = $name; + $this->background = $background; + $this->expireAfterSeconds = $expireAfterSeconds; + $this->unique = $unique; + $this->sparse = $sparse; + $this->options = $options; + $this->partialFilterExpression = $partialFilterExpression; + } +} + +// @phpstan-ignore class.notFound +class_alias(AbstractIndex::class, \Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractIndex::class); diff --git a/src/Mapping/Attribute/AlsoLoad.php b/src/Mapping/Attribute/AlsoLoad.php new file mode 100644 index 0000000000..046b3d896d --- /dev/null +++ b/src/Mapping/Attribute/AlsoLoad.php @@ -0,0 +1,21 @@ +value = $value; + } +} diff --git a/src/Mapping/Attribute/DefaultDiscriminatorValue.php b/src/Mapping/Attribute/DefaultDiscriminatorValue.php new file mode 100644 index 0000000000..769155d91e --- /dev/null +++ b/src/Mapping/Attribute/DefaultDiscriminatorValue.php @@ -0,0 +1,25 @@ +value = $value; + } +} diff --git a/src/Mapping/Attribute/DiscriminatorField.php b/src/Mapping/Attribute/DiscriminatorField.php new file mode 100644 index 0000000000..924cb1066e --- /dev/null +++ b/src/Mapping/Attribute/DiscriminatorField.php @@ -0,0 +1,24 @@ +value = $value; + } +} diff --git a/src/Mapping/Attribute/DiscriminatorMap.php b/src/Mapping/Attribute/DiscriminatorMap.php new file mode 100644 index 0000000000..d210311d11 --- /dev/null +++ b/src/Mapping/Attribute/DiscriminatorMap.php @@ -0,0 +1,25 @@ + */ + public $value; + + /** @param array $value */ + public function __construct(array $value) + { + $this->value = $value; + } +} diff --git a/src/Mapping/Attribute/DiscriminatorValue.php b/src/Mapping/Attribute/DiscriminatorValue.php new file mode 100644 index 0000000000..0c717a9f98 --- /dev/null +++ b/src/Mapping/Attribute/DiscriminatorValue.php @@ -0,0 +1,24 @@ +value = $value; + } +} diff --git a/src/Mapping/Attribute/Document.php b/src/Mapping/Attribute/Document.php new file mode 100644 index 0000000000..b895d5bcf8 --- /dev/null +++ b/src/Mapping/Attribute/Document.php @@ -0,0 +1,52 @@ +db = $db; + $this->repositoryClass = $repositoryClass; + $this->indexes = $indexes; + $this->readOnly = $readOnly; + $this->shardKey = $shardKey; + } +} diff --git a/src/Mapping/Attribute/EmbedMany.php b/src/Mapping/Attribute/EmbedMany.php new file mode 100644 index 0000000000..cd0bb64783 --- /dev/null +++ b/src/Mapping/Attribute/EmbedMany.php @@ -0,0 +1,63 @@ +|null */ + public $discriminatorMap; + + /** @var string|null */ + public $defaultDiscriminatorValue; + + /** @var string|null */ + public $collectionClass; + + /** @var bool */ + public $storeEmptyArray; + + /** @param array|null $discriminatorMap */ + public function __construct( + ?string $name = null, + bool $nullable = false, + array $options = [], + string $strategy = CollectionHelper::DEFAULT_STRATEGY, + bool $notSaved = false, + ?string $targetDocument = null, + ?string $discriminatorField = null, + ?array $discriminatorMap = null, + ?string $defaultDiscriminatorValue = null, + ?string $collectionClass = null, + bool $storeEmptyArray = false, + ) { + parent::__construct($name, ClassMetadata::MANY, $nullable, $options, $strategy, $notSaved); + + $this->targetDocument = $targetDocument; + $this->discriminatorField = $discriminatorField; + $this->discriminatorMap = $discriminatorMap; + $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; + $this->collectionClass = $collectionClass; + $this->storeEmptyArray = $storeEmptyArray; + } +} diff --git a/src/Mapping/Attribute/EmbedOne.php b/src/Mapping/Attribute/EmbedOne.php new file mode 100644 index 0000000000..b5bdbd448b --- /dev/null +++ b/src/Mapping/Attribute/EmbedOne.php @@ -0,0 +1,52 @@ +|null */ + public $discriminatorMap; + + /** @var string|null */ + public $defaultDiscriminatorValue; + + /** @param array|null $discriminatorMap */ + public function __construct( + ?string $name = null, + bool $nullable = false, + array $options = [], + ?string $strategy = null, + bool $notSaved = false, + ?string $targetDocument = null, + ?string $discriminatorField = null, + ?array $discriminatorMap = null, + ?string $defaultDiscriminatorValue = null, + ) { + parent::__construct($name, ClassMetadata::ONE, $nullable, $options, $strategy, $notSaved); + + $this->targetDocument = $targetDocument; + $this->discriminatorField = $discriminatorField; + $this->discriminatorMap = $discriminatorMap; + $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; + } +} diff --git a/src/Mapping/Attribute/EmbeddedDocument.php b/src/Mapping/Attribute/EmbeddedDocument.php new file mode 100644 index 0000000000..33abe93dc9 --- /dev/null +++ b/src/Mapping/Attribute/EmbeddedDocument.php @@ -0,0 +1,25 @@ +indexes = $indexes; + } +} diff --git a/src/Mapping/Attribute/Encrypt.php b/src/Mapping/Attribute/Encrypt.php new file mode 100644 index 0000000000..7fd9b6800d --- /dev/null +++ b/src/Mapping/Attribute/Encrypt.php @@ -0,0 +1,46 @@ +|null $sparsity + * @param positive-int|null $precision + * @param positive-int|null $trimFactor + * @param positive-int|null $contention + */ + public function __construct( + public ?EncryptQuery $queryType = null, + int|float|Int64|Decimal128|UTCDateTime|DateTimeInterface|null $min = null, + int|float|Int64|Decimal128|UTCDateTime|DateTimeInterface|null $max = null, + public ?int $sparsity = null, + public ?int $precision = null, + public ?int $trimFactor = null, + public ?int $contention = null, + ) { + $this->min = $min instanceof DateTimeInterface ? new UTCDateTime($min) : $min; + $this->max = $max instanceof DateTimeInterface ? new UTCDateTime($max) : $max; + } +} diff --git a/src/Mapping/Attribute/Field.php b/src/Mapping/Attribute/Field.php new file mode 100644 index 0000000000..60c0f6fdb4 --- /dev/null +++ b/src/Mapping/Attribute/Field.php @@ -0,0 +1,38 @@ +|null */ + public $enumType; + + /** + * @param mixed[] $options + * @param class-string|null $enumType + */ + public function __construct( + ?string $name = null, + ?string $type = null, + bool $nullable = false, + array $options = [], + ?string $strategy = null, + bool $notSaved = false, + ?string $enumType = null, + ) { + parent::__construct($name, $type, $nullable, $options, $strategy, $notSaved); + + $this->enumType = $enumType; + } +} diff --git a/src/Mapping/Attribute/File.php b/src/Mapping/Attribute/File.php new file mode 100644 index 0000000000..b5a49de8ca --- /dev/null +++ b/src/Mapping/Attribute/File.php @@ -0,0 +1,60 @@ +db = $db; + $this->bucketName = $bucketName; + $this->repositoryClass = $repositoryClass; + $this->indexes = $indexes; + $this->readOnly = $readOnly; + $this->shardKey = $shardKey; + $this->chunkSizeBytes = $chunkSizeBytes; + } +} diff --git a/src/Mapping/Attribute/File/ChunkSize.php b/src/Mapping/Attribute/File/ChunkSize.php new file mode 100644 index 0000000000..847fdaa092 --- /dev/null +++ b/src/Mapping/Attribute/File/ChunkSize.php @@ -0,0 +1,19 @@ +|null */ + public $discriminatorMap; + + /** @var string|null */ + public $defaultDiscriminatorValue; + + /** @param array|null $discriminatorMap */ + public function __construct( + bool $nullable = false, + array $options = [], + ?string $strategy = null, + bool $notSaved = false, + ?string $targetDocument = null, + ?string $discriminatorField = null, + ?array $discriminatorMap = null, + ?string $defaultDiscriminatorValue = null, + ) { + parent::__construct('metadata', ClassMetadata::ONE, $nullable, $options, $strategy, $notSaved); + + $this->targetDocument = $targetDocument; + $this->discriminatorField = $discriminatorField; + $this->discriminatorMap = $discriminatorMap; + $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; + } +} diff --git a/src/Mapping/Attribute/File/UploadDate.php b/src/Mapping/Attribute/File/UploadDate.php new file mode 100644 index 0000000000..d8d793fcce --- /dev/null +++ b/src/Mapping/Attribute/File/UploadDate.php @@ -0,0 +1,19 @@ +value = $value; + } +} diff --git a/src/Mapping/Attribute/Lock.php b/src/Mapping/Attribute/Lock.php new file mode 100644 index 0000000000..694493b7d4 --- /dev/null +++ b/src/Mapping/Attribute/Lock.php @@ -0,0 +1,17 @@ +repositoryClass = $repositoryClass; + $this->collection = $collection; + } +} diff --git a/src/Mapping/Attribute/MappingAttribute.php b/src/Mapping/Attribute/MappingAttribute.php new file mode 100644 index 0000000000..13bc8e8bae --- /dev/null +++ b/src/Mapping/Attribute/MappingAttribute.php @@ -0,0 +1,14 @@ +value = $value; + $this->tags = $tags; + } +} diff --git a/src/Mapping/Attribute/ReferenceMany.php b/src/Mapping/Attribute/ReferenceMany.php new file mode 100644 index 0000000000..d784b90538 --- /dev/null +++ b/src/Mapping/Attribute/ReferenceMany.php @@ -0,0 +1,120 @@ +|null */ + public $discriminatorMap; + + /** @var string|null */ + public $defaultDiscriminatorValue; + + /** @var bool|null */ + public $orphanRemoval; + + /** @var string|null */ + public $inversedBy; + + /** @var string|null */ + public $mappedBy; + + /** @var string|null */ + public $repositoryMethod; + + /** @var array */ + public $sort; + + /** @var array */ + public $criteria; + + /** @var int|null */ + public $limit; + + /** @var int|null */ + public $skip; + + /** @var string|null */ + public $collectionClass; + + /** @var string[] */ + public $prime; + + /** @var bool */ + public $storeEmptyArray; + + /** + * @param array|null $discriminatorMap + * @param string[]|string|null $cascade + * @param array $sort + * @param array $criteria + * @param string[] $prime + */ + public function __construct( + ?string $name = null, + bool $nullable = false, + array $options = [], + string $strategy = CollectionHelper::DEFAULT_STRATEGY, + bool $notSaved = false, + string $storeAs = ClassMetadata::REFERENCE_STORE_AS_DB_REF, + ?string $targetDocument = null, + ?string $discriminatorField = null, + ?array $discriminatorMap = null, + ?string $defaultDiscriminatorValue = null, + public $cascade = null, + ?bool $orphanRemoval = null, + ?string $inversedBy = null, + ?string $mappedBy = null, + ?string $repositoryMethod = null, + array $sort = [], + array $criteria = [], + ?int $limit = null, + ?int $skip = null, + ?string $collectionClass = null, + array $prime = [], + bool $storeEmptyArray = false, + ) { + parent::__construct($name, ClassMetadata::MANY, $nullable, $options, $strategy, $notSaved); + + $this->storeAs = $storeAs; + $this->targetDocument = $targetDocument; + $this->discriminatorField = $discriminatorField; + $this->discriminatorMap = $discriminatorMap; + $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; + $this->orphanRemoval = $orphanRemoval; + $this->inversedBy = $inversedBy; + $this->mappedBy = $mappedBy; + $this->repositoryMethod = $repositoryMethod; + $this->sort = $sort; + $this->criteria = $criteria; + $this->limit = $limit; + $this->skip = $skip; + $this->collectionClass = $collectionClass; + $this->prime = $prime; + $this->storeEmptyArray = $storeEmptyArray; + } +} diff --git a/src/Mapping/Attribute/ReferenceOne.php b/src/Mapping/Attribute/ReferenceOne.php new file mode 100644 index 0000000000..c2598f453a --- /dev/null +++ b/src/Mapping/Attribute/ReferenceOne.php @@ -0,0 +1,102 @@ +|null */ + public $discriminatorMap; + + /** @var string|null */ + public $defaultDiscriminatorValue; + + /** @var bool|null */ + public $orphanRemoval; + + /** @var string|null */ + public $inversedBy; + + /** @var string|null */ + public $mappedBy; + + /** @var string|null */ + public $repositoryMethod; + + /** @var array */ + public $sort; + + /** @var array */ + public $criteria; + + /** @var int|null */ + public $limit; + + /** @var int|null */ + public $skip; + + /** + * @param class-string|null $targetDocument + * @param array|null $discriminatorMap + * @param string[]|string|null $cascade + * @param array $sort + * @param array $criteria + */ + public function __construct( + ?string $name = null, + bool $nullable = false, + array $options = [], + ?string $strategy = null, + bool $notSaved = false, + string $storeAs = ClassMetadata::REFERENCE_STORE_AS_DB_REF, + ?string $targetDocument = null, + ?string $discriminatorField = null, + ?array $discriminatorMap = null, + ?string $defaultDiscriminatorValue = null, + public $cascade = null, + ?bool $orphanRemoval = null, + ?string $inversedBy = null, + ?string $mappedBy = null, + ?string $repositoryMethod = null, + array $sort = [], + array $criteria = [], + ?int $limit = null, + ?int $skip = null, + ) { + parent::__construct($name, ClassMetadata::ONE, $nullable, $options, $strategy, $notSaved); + + $this->storeAs = $storeAs; + $this->targetDocument = $targetDocument; + $this->discriminatorField = $discriminatorField; + $this->discriminatorMap = $discriminatorMap; + $this->defaultDiscriminatorValue = $defaultDiscriminatorValue; + $this->orphanRemoval = $orphanRemoval; + $this->inversedBy = $inversedBy; + $this->mappedBy = $mappedBy; + $this->repositoryMethod = $repositoryMethod; + $this->sort = $sort; + $this->criteria = $criteria; + $this->limit = $limit; + $this->skip = $skip; + } +} diff --git a/src/Mapping/Attribute/SearchIndex.php b/src/Mapping/Attribute/SearchIndex.php new file mode 100644 index 0000000000..11f2a9047b --- /dev/null +++ b/src/Mapping/Attribute/SearchIndex.php @@ -0,0 +1,38 @@ +|null $fields + * @param list|null $analyzers + * @param SearchIndexStoredSource|null $storedSource + * @param list|null $synonyms + */ + public function __construct( + public ?string $name = null, + public ?bool $dynamic = null, + public ?array $fields = null, + public ?string $analyzer = null, + public ?string $searchAnalyzer = null, + public ?array $analyzers = null, + public $storedSource = null, + public ?array $synonyms = null, + ) { + } +} diff --git a/src/Mapping/Attribute/ShardKey.php b/src/Mapping/Attribute/ShardKey.php new file mode 100644 index 0000000000..649b2d8041 --- /dev/null +++ b/src/Mapping/Attribute/ShardKey.php @@ -0,0 +1,29 @@ +keys = $keys; + $this->unique = $unique; + $this->numInitialChunks = $numInitialChunks; + } +} diff --git a/src/Mapping/Attribute/TimeSeries.php b/src/Mapping/Attribute/TimeSeries.php new file mode 100644 index 0000000000..4ecd1f7bf2 --- /dev/null +++ b/src/Mapping/Attribute/TimeSeries.php @@ -0,0 +1,27 @@ +validator = $validator; + $this->action = $action; + $this->level = $level; + } +} diff --git a/src/Mapping/Attribute/VectorSearchIndex.php b/src/Mapping/Attribute/VectorSearchIndex.php new file mode 100644 index 0000000000..241a78da99 --- /dev/null +++ b/src/Mapping/Attribute/VectorSearchIndex.php @@ -0,0 +1,26 @@ + $fields */ + public function __construct( + public array $fields, + public ?string $name = null, + ) { + } +} diff --git a/src/Mapping/Attribute/Version.php b/src/Mapping/Attribute/Version.php new file mode 100644 index 0000000000..295a25b615 --- /dev/null +++ b/src/Mapping/Attribute/Version.php @@ -0,0 +1,17 @@ +db = $db; + $this->view = $view; + $this->rootClass = $rootClass; + $this->repositoryClass = $repositoryClass; + } +} diff --git a/src/Mapping/ClassMetadata.php b/src/Mapping/ClassMetadata.php index 64a77f2348..658e0d33e3 100644 --- a/src/Mapping/ClassMetadata.php +++ b/src/Mapping/ClassMetadata.php @@ -13,8 +13,7 @@ use Doctrine\Instantiator\InstantiatorInterface; use Doctrine\ODM\MongoDB\Id\IdGenerator; use Doctrine\ODM\MongoDB\LockException; -use Doctrine\ODM\MongoDB\Mapping\Annotations\EncryptQuery; -use Doctrine\ODM\MongoDB\Mapping\Annotations\TimeSeries; +use Doctrine\ODM\MongoDB\Mapping\Attribute\TimeSeries; use Doctrine\ODM\MongoDB\Mapping\PropertyAccessors\EnumPropertyAccessor; use Doctrine\ODM\MongoDB\Mapping\PropertyAccessors\PropertyAccessor; use Doctrine\ODM\MongoDB\Mapping\PropertyAccessors\PropertyAccessorFactory; diff --git a/src/Mapping/Driver/AttributeDriver.php b/src/Mapping/Driver/AttributeDriver.php index 5db0d3f6ed..1f4697535a 100644 --- a/src/Mapping/Driver/AttributeDriver.php +++ b/src/Mapping/Driver/AttributeDriver.php @@ -6,10 +6,8 @@ use Doctrine\Common\Annotations\Reader; use Doctrine\ODM\MongoDB\Events; -use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; -use Doctrine\ODM\MongoDB\Mapping\Annotations\AbstractIndex; -use Doctrine\ODM\MongoDB\Mapping\Annotations\ShardKey; -use Doctrine\ODM\MongoDB\Mapping\Annotations\TimeSeries; +use Doctrine\ODM\MongoDB\Mapping\Annotations\Indexes; +use Doctrine\ODM\MongoDB\Mapping\Attribute as ODM; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; use Doctrine\ODM\MongoDB\Mapping\MappingException; use Doctrine\Persistence\Mapping\ClassMetadata as PersistenceClassMetadata; @@ -22,6 +20,8 @@ use ReflectionMethod; use ReflectionProperty; +use function array_any; +use function array_find; use function array_merge; use function array_replace; use function assert; @@ -88,8 +88,6 @@ public function loadMetadataForClass($className, PersistenceClassMetadata $metad $documentAttribute = null; foreach ($classAttributes as $attribute) { - $classAttributes[$attribute::class] = $attribute; - if ($attribute instanceof ODM\AbstractDocument) { if ($documentAttribute !== null) { throw MappingException::classCanOnlyBeMappedByOneAbstractDocument($className, $documentAttribute, $attribute); @@ -111,7 +109,7 @@ public function loadMetadataForClass($className, PersistenceClassMetadata $metad $this->addVectorSearchIndex($metadata, $attribute); } - if ($attribute instanceof ODM\Indexes) { + if ($attribute instanceof Indexes) { trigger_deprecation( 'doctrine/mongodb-odm', '2.2', @@ -255,7 +253,7 @@ public function loadMetadataForClass($className, PersistenceClassMetadata $metad $indexes[] = $propertyAttribute; } - if ($propertyAttribute instanceof ODM\Indexes) { + if ($propertyAttribute instanceof Indexes) { trigger_deprecation( 'doctrine/mongodb-odm', '2.2', @@ -296,17 +294,18 @@ public function loadMetadataForClass($className, PersistenceClassMetadata $metad } // Set shard key after all fields to ensure we mapped all its keys - if (isset($classAttributes[ShardKey::class])) { - assert($classAttributes[ShardKey::class] instanceof ShardKey); - $this->setShardKey($metadata, $classAttributes[ShardKey::class]); + $attribute = array_find($classAttributes, static fn ($attr) => $attr instanceof ODM\ShardKey); + if ($attribute) { + $this->setShardKey($metadata, $attribute); } // Mark as time series only after mapping all fields - if (isset($classAttributes[TimeSeries::class])) { - assert($classAttributes[TimeSeries::class] instanceof TimeSeries); - $metadata->markAsTimeSeries($classAttributes[TimeSeries::class]); + $attribute = array_find($classAttributes, static fn ($attr) => $attr instanceof ODM\TimeSeries); + if ($attribute) { + $metadata->markAsTimeSeries($attribute); } + $hasLifecycleCallbacks = array_any($classAttributes, static fn ($attr) => $attr instanceof ODM\HasLifecycleCallbacks); foreach ($reflClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { /* Filter for the declaring class only. Callbacks from parent * classes will already be registered. @@ -320,7 +319,7 @@ public function loadMetadataForClass($className, PersistenceClassMetadata $metad $metadata->registerAlsoLoadMethod($method->getName(), $methodAttribute->value); } - if (! isset($classAttributes[ODM\HasLifecycleCallbacks::class])) { + if (! $hasLifecycleCallbacks) { continue; } @@ -348,7 +347,7 @@ public function loadMetadataForClass($className, PersistenceClassMetadata $metad } /** @param array $keys */ - private function addIndex(ClassMetadata $class, AbstractIndex $index, array $keys = []): void + private function addIndex(ClassMetadata $class, ODM\AbstractIndex $index, array $keys = []): void { $keys = array_merge($keys, $index->keys); $options = []; diff --git a/src/Mapping/Driver/AttributeReader.php b/src/Mapping/Driver/AttributeReader.php index 3dcb5fe9ee..bd4c3251b7 100644 --- a/src/Mapping/Driver/AttributeReader.php +++ b/src/Mapping/Driver/AttributeReader.php @@ -4,7 +4,7 @@ namespace Doctrine\ODM\MongoDB\Mapping\Driver; -use Doctrine\ODM\MongoDB\Mapping\Annotations\Annotation; +use Doctrine\ODM\MongoDB\Mapping\Attribute\MappingAttribute; use ReflectionAttribute; use ReflectionClass; use ReflectionMethod; @@ -16,19 +16,19 @@ /** @internal */ final class AttributeReader { - /** @return array */ + /** @return MappingAttribute[] */ public function getClassAttributes(ReflectionClass $class): array { return $this->convertToAttributeInstances($class->getAttributes()); } - /** @return array */ + /** @return MappingAttribute[] */ public function getMethodAttributes(ReflectionMethod $method): array { return $this->convertToAttributeInstances($method->getAttributes()); } - /** @return array */ + /** @return MappingAttribute[] */ public function getPropertyAttributes(ReflectionProperty $property): array { return $this->convertToAttributeInstances($property->getAttributes()); @@ -37,7 +37,7 @@ public function getPropertyAttributes(ReflectionProperty $property): array /** * @param ReflectionAttribute[] $attributes * - * @return Annotation[] + * @return MappingAttribute[] */ private function convertToAttributeInstances(array $attributes): array { @@ -45,13 +45,13 @@ private function convertToAttributeInstances(array $attributes): array foreach ($attributes as $attribute) { $attributeName = $attribute->getName(); - // Make sure we only get Doctrine Annotations - if (! is_subclass_of($attributeName, Annotation::class)) { + // Make sure we only get MongoDB ODM attribute classes + if (! is_subclass_of($attributeName, MappingAttribute::class)) { continue; } $instance = $attribute->newInstance(); - assert($instance instanceof Annotation); + assert($instance instanceof MappingAttribute); $instances[] = $instance; } diff --git a/src/Mapping/Driver/XmlDriver.php b/src/Mapping/Driver/XmlDriver.php index f0acbfc8b8..e0a839c5e2 100644 --- a/src/Mapping/Driver/XmlDriver.php +++ b/src/Mapping/Driver/XmlDriver.php @@ -4,9 +4,9 @@ namespace Doctrine\ODM\MongoDB\Mapping\Driver; -use Doctrine\ODM\MongoDB\Mapping\Annotations\EncryptQuery; -use Doctrine\ODM\MongoDB\Mapping\Annotations\TimeSeries; +use Doctrine\ODM\MongoDB\Mapping\Attribute\TimeSeries; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; +use Doctrine\ODM\MongoDB\Mapping\EncryptQuery; use Doctrine\ODM\MongoDB\Mapping\MappingException; use Doctrine\ODM\MongoDB\Mapping\TimeSeries\Granularity; use Doctrine\ODM\MongoDB\Utility\CollectionHelper; diff --git a/src/Mapping/EncryptQuery.php b/src/Mapping/EncryptQuery.php new file mode 100644 index 0000000000..db9a6767e7 --- /dev/null +++ b/src/Mapping/EncryptQuery.php @@ -0,0 +1,18 @@ +dm->getClassMetadata(AbstractMappingDriverTimeSeriesDocumentWithGranularity::class); + self::assertInstanceOf(TimeSeries::class, $metadata->timeSeriesOptions); + // Compare using arrays as the object can be an instance of the Attribute or the child Annotation class self::assertEquals( - new ODM\TimeSeries('time', 'metadata', Granularity::Seconds, 86400), - $metadata->timeSeriesOptions, + (array) new TimeSeries('time', 'metadata', Granularity::Seconds, 86400), + (array) $metadata->timeSeriesOptions, ); } @@ -721,9 +724,10 @@ public function testTimeSeriesDocumentWithBucket(): void { $metadata = $this->dm->getClassMetadata(AbstractMappingDriverTimeSeriesDocumentWithBucket::class); + self::assertInstanceOf(TimeSeries::class, $metadata->timeSeriesOptions); self::assertEquals( - new ODM\TimeSeries('time', 'metadata', expireAfterSeconds: 86400, bucketMaxSpanSeconds: 10, bucketRoundingSeconds: 15), - $metadata->timeSeriesOptions, + (array) new TimeSeries('time', 'metadata', expireAfterSeconds: 86400, bucketMaxSpanSeconds: 10, bucketRoundingSeconds: 15), + (array) $metadata->timeSeriesOptions, ); } } diff --git a/tests/Tests/Mapping/Driver/AbstractDriverTestCase.php b/tests/Tests/Mapping/Driver/AbstractDriverTestCase.php index c4a2df5b4c..1a84114f9b 100644 --- a/tests/Tests/Mapping/Driver/AbstractDriverTestCase.php +++ b/tests/Tests/Mapping/Driver/AbstractDriverTestCase.php @@ -5,8 +5,8 @@ namespace Doctrine\ODM\MongoDB\Tests\Mapping\Driver; use DateTimeImmutable; -use Doctrine\ODM\MongoDB\Mapping\Annotations\EncryptQuery; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; +use Doctrine\ODM\MongoDB\Mapping\EncryptQuery; use Doctrine\Persistence\Mapping\Driver\MappingDriver; use Documents\Account; use Documents\Address; diff --git a/tests/Tests/Mapping/EncryptQueryTest.php b/tests/Tests/Mapping/EncryptQueryTest.php new file mode 100644 index 0000000000..0056335281 --- /dev/null +++ b/tests/Tests/Mapping/EncryptQueryTest.php @@ -0,0 +1,19 @@ +