This commit is contained in:
2021-07-12 18:51:41 +08:00
parent 16b300b139
commit 49f358fa93
6 changed files with 610 additions and 635 deletions
+152 -208
View File
@@ -13,233 +13,177 @@ use Swoole\Coroutine;
class Context extends BaseContext
{
protected static array $_contents = [];
protected static array $_contents = [];
/**
* @param $id
* @param $context
* @param null $key
* @return mixed
*/
public static function setContext($id, $context, $key = null): mixed
{
if (Coroutine::getCid() === -1) {
return static::setStatic($id, $context, $key);
}
return self::setCoroutine($id, $context, $key);
}
/**
* @param $id
* @param $context
* @return mixed
*/
public static function setContext($id, $context): mixed
{
if (Coroutine::getCid() === -1) {
return static::$_contents[$id] = $context;
}
return Coroutine::getContext()[$id] = $context;
}
/**
* @param $id
* @param $context
* @param null $key
* @return array
*/
private static function setStatic($id, $context, $key = null): mixed
{
if (empty($key)) {
return static::$_contents[$id] = $context;
}
if (!is_array(static::$_contents[$id])) {
static::$_contents[$id] = [$key => $context];
} else {
static::$_contents[$id][$key] = $context;
}
return $context;
}
/**
* @param $id
* @param int $value
* @return bool|int
*/
public static function increment($id, int $value = 1): bool|int
{
if (!isset(Coroutine::getContext()[$id])) {
return Coroutine::getContext()[$id] += $value;
}
return false;
}
/**
* @param $id
* @param $context
* @param null $key
* @return mixed
*/
private static function setCoroutine($id, $context, $key = null): mixed
{
if (empty($key)) {
return Coroutine::getContext()[$id] = $context;
}
if (!is_array(Coroutine::getContext()[$id])) {
Coroutine::getContext()[$id] = [$key => $context];
} else {
Coroutine::getContext()[$id][$key] = $context;
}
return $context;
}
/**
* @param $id
* @param int $value
* @return bool|int
*/
public static function decrement($id, int $value = 1): bool|int
{
if (!static::hasContext($id)) {
return false;
}
if (isset(Coroutine::getContext()[$id])) {
return Coroutine::getContext()[$id] -= $value;
}
return false;
}
/**
* @param $id
* @param null $key
* @param int $value
* @return bool|int
*/
public static function increment($id, $key = null, $value = 1): bool|int
{
if (!isset(Coroutine::getContext()[$id][$key])) {
return false;
}
return Coroutine::getContext()[$id][$key] += $value;
}
/**
* @param $id
* @param null $key
* @param int $value
* @return bool|int
*/
public static function decrement($id, $key = null, $value = 1): bool|int
{
if (!static::hasContext($id)) {
return false;
}
if (!isset(Coroutine::getContext()[$id][$key])) {
return false;
}
return Coroutine::getContext()[$id][$key] -= $value;
}
/**
* @param $id
* @param null $key
* @return mixed
*/
public static function getContext($id, $key = null): mixed
{
if (Coroutine::getCid() === -1) {
return static::loadByStatic($id, $key);
}
return static::loadByContext($id, $key);
}
/**
* @param $id
* @param null $default
* @return mixed
*/
public static function getContext($id, $default = null): mixed
{
if (Coroutine::getCid() === -1) {
return static::loadByStatic($id, $default);
}
return static::loadByContext($id, $default);
}
/**
* @param $id
* @param null $key
* @return mixed
*/
private static function loadByContext($id, $key = null): mixed
{
$data = Coroutine::getContext()[$id] ?? null;
if ($data === null) {
return null;
}
if ($key !== null) {
return $data[$key] ?? null;
}
return $data;
}
/**
* @param $id
* @param null $default
* @return mixed
*/
private static function loadByContext($id, $default = null): mixed
{
$data = Coroutine::getContext()[$id] ?? null;
if ($data === null) {
return $default;
}
return $data;
}
/**
* @param $id
* @param null $key
* @return mixed
*/
private static function loadByStatic($id, $key = null): mixed
{
$data = static::$_contents[$id] ?? null;
if ($data === null) {
return null;
}
if ($key !== null) {
return $data[$key] ?? null;
}
return $data;
}
/**
* @param $id
* @param null $default
* @return mixed
*/
private static function loadByStatic($id, $default = null): mixed
{
$data = static::$_contents[$id] ?? null;
if ($data === null) {
return $default;
}
return $data;
}
/**
* @return mixed
*/
public static function getAllContext(): mixed
{
if (Coroutine::getCid() === -1) {
return Coroutine::getContext() ?? [];
} else {
return static::$_contents ?? [];
}
}
/**
* @return mixed
*/
public static function getAllContext(): mixed
{
if (Coroutine::getCid() === -1) {
return Coroutine::getContext() ?? [];
} else {
return static::$_contents ?? [];
}
}
/**
* @param string $id
* @param string|null $key
*/
public static function remove(string $id, string $key = null)
{
if (!static::hasContext($id, $key)) {
return;
}
if (Coroutine::getCid() === -1) {
if (!empty($key)) {
unset(static::$_contents[$id][$key]);
} else {
unset(static::$_contents[$id]);
}
} else {
if (!empty($key)) {
unset(Coroutine::getContext()[$id][$key]);
} else {
unset(Coroutine::getContext()[$id]);
}
}
}
/**
* @param string $id
*/
public static function remove(string $id)
{
if (!static::hasContext($id)) {
return;
}
if (Coroutine::getCid() === -1) {
unset(static::$_contents[$id]);
} else {
unset(Coroutine::getContext()[$id]);
}
}
/**
* @param $id
* @param null $key
* @return bool
*/
public static function hasContext($id, $key = null): bool
{
if (Coroutine::getCid() === -1) {
return static::searchByStatic($id, $key);
}
return static::searchByCoroutine($id, $key);
}
/**
* @param $id
* @param null $key
* @return bool
*/
public static function hasContext($id, $key = null): bool
{
if (Coroutine::getCid() === -1) {
return static::searchByStatic($id, $key);
}
return static::searchByCoroutine($id, $key);
}
/**
* @param $id
* @param null $key
* @return bool
*/
private static function searchByStatic($id, $key = null): bool
{
if (!isset(static::$_contents[$id])) {
return false;
}
if (!empty($key) && !isset(static::$_contents[$id][$key])) {
return false;
}
return true;
}
/**
* @param $id
* @param null $key
* @return bool
*/
private static function searchByStatic($id, $key = null): bool
{
if (!isset(static::$_contents[$id])) {
return false;
}
if (!empty($key) && !isset(static::$_contents[$id][$key])) {
return false;
}
return true;
}
/**
* @param $id
* @param null $key
* @return bool
*/
private static function searchByCoroutine($id, $key = null): bool
{
if (!isset(Coroutine::getContext()[$id])) {
return false;
}
if ($key !== null) {
return isset((Coroutine::getContext()[$id] ?? [])[$key]);
}
return true;
}
/**
* @param $id
* @param null $key
* @return bool
*/
private static function searchByCoroutine($id, $key = null): bool
{
if (!isset(Coroutine::getContext()[$id])) {
return false;
}
if ($key !== null) {
return isset((Coroutine::getContext()[$id] ?? [])[$key]);
}
return true;
}
/**
* @return bool
*/
public static function inCoroutine(): bool
{
return Coroutine::getCid() !== -1;
}
/**
* @return bool
*/
public static function inCoroutine(): bool
{
return Coroutine::getCid() !== -1;
}
}
+31 -9
View File
@@ -17,7 +17,10 @@ use HttpServer\Controller;
use HttpServer\Http\Context;
use HttpServer\Http\Request;
use JetBrains\PhpStorm\Pure;
use ReflectionException;
use Snowflake\Aop;
use Snowflake\Core\Json;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
use Throwable;
@@ -109,30 +112,49 @@ class Node extends HttpService
}
if (!empty($this->handler)) {
$this->callback = Reduce::reduce($this->createDispatch(), $this->annotation());
$this->setAop();
}
return $this;
}
private array $_aop;
/**
* @return Closure
* @throws Exception
*/
public function createDispatch(): Closure
{
$handler = $this->handler;
return static function () use ($handler) {
$dispatchParam = Context::getContext('dispatch-param');
if (empty($dispatchParam)) {
$dispatchParam = [\request()];
return static function () {
$dispatchParam = Context::getContext('dispatch-param', [\request()]);
if (empty($this->_aop) || $this->handler instanceof Closure) {
return call_user_func($this->handler, ...$dispatchParam);
}
if ($handler instanceof Closure) {
return call_user_func($handler, ...$dispatchParam);
}
return \aop($handler, $dispatchParam);
return call_user_func($this->_aop[0], $this->_aop[1], $dispatchParam);
};
}
/**
* @throws ReflectionException
* @throws NotFindClassException
*/
private function setAop()
{
/** @var Aop $aop */
$aop = Snowflake::app()->get('aop');
if (!$aop->hasAop($this->handler)) {
return;
}
$reflect = $aop->getAop($this->handler);
$method = $reflect->getMethod('invoke');
$this->_aop = [[$method, 'invokeArgs'], $reflect->newInstance($this->handler)];
}
private bool $_hasBeforeAction = false;