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:
<?php
namespace MvcCore\Model;
trait Resource {
public static function GetResource ($args = [], $resourceClassPath = '%SELF%s\Resource') {
static $__resources = [];
$staticClassPath = get_called_class();
$cacheKey = implode('|', [$staticClassPath, serialize($args)]);
if (isset($__resources[$cacheKey]))
return $__resources[$cacheKey];
$resource = NULL;
$namespaceSeparator = strpos($staticClassPath, '\\') === FALSE ? '_' : '\\';
$staticClassPathExpl = explode($namespaceSeparator, $staticClassPath);
$resourceClassPathExpl = explode($namespaceSeparator, $resourceClassPath);
$resourceClassPathArr = [];
foreach ($resourceClassPathExpl as $key => $resourceClassPathItem) {
$selfMatched = mb_strpos($resourceClassPathItem, '%SELF%') !== FALSE;
if ($selfMatched) {
$resourceClassPathItem = str_replace('%SELF%', $staticClassPath, $resourceClassPathItem);
$resourceClassPathItemExpl = explode($namespaceSeparator, $resourceClassPathItem);
$resourceClassPathArr = array_merge($resourceClassPathArr, $resourceClassPathItemExpl);
} else if ($resourceClassPathItem === '.') {
if ($key === 0) {
unset($staticClassPathExpl[count($staticClassPathExpl) - 1]);
$resourceClassPathArr = array_merge([], $staticClassPathExpl);
}
continue;
} else if ($resourceClassPathItem === '..') {
if ($key === 0) {
unset($staticClassPathExpl[count($staticClassPathExpl) - 1]);
$resourceClassPathArr = array_merge([], $staticClassPathExpl);
}
unset($resourceClassPathArr[count($resourceClassPathArr) - 1]);
} else {
$resourceClassPathArr[] = $resourceClassPathItem;
}
}
$resourceClassName = implode($namespaceSeparator, $resourceClassPathArr);
if (class_exists($resourceClassName)) {
$reflectionClass = new \ReflectionClass($resourceClassName);
$resource = $reflectionClass->newInstanceArgs($args);
} else {
throw new \InvalidArgumentException("Class `{$resourceClassName}` doesn't exist.");
}
$__resources[$cacheKey] = $resource;
return $resource;
}
}