Blame | Last modification | View Log | Download
Custom Annotation Classes=========================If you want to define your own annotations, you just have to group themin a namespace.Annotation classes have to contain a class-level docblock with the text``@Annotation``:.. code-block:: phpnamespace MyCompany\Annotations;/** @Annotation */class Bar{// some code}Inject annotation values------------------------The annotation parser checks if the annotation constructor has arguments,if so then it will pass the value array, otherwise it will try to injectvalues into public properties directly:.. code-block:: phpnamespace MyCompany\Annotations;/*** @Annotation** Some Annotation using a constructor*/class Bar{private $foo;public function __construct(array $values){$this->foo = $values['foo'];}}/*** @Annotation** Some Annotation without a constructor*/class Foo{public $bar;}Optional: Constructors with Named Parameters--------------------------------------------Starting with Annotations v1.11 a new annotation instantiation strategyis available that aims at compatibility of Annotation classes with the PHP 8attribute feature. You need to declare a constructor with regular parameternames that match the named arguments in the annotation syntax.To enable this feature, you can tag your annotation class with``@NamedArgumentConstructor`` (available from v1.12) or implement the``Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation`` interface(available from v1.11 and deprecated as of v1.12).When using the ``@NamedArgumentConstructor`` tag, the first argument of theconstructor is considered as the default one.Usage with the ``@NamedArgumentConstructor`` tag.. code-block:: phpnamespace MyCompany\Annotations;/*** @Annotation* @NamedArgumentConstructor*/class Bar implements NamedArgumentConstructorAnnotation{private $foo;public function __construct(string $foo){$this->foo = $foo;}}/** Usable with @Bar(foo="baz") *//** Usable with @Bar("baz") */In combination with PHP 8's constructor property promotion featureyou can simplify this to:.. code-block:: phpnamespace MyCompany\Annotations;/*** @Annotation* @NamedArgumentConstructor*/class Bar implements NamedArgumentConstructorAnnotation{public function __construct(private string $foo) {}}Usage with the``Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation``interface (v1.11, deprecated as of v1.12):.. code-block:: phpnamespace MyCompany\Annotations;use Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation;/** @Annotation */class Bar implements NamedArgumentConstructorAnnotation{private $foo;public function __construct(private string $foo) {}}/** Usable with @Bar(foo="baz") */Annotation Target-----------------``@Target`` indicates the kinds of class elements to which an annotationtype is applicable. Then you could define one or more targets:- ``CLASS`` Allowed in class docblocks- ``PROPERTY`` Allowed in property docblocks- ``METHOD`` Allowed in the method docblocks- ``FUNCTION`` Allowed in function dockblocks- ``ALL`` Allowed in class, property, method and function docblocks- ``ANNOTATION`` Allowed inside other annotationsIf the annotations is not allowed in the current context, an``AnnotationException`` is thrown... code-block:: phpnamespace MyCompany\Annotations;/*** @Annotation* @Target({"METHOD","PROPERTY"})*/class Bar{// some code}/*** @Annotation* @Target("CLASS")*/class Foo{// some code}Attribute types---------------The annotation parser checks the given parameters using the phpdocannotation ``@var``, The data type could be validated using the ``@var``annotation on the annotation properties or using the ``@Attributes`` and``@Attribute`` annotations.If the data type does not match you get an ``AnnotationException``.. code-block:: phpnamespace MyCompany\Annotations;/*** @Annotation* @Target({"METHOD","PROPERTY"})*/class Bar{/** @var mixed */public $mixed;/** @var boolean */public $boolean;/** @var bool */public $bool;/** @var float */public $float;/** @var string */public $string;/** @var integer */public $integer;/** @var array */public $array;/** @var SomeAnnotationClass */public $annotation;/** @var array<integer> */public $arrayOfIntegers;/** @var array<SomeAnnotationClass> */public $arrayOfAnnotations;}/*** @Annotation* @Target({"METHOD","PROPERTY"})* @Attributes({* @Attribute("stringProperty", type = "string"),* @Attribute("annotProperty", type = "SomeAnnotationClass"),* })*/class Foo{public function __construct(array $values){$this->stringProperty = $values['stringProperty'];$this->annotProperty = $values['annotProperty'];}// some code}Annotation Required-------------------``@Required`` indicates that the field must be specified when theannotation is used. If it is not used you get an ``AnnotationException``stating that this value can not be null.Declaring a required field:.. code-block:: php/*** @Annotation* @Target("ALL")*/class Foo{/** @Required */public $requiredField;}Usage:.. code-block:: php/** @Foo(requiredField="value") */public $direction; // Valid/** @Foo */public $direction; // Required field missing, throws an AnnotationExceptionEnumerated values------------------ An annotation property marked with ``@Enum`` is a field that accepts afixed set of scalar values.- You should use ``@Enum`` fields any time you need to represent fixedvalues.- The annotation parser checks the given value and throws an``AnnotationException`` if the value does not match.Declaring an enumerated property:.. code-block:: php/*** @Annotation* @Target("ALL")*/class Direction{/*** @Enum({"NORTH", "SOUTH", "EAST", "WEST"})*/public $value;}Annotation usage:.. code-block:: php/** @Direction("NORTH") */public $direction; // Valid value/** @Direction("NORTHEAST") */public $direction; // Invalid value, throws an AnnotationExceptionConstants---------The use of constants and class constants is available on the annotationsparser.The following usages are allowed:.. code-block:: phpnamespace MyCompany\Entity;use MyCompany\Annotations\Foo;use MyCompany\Annotations\Bar;use MyCompany\Entity\SomeClass;/*** @Foo(PHP_EOL)* @Bar(Bar::FOO)* @Foo({SomeClass::FOO, SomeClass::BAR})* @Bar({SomeClass::FOO_KEY = SomeClass::BAR_VALUE})*/class User{}Be careful with constants and the cache !.. note::The cached reader will not re-evaluate each time an annotation isloaded from cache. When a constant is changed the cache must becleaned.Usage-----Using the library API is simple. Using the annotations described in theprevious section, you can now annotate other classes with yourannotations:.. code-block:: phpnamespace MyCompany\Entity;use MyCompany\Annotations\Foo;use MyCompany\Annotations\Bar;/*** @Foo(bar="foo")* @Bar(foo="bar")*/class User{}Now we can write a script to get the annotations above:.. code-block:: php$reflClass = new ReflectionClass('MyCompany\Entity\User');$classAnnotations = $reader->getClassAnnotations($reflClass);foreach ($classAnnotations AS $annot) {if ($annot instanceof \MyCompany\Annotations\Foo) {echo $annot->bar; // prints "foo";} else if ($annot instanceof \MyCompany\Annotations\Bar) {echo $annot->foo; // prints "bar";}}You have a complete API for retrieving annotation class instances from aclass, property or method docblock:Reader API~~~~~~~~~~Access all annotations of a class^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getClassAnnotations(\ReflectionClass $class);Access one annotation of a class^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getClassAnnotation(\ReflectionClass $class, $annotationName);Access all annotations of a method^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getMethodAnnotations(\ReflectionMethod $method);Access one annotation of a method^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getMethodAnnotation(\ReflectionMethod $method, $annotationName);Access all annotations of a property^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getPropertyAnnotations(\ReflectionProperty $property);Access one annotation of a property^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getPropertyAnnotation(\ReflectionProperty $property, $annotationName);Access all annotations of a function^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getFunctionAnnotations(\ReflectionFunction $property);Access one annotation of a function^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.. code-block:: phppublic function getFunctionAnnotation(\ReflectionFunction $property, $annotationName);