Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
9.09% |
1 / 11 |
CRAP | |
8.11% |
6 / 74 |
Persistable | |
0.00% |
0 / 1 |
|
16.67% |
2 / 12 |
826.57 | |
8.11% |
6 / 74 |
__construct(FAPI $storageAPI) | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
__destruct() | |
0.00% |
0 / 1 |
3.58 | |
60.00% |
3 / 5 |
|||
toArray() | |
100.00% |
1 / 1 |
1 | ||||||
getUpdateArray() | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 7 |
|||
loadFromId($id) | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 6 |
|||
__call($functionName, $arguments) | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 8 |
|||
hydrate(&$assoc) | |
0.00% |
0 / 1 |
90 | |
0.00% |
0 / 21 |
|||
updateWithArray($updatesArgs) | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
_setNonNullProperties(/* arguments in same order as in update */) | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 9 |
|||
create($args) | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
update($args) | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
delete($postId, $userId) | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
<?php | |
/** | |
* | |
*/ | |
namespace aae\db { | |
/** | |
* @author Axel Ancona Esselmann | |
* @package aae\db | |
*/ | |
use \aae\db\FunctionAPI as FAPI; | |
use \aae\std\std as std; | |
abstract class Persistable { | |
private static $_propertyMapping; | |
private static $_updateArray; | |
private $_className; | |
protected $_db; | |
public function __construct(FAPI $storageAPI) { | |
$this->_db = $storageAPI; | |
$this->_className = std::classFromNSClassName($this); | |
} | |
public function __destruct() { | |
if (!method_exists($this,"create{$this->_className}")) { | |
throw new \Exception("'".get_class($this)."' inherits from '".get_class()."' and has to implement create{$this->_className}()", 304162032); | |
} | |
if (!method_exists($this,"update{$this->_className}")) { | |
throw new \Exception("'".get_class($this)."' inherits from '".get_class()."' and has to implement update{$this->_className}()", 304162033); | |
} | |
} | |
abstract public function toArray(); | |
public function getUpdateArray() { | |
if (is_null(self::$_updateArray)) { | |
$contRefl = new \ReflectionMethod($this, "update{$this->_className}"); | |
$params = $contRefl->getParameters(); | |
self::$_updateArray = []; | |
foreach ($params as $param) self::$_updateArray[$param->name] = NULL; | |
} | |
return self::$_updateArray; | |
} | |
public function loadFromId($id) { | |
$className = std::classFromNSClassName($this); | |
$functionName = "load{$className}FromId"; | |
$this->_db->setFetchMode(FAPI::FETCH_ASS_ARRAY | FAPI::FETCH_ONE_ROW); | |
$results = $this->_db->$functionName($id); | |
$this->hydrate($results); | |
return $this; | |
} | |
public function __call($functionName, $arguments) { | |
if (strpos($functionName, "get") !== false) { | |
$propertyName = lcfirst(substr($functionName, 3)); | |
if (property_exists($this, $propertyName)) { | |
return $this->$propertyName; | |
} | |
} | |
if(method_exists($this,$functionName)) { | |
return call_user_func_array(array($this,$functionName), $arguments); | |
} | |
throw new \Exception("Fatal error: Call to undefined method ".get_class($this)."::{$functionName}()".__FILE__." on line", 309161550); | |
} | |
public function hydrate(&$assoc) { | |
if (!is_array($assoc)) $assoc = []; | |
if (array_key_exists(0, $assoc)) { | |
foreach ($assoc as $key => $hydrateArray) { | |
$obj = clone $this; | |
$obj->hydrate($hydrateArray); | |
$assoc[$key] = $obj; | |
} | |
return $assoc; | |
} | |
if (is_null(self::$_propertyMapping)) { | |
foreach ($assoc as $colName => $value) { | |
$camel = std::snakeToCamel($colName, true); | |
if (property_exists($this, $camel)) self::$_propertyMapping[$colName] = $camel; | |
} | |
} | |
foreach ($assoc as $colName => $value) { | |
if (array_key_exists($colName, self::$_propertyMapping)) { | |
$camel = self::$_propertyMapping[$colName]; | |
$this->$camel = $value; | |
} | |
} | |
} | |
public function updateWithArray($updatesArgs) { | |
$updates = $this->getUpdateArray(); | |
foreach ($updatesArgs as $key => $value) $updates[$key] = $value; | |
return call_user_func_array([$this,"update{$this->_className}"], $updates); | |
} | |
protected function _setNonNullProperties(/* arguments in same order as in update */) { | |
$args = func_get_args(); | |
$updateArray = $this->getUpdateArray(); | |
$argNbr = 0; | |
foreach ($updateArray as $propertyName => $value) { | |
$newValue = $args[$argNbr]; | |
$this->$propertyName = (!is_null($newValue)) ? $newValue : $this->$propertyName; | |
$argNbr++; | |
} | |
} | |
protected function create($args) { | |
$functionName = "create{$this->_className}"; | |
if ($id = (int)call_user_func_array([$this->_db, $functionName], $args)) { | |
call_user_func_array([$this, "_setNonNullProperties"], array_merge([$id],$args)); | |
} | |
return $this; | |
} | |
protected function update($args) { | |
$functionName = "update{$this->_className}"; | |
if ($nbrUpdated = (int)call_user_func_array([$this->_db, $functionName], $args)) { | |
call_user_func_array([$this, "_setNonNullProperties"], $args); | |
} | |
return $this; | |
} | |
public function delete($postId, $userId) { | |
$functionName = "delete{$this->_className}"; | |
return (bool) $this->_db->$functionName($postId, $userId); | |
} | |
} | |
} |