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\Factory ;
use Doctrine\Common\Cache\Cache ;
use Symfony\Component\Serializer\Exception\InvalidArgumentException ;
use Symfony\Component\Serializer\Mapping\ClassMetadata ;
use Symfony\Component\Serializer\Mapping\Loader\LoaderInterface ;
/**
* Returns a { @ link ClassMetadata } .
*
* @ author Kévin Dunglas < dunglas @ gmail . com >
*/
class ClassMetadataFactory implements ClassMetadataFactoryInterface
{
2018-11-23 12:29:20 +00:00
use ClassResolverTrait ;
2016-04-20 16:56:34 +00:00
2018-11-23 12:29:20 +00:00
private $loader ;
2015-08-18 00:00:26 +00:00
private $cache ;
private $loadedClasses ;
public function __construct ( LoaderInterface $loader , Cache $cache = null )
{
$this -> loader = $loader ;
$this -> cache = $cache ;
2018-11-23 12:29:20 +00:00
if ( null !== $cache ) {
@ trigger_error ( sprintf ( 'Passing a Doctrine Cache instance as 2nd parameter of the "%s" constructor is deprecated since Symfony 3.1. This parameter will be removed in Symfony 4.0. Use the "%s" class instead.' , __CLASS__ , CacheClassMetadataFactory :: class ), E_USER_DEPRECATED );
}
2015-08-18 00:00:26 +00:00
}
/**
* { @ inheritdoc }
*/
public function getMetadataFor ( $value )
{
$class = $this -> getClass ( $value );
if ( isset ( $this -> loadedClasses [ $class ])) {
return $this -> loadedClasses [ $class ];
}
if ( $this -> cache && ( $this -> loadedClasses [ $class ] = $this -> cache -> fetch ( $class ))) {
return $this -> loadedClasses [ $class ];
}
$classMetadata = new ClassMetadata ( $class );
$this -> loader -> loadClassMetadata ( $classMetadata );
$reflectionClass = $classMetadata -> getReflectionClass ();
// Include metadata from the parent class
if ( $parent = $reflectionClass -> getParentClass ()) {
$classMetadata -> merge ( $this -> getMetadataFor ( $parent -> name ));
}
// Include metadata from all implemented interfaces
foreach ( $reflectionClass -> getInterfaces () as $interface ) {
$classMetadata -> merge ( $this -> getMetadataFor ( $interface -> name ));
}
if ( $this -> cache ) {
$this -> cache -> save ( $class , $classMetadata );
}
return $this -> loadedClasses [ $class ] = $classMetadata ;
}
/**
* { @ inheritdoc }
*/
public function hasMetadataFor ( $value )
{
2018-11-23 12:29:20 +00:00
try {
$this -> getClass ( $value );
2015-08-18 00:00:26 +00:00
2018-11-23 12:29:20 +00:00
return true ;
} catch ( InvalidArgumentException $invalidArgumentException ) {
// Return false in case of exception
2015-08-18 00:00:26 +00:00
}
2018-11-23 12:29:20 +00:00
return false ;
2015-08-18 00:00:26 +00:00
}
}