├── config ├── config.php ├── autoload │ ├── commands.php │ ├── middlewares.php │ └── server.php └── routes.php ├── .gitignore ├── .idea ├── misc.xml ├── vcs.xml ├── .gitignore ├── modules.xml ├── php.xml └── hyperf-rebuild.iml ├── src ├── HttpServer │ ├── Contract │ │ └── CoreMiddlewareInterface.php │ ├── MiddlewareManager.php │ ├── Router │ │ ├── Dispatched.php │ │ └── DispatherFactory.php │ ├── Server.php │ └── CoreMiddleware.php ├── Dispatcher │ ├── HttpRequestHandler.php │ └── AbstractRequestHandler.php ├── Server │ ├── ServerFactory.php │ ├── ServerInterface.php │ └── Server.php ├── Config │ ├── Config.php │ └── ConfigFactory.php ├── Contract │ └── ConfigInterface.php └── Command │ └── StartCommand.php ├── app ├── Controller │ └── HelloController.php └── Middleware │ ├── MiddlewareB.php │ └── MiddlewareA.php ├── bin └── rebuild.php ├── composer.json └── composer.lock /config/config.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /config/routes.php: -------------------------------------------------------------------------------- 1 | [ 9 | MiddlewareB::class, 10 | ], 11 | ]], 12 | ['GET', '/hello/hyperf', [HelloController::class, 'hyperf']], 13 | ]; -------------------------------------------------------------------------------- /src/HttpServer/Contract/CoreMiddlewareInterface.php: -------------------------------------------------------------------------------- 1 | handleRequest($request); 15 | } 16 | } -------------------------------------------------------------------------------- /app/Controller/HelloController.php: -------------------------------------------------------------------------------- 1 | serverConfig = $configs; 19 | $this->getServer()->init($this->serverConfig); 20 | } 21 | 22 | public function getServer(): Server 23 | { 24 | if (! isset($this->server)) { 25 | $this->server = new Server(); 26 | } 27 | return $this->server; 28 | } 29 | 30 | 31 | } -------------------------------------------------------------------------------- /bin/rebuild.php: -------------------------------------------------------------------------------- 1 | get('commands'); 15 | foreach ($commands as $command) { 16 | if ($command === StartCommand::class) { 17 | $application->add(new StartCommand($config)); 18 | } else { 19 | $application->add(new $command); 20 | } 21 | } 22 | $application->run(); -------------------------------------------------------------------------------- /src/Server/ServerInterface.php: -------------------------------------------------------------------------------- 1 | SWOOLE_PROCESS, 8 | 'servers' => [ 9 | [ 10 | 'name' => 'http', 11 | 'type' => 1, 12 | 'host' => '0.0.0.0', 13 | 'port' => 9601, 14 | 'sock_type' => SWOOLE_SOCK_TCP, 15 | 'callbacks' => [ 16 | 'request' => [\Rebuild\HttpServer\Server::class, 'onRequest'], 17 | ], 18 | ], 19 | ], 20 | 'settings' => [ 21 | 'enable_coroutine' => true, 22 | 'worker_num' => 1, 23 | ], 24 | 'callbacks' => [ 25 | 'worker_start' => [Hyperf\Framework\Bootstrap\WorkerStartCallback::class, 'onWorkerStart'], 26 | ], 27 | ]; 28 | -------------------------------------------------------------------------------- /app/Middleware/MiddlewareB.php: -------------------------------------------------------------------------------- 1 | handle($request); 19 | return $response 20 | ->withBody( 21 | new SwooleStream($response->getBody()->getContents() . '--') 22 | ); 23 | } 24 | } -------------------------------------------------------------------------------- /src/Config/Config.php: -------------------------------------------------------------------------------- 1 | configs = $configs; 22 | } 23 | 24 | public function get(string $key, $default = null) 25 | { 26 | return $this->configs[$key] ?? $default; 27 | } 28 | 29 | public function has(string $keys) 30 | { 31 | return isset($this->configs[$keys]); 32 | } 33 | 34 | public function set(string $key, $value) 35 | { 36 | $this->configs[$key] = $value; 37 | } 38 | } -------------------------------------------------------------------------------- /src/Contract/ConfigInterface.php: -------------------------------------------------------------------------------- 1 | getUri()->getPath(); 23 | if ($path === '/hello/hyperf') { 24 | return Context::get(ResponseInterface::class)->withStatus(401)->withBody(new SwooleStream('Not allow')); 25 | } 26 | // $handler->handle() 其实是 MiddlewareB 27 | $response = $handler->handle($request); 28 | return $response 29 | ->withBody( 30 | new SwooleStream($response->getBody()->getContents() . '++') 31 | ); 32 | } 33 | } -------------------------------------------------------------------------------- /.idea/php.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/Command/StartCommand.php: -------------------------------------------------------------------------------- 1 | config = $config; 26 | } 27 | 28 | protected function configure() 29 | { 30 | $this->setName('start')->setDescription('启动服务'); 31 | } 32 | 33 | protected function execute(InputInterface $input, OutputInterface $output): int 34 | { 35 | $config = $this->config; 36 | $configs = $config->get('server'); 37 | $serverFactory = new ServerFactory(); 38 | $serverFactory->configure($configs); 39 | $serverFactory->getServer()->start(); 40 | return 1; 41 | } 42 | 43 | 44 | } -------------------------------------------------------------------------------- /src/Config/ConfigFactory.php: -------------------------------------------------------------------------------- 1 | readConfig($basePath . '/config.php'); 15 | $autoloadConfig = $this->readPath([$basePath . '/autoload']); 16 | $configs = array_merge_recursive($configFile, $autoloadConfig); 17 | return new Config($configs); 18 | } 19 | 20 | protected function readConfig(string $string): array 21 | { 22 | $config = require $string; 23 | if (! is_array($config)) { 24 | return []; 25 | } 26 | return $config; 27 | } 28 | 29 | protected function readPath(array $dirs): array 30 | { 31 | $config = []; 32 | $finder = new Finder(); 33 | $finder->files()->in($dirs)->name('*.php'); 34 | foreach ($finder as $fileInfo) { 35 | $key = $fileInfo->getBasename('.php'); 36 | $value = require $fileInfo->getRealPath(); 37 | $config[$key] = $value; 38 | } 39 | return $config; 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /src/HttpServer/Router/Dispatched.php: -------------------------------------------------------------------------------- 1 | 'value', ...]] 32 | */ 33 | public function __construct(array $array) 34 | { 35 | $this->status = $array[0]; 36 | switch ($this->status) { 37 | case Dispatcher::METHOD_NOT_ALLOWED: 38 | $this->params = $array[1]; 39 | break; 40 | case Dispatcher::FOUND: 41 | $this->handler = $array[1]; 42 | $this->params = $array[2]; 43 | break; 44 | } 45 | } 46 | 47 | public function isFound(): bool 48 | { 49 | return $this->status === Dispatcher::FOUND; 50 | } 51 | } -------------------------------------------------------------------------------- /.idea/hyperf-rebuild.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/Dispatcher/AbstractRequestHandler.php: -------------------------------------------------------------------------------- 1 | middlewares = $middlewares; 27 | $this->coreHandler = $coreHandler; 28 | } 29 | 30 | protected function handleRequest($request) 31 | { 32 | if (! isset($this->middlewares[$this->offset]) && ! empty($this->coreHandler)) { 33 | $handler = $this->coreHandler; 34 | } else { 35 | $handler = $this->middlewares[$this->offset]; 36 | // todo 37 | is_string($handler) && $handler = new $handler(); 38 | } 39 | if (! method_exists($handler, 'process')) { 40 | throw new InvalidArgumentException(sprintf('Invalid middleware, it has to provide a process() method.')); 41 | } 42 | return $handler->process($request, $this->next()); 43 | } 44 | 45 | /** 46 | * @return $this 47 | */ 48 | protected function next() 49 | { 50 | ++$this->offset; 51 | return $this; 52 | } 53 | } -------------------------------------------------------------------------------- /src/Server/Server.php: -------------------------------------------------------------------------------- 1 | server = new SwooelHttpServer($server['host'], $server['port'], $server['type'], $server['sock_type']); 28 | $this->registerSwooleEvents($server['callbacks']); 29 | 30 | break; 31 | } 32 | return $this; 33 | } 34 | 35 | public function start() 36 | { 37 | $this->getServer()->start(); 38 | } 39 | 40 | public function getServer() 41 | { 42 | return $this->server; 43 | } 44 | 45 | protected function registerSwooleEvents(array $callbacks) 46 | { 47 | foreach ($callbacks as $swolleEvent => $callback) { 48 | [$class, $method] = $callback; 49 | if ($class === \Rebuild\HttpServer\Server::class) { 50 | $instance = new $class(new DispatherFactory()); 51 | } else { 52 | $instance = new $class(); 53 | } 54 | $this->server->on($swolleEvent, [$instance, $method]); 55 | if (method_exists($instance, 'initCoreMiddleware')) { 56 | $instance->initCoreMiddleware(); 57 | } 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /src/HttpServer/Router/DispatherFactory.php: -------------------------------------------------------------------------------- 1 | initConfigRoute(); 33 | } 34 | 35 | public function getDispathcer(string $serverName): Dispatcher 36 | { 37 | if (! isset($this->dispatchers[$serverName])) { 38 | $this->dispatchers[$serverName] = simpleDispatcher(function (RouteCollector $r) { 39 | foreach ($this->routes as $route) { 40 | [$httpMethod, $path, $handler] = $route; 41 | if (isset($route[3])) { 42 | $options = $route[3]; 43 | } 44 | $r->addRoute($httpMethod, $path, $handler); 45 | if (isset($options['middlewares']) && is_array($options['middlewares'])) { 46 | MiddlewareManager::addMiddlewares($path, $httpMethod, $options['middlewares']); 47 | } 48 | } 49 | }); 50 | } 51 | return $this->dispatchers[$serverName]; 52 | } 53 | 54 | public function initConfigRoute() 55 | { 56 | foreach ($this->routeFiles as $file) { 57 | if (file_exists($file)) { 58 | $routes = require_once $file; 59 | $this->routes = array_merge_recursive($this->routes, $routes); 60 | } 61 | } 62 | } 63 | 64 | } -------------------------------------------------------------------------------- /src/HttpServer/Server.php: -------------------------------------------------------------------------------- 1 | dispatcherFactory = $dispatcherFactory; 44 | $this->dispatcher = $this->dispatcherFactory->getDispathcer('http'); 45 | } 46 | 47 | public function initCoreMiddleware() 48 | { 49 | $config = (new ConfigFactory())(); 50 | $this->globalMiddlewares = $config->get('middlewares'); 51 | $this->coreMiddleware = new CoreMiddleware($this->dispatcherFactory); 52 | } 53 | 54 | public function onRequest(SwooleRequest $request, SwooleResponse $response): void 55 | { 56 | /** @var \Psr\Http\Message\RequestInterface $psr7Request */ 57 | /** @var \Psr\Http\Message\ResponseInterface $psr7Response */ 58 | [$psr7Request, $psr7Response] = $this->initRequestAndResponse($request, $response); 59 | 60 | $psr7Request = $this->coreMiddleware->dispatch($psr7Request); 61 | 62 | $httpMethod = $psr7Request->getMethod(); 63 | $path = $psr7Request->getUri()->getPath(); 64 | 65 | $middlewares = $this->globalMiddlewares ?? []; 66 | 67 | $dispatched = $psr7Request->getAttribute(Dispatched::class); 68 | if ($dispatched instanceof Dispatched && $dispatched->isFound()) { 69 | $registeredMiddlewares = MiddlewareManager::get($path, $httpMethod) ?? []; 70 | $middlewares = array_merge($middlewares, $registeredMiddlewares); 71 | } 72 | 73 | $requestHandler = new HttpRequestHandler($middlewares, $this->coreMiddleware); 74 | $psr7Response = $requestHandler->handle($psr7Request); 75 | 76 | /* 77 | * Headers 78 | */ 79 | foreach ($psr7Response->getHeaders() as $key => $value) { 80 | $response->header($key, implode(';', $value)); 81 | } 82 | 83 | /* 84 | * Status code 85 | */ 86 | $response->status($psr7Response->getStatusCode()); 87 | $response->end($psr7Response->getBody()->getContents()); 88 | var_dump('response end'); 89 | } 90 | 91 | protected function initRequestAndResponse(SwooleRequest $request, SwooleResponse $response): array 92 | { 93 | // Initialize PSR-7 Request and Response objects. 94 | Context::set(ResponseInterface::class, $psr7Response = new Psr7Response()); 95 | Context::set(ServerRequestInterface::class, $psr7Request = Psr7Request::loadFromSwooleRequest($request)); 96 | return [$psr7Request, $psr7Response]; 97 | } 98 | 99 | } -------------------------------------------------------------------------------- /src/HttpServer/CoreMiddleware.php: -------------------------------------------------------------------------------- 1 | dispatcher = $dispatcherFactory->getDispathcer('http'); 30 | } 31 | 32 | public function dispatch(ServerRequestInterface $request): ServerRequestInterface 33 | { 34 | $httpMethod = $request->getMethod(); 35 | $uri = $request->getUri()->getPath(); 36 | 37 | $routeInfo = $this->dispatcher->dispatch($httpMethod, $uri); 38 | $dispatched = new Dispatched($routeInfo); 39 | 40 | $request = Context::set(ServerRequestInterface::class, $request->withAttribute(Dispatched::class, $dispatched)); 41 | return $request; 42 | } 43 | 44 | public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface 45 | { 46 | $dispatched = $request->getAttribute(Dispatched::class); 47 | if (! $dispatched instanceof Dispatched) { 48 | throw new \InvalidArgumentException('Route not found'); 49 | } 50 | switch ($dispatched->status) { 51 | case Dispatcher::NOT_FOUND: 52 | $response = $this->handleNotFound($request); 53 | break; 54 | case Dispatcher::METHOD_NOT_ALLOWED: 55 | $response = $this->handleMethodNotAllow($request); 56 | break; 57 | case Dispatcher::FOUND: 58 | $response = $this->handleFound($request, $dispatched); 59 | break; 60 | } 61 | if (! $response instanceof ResponseInterface) { 62 | $response = $this->transferToResponse($response); 63 | } 64 | return $response; 65 | } 66 | 67 | protected function handleNotFound(ServerRequestInterface $request): ResponseInterface 68 | { 69 | /** @var ResponseInterface $response */ 70 | return $response->withStatus(404)->withBody(new SwooleStream('Not found')); 71 | } 72 | 73 | protected function handleMethodNotAllow(ServerRequestInterface $request) 74 | { 75 | /** @var ResponseInterface $response */ 76 | return $response->withStatus(405)->withBody(new SwooleStream('Method not allow')); 77 | } 78 | 79 | protected function handleFound(ServerRequestInterface $request, Dispatched $dispatched) 80 | { 81 | [$controller, $action] = $dispatched->handler; 82 | if (! class_exists($controller)) { 83 | throw new \InvalidArgumentException('Controller not exist'); 84 | } 85 | if (! method_exists($controller, $action)) { 86 | throw new \InvalidArgumentException('Action of Controller not exist'); 87 | } 88 | $parameters = []; 89 | $controllerInstance = new $controller(); 90 | return $controllerInstance->{$action}(...$parameters); 91 | } 92 | 93 | protected function transferToResponse($response): ResponseInterface 94 | { 95 | if (is_string($response)) { 96 | return $this->response() 97 | ->withAddedHeader('Content-Type', 'text/plain') 98 | ->withBody(new SwooleStream((string) $response)); 99 | } elseif (is_array($response) || $response instanceof Arrayable) { 100 | return $this->response() 101 | ->withAddedHeader('Content-Type', 'application/json') 102 | ->withBody(new SwooleStream(Json::encode($response))); 103 | } elseif ($response instanceof Jsonable) { 104 | return $this->response() 105 | ->withAddedHeader('Content-Type', 'application/json') 106 | ->withBody(new SwooleStream((string) $response)); 107 | } 108 | return $response; 109 | } 110 | 111 | protected function response(): ResponseInterface 112 | { 113 | return Context::get(ResponseInterface::class); 114 | } 115 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "1a3a5c2809df82959f956fd5421d681a", 8 | "packages": [ 9 | { 10 | "name": "doctrine/inflector", 11 | "version": "2.0.3", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/inflector.git", 15 | "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", 20 | "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", 21 | "shasum": "", 22 | "mirrors": [ 23 | { 24 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 25 | "preferred": true 26 | } 27 | ] 28 | }, 29 | "require": { 30 | "php": "^7.2 || ^8.0" 31 | }, 32 | "require-dev": { 33 | "doctrine/coding-standard": "^7.0", 34 | "phpstan/phpstan": "^0.11", 35 | "phpstan/phpstan-phpunit": "^0.11", 36 | "phpstan/phpstan-strict-rules": "^0.11", 37 | "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" 38 | }, 39 | "type": "library", 40 | "extra": { 41 | "branch-alias": { 42 | "dev-master": "2.0.x-dev" 43 | } 44 | }, 45 | "autoload": { 46 | "psr-4": { 47 | "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" 48 | } 49 | }, 50 | "notification-url": "https://packagist.org/downloads/", 51 | "license": [ 52 | "MIT" 53 | ], 54 | "authors": [ 55 | { 56 | "name": "Guilherme Blanco", 57 | "email": "guilhermeblanco@gmail.com" 58 | }, 59 | { 60 | "name": "Roman Borschel", 61 | "email": "roman@code-factory.org" 62 | }, 63 | { 64 | "name": "Benjamin Eberlei", 65 | "email": "kontakt@beberlei.de" 66 | }, 67 | { 68 | "name": "Jonathan Wage", 69 | "email": "jonwage@gmail.com" 70 | }, 71 | { 72 | "name": "Johannes Schmitt", 73 | "email": "schmittjoh@gmail.com" 74 | } 75 | ], 76 | "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", 77 | "homepage": "https://www.doctrine-project.org/projects/inflector.html", 78 | "keywords": [ 79 | "inflection", 80 | "inflector", 81 | "lowercase", 82 | "manipulation", 83 | "php", 84 | "plural", 85 | "singular", 86 | "strings", 87 | "uppercase", 88 | "words" 89 | ], 90 | "time": "2020-05-29T15:13:26+00:00" 91 | }, 92 | { 93 | "name": "hyperf/contract", 94 | "version": "v2.0.13", 95 | "source": { 96 | "type": "git", 97 | "url": "https://github.com/hyperf/contract.git", 98 | "reference": "02eb7c2affbc9ef020b02801b4b21c69c7e4fd5b" 99 | }, 100 | "dist": { 101 | "type": "zip", 102 | "url": "https://api.github.com/repos/hyperf/contract/zipball/02eb7c2affbc9ef020b02801b4b21c69c7e4fd5b", 103 | "reference": "02eb7c2affbc9ef020b02801b4b21c69c7e4fd5b", 104 | "shasum": "", 105 | "mirrors": [ 106 | { 107 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 108 | "preferred": true 109 | } 110 | ] 111 | }, 112 | "require": { 113 | "php": ">=7.2" 114 | }, 115 | "require-dev": { 116 | "friendsofphp/php-cs-fixer": "^2.9", 117 | "malukenho/docheader": "^0.1.6", 118 | "mockery/mockery": "^1.0", 119 | "phpunit/phpunit": "^7.0.0" 120 | }, 121 | "type": "library", 122 | "extra": { 123 | "branch-alias": { 124 | "dev-master": "2.0-dev" 125 | }, 126 | "hyperf": [] 127 | }, 128 | "autoload": { 129 | "psr-4": { 130 | "Hyperf\\Contract\\": "src/" 131 | } 132 | }, 133 | "notification-url": "https://packagist.org/downloads/", 134 | "license": [ 135 | "MIT" 136 | ], 137 | "description": "The contracts of Hyperf.", 138 | "homepage": "https://hyperf.io", 139 | "keywords": [ 140 | "hyperf", 141 | "php", 142 | "swoole" 143 | ], 144 | "time": "2020-09-27T08:25:56+00:00" 145 | }, 146 | { 147 | "name": "hyperf/http-message", 148 | "version": "v2.0.11", 149 | "source": { 150 | "type": "git", 151 | "url": "https://github.com/hyperf/http-message.git", 152 | "reference": "f817201019898ee205f87f4d7e59623a35dd6e75" 153 | }, 154 | "dist": { 155 | "type": "zip", 156 | "url": "https://api.github.com/repos/hyperf/http-message/zipball/f817201019898ee205f87f4d7e59623a35dd6e75", 157 | "reference": "f817201019898ee205f87f4d7e59623a35dd6e75", 158 | "shasum": "", 159 | "mirrors": [ 160 | { 161 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 162 | "preferred": true 163 | } 164 | ] 165 | }, 166 | "require": { 167 | "hyperf/utils": "~2.0.0", 168 | "laminas/laminas-mime": "^2.7", 169 | "psr/http-message": "^1.0" 170 | }, 171 | "require-dev": { 172 | "psr/container": "^1.0" 173 | }, 174 | "suggest": { 175 | "psr/container": "Required to replace RequestParserInterface." 176 | }, 177 | "type": "library", 178 | "extra": { 179 | "branch-alias": { 180 | "dev-master": "2.0-dev" 181 | }, 182 | "hyperf": { 183 | "config": "Hyperf\\HttpMessage\\ConfigProvider" 184 | } 185 | }, 186 | "autoload": { 187 | "psr-4": { 188 | "Hyperf\\HttpMessage\\": "src/" 189 | } 190 | }, 191 | "notification-url": "https://packagist.org/downloads/", 192 | "license": [ 193 | "MIT" 194 | ], 195 | "description": "microservice framework base on swoole", 196 | "keywords": [ 197 | "http-message", 198 | "hyperf", 199 | "php", 200 | "swoole" 201 | ], 202 | "time": "2020-09-07T10:26:15+00:00" 203 | }, 204 | { 205 | "name": "hyperf/utils", 206 | "version": "v2.0.13", 207 | "source": { 208 | "type": "git", 209 | "url": "https://github.com/hyperf/utils.git", 210 | "reference": "ffac695fc22fe3443fb9c7ba9398b03268e518e7" 211 | }, 212 | "dist": { 213 | "type": "zip", 214 | "url": "https://api.github.com/repos/hyperf/utils/zipball/ffac695fc22fe3443fb9c7ba9398b03268e518e7", 215 | "reference": "ffac695fc22fe3443fb9c7ba9398b03268e518e7", 216 | "shasum": "", 217 | "mirrors": [ 218 | { 219 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 220 | "preferred": true 221 | } 222 | ] 223 | }, 224 | "require": { 225 | "doctrine/inflector": "^2.0", 226 | "hyperf/contract": "~2.0.0", 227 | "php": ">=7.2" 228 | }, 229 | "require-dev": { 230 | "friendsofphp/php-cs-fixer": "^2.9", 231 | "malukenho/docheader": "^0.1.6", 232 | "mockery/mockery": "^1.0", 233 | "phpunit/phpunit": "^7.0.0", 234 | "symfony/property-access": "^5.0", 235 | "symfony/serializer": "^5.0", 236 | "symfony/var-dumper": "^5.0" 237 | }, 238 | "suggest": { 239 | "ext-swoole": "Required to use methods related to swoole (>=4.5).", 240 | "hyperf/di": "Required to use ExceptionNormalizer", 241 | "symfony/property-access": "Required to use SymfonyNormalizer (^5.0)", 242 | "symfony/serializer": "Required to use SymfonyNormalizer (^5.0)", 243 | "symfony/var-dumper": "Required to use the dd function (^5.0)." 244 | }, 245 | "type": "library", 246 | "extra": { 247 | "hyperf": { 248 | "config": "Hyperf\\Utils\\ConfigProvider" 249 | }, 250 | "branch-alias": { 251 | "dev-master": "2.0-dev" 252 | } 253 | }, 254 | "autoload": { 255 | "files": [ 256 | "src/Functions.php" 257 | ], 258 | "psr-4": { 259 | "Hyperf\\Utils\\": "src/" 260 | } 261 | }, 262 | "notification-url": "https://packagist.org/downloads/", 263 | "license": [ 264 | "MIT" 265 | ], 266 | "description": "A tools package that could help developer solved the problem quickly.", 267 | "homepage": "https://hyperf.io", 268 | "keywords": [ 269 | "hyperf", 270 | "php", 271 | "swoole", 272 | "utils" 273 | ], 274 | "time": "2020-09-23T02:31:52+00:00" 275 | }, 276 | { 277 | "name": "laminas/laminas-mime", 278 | "version": "2.7.4", 279 | "source": { 280 | "type": "git", 281 | "url": "https://github.com/laminas/laminas-mime.git", 282 | "reference": "e45a7d856bf7b4a7b5bd00d6371f9961dc233add" 283 | }, 284 | "dist": { 285 | "type": "zip", 286 | "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/e45a7d856bf7b4a7b5bd00d6371f9961dc233add", 287 | "reference": "e45a7d856bf7b4a7b5bd00d6371f9961dc233add", 288 | "shasum": "", 289 | "mirrors": [ 290 | { 291 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 292 | "preferred": true 293 | } 294 | ] 295 | }, 296 | "require": { 297 | "laminas/laminas-stdlib": "^2.7 || ^3.0", 298 | "laminas/laminas-zendframework-bridge": "^1.0", 299 | "php": "^5.6 || ^7.0" 300 | }, 301 | "replace": { 302 | "zendframework/zend-mime": "^2.7.2" 303 | }, 304 | "require-dev": { 305 | "laminas/laminas-coding-standard": "~1.0.0", 306 | "laminas/laminas-mail": "^2.6", 307 | "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20" 308 | }, 309 | "suggest": { 310 | "laminas/laminas-mail": "Laminas\\Mail component" 311 | }, 312 | "type": "library", 313 | "extra": { 314 | "branch-alias": { 315 | "dev-master": "2.7.x-dev", 316 | "dev-develop": "2.8.x-dev" 317 | } 318 | }, 319 | "autoload": { 320 | "psr-4": { 321 | "Laminas\\Mime\\": "src/" 322 | } 323 | }, 324 | "notification-url": "https://packagist.org/downloads/", 325 | "license": [ 326 | "BSD-3-Clause" 327 | ], 328 | "description": "Create and parse MIME messages and parts", 329 | "homepage": "https://laminas.dev", 330 | "keywords": [ 331 | "laminas", 332 | "mime" 333 | ], 334 | "time": "2020-03-29T13:12:07+00:00" 335 | }, 336 | { 337 | "name": "laminas/laminas-stdlib", 338 | "version": "3.2.1", 339 | "source": { 340 | "type": "git", 341 | "url": "https://github.com/laminas/laminas-stdlib.git", 342 | "reference": "2b18347625a2f06a1a485acfbc870f699dbe51c6" 343 | }, 344 | "dist": { 345 | "type": "zip", 346 | "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/2b18347625a2f06a1a485acfbc870f699dbe51c6", 347 | "reference": "2b18347625a2f06a1a485acfbc870f699dbe51c6", 348 | "shasum": "", 349 | "mirrors": [ 350 | { 351 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 352 | "preferred": true 353 | } 354 | ] 355 | }, 356 | "require": { 357 | "laminas/laminas-zendframework-bridge": "^1.0", 358 | "php": "^5.6 || ^7.0" 359 | }, 360 | "replace": { 361 | "zendframework/zend-stdlib": "self.version" 362 | }, 363 | "require-dev": { 364 | "laminas/laminas-coding-standard": "~1.0.0", 365 | "phpbench/phpbench": "^0.13", 366 | "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" 367 | }, 368 | "type": "library", 369 | "extra": { 370 | "branch-alias": { 371 | "dev-master": "3.2.x-dev", 372 | "dev-develop": "3.3.x-dev" 373 | } 374 | }, 375 | "autoload": { 376 | "psr-4": { 377 | "Laminas\\Stdlib\\": "src/" 378 | } 379 | }, 380 | "notification-url": "https://packagist.org/downloads/", 381 | "license": [ 382 | "BSD-3-Clause" 383 | ], 384 | "description": "SPL extensions, array utilities, error handlers, and more", 385 | "homepage": "https://laminas.dev", 386 | "keywords": [ 387 | "laminas", 388 | "stdlib" 389 | ], 390 | "time": "2019-12-31T17:51:15+00:00" 391 | }, 392 | { 393 | "name": "laminas/laminas-zendframework-bridge", 394 | "version": "1.1.1", 395 | "source": { 396 | "type": "git", 397 | "url": "https://github.com/laminas/laminas-zendframework-bridge.git", 398 | "reference": "6ede70583e101030bcace4dcddd648f760ddf642" 399 | }, 400 | "dist": { 401 | "type": "zip", 402 | "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", 403 | "reference": "6ede70583e101030bcace4dcddd648f760ddf642", 404 | "shasum": "", 405 | "mirrors": [ 406 | { 407 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 408 | "preferred": true 409 | } 410 | ] 411 | }, 412 | "require": { 413 | "php": "^5.6 || ^7.0 || ^8.0" 414 | }, 415 | "require-dev": { 416 | "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", 417 | "squizlabs/php_codesniffer": "^3.5" 418 | }, 419 | "type": "library", 420 | "extra": { 421 | "laminas": { 422 | "module": "Laminas\\ZendFrameworkBridge" 423 | } 424 | }, 425 | "autoload": { 426 | "files": [ 427 | "src/autoload.php" 428 | ], 429 | "psr-4": { 430 | "Laminas\\ZendFrameworkBridge\\": "src//" 431 | } 432 | }, 433 | "notification-url": "https://packagist.org/downloads/", 434 | "license": [ 435 | "BSD-3-Clause" 436 | ], 437 | "description": "Alias legacy ZF class names to Laminas Project equivalents.", 438 | "keywords": [ 439 | "ZendFramework", 440 | "autoloading", 441 | "laminas", 442 | "zf" 443 | ], 444 | "time": "2020-09-14T14:23:00+00:00" 445 | }, 446 | { 447 | "name": "nikic/fast-route", 448 | "version": "v1.3.0", 449 | "source": { 450 | "type": "git", 451 | "url": "https://github.com/nikic/FastRoute.git", 452 | "reference": "181d480e08d9476e61381e04a71b34dc0432e812" 453 | }, 454 | "dist": { 455 | "type": "zip", 456 | "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", 457 | "reference": "181d480e08d9476e61381e04a71b34dc0432e812", 458 | "shasum": "", 459 | "mirrors": [ 460 | { 461 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 462 | "preferred": true 463 | } 464 | ] 465 | }, 466 | "require": { 467 | "php": ">=5.4.0" 468 | }, 469 | "require-dev": { 470 | "phpunit/phpunit": "^4.8.35|~5.7" 471 | }, 472 | "type": "library", 473 | "autoload": { 474 | "psr-4": { 475 | "FastRoute\\": "src/" 476 | }, 477 | "files": [ 478 | "src/functions.php" 479 | ] 480 | }, 481 | "notification-url": "https://packagist.org/downloads/", 482 | "license": [ 483 | "BSD-3-Clause" 484 | ], 485 | "authors": [ 486 | { 487 | "name": "Nikita Popov", 488 | "email": "nikic@php.net" 489 | } 490 | ], 491 | "description": "Fast request router for PHP", 492 | "keywords": [ 493 | "router", 494 | "routing" 495 | ], 496 | "time": "2018-02-13T20:26:39+00:00" 497 | }, 498 | { 499 | "name": "psr/container", 500 | "version": "1.0.0", 501 | "source": { 502 | "type": "git", 503 | "url": "https://github.com/php-fig/container.git", 504 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 505 | }, 506 | "dist": { 507 | "type": "zip", 508 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 509 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 510 | "shasum": "", 511 | "mirrors": [ 512 | { 513 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 514 | "preferred": true 515 | } 516 | ] 517 | }, 518 | "require": { 519 | "php": ">=5.3.0" 520 | }, 521 | "type": "library", 522 | "extra": { 523 | "branch-alias": { 524 | "dev-master": "1.0.x-dev" 525 | } 526 | }, 527 | "autoload": { 528 | "psr-4": { 529 | "Psr\\Container\\": "src/" 530 | } 531 | }, 532 | "notification-url": "https://packagist.org/downloads/", 533 | "license": [ 534 | "MIT" 535 | ], 536 | "authors": [ 537 | { 538 | "name": "PHP-FIG", 539 | "homepage": "http://www.php-fig.org/" 540 | } 541 | ], 542 | "description": "Common Container Interface (PHP FIG PSR-11)", 543 | "homepage": "https://github.com/php-fig/container", 544 | "keywords": [ 545 | "PSR-11", 546 | "container", 547 | "container-interface", 548 | "container-interop", 549 | "psr" 550 | ], 551 | "time": "2017-02-14T16:28:37+00:00" 552 | }, 553 | { 554 | "name": "psr/http-message", 555 | "version": "1.0.1", 556 | "source": { 557 | "type": "git", 558 | "url": "https://github.com/php-fig/http-message.git", 559 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 560 | }, 561 | "dist": { 562 | "type": "zip", 563 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 564 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 565 | "shasum": "", 566 | "mirrors": [ 567 | { 568 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 569 | "preferred": true 570 | } 571 | ] 572 | }, 573 | "require": { 574 | "php": ">=5.3.0" 575 | }, 576 | "type": "library", 577 | "extra": { 578 | "branch-alias": { 579 | "dev-master": "1.0.x-dev" 580 | } 581 | }, 582 | "autoload": { 583 | "psr-4": { 584 | "Psr\\Http\\Message\\": "src/" 585 | } 586 | }, 587 | "notification-url": "https://packagist.org/downloads/", 588 | "license": [ 589 | "MIT" 590 | ], 591 | "authors": [ 592 | { 593 | "name": "PHP-FIG", 594 | "homepage": "http://www.php-fig.org/" 595 | } 596 | ], 597 | "description": "Common interface for HTTP messages", 598 | "homepage": "https://github.com/php-fig/http-message", 599 | "keywords": [ 600 | "http", 601 | "http-message", 602 | "psr", 603 | "psr-7", 604 | "request", 605 | "response" 606 | ], 607 | "time": "2016-08-06T14:39:51+00:00" 608 | }, 609 | { 610 | "name": "psr/http-server-handler", 611 | "version": "1.0.1", 612 | "source": { 613 | "type": "git", 614 | "url": "https://github.com/php-fig/http-server-handler.git", 615 | "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" 616 | }, 617 | "dist": { 618 | "type": "zip", 619 | "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", 620 | "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", 621 | "shasum": "", 622 | "mirrors": [ 623 | { 624 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 625 | "preferred": true 626 | } 627 | ] 628 | }, 629 | "require": { 630 | "php": ">=7.0", 631 | "psr/http-message": "^1.0" 632 | }, 633 | "type": "library", 634 | "extra": { 635 | "branch-alias": { 636 | "dev-master": "1.0.x-dev" 637 | } 638 | }, 639 | "autoload": { 640 | "psr-4": { 641 | "Psr\\Http\\Server\\": "src/" 642 | } 643 | }, 644 | "notification-url": "https://packagist.org/downloads/", 645 | "license": [ 646 | "MIT" 647 | ], 648 | "authors": [ 649 | { 650 | "name": "PHP-FIG", 651 | "homepage": "http://www.php-fig.org/" 652 | } 653 | ], 654 | "description": "Common interface for HTTP server-side request handler", 655 | "keywords": [ 656 | "handler", 657 | "http", 658 | "http-interop", 659 | "psr", 660 | "psr-15", 661 | "psr-7", 662 | "request", 663 | "response", 664 | "server" 665 | ], 666 | "time": "2018-10-30T16:46:14+00:00" 667 | }, 668 | { 669 | "name": "psr/http-server-middleware", 670 | "version": "1.0.1", 671 | "source": { 672 | "type": "git", 673 | "url": "https://github.com/php-fig/http-server-middleware.git", 674 | "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" 675 | }, 676 | "dist": { 677 | "type": "zip", 678 | "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", 679 | "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", 680 | "shasum": "", 681 | "mirrors": [ 682 | { 683 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 684 | "preferred": true 685 | } 686 | ] 687 | }, 688 | "require": { 689 | "php": ">=7.0", 690 | "psr/http-message": "^1.0", 691 | "psr/http-server-handler": "^1.0" 692 | }, 693 | "type": "library", 694 | "extra": { 695 | "branch-alias": { 696 | "dev-master": "1.0.x-dev" 697 | } 698 | }, 699 | "autoload": { 700 | "psr-4": { 701 | "Psr\\Http\\Server\\": "src/" 702 | } 703 | }, 704 | "notification-url": "https://packagist.org/downloads/", 705 | "license": [ 706 | "MIT" 707 | ], 708 | "authors": [ 709 | { 710 | "name": "PHP-FIG", 711 | "homepage": "http://www.php-fig.org/" 712 | } 713 | ], 714 | "description": "Common interface for HTTP server-side middleware", 715 | "keywords": [ 716 | "http", 717 | "http-interop", 718 | "middleware", 719 | "psr", 720 | "psr-15", 721 | "psr-7", 722 | "request", 723 | "response" 724 | ], 725 | "time": "2018-10-30T17:12:04+00:00" 726 | }, 727 | { 728 | "name": "symfony/console", 729 | "version": "v5.1.5", 730 | "source": { 731 | "type": "git", 732 | "url": "https://github.com/symfony/console.git", 733 | "reference": "186f395b256065ba9b890c0a4e48a91d598fa2cf" 734 | }, 735 | "dist": { 736 | "type": "zip", 737 | "url": "https://api.github.com/repos/symfony/console/zipball/186f395b256065ba9b890c0a4e48a91d598fa2cf", 738 | "reference": "186f395b256065ba9b890c0a4e48a91d598fa2cf", 739 | "shasum": "", 740 | "mirrors": [ 741 | { 742 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 743 | "preferred": true 744 | } 745 | ] 746 | }, 747 | "require": { 748 | "php": ">=7.2.5", 749 | "symfony/polyfill-mbstring": "~1.0", 750 | "symfony/polyfill-php73": "^1.8", 751 | "symfony/polyfill-php80": "^1.15", 752 | "symfony/service-contracts": "^1.1|^2", 753 | "symfony/string": "^5.1" 754 | }, 755 | "conflict": { 756 | "symfony/dependency-injection": "<4.4", 757 | "symfony/dotenv": "<5.1", 758 | "symfony/event-dispatcher": "<4.4", 759 | "symfony/lock": "<4.4", 760 | "symfony/process": "<4.4" 761 | }, 762 | "provide": { 763 | "psr/log-implementation": "1.0" 764 | }, 765 | "require-dev": { 766 | "psr/log": "~1.0", 767 | "symfony/config": "^4.4|^5.0", 768 | "symfony/dependency-injection": "^4.4|^5.0", 769 | "symfony/event-dispatcher": "^4.4|^5.0", 770 | "symfony/lock": "^4.4|^5.0", 771 | "symfony/process": "^4.4|^5.0", 772 | "symfony/var-dumper": "^4.4|^5.0" 773 | }, 774 | "suggest": { 775 | "psr/log": "For using the console logger", 776 | "symfony/event-dispatcher": "", 777 | "symfony/lock": "", 778 | "symfony/process": "" 779 | }, 780 | "type": "library", 781 | "extra": { 782 | "branch-alias": { 783 | "dev-master": "5.1-dev" 784 | } 785 | }, 786 | "autoload": { 787 | "psr-4": { 788 | "Symfony\\Component\\Console\\": "" 789 | }, 790 | "exclude-from-classmap": [ 791 | "/Tests/" 792 | ] 793 | }, 794 | "notification-url": "https://packagist.org/downloads/", 795 | "license": [ 796 | "MIT" 797 | ], 798 | "authors": [ 799 | { 800 | "name": "Fabien Potencier", 801 | "email": "fabien@symfony.com" 802 | }, 803 | { 804 | "name": "Symfony Community", 805 | "homepage": "https://symfony.com/contributors" 806 | } 807 | ], 808 | "description": "Symfony Console Component", 809 | "homepage": "https://symfony.com", 810 | "time": "2020-09-02T07:07:40+00:00" 811 | }, 812 | { 813 | "name": "symfony/finder", 814 | "version": "v5.1.5", 815 | "source": { 816 | "type": "git", 817 | "url": "https://github.com/symfony/finder.git", 818 | "reference": "2b765f0cf6612b3636e738c0689b29aa63088d5d" 819 | }, 820 | "dist": { 821 | "type": "zip", 822 | "url": "https://api.github.com/repos/symfony/finder/zipball/2b765f0cf6612b3636e738c0689b29aa63088d5d", 823 | "reference": "2b765f0cf6612b3636e738c0689b29aa63088d5d", 824 | "shasum": "", 825 | "mirrors": [ 826 | { 827 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 828 | "preferred": true 829 | } 830 | ] 831 | }, 832 | "require": { 833 | "php": ">=7.2.5" 834 | }, 835 | "type": "library", 836 | "extra": { 837 | "branch-alias": { 838 | "dev-master": "5.1-dev" 839 | } 840 | }, 841 | "autoload": { 842 | "psr-4": { 843 | "Symfony\\Component\\Finder\\": "" 844 | }, 845 | "exclude-from-classmap": [ 846 | "/Tests/" 847 | ] 848 | }, 849 | "notification-url": "https://packagist.org/downloads/", 850 | "license": [ 851 | "MIT" 852 | ], 853 | "authors": [ 854 | { 855 | "name": "Fabien Potencier", 856 | "email": "fabien@symfony.com" 857 | }, 858 | { 859 | "name": "Symfony Community", 860 | "homepage": "https://symfony.com/contributors" 861 | } 862 | ], 863 | "description": "Symfony Finder Component", 864 | "homepage": "https://symfony.com", 865 | "time": "2020-08-17T10:01:29+00:00" 866 | }, 867 | { 868 | "name": "symfony/polyfill-ctype", 869 | "version": "v1.18.1", 870 | "source": { 871 | "type": "git", 872 | "url": "https://github.com/symfony/polyfill-ctype.git", 873 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" 874 | }, 875 | "dist": { 876 | "type": "zip", 877 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", 878 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", 879 | "shasum": "", 880 | "mirrors": [ 881 | { 882 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 883 | "preferred": true 884 | } 885 | ] 886 | }, 887 | "require": { 888 | "php": ">=5.3.3" 889 | }, 890 | "suggest": { 891 | "ext-ctype": "For best performance" 892 | }, 893 | "type": "library", 894 | "extra": { 895 | "branch-alias": { 896 | "dev-master": "1.18-dev" 897 | }, 898 | "thanks": { 899 | "name": "symfony/polyfill", 900 | "url": "https://github.com/symfony/polyfill" 901 | } 902 | }, 903 | "autoload": { 904 | "psr-4": { 905 | "Symfony\\Polyfill\\Ctype\\": "" 906 | }, 907 | "files": [ 908 | "bootstrap.php" 909 | ] 910 | }, 911 | "notification-url": "https://packagist.org/downloads/", 912 | "license": [ 913 | "MIT" 914 | ], 915 | "authors": [ 916 | { 917 | "name": "Gert de Pagter", 918 | "email": "BackEndTea@gmail.com" 919 | }, 920 | { 921 | "name": "Symfony Community", 922 | "homepage": "https://symfony.com/contributors" 923 | } 924 | ], 925 | "description": "Symfony polyfill for ctype functions", 926 | "homepage": "https://symfony.com", 927 | "keywords": [ 928 | "compatibility", 929 | "ctype", 930 | "polyfill", 931 | "portable" 932 | ], 933 | "time": "2020-07-14T12:35:20+00:00" 934 | }, 935 | { 936 | "name": "symfony/polyfill-intl-grapheme", 937 | "version": "v1.18.1", 938 | "source": { 939 | "type": "git", 940 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 941 | "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5" 942 | }, 943 | "dist": { 944 | "type": "zip", 945 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b740103edbdcc39602239ee8860f0f45a8eb9aa5", 946 | "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5", 947 | "shasum": "", 948 | "mirrors": [ 949 | { 950 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 951 | "preferred": true 952 | } 953 | ] 954 | }, 955 | "require": { 956 | "php": ">=5.3.3" 957 | }, 958 | "suggest": { 959 | "ext-intl": "For best performance" 960 | }, 961 | "type": "library", 962 | "extra": { 963 | "branch-alias": { 964 | "dev-master": "1.18-dev" 965 | }, 966 | "thanks": { 967 | "name": "symfony/polyfill", 968 | "url": "https://github.com/symfony/polyfill" 969 | } 970 | }, 971 | "autoload": { 972 | "psr-4": { 973 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 974 | }, 975 | "files": [ 976 | "bootstrap.php" 977 | ] 978 | }, 979 | "notification-url": "https://packagist.org/downloads/", 980 | "license": [ 981 | "MIT" 982 | ], 983 | "authors": [ 984 | { 985 | "name": "Nicolas Grekas", 986 | "email": "p@tchwork.com" 987 | }, 988 | { 989 | "name": "Symfony Community", 990 | "homepage": "https://symfony.com/contributors" 991 | } 992 | ], 993 | "description": "Symfony polyfill for intl's grapheme_* functions", 994 | "homepage": "https://symfony.com", 995 | "keywords": [ 996 | "compatibility", 997 | "grapheme", 998 | "intl", 999 | "polyfill", 1000 | "portable", 1001 | "shim" 1002 | ], 1003 | "time": "2020-07-14T12:35:20+00:00" 1004 | }, 1005 | { 1006 | "name": "symfony/polyfill-intl-normalizer", 1007 | "version": "v1.18.1", 1008 | "source": { 1009 | "type": "git", 1010 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 1011 | "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" 1012 | }, 1013 | "dist": { 1014 | "type": "zip", 1015 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", 1016 | "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", 1017 | "shasum": "", 1018 | "mirrors": [ 1019 | { 1020 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1021 | "preferred": true 1022 | } 1023 | ] 1024 | }, 1025 | "require": { 1026 | "php": ">=5.3.3" 1027 | }, 1028 | "suggest": { 1029 | "ext-intl": "For best performance" 1030 | }, 1031 | "type": "library", 1032 | "extra": { 1033 | "branch-alias": { 1034 | "dev-master": "1.18-dev" 1035 | }, 1036 | "thanks": { 1037 | "name": "symfony/polyfill", 1038 | "url": "https://github.com/symfony/polyfill" 1039 | } 1040 | }, 1041 | "autoload": { 1042 | "psr-4": { 1043 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 1044 | }, 1045 | "files": [ 1046 | "bootstrap.php" 1047 | ], 1048 | "classmap": [ 1049 | "Resources/stubs" 1050 | ] 1051 | }, 1052 | "notification-url": "https://packagist.org/downloads/", 1053 | "license": [ 1054 | "MIT" 1055 | ], 1056 | "authors": [ 1057 | { 1058 | "name": "Nicolas Grekas", 1059 | "email": "p@tchwork.com" 1060 | }, 1061 | { 1062 | "name": "Symfony Community", 1063 | "homepage": "https://symfony.com/contributors" 1064 | } 1065 | ], 1066 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 1067 | "homepage": "https://symfony.com", 1068 | "keywords": [ 1069 | "compatibility", 1070 | "intl", 1071 | "normalizer", 1072 | "polyfill", 1073 | "portable", 1074 | "shim" 1075 | ], 1076 | "time": "2020-07-14T12:35:20+00:00" 1077 | }, 1078 | { 1079 | "name": "symfony/polyfill-mbstring", 1080 | "version": "v1.18.1", 1081 | "source": { 1082 | "type": "git", 1083 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1084 | "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" 1085 | }, 1086 | "dist": { 1087 | "type": "zip", 1088 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", 1089 | "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", 1090 | "shasum": "", 1091 | "mirrors": [ 1092 | { 1093 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1094 | "preferred": true 1095 | } 1096 | ] 1097 | }, 1098 | "require": { 1099 | "php": ">=5.3.3" 1100 | }, 1101 | "suggest": { 1102 | "ext-mbstring": "For best performance" 1103 | }, 1104 | "type": "library", 1105 | "extra": { 1106 | "branch-alias": { 1107 | "dev-master": "1.18-dev" 1108 | }, 1109 | "thanks": { 1110 | "name": "symfony/polyfill", 1111 | "url": "https://github.com/symfony/polyfill" 1112 | } 1113 | }, 1114 | "autoload": { 1115 | "psr-4": { 1116 | "Symfony\\Polyfill\\Mbstring\\": "" 1117 | }, 1118 | "files": [ 1119 | "bootstrap.php" 1120 | ] 1121 | }, 1122 | "notification-url": "https://packagist.org/downloads/", 1123 | "license": [ 1124 | "MIT" 1125 | ], 1126 | "authors": [ 1127 | { 1128 | "name": "Nicolas Grekas", 1129 | "email": "p@tchwork.com" 1130 | }, 1131 | { 1132 | "name": "Symfony Community", 1133 | "homepage": "https://symfony.com/contributors" 1134 | } 1135 | ], 1136 | "description": "Symfony polyfill for the Mbstring extension", 1137 | "homepage": "https://symfony.com", 1138 | "keywords": [ 1139 | "compatibility", 1140 | "mbstring", 1141 | "polyfill", 1142 | "portable", 1143 | "shim" 1144 | ], 1145 | "time": "2020-07-14T12:35:20+00:00" 1146 | }, 1147 | { 1148 | "name": "symfony/polyfill-php73", 1149 | "version": "v1.18.1", 1150 | "source": { 1151 | "type": "git", 1152 | "url": "https://github.com/symfony/polyfill-php73.git", 1153 | "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" 1154 | }, 1155 | "dist": { 1156 | "type": "zip", 1157 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", 1158 | "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", 1159 | "shasum": "", 1160 | "mirrors": [ 1161 | { 1162 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1163 | "preferred": true 1164 | } 1165 | ] 1166 | }, 1167 | "require": { 1168 | "php": ">=5.3.3" 1169 | }, 1170 | "type": "library", 1171 | "extra": { 1172 | "branch-alias": { 1173 | "dev-master": "1.18-dev" 1174 | }, 1175 | "thanks": { 1176 | "name": "symfony/polyfill", 1177 | "url": "https://github.com/symfony/polyfill" 1178 | } 1179 | }, 1180 | "autoload": { 1181 | "psr-4": { 1182 | "Symfony\\Polyfill\\Php73\\": "" 1183 | }, 1184 | "files": [ 1185 | "bootstrap.php" 1186 | ], 1187 | "classmap": [ 1188 | "Resources/stubs" 1189 | ] 1190 | }, 1191 | "notification-url": "https://packagist.org/downloads/", 1192 | "license": [ 1193 | "MIT" 1194 | ], 1195 | "authors": [ 1196 | { 1197 | "name": "Nicolas Grekas", 1198 | "email": "p@tchwork.com" 1199 | }, 1200 | { 1201 | "name": "Symfony Community", 1202 | "homepage": "https://symfony.com/contributors" 1203 | } 1204 | ], 1205 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 1206 | "homepage": "https://symfony.com", 1207 | "keywords": [ 1208 | "compatibility", 1209 | "polyfill", 1210 | "portable", 1211 | "shim" 1212 | ], 1213 | "time": "2020-07-14T12:35:20+00:00" 1214 | }, 1215 | { 1216 | "name": "symfony/polyfill-php80", 1217 | "version": "v1.18.1", 1218 | "source": { 1219 | "type": "git", 1220 | "url": "https://github.com/symfony/polyfill-php80.git", 1221 | "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" 1222 | }, 1223 | "dist": { 1224 | "type": "zip", 1225 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", 1226 | "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", 1227 | "shasum": "", 1228 | "mirrors": [ 1229 | { 1230 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1231 | "preferred": true 1232 | } 1233 | ] 1234 | }, 1235 | "require": { 1236 | "php": ">=7.0.8" 1237 | }, 1238 | "type": "library", 1239 | "extra": { 1240 | "branch-alias": { 1241 | "dev-master": "1.18-dev" 1242 | }, 1243 | "thanks": { 1244 | "name": "symfony/polyfill", 1245 | "url": "https://github.com/symfony/polyfill" 1246 | } 1247 | }, 1248 | "autoload": { 1249 | "psr-4": { 1250 | "Symfony\\Polyfill\\Php80\\": "" 1251 | }, 1252 | "files": [ 1253 | "bootstrap.php" 1254 | ], 1255 | "classmap": [ 1256 | "Resources/stubs" 1257 | ] 1258 | }, 1259 | "notification-url": "https://packagist.org/downloads/", 1260 | "license": [ 1261 | "MIT" 1262 | ], 1263 | "authors": [ 1264 | { 1265 | "name": "Ion Bazan", 1266 | "email": "ion.bazan@gmail.com" 1267 | }, 1268 | { 1269 | "name": "Nicolas Grekas", 1270 | "email": "p@tchwork.com" 1271 | }, 1272 | { 1273 | "name": "Symfony Community", 1274 | "homepage": "https://symfony.com/contributors" 1275 | } 1276 | ], 1277 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 1278 | "homepage": "https://symfony.com", 1279 | "keywords": [ 1280 | "compatibility", 1281 | "polyfill", 1282 | "portable", 1283 | "shim" 1284 | ], 1285 | "time": "2020-07-14T12:35:20+00:00" 1286 | }, 1287 | { 1288 | "name": "symfony/service-contracts", 1289 | "version": "v2.2.0", 1290 | "source": { 1291 | "type": "git", 1292 | "url": "https://github.com/symfony/service-contracts.git", 1293 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" 1294 | }, 1295 | "dist": { 1296 | "type": "zip", 1297 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", 1298 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", 1299 | "shasum": "", 1300 | "mirrors": [ 1301 | { 1302 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1303 | "preferred": true 1304 | } 1305 | ] 1306 | }, 1307 | "require": { 1308 | "php": ">=7.2.5", 1309 | "psr/container": "^1.0" 1310 | }, 1311 | "suggest": { 1312 | "symfony/service-implementation": "" 1313 | }, 1314 | "type": "library", 1315 | "extra": { 1316 | "branch-alias": { 1317 | "dev-master": "2.2-dev" 1318 | }, 1319 | "thanks": { 1320 | "name": "symfony/contracts", 1321 | "url": "https://github.com/symfony/contracts" 1322 | } 1323 | }, 1324 | "autoload": { 1325 | "psr-4": { 1326 | "Symfony\\Contracts\\Service\\": "" 1327 | } 1328 | }, 1329 | "notification-url": "https://packagist.org/downloads/", 1330 | "license": [ 1331 | "MIT" 1332 | ], 1333 | "authors": [ 1334 | { 1335 | "name": "Nicolas Grekas", 1336 | "email": "p@tchwork.com" 1337 | }, 1338 | { 1339 | "name": "Symfony Community", 1340 | "homepage": "https://symfony.com/contributors" 1341 | } 1342 | ], 1343 | "description": "Generic abstractions related to writing services", 1344 | "homepage": "https://symfony.com", 1345 | "keywords": [ 1346 | "abstractions", 1347 | "contracts", 1348 | "decoupling", 1349 | "interfaces", 1350 | "interoperability", 1351 | "standards" 1352 | ], 1353 | "time": "2020-09-07T11:33:47+00:00" 1354 | }, 1355 | { 1356 | "name": "symfony/string", 1357 | "version": "v5.1.5", 1358 | "source": { 1359 | "type": "git", 1360 | "url": "https://github.com/symfony/string.git", 1361 | "reference": "0de4cc1e18bb596226c06a82e2e7e9bc6001a63a" 1362 | }, 1363 | "dist": { 1364 | "type": "zip", 1365 | "url": "https://api.github.com/repos/symfony/string/zipball/0de4cc1e18bb596226c06a82e2e7e9bc6001a63a", 1366 | "reference": "0de4cc1e18bb596226c06a82e2e7e9bc6001a63a", 1367 | "shasum": "", 1368 | "mirrors": [ 1369 | { 1370 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1371 | "preferred": true 1372 | } 1373 | ] 1374 | }, 1375 | "require": { 1376 | "php": ">=7.2.5", 1377 | "symfony/polyfill-ctype": "~1.8", 1378 | "symfony/polyfill-intl-grapheme": "~1.0", 1379 | "symfony/polyfill-intl-normalizer": "~1.0", 1380 | "symfony/polyfill-mbstring": "~1.0", 1381 | "symfony/polyfill-php80": "~1.15" 1382 | }, 1383 | "require-dev": { 1384 | "symfony/error-handler": "^4.4|^5.0", 1385 | "symfony/http-client": "^4.4|^5.0", 1386 | "symfony/translation-contracts": "^1.1|^2", 1387 | "symfony/var-exporter": "^4.4|^5.0" 1388 | }, 1389 | "type": "library", 1390 | "extra": { 1391 | "branch-alias": { 1392 | "dev-master": "5.1-dev" 1393 | } 1394 | }, 1395 | "autoload": { 1396 | "psr-4": { 1397 | "Symfony\\Component\\String\\": "" 1398 | }, 1399 | "files": [ 1400 | "Resources/functions.php" 1401 | ], 1402 | "exclude-from-classmap": [ 1403 | "/Tests/" 1404 | ] 1405 | }, 1406 | "notification-url": "https://packagist.org/downloads/", 1407 | "license": [ 1408 | "MIT" 1409 | ], 1410 | "authors": [ 1411 | { 1412 | "name": "Nicolas Grekas", 1413 | "email": "p@tchwork.com" 1414 | }, 1415 | { 1416 | "name": "Symfony Community", 1417 | "homepage": "https://symfony.com/contributors" 1418 | } 1419 | ], 1420 | "description": "Symfony String component", 1421 | "homepage": "https://symfony.com", 1422 | "keywords": [ 1423 | "grapheme", 1424 | "i18n", 1425 | "string", 1426 | "unicode", 1427 | "utf-8", 1428 | "utf8" 1429 | ], 1430 | "time": "2020-08-17T07:48:54+00:00" 1431 | } 1432 | ], 1433 | "packages-dev": [ 1434 | { 1435 | "name": "swoole/ide-helper", 1436 | "version": "4.5.4", 1437 | "source": { 1438 | "type": "git", 1439 | "url": "https://github.com/swoole/ide-helper.git", 1440 | "reference": "3382a1844afb206cac064252f6b8b50115bf72bb" 1441 | }, 1442 | "dist": { 1443 | "type": "zip", 1444 | "url": "https://api.github.com/repos/swoole/ide-helper/zipball/3382a1844afb206cac064252f6b8b50115bf72bb", 1445 | "reference": "3382a1844afb206cac064252f6b8b50115bf72bb", 1446 | "shasum": "", 1447 | "mirrors": [ 1448 | { 1449 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1450 | "preferred": true 1451 | } 1452 | ] 1453 | }, 1454 | "require-dev": { 1455 | "guzzlehttp/guzzle": "~6.5.0", 1456 | "laminas/laminas-code": "~3.4.0", 1457 | "squizlabs/php_codesniffer": "~3.5.0", 1458 | "symfony/filesystem": "~4.0" 1459 | }, 1460 | "type": "library", 1461 | "notification-url": "https://packagist.org/downloads/", 1462 | "license": [ 1463 | "Apache-2.0" 1464 | ], 1465 | "authors": [ 1466 | { 1467 | "name": "Team Swoole", 1468 | "email": "team@swoole.com" 1469 | } 1470 | ], 1471 | "description": "IDE help files for Swoole.", 1472 | "time": "2020-09-16T00:12:52+00:00" 1473 | } 1474 | ], 1475 | "aliases": [], 1476 | "minimum-stability": "stable", 1477 | "stability-flags": [], 1478 | "prefer-stable": false, 1479 | "prefer-lowest": false, 1480 | "platform": [], 1481 | "platform-dev": [] 1482 | } 1483 | --------------------------------------------------------------------------------