/** * @param \DIServer\Interfaces\IHandler $handler * * @return \Closure */ private function _createPipeClosure(\DIServer\Interfaces\IHandler $handler) { $pipeline = new Pipeline(); $middlewareClasses = $handler->GetMiddlewares(); $middlewareHandlers = []; foreach ($middlewareClasses as $middlewareClass) { $refClass = new \ReflectionClass($middlewareClass); if (!$refClass->isSubclassOf(IMiddleware::class)) { Log::Warning("Try to load {$middlewareClass} in " . get_class($handler) . " but is not instance of IMiddleware"); continue; } $middlewareHandlers[] = Container::BuildWithClass($middlewareClass); } return $pipeline->Through($middlewareHandlers)->Prepared(function ($request) use($handler) { //最后一层封装为Handler的默认Handle方法 return Container::CallMethod($handler, 'Handle', ['request' => $request]); }); }
/** * 触发事件 * * @param string $tag 标签名 * @param mixed $params 以引用方式传递于此标签行为的参数数组 */ public function Listen($tag, &$params = []) { if (isset($this->events[$tag])) { $startTime = microtime(true); foreach ($this->events[$tag] as $event) { $res = call_user_func_array($event, $params); if ($res === false) { break; //中断执行 } } $endTime = microtime(true); $costTime = $startTime - $endTime; if ($costTime >= 1000) { Log::Warning("Call {$tag} event cost {$costTime}ms."); } } }
public function AutoBuildCollection($registryFile, $iface = '') { $files = $this->GetConventionPaths("/Registry/{$registryFile}"); if ($this->isAbstract($iface)) { $check = function (string $class) use($iface) { if (class_exists($class)) { $refClass = new \ReflectionClass($class); if ($refClass->isSubclassOf($iface)) { return true; } else { Log::Warning("Try to auto-build {$class}, but class isn't instance of {$iface}."); } } else { Log::Warning("Try to auto-build {$class}, but class not exist."); } return false; }; } else { $check = function (string $class) { if (class_exists($class)) { return true; } else { Log::Warning("Try to auto-build {$class}, but class not exist."); } //没有传入iface就不检查默认true return false; }; } $newClasses = []; foreach ($files as $file) { if (file_exists($file)) { $tempClass = (include $file); Ary::MergeRecursive($newClasses, $tempClass); } } $newInstances = []; foreach ($newClasses as $key => $newClass) { if (is_array($newClass)) { foreach ($newClass as $tempClass) { if ($check($newClass)) { $newInstances[$key][] = $this->BuildWithClass($newClass); } } } else { if ($check($newClass)) { $newInstances[$key] = $this->BuildWithClass($newClass); } } } return $newInstances; }