Files
awo-hamburg-intranet/mysyde/common/classes/SessionStorage.php
2026-02-17 14:56:23 +01:00

174 lines
6.2 KiB
PHP

<?php
namespace DynCom\mysyde\common\classes;
use DynCom\mysyde\common\interfaces\CRUDObjectStorage;
use DynCom\mysyde\common\interfaces\Entity;
/**
* Created by PhpStorm.
* User: Bauer
* Date: 08.07.2015
* Time: 01:28
*/
class SessionStorage implements CRUDObjectStorage
{
protected $namespace;
protected $storedIDsPerClassName = [];
/**
* @param string $namespace
*/
public function __create($namespace = 'global') {
$this->namespace = (string)$namespace;
$this->hydrateFromSession();
}
protected function hydrateFromSession() {
if( !array_key_exists($this->namespace,$_SESSION['SessionObjectStorage']) ||
!is_array($_SESSION['SessionObjectStorage'][$this->namespace]) ||
!array_key_exists('storedIDsPerClassName',$_SESSION['SessionObjectStorage'][$this->namespace]) ||
!is_array($_SESSION['SessionObjectStorage'][$this->namespace]['storedIDsPerClassName'])) return;
$this->storedIDsPerClassName = $_SESSION['SessionObjectStorage'][$this->namespace]['storedIDsPerClassName'];
}
/**
* @param Entity $entity
*/
public function create(Entity $entity) {
$id = $entity->getID();
if($id > 0) {
throw new \InvalidArgumentException(
'Entities with ID > 0 cannot be created.'
);
}
$className = get_class($entity);
$newID = 1;
if(array_key_exists($className,$this->storedIDsPerClassName) && is_array($this->storedIDsPerClassName[$className])) {
$newID = ((int)max($this->storedIDsPerClassName[$className])) + 1;
}
$entityPropArray = $entity->getAllFieldsAsArray();
$entityPropArray['id'] = $newID;
$entity->mapFromArray($entityPropArray);
$_SESSION['SessionObjectStorage'][$this->namespace][$className][$newID] = serialize($entity);
}
/**
* @param Entity $entity
*/
public function replace(Entity $entity)
{
$id = $entity->getID();
if (!$id) {
throw new \InvalidArgumentException(
'Entities without ID > 0cannot be replaced.'
);
}
$className = get_class($entity);
if (!array_key_exists($className,$this->storedIDsPerClassName) || !is_array($this->storedIDsPerClassName[$className])) {
throw new \InvalidArgumentException(
"No objects for class $className are in SessionStorage of namespace $this->namespace"
);
}
if(!array_key_exists($id,$_SESSION['SessionObjectStorage'][$this->namespace][$className])) {
throw new \InvalidArgumentException(
"No object of class $className and with ID $id exists in SessionStorage of namespace $this->namespace"
);
}
$_SESSION['SessionObjectStorage'][$this->namespace][$className][$id] = serialize($entity);
}
/**
* @param Entity $entity
*/
public function update(Entity $entity) {
$id = $entity->getID();
if (!$id) {
throw new \InvalidArgumentException(
'Entities without ID > 0 cannot be updated.'
);
}
$className = get_class($entity);
if (!array_key_exists($className,$this->storedIDsPerClassName) || !is_array($this->storedIDsPerClassName[$className])) {
throw new \InvalidArgumentException(
"No objects for class $className are in SessionStorage of namespace $this->namespace"
);
}
if(!array_key_exists($id,$_SESSION['SessionObjectStorage'][$this->namespace][$className])) {
throw new \InvalidArgumentException(
"No object of class $className and with ID $id exists in SessionStorage of namespace $this->namespace"
);
}
$altPrimaryFields = $entity->getAltPrimaryFieldNames();
$entityPropArr = $entity->getAllFieldsAsArray();
foreach($altPrimaryFields as $primaryField) {
if(array_key_exists($primaryField,$altPrimaryFields)) unset($entityPropArr[$primaryField]);
}
$storedEntity = unserialize($_SESSION['SessionObjectStorage'][$this->namespace][$className][$id]);
$storedEntity->mapFromArray($storedEntity);
$_SESSION['SessionObjectStorage'][$this->namespace][$className][$id] = serialize($storedEntity);
}
/**
* @param Entity $entity
*/
public function delete(Entity $entity) {
$id = $entity->getID();
if (!($id > 0)) {
throw new \InvalidArgumentException(
'Entities without ID cannot be deleted.'
);
}
$className = get_class($entity);
if (!array_key_exists($className,$this->storedIDsPerClassName) || !is_array($this->storedIDsPerClassName[$className])) {
throw new \InvalidArgumentException(
"No objects for class $className are in SessionStorage of namespace $this->namespace"
);
}
if(!array_key_exists($id,$_SESSION['SessionObjectStorage'][$this->namespace][$className])) {
throw new \InvalidArgumentException(
"No object of class $className and with ID $id exists in SessionStorage of namespace $this->namespace"
);
}
$sessionObjVar = $_SESSION['SessionObjectStorage'][$this->namespace][$className][$id];
unset($_SESSION['SessionObjectStorage'][$this->namespace][$className][$id],$sessionObjVar);
}
/**
* @param $id
* @param $className
* @param string $namespace
* @return bool|string
*/
public function getByID($id, $className, $namespace = 'global') {
$return = $_SESSION['SessionObjectStorage'][$namespace][$className][(int)$id] ?
serialize($_SESSION['SessionObjectStorage'][$this->namespace][$className][(int)$id]) : false;
return $return;
}
/**
* @param $id
* @param $className
* @param string $namespace
* @return bool|string
*/
public function read($id, $className, $namespace = 'global') {
return $this->getByID($id,$className,$namespace);
}
}