<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model;
use Magento\Framework\Model\AbstractModel as FrameworkAbstractModel;
/**
* Class EntityStorage store only one type of entity per instance
*/
class EntityStorage
{
/**
* @var array
*/
protected $registry = [];
/**
* Using for mapping hashes of identifying fields to entity ids
*
* @var array
*/
protected $storageMapper = [];
/**
* Using for array concatenation
*/
const GLUE = '';
/**
* Adds entity using identifying fields mapping, entity should have an id
*
* @param FrameworkAbstractModel $object
* @param array $identifyingFields
* @param string $storageName
* @return void
* @throws \Magento\Framework\Exception\InputException
*/
public function addByIdentifyingFields(FrameworkAbstractModel $object, array $identifyingFields, $storageName)
{
if (empty($identifyingFields)) {
throw new \Magento\Framework\Exception\InputException(__('Identifying Fields required'));
}
if (!$object->getId()) {
throw new \Magento\Framework\Exception\InputException(__('An ID is needed. Set the ID and try again.'));
}
$this->storageMapper[$storageName][$this->getHash($identifyingFields)] = $object->getId();
$this->registry[$object->getId()] = $object;
}
/**
* Add entity to registry if entity in it
*
* @param \Magento\Framework\Model\AbstractModel $entity
* @return void
*/
public function add($entity)
{
$this->registry[$entity->getId()] = $entity;
}
/**
* Retrieve entity from registry if entity in it
*
* @param int $id
* @return bool|FrameworkAbstractModel
*/
public function get($id)
{
if ($this->has($id)) {
return $this->registry[$id];
}
return false;
}
/**
* Gets entity by identifying fields
*
* @param array $identifyingFields
* @param string $storageName
* @return bool|FrameworkAbstractModel
*/
public function getByIdentifyingFields(array $identifyingFields, $storageName)
{
$hash = $this->getHash($identifyingFields);
if (isset($this->storageMapper[$storageName][$hash])) {
return $this->get($this->storageMapper[$storageName][$hash]);
}
return false;
}
/**
* Remove entity from storage
*
* @param int $id
* @return void
*/
public function remove($id)
{
if ($this->has($id)) {
unset($this->registry[$id]);
}
}
/**
* Checks if entity is in storage
*
* @param int $id
* @return bool
*/
public function has($id)
{
return isset($this->registry[$id]);
}
/**
* Gets hash using concatenation of identifying fields
*
* @param array $fields
* @return string
*/
protected function getHash(array $fields)
{
$stringForKey = implode(self::GLUE, $fields);
return sha1($stringForKey);
}
}
|