1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
<?php
namespace OneOfZero\Json\Helpers;
use OneOfZero\Json\ReferableInterface;
use OneOfZero\Json\ReferenceResolverInterface;
class ProxyHelper
{
private static $proxyInterfaces = [
'ProxyManager\Proxy\ProxyInterface',
'Doctrine\Common\Persistence\Proxy'
];
private $referenceResolver;
public function __construct(ReferenceResolverInterface $referenceResolver = null)
{
$this->referenceResolver = $referenceResolver;
}
public function isProxy($classOrInstance)
{
foreach (self::$proxyInterfaces as $proxyInterface)
{
if (is_subclass_of($classOrInstance, $proxyInterface))
{
return true;
}
}
return false;
}
public function getClassBeneath($classOrInstance)
{
if (!$this->isProxy($classOrInstance))
{
return is_string($classOrInstance) ? $classOrInstance : get_class($classOrInstance);
}
return $this->getClassBeneath(get_parent_class($classOrInstance));
}
public function unproxy($instance)
{
if (!$this->isProxy($instance))
{
return $instance;
}
if ($this->referenceResolver && $instance instanceof ReferableInterface)
{
return $this->referenceResolver->resolve($this->getClassBeneath($instance), $instance->getId(), false);
}
if (is_subclass_of($instance, 'Doctrine\Common\Persistence\Proxy'))
{
if (!call_user_func([ $instance, '__isInitialized' ]))
{
call_user_func([$instance, '__load']);
}
}
if (is_subclass_of($instance, 'ProxyManager\Proxy\LazyLoadingInterface'))
{
if (!call_user_func([ $instance, 'isProxyInitialized' ]))
{
call_user_func([$instance, 'initializeProxy']);
}
}
if (is_subclass_of($instance, 'ProxyManager\Proxy\ValueHolderInterface'))
{
return call_user_func([$instance, 'getWrappedValueHolderValue']);
}
return clone $instance;
}
}