2015-08-18 00:00:26 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Serializer\Mapping\Loader ;
use Doctrine\Common\Annotations\Reader ;
use Symfony\Component\Serializer\Annotation\Groups ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Serializer\Annotation\MaxDepth ;
2015-08-18 00:00:26 +00:00
use Symfony\Component\Serializer\Exception\MappingException ;
use Symfony\Component\Serializer\Mapping\AttributeMetadata ;
use Symfony\Component\Serializer\Mapping\ClassMetadataInterface ;
/**
* Annotation loader .
*
* @ author Kévin Dunglas < dunglas @ gmail . com >
*/
class AnnotationLoader implements LoaderInterface
{
private $reader ;
public function __construct ( Reader $reader )
{
$this -> reader = $reader ;
}
/**
* { @ inheritdoc }
*/
public function loadClassMetadata ( ClassMetadataInterface $classMetadata )
{
$reflectionClass = $classMetadata -> getReflectionClass ();
$className = $reflectionClass -> name ;
$loaded = false ;
$attributesMetadata = $classMetadata -> getAttributesMetadata ();
foreach ( $reflectionClass -> getProperties () as $property ) {
2015-11-17 21:42:33 +00:00
if ( ! isset ( $attributesMetadata [ $property -> name ])) {
2015-08-18 00:00:26 +00:00
$attributesMetadata [ $property -> name ] = new AttributeMetadata ( $property -> name );
$classMetadata -> addAttributeMetadata ( $attributesMetadata [ $property -> name ]);
}
if ( $property -> getDeclaringClass () -> name === $className ) {
2018-11-23 12:29:20 +00:00
foreach ( $this -> reader -> getPropertyAnnotations ( $property ) as $annotation ) {
if ( $annotation instanceof Groups ) {
foreach ( $annotation -> getGroups () as $group ) {
2015-08-18 00:00:26 +00:00
$attributesMetadata [ $property -> name ] -> addGroup ( $group );
}
2018-11-23 12:29:20 +00:00
} elseif ( $annotation instanceof MaxDepth ) {
$attributesMetadata [ $property -> name ] -> setMaxDepth ( $annotation -> getMaxDepth ());
2015-08-18 00:00:26 +00:00
}
$loaded = true ;
}
}
}
foreach ( $reflectionClass -> getMethods () as $method ) {
2018-11-23 12:29:20 +00:00
if ( $method -> getDeclaringClass () -> name !== $className ) {
continue ;
}
$accessorOrMutator = preg_match ( '/^(get|is|has|set)(.+)$/i' , $method -> name , $matches );
if ( $accessorOrMutator ) {
$attributeName = lcfirst ( $matches [ 2 ]);
if ( isset ( $attributesMetadata [ $attributeName ])) {
$attributeMetadata = $attributesMetadata [ $attributeName ];
} else {
$attributesMetadata [ $attributeName ] = $attributeMetadata = new AttributeMetadata ( $attributeName );
$classMetadata -> addAttributeMetadata ( $attributeMetadata );
}
}
foreach ( $this -> reader -> getMethodAnnotations ( $method ) as $annotation ) {
if ( $annotation instanceof Groups ) {
if ( ! $accessorOrMutator ) {
throw new MappingException ( sprintf ( 'Groups on "%s::%s" cannot be added. Groups can only be added on methods beginning with "get", "is", "has" or "set".' , $className , $method -> name ));
2015-08-18 00:00:26 +00:00
}
2018-11-23 12:29:20 +00:00
foreach ( $annotation -> getGroups () as $group ) {
$attributeMetadata -> addGroup ( $group );
}
} elseif ( $annotation instanceof MaxDepth ) {
if ( ! $accessorOrMutator ) {
throw new MappingException ( sprintf ( 'MaxDepth on "%s::%s" cannot be added. MaxDepth can only be added on methods beginning with "get", "is", "has" or "set".' , $className , $method -> name ));
}
$attributeMetadata -> setMaxDepth ( $annotation -> getMaxDepth ());
2015-08-18 00:00:26 +00:00
}
2018-11-23 12:29:20 +00:00
$loaded = true ;
2015-08-18 00:00:26 +00:00
}
}
return $loaded ;
}
}