/vendor/doctrine/doctrine-cache-bundle/Acl/Model/AclCache.php
https://gitlab.com/cuza/Clinic_Recods · PHP · 239 lines · 127 code · 49 blank · 63 comment · 9 complexity · 3908eccba950c8d023082615747d0daa MD5 · raw file
- <?php
- namespace Doctrine\Bundle\DoctrineCacheBundle\Acl\Model;
- use Doctrine\Common\Cache\CacheProvider;
- use Symfony\Component\Security\Acl\Model\AclCacheInterface;
- use Symfony\Component\Security\Acl\Model\AclInterface;
- use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;
- use Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface;
- /**
- * This class is a wrapper around the actual cache implementation.
- *
- * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author Fabien Potencier <fabien@symfony.com>
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- */
- class AclCache implements AclCacheInterface
- {
- /**
- * @var \Doctrine\Common\Cache\CacheProvider
- */
- private $cache;
- /**
- * @var \Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface
- */
- private $permissionGrantingStrategy;
- /**
- * Constructor
- *
- * @param \Doctrine\Common\Cache\CacheProvider $cache
- * @param \Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface $permissionGrantingStrategy
- */
- public function __construct(CacheProvider $cache, PermissionGrantingStrategyInterface $permissionGrantingStrategy)
- {
- $this->cache = $cache;
- $this->permissionGrantingStrategy = $permissionGrantingStrategy;
- }
- /**
- * {@inheritdoc}
- */
- public function evictFromCacheById($primaryKey)
- {
- if ( ! $this->cache->contains($primaryKey)) {
- return;
- }
- $key = $this->cache->fetch($primaryKey);
- $this->cache->delete($primaryKey);
- $this->evictFromCacheByKey($key);
- }
- /**
- * {@inheritdoc}
- */
- public function evictFromCacheByIdentity(ObjectIdentityInterface $oid)
- {
- $key = $this->createKeyFromIdentity($oid);
- $this->evictFromCacheByKey($key);
- }
- /**
- * {@inheritdoc}
- */
- public function getFromCacheById($primaryKey)
- {
- if ( ! $this->cache->contains($primaryKey)) {
- return null;
- }
- $key = $this->cache->fetch($primaryKey);
- $acl = $this->getFromCacheByKey($key);
- if ( ! $acl) {
- $this->cache->delete($primaryKey);
- return null;
- }
- return $acl;
- }
- /**
- * {@inheritdoc}
- */
- public function getFromCacheByIdentity(ObjectIdentityInterface $oid)
- {
- $key = $this->createKeyFromIdentity($oid);
- return $this->getFromCacheByKey($key);
- }
- /**
- * {@inheritdoc}
- */
- public function putInCache(AclInterface $acl)
- {
- if (null === $acl->getId()) {
- throw new \InvalidArgumentException('Transient ACLs cannot be cached.');
- }
- $parentAcl = $acl->getParentAcl();
- if (null !== $parentAcl) {
- $this->putInCache($parentAcl);
- }
- $key = $this->createKeyFromIdentity($acl->getObjectIdentity());
- $this->cache->save($key, serialize($acl));
- $this->cache->save($acl->getId(), $key);
- }
- /**
- * {@inheritdoc}
- */
- public function clearCache()
- {
- return $this->cache->deleteAll();
- }
- /**
- * Unserialize a given ACL.
- *
- * @param string $serialized
- *
- * @return \Symfony\Component\Security\Acl\Model\AclInterface
- */
- private function unserializeAcl($serialized)
- {
- $acl = unserialize($serialized);
- $parentId = $acl->getParentAcl();
- if (null !== $parentId) {
- $parentAcl = $this->getFromCacheById($parentId);
- if (null === $parentAcl) {
- return null;
- }
- $acl->setParentAcl($parentAcl);
- }
- $reflectionProperty = new \ReflectionProperty($acl, 'permissionGrantingStrategy');
- $reflectionProperty->setAccessible(true);
- $reflectionProperty->setValue($acl, $this->permissionGrantingStrategy);
- $reflectionProperty->setAccessible(false);
- $aceAclProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'acl');
- $aceAclProperty->setAccessible(true);
- foreach ($acl->getObjectAces() as $ace) {
- $aceAclProperty->setValue($ace, $acl);
- }
- foreach ($acl->getClassAces() as $ace) {
- $aceAclProperty->setValue($ace, $acl);
- }
- $aceClassFieldProperty = new \ReflectionProperty($acl, 'classFieldAces');
- $aceClassFieldProperty->setAccessible(true);
- foreach ($aceClassFieldProperty->getValue($acl) as $aces) {
- foreach ($aces as $ace) {
- $aceAclProperty->setValue($ace, $acl);
- }
- }
- $aceClassFieldProperty->setAccessible(false);
- $aceObjectFieldProperty = new \ReflectionProperty($acl, 'objectFieldAces');
- $aceObjectFieldProperty->setAccessible(true);
- foreach ($aceObjectFieldProperty->getValue($acl) as $aces) {
- foreach ($aces as $ace) {
- $aceAclProperty->setValue($ace, $acl);
- }
- }
- $aceObjectFieldProperty->setAccessible(false);
- $aceAclProperty->setAccessible(false);
- return $acl;
- }
- /**
- * Returns the key for the object identity
- *
- * @param \Symfony\Component\Security\Acl\Model\ObjectIdentityInterface $oid
- *
- * @return string
- */
- private function createKeyFromIdentity(ObjectIdentityInterface $oid)
- {
- return $oid->getType() . '_' . $oid->getIdentifier();
- }
- /**
- * Removes an ACL from the cache
- *
- * @param string $key
- */
- private function evictFromCacheByKey($key)
- {
- if ( ! $this->cache->contains($key)) {
- return;
- }
- $this->cache->delete($key);
- }
- /**
- * Retrieves an ACL for the given key from the cache
- *
- * @param string $key
- *
- * @return null|\Symfony\Component\Security\Acl\Model\AclInterface
- */
- private function getFromCacheByKey($key)
- {
- if ( ! $this->cache->contains($key)) {
- return null;
- }
- $serialized = $this->cache->fetch($key);
- return $this->unserializeAcl($serialized);
- }
- }