├── 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 |
5 |
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 |
--------------------------------------------------------------------------------