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 ;
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
{
/**
* @ var Reader
*/
private $reader ;
/**
* @ param Reader $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 ) {
foreach ( $this -> reader -> getPropertyAnnotations ( $property ) as $groups ) {
if ( $groups instanceof Groups ) {
foreach ( $groups -> getGroups () as $group ) {
$attributesMetadata [ $property -> name ] -> addGroup ( $group );
}
}
$loaded = true ;
}
}
}
foreach ( $reflectionClass -> getMethods () as $method ) {
if ( $method -> getDeclaringClass () -> name === $className ) {
foreach ( $this -> reader -> getMethodAnnotations ( $method ) as $groups ) {
if ( $groups instanceof Groups ) {
if ( preg_match ( '/^(get|is|has|set)(.+)$/i' , $method -> name , $matches )) {
$attributeName = lcfirst ( $matches [ 2 ]);
if ( isset ( $attributesMetadata [ $attributeName ])) {
$attributeMetadata = $attributesMetadata [ $attributeName ];
} else {
$attributesMetadata [ $attributeName ] = $attributeMetadata = new AttributeMetadata ( $attributeName );
$classMetadata -> addAttributeMetadata ( $attributeMetadata );
}
foreach ( $groups -> getGroups () as $group ) {
$attributeMetadata -> addGroup ( $group );
}
} else {
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 ));
}
}
$loaded = true ;
}
}
}
return $loaded ;
}
}