commit 4bc96e314e40e725011d5089b4e2522390019151 Author: elf <360197197@qq.com> Date: Mon Sep 5 23:49:31 2022 +0800 Initial diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..6879583 --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +APP_NAME=skeleton +APP_ENV=dev + +DB_DRIVER=mysql +DB_HOST=localhost +DB_PORT=3306 +DB_DATABASE=hyperf +DB_USERNAME=root +DB_PASSWORD= +DB_CHARSET=utf8mb4 +DB_COLLATION=utf8mb4_unicode_ci +DB_PREFIX= + +REDIS_HOST=localhost +REDIS_AUTH=(null) +REDIS_PORT=6379 +REDIS_DB=0 \ No newline at end of file diff --git a/.github/workflows/Dockerfile b/.github/workflows/Dockerfile new file mode 100644 index 0000000..cd34eac --- /dev/null +++ b/.github/workflows/Dockerfile @@ -0,0 +1,54 @@ +# Default Dockerfile +# +# @link https://www.hyperf.io +# @document https://hyperf.wiki +# @contact group@hyperf.io +# @license https://github.com/hyperf/hyperf/blob/master/LICENSE + +FROM hyperf/hyperf:8.0-alpine-v3.12-swoole +LABEL maintainer="Hyperf Developers " version="1.0" license="MIT" app.name="Hyperf" + +## +# ---------- env settings ---------- +## +# --build-arg timezone=Asia/Shanghai +ARG timezone + +ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \ + APP_ENV=prod \ + SCAN_CACHEABLE=(true) + +# update +RUN set -ex \ + # show php version and extensions + && php -v \ + && php -m \ + && php --ri swoole \ + # ---------- some config ---------- + && cd /etc/php8 \ + # - config PHP + && { \ + echo "upload_max_filesize=128M"; \ + echo "post_max_size=128M"; \ + echo "memory_limit=1G"; \ + echo "date.timezone=${TIMEZONE}"; \ + } | tee conf.d/99_overrides.ini \ + # - config timezone + && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \ + && echo "${TIMEZONE}" > /etc/timezone \ + # ---------- clear works ---------- + && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \ + && echo -e "\033[42;37m Build Completed :).\033[0m\n" + +WORKDIR /opt/www + +# Composer Cache +# COPY ./composer.* /opt/www/ +# RUN composer install --no-dev --no-scripts + +COPY . /opt/www +RUN print "\n" | composer install -o && php bin/hyperf.php + +EXPOSE 9501 + +ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..0ca82fa --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,12 @@ +name: Build Docker + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Build + run: cp -rf .github/workflows/Dockerfile . && docker build -t hyperf . diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0f7d23f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +on: + push: + # Sequence of patterns matched against refs/tags + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + +name: Release + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70b4f13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +.buildpath +.settings/ +.project +*.patch +.idea/ +.git/ +runtime/ +vendor/ +.phpintel/ +.env +.DS_Store +.phpunit* +*.cache diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..a5fccae --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,57 @@ +# usermod -aG docker gitlab-runner + +stages: + - build + - deploy + +variables: + PROJECT_NAME: hyperf + REGISTRY_URL: registry-docker.org + +build_test_docker: + stage: build + before_script: +# - git submodule sync --recursive +# - git submodule update --init --recursive + script: + - docker build . -t $PROJECT_NAME + - docker tag $PROJECT_NAME $REGISTRY_URL/$PROJECT_NAME:test + - docker push $REGISTRY_URL/$PROJECT_NAME:test + only: + - test + tags: + - builder + +deploy_test_docker: + stage: deploy + script: + - docker stack deploy -c deploy.test.yml --with-registry-auth $PROJECT_NAME + only: + - test + tags: + - test + +build_docker: + stage: build + before_script: +# - git submodule sync --recursive +# - git submodule update --init --recursive + script: + - docker build . -t $PROJECT_NAME + - docker tag $PROJECT_NAME $REGISTRY_URL/$PROJECT_NAME:$CI_COMMIT_REF_NAME + - docker tag $PROJECT_NAME $REGISTRY_URL/$PROJECT_NAME:latest + - docker push $REGISTRY_URL/$PROJECT_NAME:$CI_COMMIT_REF_NAME + - docker push $REGISTRY_URL/$PROJECT_NAME:latest + only: + - tags + tags: + - builder + +deploy_docker: + stage: deploy + script: + - echo SUCCESS + only: + - tags + tags: + - builder diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 0000000..dd164b5 --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,91 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + '@Symfony' => true, + '@DoctrineAnnotation' => true, + '@PhpCsFixer' => true, + 'header_comment' => [ + 'comment_type' => 'PHPDoc', + 'header' => $header, + 'separate' => 'none', + 'location' => 'after_declare_strict', + ], + 'array_syntax' => [ + 'syntax' => 'short' + ], + 'list_syntax' => [ + 'syntax' => 'short' + ], + 'concat_space' => [ + 'spacing' => 'one' + ], + 'blank_line_before_statement' => [ + 'statements' => [ + 'declare', + ], + ], + 'general_phpdoc_annotation_remove' => [ + 'annotations' => [ + 'author' + ], + ], + 'ordered_imports' => [ + 'imports_order' => [ + 'class', 'function', 'const', + ], + 'sort_algorithm' => 'alpha', + ], + 'single_line_comment_style' => [ + 'comment_types' => [ + ], + ], + 'yoda_style' => [ + 'always_move_variable' => false, + 'equal' => false, + 'identical' => false, + ], + 'phpdoc_align' => [ + 'align' => 'left', + ], + 'multiline_whitespace_before_semicolons' => [ + 'strategy' => 'no_multi_line', + ], + 'constant_case' => [ + 'case' => 'lower', + ], + 'class_attributes_separation' => true, + 'combine_consecutive_unsets' => true, + 'declare_strict_types' => true, + 'linebreak_after_opening_tag' => true, + 'lowercase_static_reference' => true, + 'no_useless_else' => true, + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'not_operator_with_space' => false, + 'ordered_class_elements' => true, + 'php_unit_strict' => false, + 'phpdoc_separation' => false, + 'single_quote' => true, + 'standardize_not_equals' => true, + 'multiline_comment_opening_closing' => true, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('public') + ->exclude('runtime') + ->exclude('vendor') + ->in(__DIR__) + ) + ->setUsingCache(false); diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php new file mode 100644 index 0000000..5ba7d5f --- /dev/null +++ b/.phpstorm.meta.php @@ -0,0 +1,11 @@ +" version="1.0" license="MIT" app.name="Hyperf" + +## +# ---------- env settings ---------- +## +# --build-arg timezone=Asia/Shanghai +ARG timezone + +ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \ + APP_ENV=prod \ + SCAN_CACHEABLE=(true) + +# update +RUN set -ex \ + # show php version and extensions + && php -v \ + && php -m \ + && php --ri swoole \ + # ---------- some config ---------- + && cd /etc/php8 \ + # - config PHP + && { \ + echo "upload_max_filesize=128M"; \ + echo "post_max_size=128M"; \ + echo "memory_limit=1G"; \ + echo "date.timezone=${TIMEZONE}"; \ + } | tee conf.d/99_overrides.ini \ + # - config timezone + && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \ + && echo "${TIMEZONE}" > /etc/timezone \ + # ---------- clear works ---------- + && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \ + && echo -e "\033[42;37m Build Completed :).\033[0m\n" + +WORKDIR /opt/www + +# Composer Cache +# COPY ./composer.* /opt/www/ +# RUN composer install --no-dev --no-scripts + +COPY . /opt/www +RUN composer install --no-dev -o && php bin/hyperf.php + +EXPOSE 9501 + +ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..b38b119 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Introduction + +This is a skeleton application using the Hyperf framework. This application is meant to be used as a starting place for those looking to get their feet wet with Hyperf Framework. + +# Requirements + +Hyperf has some requirements for the system environment, it can only run under Linux and Mac environment, but due to the development of Docker virtualization technology, Docker for Windows can also be used as the running environment under Windows. + +The various versions of Dockerfile have been prepared for you in the [hyperf/hyperf-docker](https://github.com/hyperf/hyperf-docker) project, or directly based on the already built [hyperf/hyperf](https://hub.docker.com/r/hyperf/hyperf) Image to run. + +When you don't want to use Docker as the basis for your running environment, you need to make sure that your operating environment meets the following requirements: + + - PHP >= 7.3 + - Swoole PHP extension >= 4.5,and Disabled `Short Name` + - OpenSSL PHP extension + - JSON PHP extension + - PDO PHP extension (If you need to use MySQL Client) + - Redis PHP extension (If you need to use Redis Client) + - Protobuf PHP extension (If you need to use gRPC Server of Client) + +# Installation using Composer + +The easiest way to create a new Hyperf project is to use Composer. If you don't have it already installed, then please install as per the documentation. + +To create your new Hyperf project: + +$ composer create-project hyperf/hyperf-skeleton path/to/install + +Once installed, you can run the server immediately using the command below. + +$ cd path/to/install +$ php bin/hyperf.php start + +This will start the cli-server on port `9501`, and bind it to all network interfaces. You can then visit the site at `http://localhost:9501/` + +which will bring up Hyperf default home page. diff --git a/app/Command/JinlingCommand.php b/app/Command/JinlingCommand.php new file mode 100644 index 0000000..49ea701 --- /dev/null +++ b/app/Command/JinlingCommand.php @@ -0,0 +1,50 @@ +container = $container; + + parent::__construct('jinling'); + } + + public function configure() + { + parent::configure(); + $this->setDescription('廖金灵测试'); + } + + public function handle() + { + Lanhuo::addUser([ + 'user_id' => 111, + 'account' => 'bbbbbbbabc111', + 'phone' => '18888888888', + 'device_type' => 2, // 设备类型(1-andriod 2-ios) + 'device_number' => 'ABCD', + 'name' =>'哈哈哈', + 'id_card' => '350824199911111111', + 'is_real' => 1, // 是否实名(1-实名 0-未实名) + ]); + } +} \ No newline at end of file diff --git a/app/Constants/ResultCode.php b/app/Constants/ResultCode.php new file mode 100644 index 0000000..115025f --- /dev/null +++ b/app/Constants/ResultCode.php @@ -0,0 +1,44 @@ +respond($code, $message); + } + + protected function respond(int $code, string $message): Result + { + $data = Context::get('respondData', []); + return new Result($code, $message, $data); + } + + protected function setData(array $data): AbstractController + { + Context::set('respondData', $data); + return $this; + } +} diff --git a/app/Controller/GameEventController.php b/app/Controller/GameEventController.php new file mode 100644 index 0000000..959bf57 --- /dev/null +++ b/app/Controller/GameEventController.php @@ -0,0 +1,70 @@ +request->input('pay_order_number', ''); + if (!$payOrderNumber) { + throw new BusinessException('缺少参数[pay_order_number]'); + } + Queue::push(AfterSpendJob::class, ['pay_order_number' => $payOrderNumber]); + return $this->success(); + } + + public function login() + { + $userId = (int)$this->request->input('user_id', 0); + $gameId = (int)$this->request->input('game_id', 0); + $loginTime = (int)$this->request->input('login_time', 0); + if (!$userId) { + throw new BusinessException('缺少参数[user_id]'); + } + if (!$gameId) { + throw new BusinessException('缺少参数[game_id]'); + } + if (!$loginTime) { + throw new BusinessException('缺少参数[login_time]'); + } + Queue::push(AfterLoginJob::class, [ + 'user_id' => $userId, + 'game_id' => $gameId, + 'login_time' => $loginTime + ]); + return $this->success(); + } + + public function register() + { + $userId = $this->request->input('user_id', 0); + $source = $this->request->input('source', 'SDK'); + if (!$userId) { + throw new BusinessException('缺少参数[user_id]'); + } + Queue::push(AfterRegisterJob::class, [ + 'user_id' => $userId, + ]); + return $this->success(); + } + + public function saveRole() + { + Queue::push(AfterSaveRoleJob::class, $this->request->all()); + return $this->success(); + } +} \ No newline at end of file diff --git a/app/Controller/IndexController.php b/app/Controller/IndexController.php new file mode 100644 index 0000000..60a442e --- /dev/null +++ b/app/Controller/IndexController.php @@ -0,0 +1,26 @@ +request->input('user', 'Hyperf'); + $method = $this->request->getMethod(); + + return [ + 'method' => $method, + 'message' => "Hello {$user}.", + ]; + } +} diff --git a/app/Controller/StatisticsController.php b/app/Controller/StatisticsController.php new file mode 100644 index 0000000..00270da --- /dev/null +++ b/app/Controller/StatisticsController.php @@ -0,0 +1,27 @@ +playerService = $playerService; + } + + public function playerRetention() + { + $records = $this->playerService->getPlayerRetention($this->request->all()); + return $this->setData(['records' => $records])->success(); + } +} \ No newline at end of file diff --git a/app/Exception/BusinessException.php b/app/Exception/BusinessException.php new file mode 100644 index 0000000..75c4a98 --- /dev/null +++ b/app/Exception/BusinessException.php @@ -0,0 +1,21 @@ +logger = $logger; + } + + public function handle(Throwable $throwable, ResponseInterface $response) + { + $data = []; + $code = ResultCode::SERVER_ERROR; + $message = ''; + $httpCode = 200; + if ($throwable instanceof BusinessException) { + $this->stopPropagation(); + $code = $throwable->getCode(); + $message = $throwable->getMessage(); + } elseif ($throwable instanceof ModelNotFoundException) { + $this->stopPropagation(); + $code = ResultCode::RECORD_NOT_FOUND; + $message = ResultCode::getMessage($code); + } else { + if (config('app_env') == 'dev') { + $message = $throwable->getMessage(); + $data = [ + 'line' => $throwable->getLine(), + 'file' => $throwable->getFile(), + ]; + } else { + $message = ResultCode::getMessage($code); + } + $this->logger->error(sprintf('%s[%s] in %s', $throwable->getMessage(), $throwable->getLine(), $throwable->getFile())); + $this->logger->error($throwable->getTraceAsString()); + } + $result = new Result($code, $message, $data); + return $response + ->withAddedHeader('content-type', 'application/json; charset=utf-8') + ->withStatus($httpCode) + ->withBody(new SwooleStream(strval($result))); + + } + + public function isValid(Throwable $throwable): bool + { + return true; + } +} diff --git a/app/Helper/Annotation.php b/app/Helper/Annotation.php new file mode 100644 index 0000000..199cd05 --- /dev/null +++ b/app/Helper/Annotation.php @@ -0,0 +1,40 @@ + $value) { + $cacheKey = str_replace('{' . $key . '}', $value, $cacheKey); + } + return $cacheKey; + } + + public static function getInstance() + { + if (is_null(self::$instance)) { + self::$instance = ApplicationContext::getContainer()->get(\Psr\SimpleCache\CacheInterface::class); + } + return self::$instance; + } + + public static function __callStatic($method, $args) + { + return call_user_func_array([self::getInstance(), $method], $args); + } +} diff --git a/app/Helper/Client/Lanhuo.php b/app/Helper/Client/Lanhuo.php new file mode 100644 index 0000000..caada65 --- /dev/null +++ b/app/Helper/Client/Lanhuo.php @@ -0,0 +1,171 @@ + $data['user_id'], + 'account' => $data['account'], + 'phone' => $data['phone'], + 'device_type' => $data['device_type'], // 设备类型(1-andriod 2-ios) + 'device_number' => $data['device_number'], + 'name' => $data['name'], + 'id_card' => $data['id_card'], + 'is_real' => $data['is_real'], // 是否实名(1-实名 0-未实名) + ]; + return self::api('/llwf/user/add', $params); + } + + public static function updateUser($data) + { + $params = [ + 'user_id' => $data['user_id'], + 'phone' => $data['phone'], + 'device_type' => $data['device_type'], // 设备类型(1-andriod 2-ios) + 'device_number' => $data['device_number'], + 'name' => $data['name'], + 'id_card' => $data['id_card'], + 'is_real' => $data['is_real'], // 是否实名(1-实名 0-未实名) + ]; + return self::api('/llwf/user/update', $params); + } + + public static function addLoginLog($data) + { + $params = [ + 'user_id' => $data['user_id'], + 'account' => $data['account'], + 'phone' => $data['phone'], + 'device_type' => $data['device_type'], // 设备类型(1-andriod 2-ios) + 'device_number' => $data['device_number'], + ]; + return self::api('/llwf/user/AddLoginLog', $params); + } + + public static function addOrder($data) + { + $params = [ + 'order_code' => $data['pay_order_number'], + 'user_id' => $data['user_id'], + 'account' => $data['account'], + 'service_id' => $data['service_id'], + 'service_name' => $data['service_name'], + 'role_id' => $data['role_id'], + 'role_name' => $data['role_name'], + 'game_name' => $data['game_name'], + 'order_amount' => $data['order_amount'], + 'pay_time' => $data['pay_time'], + 'status' => $data['status'], //支付状态(待支付 0 已支付 1 支付失败 2) + ]; + return self::api('/llwf/order/add', $params); + } + + public static function addRole($data) + { + $params = [ + 'user_id' => $data['user_id'], + 'service_id' => $data['service_id'], + 'service_name' => $data['service_name'], + 'role_id' => $data['role_id'], + 'role_name' => $data['role_name'], + 'role_level' => $data['role_level'], + 'profession_id' => '', // 职业ID + 'profession_name' => '', // 职业名称 + 'power' => '', // 战力 + ]; + return self::api('/llwf//role/add', $params); + } + + private static function auth() + { + $params = [ + 'appId' => config('clients.lanhuo.app_id', ''), + 'appKey' => config('clients.lanhuo.app_key', ''), + 'appSecret' => config('clients.lanhuo.app_secret', ''), + ]; + return self::api('/auth', $params, false); + } + + private static function api($uri, array $params, $withAccessToken = true) + { + $headers = []; + if ($withAccessToken) { + if (!self::$accessToken || time() > self::$expiredAt) { + self::refreshAccessToken(); + } + $headers['accessToken'] = self::$accessToken; + } + + $result = self::post($uri, $params, $headers); + if ($result['errorCode'] == self::SUCCESS) { + return $result['data']; + } else { + Log::error('LANHUO_REQUEST_ERROR[' . $uri . ']: ' . $result['msg'], $params, 'lanhuo'); + throw new BusinessException('请求接口错误:' . $result['msg']); + } + } + + private static function refreshAccessToken() + { + $data = self::auth(); + self::$accessToken = $data['accessToken']; + self::$expiredAt = strtotime($data['createDt']) + $data['expireTime'] - 10; // 前置10秒 + } + + private static function post($uri, array $params, array $headers = []): array + { + try { + $response = self::getClient()->post('/openapi' . $uri, [ + 'verify' => false, + // 'form_params' => $params, + 'json' => $params, + 'headers' => $headers, + ]); + $result = (string)$response->getBody(); + return json_decode($result, true); + } catch (\Exception $e) { + Log::error('LANHUO_NET_ERROR[' . $uri . ']: ' . $e->getMessage(), $params, 'lanhuo'); + return [ + 'errorCode' => 88888, + 'msg' => env('APP_ENV') == 'prod' ? '网络异常' : '网络异常:' . $e->getMessage(), + 'data' => [], + ]; + } + } + + private static function getClient() + { + if (is_null(self::$client)) { + self::$client = new Client([ + 'base_uri' => config('clients.lanhuo.base_url', ''), + 'handler' => HandlerStack::create(new CoroutineHandler()), + 'timeout' => 5, + 'swoole' => [ + 'timeout' => 10, + 'socket_buffer_size' => 1024 * 1024 * 2, + ], + 'headers' => [ + 'Content-Type' => 'application/json', + ], + ]); + } + return self::$client; + } +} \ No newline at end of file diff --git a/app/Helper/DataList.php b/app/Helper/DataList.php new file mode 100644 index 0000000..95dc680 --- /dev/null +++ b/app/Helper/DataList.php @@ -0,0 +1,212 @@ +params = $params; + $this->check(); + $this->init(); + } + + protected function init() + { + + } + + protected function beforeGenerate($items) + { + return $items; + } + + protected function afterGenerate() + { + + } + + public function generateRecords($items) + { + $items = $this->beforeGenerate($items); + $this->records = []; + if ($this->isSpanRow) { + foreach ($items as $item) { + $this->records = array_merge($this->records, $this->toArray($item)); + } + } else { + foreach ($items as $item) { + $this->records[] = $this->toArray($item); + } + } + $this->afterGenerate(); + } + + public function toArray($item) + { + return null; + } + + public function query() + { + return null; + } + + protected function statOffset($page, $limit) + { + return ($page - 1) * $limit; + } + + public function paginate(): DataList + { + [$records, $pagination] = $this->doPaginate(); + $this->pagination = $pagination; + $this->generateRecords($records); + return $this; + } + + public function doPaginate(): array + { + $count = 0; + $this->page = $page = intval($this->params['page'] ?? 1); + $this->limit = $limit = intval($this->params['limit'] ?? 10); + $this->offset = $offset = $this->statOffset($page, $limit); + + $records = new Collection([]); + $query = $this->query(); + if (is_null($query)) { + $pagination = $this->generatePagination($page, $limit, $this->getCount()); + return [$records, $pagination]; + } + + if ($this->withoutPaginate) { + $searchQuery = clone $query; + return [$searchQuery->get(), null]; + } + + // 临时快速分页 + if ($this->isQuickPaginate) { + return $this->quickPaginate(clone $query, $page, $limit); + } else { + $count = $this->getCount(); + if ($count) { + $searchQuery = clone $query; + $records = $searchQuery->offset($offset)->limit($limit)->get(); + } + $pagination = $this->generatePagination($page, $limit, $count); + } + return [$records, $pagination]; + } + + protected function quickPaginate($query, $page, $limit) + { + $count = 1; + $offset = $this->statOffset($page, $limit); + $records = $query->offset($offset)->limit($limit+1)->get(); + $recordCount = $records->count(); + if ($recordCount < $limit+1) { + $hasMroe = false; + } else { + $records->pop(); + $hasMroe = true; + } + $pagination = $this->generatePagination($page, $limit, $count, $hasMroe); + return [$records, $pagination]; + } + + protected function generatePagination($page, $limit, $count, $hasMroe = false) + { + $pageCount = intval(ceil($count/$limit)); + if (! $hasMroe) { + if ($page < $pageCount) { + $hasMroe = true; + } + } + return [ + 'page' => $page, + 'count' => $count, + 'page_count' => $pageCount, + 'limit' => $limit, + 'has_more'=> $hasMroe, + ]; + } + + public function getCount() + { + $query = $this->query(); + if (is_null($query)) { + return 0; + } + $countQuery = clone $query; + if ($this->isGroupQuery) { + $countQuery->select([DB::raw('1')]); + return DB::table(DB::raw("({$countQuery->toSql()}) as temp_count_table")) + ->mergeBindings($query instanceof Builder ? $countQuery : $countQuery->getQuery()) + ->count(); + } else { + return $countQuery->count(); + } + } + + public function getPagination(): ?array + { + return $this->pagination; + } + + public function setWithoutPaginate($withoutPaginate) + { + $this->withoutPaginate = $withoutPaginate; + return $this; + } + + public function getRecords() + { + return $this->records; + } + + public function getSummary() + { + return []; + } + + public function check() + { + + } + + /** + * 获取 记录(records)/分页(pagination)/汇总(summary) + * @param array $appendOptions 追加信息一起返回 + * @return array + */ + public function all($appendOptions = []) + { + $data = [ + 'records' => $this->getRecords(), + 'pagination' => $this->getPagination(), + 'summary' => $this->getSummary(), + ]; + return array_merge($data, $appendOptions); + } +} \ No newline at end of file diff --git a/app/Helper/DeviceType.php b/app/Helper/DeviceType.php new file mode 100644 index 0000000..db56c10 --- /dev/null +++ b/app/Helper/DeviceType.php @@ -0,0 +1,21 @@ + '安卓', + self::IOS => '苹果', + ]; + + public static function getDeviceTypeText($deviceType) + { + return self::$deviceTypeList[$deviceType] ?? '未知'; + } +} \ No newline at end of file diff --git a/app/Helper/Dict.php b/app/Helper/Dict.php new file mode 100644 index 0000000..c53a54b --- /dev/null +++ b/app/Helper/Dict.php @@ -0,0 +1,73 @@ +name] = ['class' => $item['class'], 'property' => $item['property'], 'transform' => $item['annotation']->transform]; + } + $records = []; + foreach ($names as $name) { + if (isset($properties[$name])) { + $property = $properties[$name]; + $items = $property['class']::${$property['property']}; + if ($property['transform']) { + foreach ($items as $key => $value) { + $records[$name][] = ['key' => $key, 'value' => $value]; + } + } else { + $records[$name] = $items; + } + } + } + return $records; + } + + private static function getFromMethods(array $names, int $language): array + { + $items = AnnotationCollector::getMethodsByAnnotation(DictAnnotation::class); + $methods = []; + foreach ($items as $item) { + $methods[$item['annotation']->name] = ['class' => $item['class'], 'method' => $item['method']]; + } + + $records = []; + foreach ($names as $name) { + if (isset($methods[$name])) { + $method = $methods[$name]; + $object = make($method['class']); + if ($language > 0) { + $records[$name] = $object->{$method['method']}($language); + } else { + $records[$name] = $object->{$method['method']}(); + } + } + } + return $records; + } +} diff --git a/app/Helper/Excel.php b/app/Helper/Excel.php new file mode 100644 index 0000000..aa0ef77 --- /dev/null +++ b/app/Helper/Excel.php @@ -0,0 +1,28 @@ += 256) { + throw new \Exception('Too much Excel column!'); + } + $keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; + if ($index < 26) { + return $keys[$index]; + } else { + $first = $index/26; + $second = $index%26; + return $keys[$first-1] . $keys[$second]; + } + } + + public static function generateUniqueCode(array $params, string $identity, $length = 8) + { + $md5Code = md5(microtime(true) . json_encode($params) . $identity . rand(0, 9999)); + return substr($md5Code, 0, $length); + } +} \ No newline at end of file diff --git a/app/Helper/Export.php b/app/Helper/Export.php new file mode 100644 index 0000000..eb219ef --- /dev/null +++ b/app/Helper/Export.php @@ -0,0 +1,185 @@ + 'id', + 'symbol' => '<' + ]; + + public function __construct(array $params = []) + { + $this->params = $params; + $this->init(); + } + + protected function init() + { + + } + + public function query() + { + return null; + } + + public function array(): array + { + return []; + } + + public function collection(): Collection + { + return new Collection([]); + } + + /** + * 导出时每行的数据 + */ + public function map($item): array + { + return []; + } + + /** + * 导出时的表头 + */ + public function headings(): array + { + return []; + } + + public function summary(): array + { + return []; + } + + public function rangeQueryItems($items) + { + return $items; + } + + /** + * 导出时文件后缀 + */ + public function getExtension() + { + /* $extensions = [ + Excel::XLSX => '.xlsx', + Excel::CSV => '.csv', + // Excel::TSV => '.tsv', + Excel::ODS => '.ods', + Excel::XLS => '.xls', + Excel::HTML => '.html', + Excel::MPDF => '.pdf', + Excel::DOMPDF => '.pdf', + Excel::TCPDF => '.pdf', + ]; + + return $extensions[$this->writerType] ?? '.xlsx'; */ + return '.xlsx'; + } + + public function generateFileName() + { + $uniqueCode = Excel::generateUniqueCode($this->params, '', 8); + if (!$this->name) { + $this->fileName = date('YmdHis') . $uniqueCode; + } else { + $this->fileName = date('YmdHis') . $uniqueCode . '_' . $this->name; + } + } + + protected function generateFilePath() + { + if (!$this->fileName) { + $this->generateFileName(); + } + $excelPath = getRoutePrefix() . '/excels/'; + if (!is_dir($this->basePath . $excelPath)) { + mkdir($this->basePath . $excelPath); + } + $this->fileUrl = $excelPath . $this->fileName. $this->getExtension(); + $this->filePath = $this->basePath . $this->fileUrl; + } + + public function getMode() + { + return self::MODE_QUERY; + } + + protected function prepare() + { + + } + + public function store() + { + $this->prepare(); + $this->generateFilePath(); + $exporter = new Exporter(); + $exporter->store($this, $this->filePath); + } + + /** + * 返回设置单元格样式的函数 function(Export, Worksheet) + */ + public function getStyleSetting(): ?Closure + { + return null; + } + + public function setFileName($fileName) + { + return $this->fileName = $fileName; + } + + public function getFileName() + { + return $this->fileName; + } + + public function getFileUrl() + { + return $this->fileUrl; + } + + protected function check() + { + + } + + public static function identity() + { + return Str::encrypt(static::class); + } + + public static function getClassByIdentity($identity) + { + return Str::decrypt($identity); + } +} \ No newline at end of file diff --git a/app/Helper/Exporter.php b/app/Helper/Exporter.php new file mode 100644 index 0000000..29b4b08 --- /dev/null +++ b/app/Helper/Exporter.php @@ -0,0 +1,190 @@ +getActiveSheet(); + + $this->fillHeading($export, $sheet); + $this->fillData($export, $sheet); + $this->setAutoSize($export, $sheet); + $closure = $export->getStyleSetting(); + if ($closure) { + $closure($export, $sheet); + } + + $writer = new Xlsx($spreadsheet); + $writer->save($filePath); + } + + private function fillHeading(Export $export, Worksheet $sheet) + { + $rowIndex = 0; + $firstCellKey = null; + $lastCellKey = null; + foreach ($export->headings() as $columnIndex => $name) { + $cellKey = $this->getCellKey($rowIndex, $columnIndex); + $sheet->setCellValue($cellKey, $name); + if ($columnIndex == 0) { + $firstCellKey = $cellKey; + } + $lastCellKey = $cellKey; + } + + $this->setHeadingStyle($sheet, $firstCellKey . ':' . $lastCellKey); + } + + private function fillData(Export $export, Worksheet $sheet, $rowIndex = 1) + { + $mode = $export->getMode(); + if ($mode == Export::MODE_QUERY) { + $rowIndex = $this->fillFromQuery($export, $sheet, $rowIndex); + } elseif ($mode == Export::MODE_ARRAY) { + $rowIndex = $this->fillFromArray($export, $sheet, $rowIndex); + } elseif ($mode == Export::MODE_COLLECTION) { + $rowIndex = $this->fillFromCollection($export, $sheet, $rowIndex); + } + + $summary = $export->withSummary ? $export->summary() : null; + if (!empty($summary)) { + $rowIndex = $this->fillItems($export, $sheet, [$summary], $rowIndex); + } + } + + private function setHeadingStyle(Worksheet $sheet, $cellRange) + { + $sharedStyle = new Style(); + $sharedStyle->applyFromArray( + [ + 'fill' => [ + 'fillType' => Fill::FILL_SOLID, + 'color' => ['argb' => 'd9d9d9'], + ], + 'borders' => [ + 'allBorders' => ['borderStyle' => Border::BORDER_THIN], + ], + 'font' => [ + 'name' => '黑体', + 'bold' => true, + 'size' => 12 + ] + ] + ); + $sheet->duplicateStyle($sharedStyle, $cellRange); + } + + private function fillFromQuery(Export $export, Worksheet $sheet, $rowIndex) + { + $query = $export->query(); + if (is_null($query)) { + throw new BusinessException('query 方法未实现'); + } + $page = 1; + $limit = 1000; + $chunkCompareValue = null; + $isFirstRound = true; + do { + $tmpQuery = clone $query; + $offset = ($page-1) * $limit; + $items = null; + if ($export->chunkCompareEnable) { + $options = $export->chunkCompareOptions; + if (!$isFirstRound) { + $tmpQuery->where($options['key'], $options['symbol'], $chunkCompareValue); + } + $items = $tmpQuery->limit($limit)->get(); + $lastItem = $items->last(); + $chunkCompareValue = $lastItem ? $lastItem->{$options['key']} : null; + } else { + $items = $tmpQuery->offset($offset)->limit($limit)->get(); + } + $items = $export->rangeQueryItems($items); + $rowIndex = $this->fillItems($export, $sheet, $items, $rowIndex); + $isFirstRound = false; + $count = count($items); + $page ++; + } while ($count == $limit); + return $rowIndex; + } + + private function fillFromArray(Export $export, Worksheet $sheet, $rowIndex) + { + return $this->fillItems($export, $sheet, $export->array(), $rowIndex); + } + + private function fillFromCollection(Export $export, Worksheet $sheet, $rowIndex) + { + return $this->fillItems($export, $sheet, $export->collection(), $rowIndex); + } + + private function fillItems(Export $export, Worksheet $sheet, $items, $rowIndex) + { + foreach ($items as $item) { + foreach ($export->map($item) as $columnIndex => $value) { + $cellKey = $this->getCellKey($rowIndex, $columnIndex); + $sheet->setCellValue($cellKey, $value); + } + $rowIndex += 1; + } + return $rowIndex; + } + + private function concatCellKey($rowKey, $columnKey) + { + return $columnKey . $rowKey; + } + + private function getCellKey($rowIndex, $columnIndex) + { + return $this->concatCellKey($rowIndex + 1, Excel::getColumnKey($columnIndex)); + } + + private function setAutoSize(Export $export, Worksheet $sheet) + { + foreach ($export->headings() as $columnIndex => $name) { + $columnKey = Excel::getColumnKey($columnIndex); + $sheet->getColumnDimension($columnKey)->setAutoSize(true); + } + } +} diff --git a/app/Helper/Form.php b/app/Helper/Form.php new file mode 100644 index 0000000..1c78b52 --- /dev/null +++ b/app/Helper/Form.php @@ -0,0 +1,211 @@ +defaults() as $key => $value) { + if (isset($data[$key])) { + if (empty($value) && empty($data[$key])) { + $data[$key] = $value; + } + } else { + $data[$key] = $value; + } + } + $this->_data = $data; + } + + /** + * 设置表单参数默认值,暂不支持多维数组 + * @return array + */ + public function defaults(): array + { + return []; + } + + public function rules(): array + { + return []; + } + + public function messages(): array + { + return []; + } + + public function attributes(): array + { + return []; + } + + protected function before() + { + + } + + protected final function handleBefore() + { + $this->before(); + $this->checkScene(); + } + + protected function getRules() + { + $rules = $this->rules(); + $scene = $this->getScene(); + if ($scene && isset($this->scenes[$scene]) && is_array($this->scenes[$scene])) { + $newRules = []; + foreach ($this->scenes[$scene] as $field) { + if (array_key_exists($field, $rules)) { + $newRules[$field] = $rules[$field]; + } + } + return $newRules; + } + return $rules; + } + + public final function validate($throwException = true) + { + $this->handleBefore(); + $this->validator = $this->validationFactory->make($this->_data, $this->getRules(), $this->messages(), $this->attributes()); + $this->handleAfter(); + + $fails = $this->validator->fails(); + if ($throwException && $fails) { + throw new BusinessException($this->getErrorMessage()); + } + + return !$fails; + } + + protected function after() + { + + } + + protected final function handleAfter() + { + $this->validator->after(function ($validator) { + $items = Annotation::getMethodsByAnnotationAndClass(After::class, static::class); + foreach ($items as $item) { + if (empty($item['annotation']->scenes) || in_array($this->scene, $item['annotation']->scenes)) { + $this->{$item['method']}(); + } + } + }); + + $this->after(); + } + + public function addError($field, $message) + { + $this->validator->errors()->add($field, $message); + } + + public function errors(): MessageBag + { + return $this->validator->errors(); + } + + public function getErrorMessage($isAll = false): string + { + if ($this->errors()->count() > 0) { + $messages = $this->errors()->all(); + return $isAll ? implode('', $messages) : $messages[0]; + } + return ''; + } + + public final function getData() + { + return $this->_data; + } + + public final function getSceneData() + { + $scene = $this->getScene(); + if ($scene && isset($this->scenes[$scene]) && is_array($this->scenes[$scene])) { + $newData = []; + foreach ($this->scenes[$scene] as $field) { + if (array_key_exists($field, $this->_data)) { + $newData[$field] = $this->_data[$field]; + } + } + return $newData; + } + return $this->_data; + } + + /** + * @param string $scene 场景名称 + * @param bool $isCheckScene 是否检查场景是否存在 + */ + public final function setScene(string $scene, bool $isCheckScene = true): void + { + $this->scene = $scene; + $this->isCheckScene = $isCheckScene; + } + + protected final function checkScene() + { + if ($this->getScene() && $this->isCheckScene && !isset($this->scenes[$this->scene])) { + throw new BusinessException('Scene undefined!'); + } + } + + public final function getScene() + { + return $this->scene; + } + + public function __get($key) + { + return isset($this->_data[$key]) ? $this->_data[$key] : null; + } + + public function __set($key, $value) + { + $this->_data[$key] = $value; + } + + public function __isset($key) + { + return $this->__get($key); + } +} \ No newline at end of file diff --git a/app/Helper/Functions.php b/app/Helper/Functions.php new file mode 100644 index 0000000..e37835c --- /dev/null +++ b/app/Helper/Functions.php @@ -0,0 +1,54 @@ +getHeaders(); + if(isset($headers['x-forwarded-for'][0]) && !empty($headers['x-forwarded-for'][0])) { + $ips = explode(',', $headers['x-forwarded-for'][0]); + return trim($ips[0]); + } elseif (isset($headers['x-real-ip'][0]) && !empty($headers['x-real-ip'][0])) { + return $headers['x-real-ip'][0]; + } + + $serverParams = $request->getServerParams(); + return $serverParams['remote_addr'] ?? ''; + } +} \ No newline at end of file diff --git a/app/Helper/ListExport.php b/app/Helper/ListExport.php new file mode 100644 index 0000000..2052add --- /dev/null +++ b/app/Helper/ListExport.php @@ -0,0 +1,78 @@ +generateList(); + if (empty($this->name)) { + $this->name = $this->list->name; + } + $this->check(); + } + + public function query() + { + return $this->list->query(); + } + + public function array(): array + { + return $this->list->getRecords(); + } + + public function summary(): array + { + return $this->list->getSummary(); + } + + public function rangeQueryItems($items) + { + $this->list->generateRecords($items); + return $this->list->getRecords(); + } + + protected function prepare() + { + $query = $this->query(); + if ($this->getMode() == self::MODE_QUERY) { + if (is_null($query)) { + throw new BusinessException('query不能为空'); + } + } else { + $items = new Collection([]); + if (!is_null($query)) { + $items = $query->get(); + } + $this->list->generateRecords($items); + } + } + + protected function listClass() + { + return null; + } + + protected function generateList() + { + $class = $this->listClass(); + if ($class) { + $this->list = new $class($this->params); + } else { + throw new BusinessException('未配置对应DataList'); + } + } +} \ No newline at end of file diff --git a/app/Helper/Log.php b/app/Helper/Log.php new file mode 100644 index 0000000..90e7017 --- /dev/null +++ b/app/Helper/Log.php @@ -0,0 +1,26 @@ +get(LoggerFactory::class)->get($name); + } + + public static function __callStatic($method, $args) + { + $name = 'app'; + if (isset($args[2])) { + $name = $args[2]; + unset($args[2]); + } + return call_user_func_array([self::get($name), $method], $args); + } +} \ No newline at end of file diff --git a/app/Helper/Logic.php b/app/Helper/Logic.php new file mode 100644 index 0000000..4a0bfba --- /dev/null +++ b/app/Helper/Logic.php @@ -0,0 +1,9 @@ +builder = $builder; + $this->relation = $relation; + $this->callback = $callback; + } + + /** + * @return Builder + * + * @throws \Exception + */ + public function execute() + { + if (! $this->relation) { + return $this->builder; + } + + return $this->where( + $this->formatRelation() + ); + } + + /** + * @param Relations\Relation $relation + * + * @return Builder + * + * @throws \Exception + */ + protected function where($relation) + { + if ($relation instanceof Relations\MorphTo) { + throw new \Exception('Please use whereHasMorphIn() for MorphTo relationships.'); + } + + $relationQuery = $this->getRelationQuery($relation); + $method = $this->method; + + if ( + $relation instanceof Relations\MorphOne + || $relation instanceof Relations\MorphMany + ) { + return $this->builder->{$method}( + $relation->getQualifiedParentKeyName(), + $this->withRelationQueryCallback( + $relationQuery + ->select($relation->getQualifiedForeignKeyName()) + ->whereColumn($relation->getQualifiedParentKeyName(), $relation->getQualifiedForeignKeyName()) + ->where($relation->getQualifiedMorphType(), $relation->getMorphClass()) + ) + ); + } + + if ($relation instanceof Relations\MorphToMany) { + return $this->builder->{$method}( + $relation->getQualifiedParentKeyName(), + $this->withRelationQueryCallback( + $relationQuery + ->select($relation->getQualifiedForeignPivotKeyName()) + ->whereColumn($relation->getQualifiedParentKeyName(), $relation->getQualifiedForeignPivotKeyName()) + ->where($relation->getTable().'.'.$relation->getMorphType(), $relation->getMorphClass()) + ) + ); + } + + // BelongsTo + if ($relation instanceof Relations\BelongsTo) { + return $this->builder->{$method}( + $this->getRelationQualifiedForeignKeyName($relation), + $this->withRelationQueryCallback( + $relationQuery + ->select($relation->getQualifiedOwnerKeyName()) + ->whereColumn($this->getRelationQualifiedForeignKeyName($relation), $relation->getQualifiedOwnerKeyName()) + ) + ); + } + + if ( + $relation instanceof Relations\HasOne + || $relation instanceof Relations\HasMany + ) { + return $this->builder->{$method}( + $relation->getQualifiedParentKeyName(), + $this->withRelationQueryCallback( + $relationQuery + ->select($relation->getQualifiedForeignKeyName()) + ->whereColumn($relation->getQualifiedParentKeyName(), $relation->getQualifiedForeignKeyName()) + ) + ); + } + + // BelongsToMany + if ($relation instanceof Relations\BelongsToMany) { + return $this->builder->{$method}( + $relation->getQualifiedParentKeyName(), + $this->withRelationQueryCallback( + $relationQuery + ->select($relation->getQualifiedForeignPivotKeyName()) + ->whereColumn($relation->getQualifiedParentKeyName(), $relation->getQualifiedForeignPivotKeyName()) + ) + ); + } + + if ( + $relation instanceof Relations\HasOneThrough + || $relation instanceof Relations\HasManyThrough + ) { + return $this->builder->{$method}( + $relation->getQualifiedLocalKeyName(), + $this->withRelationQueryCallback( + $relationQuery + ->select($relation->getQualifiedFirstKeyName()) + ->whereColumn($relation->getQualifiedLocalKeyName(), $relation->getQualifiedFirstKeyName()) + ) + ); + } + + throw new \Exception(sprintf('%s does not support "whereHasIn".', get_class($relation))); + } + + /** + * @param Relations\Relation $relation + * + * @return Builder + */ + protected function getRelationQuery($relation) + { + $q = $relation->getQuery(); + + if ($this->builder->getModel()->getConnectionName() !== $q->getModel()->getConnectionName()) { + $databaseName = $this->getRelationDatabaseName($q); + $table = $q->getModel()->getTable(); + + if (! Str::contains($table, ["`$databaseName`.", "{$databaseName}."])) { + $q->from("{$databaseName}.{$table}"); + } + } + + return $q; + } + + protected function getRelationDatabaseName($q) + { + return config('database.connections.'.$q->getModel()->getConnectionName().'.database'); + } + + protected function getRelationQualifiedForeignKeyName($relation) + { + if (method_exists($relation, 'getQualifiedForeignKeyName')) { + return $relation->getQualifiedForeignKeyName(); + } + + return $relation->getQualifiedForeignKey(); + } + + /** + * @return Relations\Relation + */ + protected function formatRelation() + { + if (is_object($this->relation)) { + $relation = $this->relation; + } else { + $relationNames = explode('.', $this->relation); + $this->nextRelation = implode('.', array_slice($relationNames, 1)); + + $method = $relationNames[0]; + + $relation = Relations\Relation::noConstraints(function () use ($method) { + return $this->builder->getModel()->$method(); + }); + } + + return $relation; + } + + /** + * @param Builder $relation + * + * @return Builder + */ + protected function withRelationQueryCallback($relationQuery) + { + return call_user_func($this->callback, $this->nextRelation, $relationQuery); + } +} \ No newline at end of file diff --git a/app/Helper/Macro/WhereHasMorphIn.php b/app/Helper/Macro/WhereHasMorphIn.php new file mode 100644 index 0000000..59751f6 --- /dev/null +++ b/app/Helper/Macro/WhereHasMorphIn.php @@ -0,0 +1,44 @@ +getRelationWithoutConstraints($relation); + + $types = (array) $types; + + if ($types === ['*']) { + $types = $this->model->newModelQuery()->distinct()->pluck($relation->getMorphType())->all(); + + foreach ($types as &$type) { + $type = Relation::getMorphedModel($type) ?? $type; + } + } + + return $this->where(function ($query) use ($relation, $callback, $types) { + foreach ($types as $type) { + $query->orWhere(function ($query) use ($relation, $callback, $type) { + $belongsTo = $this->getBelongsToRelation($relation, $type); + + if ($callback) { + $callback = function ($query) use ($callback, $type) { + return $callback($query, $type); + }; + } + + $query->where($relation->getRelated()->getTable().'.'.$relation->getMorphType(), '=', (new $type)->getMorphClass()) + ->whereHasIn($belongsTo, $callback); + }); + } + }, null, null, $boolean); + }; + } +} \ No newline at end of file diff --git a/app/Helper/Macro/WhereHasNotIn.php b/app/Helper/Macro/WhereHasNotIn.php new file mode 100644 index 0000000..0eb28b0 --- /dev/null +++ b/app/Helper/Macro/WhereHasNotIn.php @@ -0,0 +1,13 @@ +first(); + } + + public static function getMorphClass(string $morphType): ?string + { + return Relation::$morphMap[$morphType] ?? null; + } + + /** + * 验证评论类型是否存在 + * + * @param string $morphType + * @return void + * @throws BusinessException + */ + public static function checkMorphType(string $morphType) + { + if (is_null(self::getMorphClass($morphType))) { + throw new BusinessException('Morph type error!'); + } + } + + public static function instanceOf(string $morphType, $instance): bool + { + return get_class($instance) === self::getMorphClass($morphType); + } + + public static function getMorphTypeOfInstance(object $instance): string + { + return self::getMorphType(get_class($instance)); + } + + public static function getMorphType(string $class): string + { + $morphMap = Relation::$morphMap; + $morphMap = array_flip($morphMap); + return $morphMap[$class] ?? ''; + } +} \ No newline at end of file diff --git a/app/Helper/Param.php b/app/Helper/Param.php new file mode 100644 index 0000000..e3d71e3 --- /dev/null +++ b/app/Helper/Param.php @@ -0,0 +1,57 @@ + $value) { + if (!isset($params[$key])) { + $params[$key] = $value; + } + } + return $params; + } + + public static function remove(array $params, array $removeKeys): array + { + foreach ($removeKeys as $key) { + if (isset($params[$key])) { + unset($params[$key]); + } + } + return $params; + } +} \ No newline at end of file diff --git a/app/Helper/Queue.php b/app/Helper/Queue.php new file mode 100644 index 0000000..591ea2a --- /dev/null +++ b/app/Helper/Queue.php @@ -0,0 +1,27 @@ +get(DriverFactory::class); + } + return self::$factory; + } + + public static function push($jobClass, $params, int $delay = 0): bool + { + $job = new $jobClass($params); + return self::getFactory()->get($job->getQueueName())->push($job, $delay); + } +} \ No newline at end of file diff --git a/app/Helper/Redis.php b/app/Helper/Redis.php new file mode 100644 index 0000000..0689abc --- /dev/null +++ b/app/Helper/Redis.php @@ -0,0 +1,38 @@ +get(RedisFactory::class); + } + return self::$factory; + } + + public static function getInstance($poolName = 'default'): RedisProxy + { + return self::getFactory()->get($poolName); + } + + public static function __callStatic($method, $args) + { + return call_user_func_array([self::getInstance(), $method], $args); + } +} \ No newline at end of file diff --git a/app/Helper/Result.php b/app/Helper/Result.php new file mode 100644 index 0000000..d360549 --- /dev/null +++ b/app/Helper/Result.php @@ -0,0 +1,66 @@ +code = $code; + $this->message = empty($message) ? ResultCode::getMessage($code) : $message; + $this->data = $data; + } + + public function getCode(): int + { + return $this->code; + } + + public function setCode(int $code) + { + return $this->code = $code; + } + + public function getMessage(): string + { + return $this->message; + } + + public function setMessage(string $message) + { + return $this->message = empty($message) ? ResultCode::getMessage($this->code) : $message; + } + + public function getData(): array + { + return $this->data; + } + + public function setData(array $data) + { + return $this->data = $data; + } + + public function toArray(): array + { + return [ + 'code' => $this->code, + 'message' => $this->message, + 'data' => new \ArrayObject($this->data), + ]; + } + + public function __toString() + { + return json_encode($this->toArray(), JSON_UNESCAPED_UNICODE); + } +} \ No newline at end of file diff --git a/app/Helper/Str.php b/app/Helper/Str.php new file mode 100644 index 0000000..832eace --- /dev/null +++ b/app/Helper/Str.php @@ -0,0 +1,75 @@ +', '~', '+', '=', ',', '.' + )); + } + + $charsLen = count($chars) - 1; + shuffle($chars); + + $password = ''; + for($i=0; $i<$length; $i++){ + $password .= $chars[mt_rand(0, $charsLen)]; + } + + return $password; + } + + public static function encrypt(string $data) + { + $iv = '62dTsnuD1Ow68pR8'; + return openssl_encrypt($data, self::CIPHER_ALGO, self::PASSPHRASE, 0, $iv); + } + + public static function decrypt(string $password) + { + $iv = '62dTsnuD1Ow68pR8'; + return openssl_decrypt($password, self::CIPHER_ALGO, self::PASSPHRASE, 0, $iv); + } + + public static function parseUrl(string $url) + { + if (empty($url)) { + return $url; + } + + $item = explode(':', $url); + if (!isset($item[0]) || in_array($item[0], ['http', 'https'])) { + return $url; + } + return self::getFileUrlViaStorage($item[1], $item[0]); + } + + public static function getFileUrlViaStorage(string $url, string $storage): string + { + $domain = config('file.storage.' . $storage . '.domain'); + $prefixPath = config('file.storage.' . $storage . '.prefix_path', ''); + return $domain . $prefixPath . $url; + } +} \ No newline at end of file diff --git a/app/Helper/Time.php b/app/Helper/Time.php new file mode 100644 index 0000000..2e4a3a8 --- /dev/null +++ b/app/Helper/Time.php @@ -0,0 +1,89 @@ +firstOfMonth()->format('Y-m-d'), + $carbon->lastOfMonth()->format('Y-m-d') + ]; + } + + public static function getLastMonth() + { + return Carbon::now()->subMonth()->format('Y-m'); + } + + public static function getNextMonth() + { + return Carbon::now()->addMonth()->format('Y-m'); + } +} \ No newline at end of file diff --git a/app/Job/AfterLoginJob.php b/app/Job/AfterLoginJob.php new file mode 100644 index 0000000..96deada --- /dev/null +++ b/app/Job/AfterLoginJob.php @@ -0,0 +1,23 @@ +params['user_id'] ?? 0; + $gameId = (int)$this->params['game_id'] ?? 0; + $loginTime = (int)$this->params['login_time'] ?? 0; + + /** + * @var UserService $userService + */ + $userService = make(UserService::class); + $userService->afterLogin($userId, $gameId, $loginTime); + } +} \ No newline at end of file diff --git a/app/Job/AfterRegisterJob.php b/app/Job/AfterRegisterJob.php new file mode 100644 index 0000000..5cfd40c --- /dev/null +++ b/app/Job/AfterRegisterJob.php @@ -0,0 +1,21 @@ +params['user_id'] ?? ''; + + /** + * @var UserService $userService + */ + $userService = make(UserService::class); + $userService->afterRegister($userId); + } +} \ No newline at end of file diff --git a/app/Job/AfterSaveRoleJob.php b/app/Job/AfterSaveRoleJob.php new file mode 100644 index 0000000..4fa198b --- /dev/null +++ b/app/Job/AfterSaveRoleJob.php @@ -0,0 +1,19 @@ +save($this->params); + } +} \ No newline at end of file diff --git a/app/Job/AfterSpendJob.php b/app/Job/AfterSpendJob.php new file mode 100644 index 0000000..ddb137f --- /dev/null +++ b/app/Job/AfterSpendJob.php @@ -0,0 +1,21 @@ +params['pay_order_number'] ?? ''; + + /** + * @var SpendService $spendService + */ + $spendService = make(SpendService::class); + $spendService->afterSpend($payOrderNumber); + } +} \ No newline at end of file diff --git a/app/Job/Job.php b/app/Job/Job.php new file mode 100644 index 0000000..5b9905c --- /dev/null +++ b/app/Job/Job.php @@ -0,0 +1,47 @@ +context = $context; + $this->params = $this->prepare($params); + } + + protected function prepare(array $params): array + { + return $params; + } + + public function handle() + { + } + + protected function getJobName() + { + return get_called_class(); + } + + public function getQueueName() + { + return $this->queueName; + } +} \ No newline at end of file diff --git a/app/Listener/DbQueryExecutedListener.php b/app/Listener/DbQueryExecutedListener.php new file mode 100644 index 0000000..abe5a52 --- /dev/null +++ b/app/Listener/DbQueryExecutedListener.php @@ -0,0 +1,61 @@ +logger = $container->get(LoggerFactory::class)->get('sql'); + } + + public function listen(): array + { + return [ + QueryExecuted::class, + ]; + } + + /** + * @param QueryExecuted $event + */ + public function process(object $event) + { + if ($event instanceof QueryExecuted) { + $sql = $event->sql; + if (! Arr::isAssoc($event->bindings)) { + foreach ($event->bindings as $key => $value) { + $sql = Str::replaceFirst('?', "'{$value}'", $sql); + } + } + + $this->logger->info(sprintf('[%s] %s', $event->time, $sql)); + } + } +} diff --git a/app/Listener/ModelPrepareListener.php b/app/Listener/ModelPrepareListener.php new file mode 100644 index 0000000..14b8290 --- /dev/null +++ b/app/Listener/ModelPrepareListener.php @@ -0,0 +1,85 @@ +morphMapRelation(); + $this->macroWhereHasIn(); + } + + private function morphMapRelation() + { + Relation::morphMap([ + ]); + } + + private function macroWhereHasIn() + { + Builder::macro('whereHasIn', function ($relationName, $callable = null) { + return (new WhereHasIn($this, $relationName, function ($nextRelation, $builder) use ($callable) { + if ($nextRelation) { + return $builder->whereHasIn($nextRelation, $callable); + } + + if ($callable) { + return $builder->callScope($callable); + } + + return $builder; + }))->execute(); + }); + Builder::macro('orWhereHasIn', function ($relationName, $callable = null) { + return $this->orWhere(function ($query) use ($relationName, $callable) { + return $query->whereHasIn($relationName, $callable); + }); + }); + + Builder::macro('whereHasNotIn', function ($relationName, $callable = null) { + return (new WhereHasNotIn($this, $relationName, function ($nextRelation, $builder) use ($callable) { + if ($nextRelation) { + return $builder->whereHasNotIn($nextRelation, $callable); + } + + if ($callable) { + return $builder->callScope($callable); + } + + return $builder; + }))->execute(); + }); + Builder::macro('orWhereHasNotIn', function ($relationName, $callable = null) { + return $this->orWhere(function ($query) use ($relationName, $callable) { + return $query->whereHasNotIn($relationName, $callable); + }); + }); + + Builder::macro('whereHasMorphIn', WhereHasMorphIn::make()); + Builder::macro('orWhereHasMorphIn', function ($relation, $types, $callback = null) { + return $this->whereHasMorphIn($relation, $types, $callback, 'or'); + }); + } +} diff --git a/app/Listener/QueueHandleListener.php b/app/Listener/QueueHandleListener.php new file mode 100644 index 0000000..3638a9b --- /dev/null +++ b/app/Listener/QueueHandleListener.php @@ -0,0 +1,83 @@ +logger = $loggerFactory->get('queue'); + $this->formatter = $formatter; + } + + public function listen(): array + { + return [ + AfterHandle::class, + BeforeHandle::class, + FailedHandle::class, + RetryHandle::class, + ]; + } + + public function process(object $event) + { + if ($event instanceof Event && $event->message->job()) { + $job = $event->message->job(); + $jobClass = get_class($job); + if ($job instanceof AnnotationJob) { + $jobClass = sprintf('Job[%s@%s]', $job->class, $job->method); + } + $date = date('Y-m-d H:i:s'); + + switch (true) { + case $event instanceof BeforeHandle: + $this->logger->info(sprintf('[%s] Processing %s.', $date, $jobClass)); + break; + case $event instanceof AfterHandle: + $this->logger->info(sprintf('[%s] Processed %s.', $date, $jobClass)); + break; + case $event instanceof FailedHandle: + $this->logger->error(sprintf('[%s] Failed %s.', $date, $jobClass)); + $this->logger->error($this->formatter->format($event->getThrowable())); + break; + case $event instanceof RetryHandle: + $this->logger->warning(sprintf('[%s] Retried %s.', $date, $jobClass)); + break; + } + } + } +} diff --git a/app/Model/BaseGame.php b/app/Model/BaseGame.php new file mode 100644 index 0000000..64861d8 --- /dev/null +++ b/app/Model/BaseGame.php @@ -0,0 +1,17 @@ +where(function ($q) use($game) { + $q->orWhere('android_game_id', $game->id)->orWhere('ios_game_id', $game->id); + }); + } +} diff --git a/app/Model/Game.php b/app/Model/Game.php new file mode 100644 index 0000000..c3a46e2 --- /dev/null +++ b/app/Model/Game.php @@ -0,0 +1,21 @@ +hasOne(GameSource::class, 'game_id', 'id'); + } + + public function logo() + { + return $this->hasOne(Image::class, 'id', 'icon'); + } + +} diff --git a/app/Model/GameData.php b/app/Model/GameData.php new file mode 100644 index 0000000..18e6896 --- /dev/null +++ b/app/Model/GameData.php @@ -0,0 +1,14 @@ +getTable(); + if ($alias) { + $name .= ' as ' . $alias; + } + return $name; + } + + public static function fromAlias($alias) + { + return static::from(static::alias($alias)); + } + + public function getRawAttribute($key) + { + if (!$key) { + return null; + } + return $this->attributes[$key] ?? null; + } +} diff --git a/app/Model/Player.php b/app/Model/Player.php new file mode 100644 index 0000000..1beca73 --- /dev/null +++ b/app/Model/Player.php @@ -0,0 +1,25 @@ +belongsTo(Promote::class, 'promote_id', 'id'); + } + + public function user() + { + return $this->belongsTo(User::class, 'user_id', 'id'); + } +} \ No newline at end of file diff --git a/app/Model/PlayerRetention.php b/app/Model/PlayerRetention.php new file mode 100644 index 0000000..186e4c0 --- /dev/null +++ b/app/Model/PlayerRetention.php @@ -0,0 +1,18 @@ +belongsTo(Player::class, 'player_id', 'id'); + } +} \ No newline at end of file diff --git a/app/Model/PlayerRole.php b/app/Model/PlayerRole.php new file mode 100644 index 0000000..5094592 --- /dev/null +++ b/app/Model/PlayerRole.php @@ -0,0 +1,57 @@ +belongsTo(Promote::class, 'promote_id', 'id'); + } + + public function user() + { + return $this->belongsTo(User::class, 'user_id', 'id'); + } + + public function testingBinding() + { + return $this->hasOne(TestingBinding::class, 'role_key', 'role_key'); + } + + public function bindTestingBinding() + { + return $this->hasOne(TestingBinding::class, 'bind_role_key', 'role_key'); + } + + public function getDeviceTypeNameAttribute() + { + return DeviceType::getDeviceTypeText($this->sdk_version); + } + + public function getBaseGameNameAttribute() + { + return strtr($this->game_name, ['(安卓版)' => '', '(苹果版)' => '']); + } + + public static function generateUniqueCode($gameId, $userId, $roleId) + { + if (is_null($roleId)) { + $roleId = 'UNKNOW'; + } + return substr(md5($gameId . '#' . $userId . '#' . $roleId), 8, 16); + } +} \ No newline at end of file diff --git a/app/Model/Promote.php b/app/Model/Promote.php new file mode 100644 index 0000000..72ee9ce --- /dev/null +++ b/app/Model/Promote.php @@ -0,0 +1,14 @@ + 'array', + ]; + + public $typeDisplayNames = [ + 'A' => '单笔充值福利', + 'B' => '月卡福利发放', + 'C' => '累充福利发放', + 'D' => '首充福利发放', + 'E' => '单日累充福利发放', + 'F' => '周卡福利发放', + 'G' => '首次进游福利', + 'H' => '签到福利发放', + 'I' => '充值返利发放', + ]; +} \ No newline at end of file diff --git a/app/Model/RebateOrder.php b/app/Model/RebateOrder.php new file mode 100644 index 0000000..3796b35 --- /dev/null +++ b/app/Model/RebateOrder.php @@ -0,0 +1,11 @@ + '绑币', + 0 => '平台币', + 1 => '支付宝', + 2 => '微信', + 3 => '微信APP', + 9 => '双乾支付', + 15 => '双乾支付-快捷', + 17 => '易宝支付' + ]; + + public static $payStatusList = [ + self::STATUS_FAILED => '失败', + self::STATUS_SUCCESS => '成功', + ]; + + public function getPayWayTextAttribute() + { + return self::$payWays[$this->pay_way] ?? '未知'; + } + + public function getDeviceTypeNameAttribute() + { + return DeviceType::getDeviceTypeText($this->sdk_version); + } + + public function getPayStatusTextAttribute() + { + return self::$payStatusList[$this->pay_status] ?? '未知'; + } + + public function promote() + { + return $this->belongsTo(Promote::class, 'promote_id', 'id'); + } + + public function isSuccess() + { + return $this->pay_status === self::STATUS_SUCCESS; + } +} \ No newline at end of file diff --git a/app/Model/Tool.php b/app/Model/Tool.php new file mode 100644 index 0000000..d62d7ef --- /dev/null +++ b/app/Model/Tool.php @@ -0,0 +1,36 @@ + ['sms_set', 'zhongwang', 'juhedata'], + ]; + + public function get(string $name) + { + if ($this->configItems == null) { + $this->configItems = (json_decode($this->config, true) ?? []); + } + return $this->configItems[$name] ?? null; + } + + public static function getActiveByGroup($group) + { + if (!isset(self::$groups[$group])) { + return null; + } + return static::where('status', self::STATUS_OPEN)->whereIn('name', self::$groups[$group])->first(); + } +} \ No newline at end of file diff --git a/app/Model/User.php b/app/Model/User.php new file mode 100644 index 0000000..1dffcf4 --- /dev/null +++ b/app/Model/User.php @@ -0,0 +1,21 @@ +belongsTo(Promote::class, 'promote_id', 'id'); + } +} \ No newline at end of file diff --git a/app/Model/UserData.php b/app/Model/UserData.php new file mode 100644 index 0000000..2b0d8a5 --- /dev/null +++ b/app/Model/UserData.php @@ -0,0 +1,14 @@ +whereHas('promote', function ($query) use ($promote) { + $query->ofParent($promote)->orWhere('promote_id', $promote->id); + }); + } else { + $query->where('promote_id', $promote->id); + } + return $query; + } +} \ No newline at end of file diff --git a/app/Scopes/CommonTimeScopes.php b/app/Scopes/CommonTimeScopes.php new file mode 100644 index 0000000..3554bfe --- /dev/null +++ b/app/Scopes/CommonTimeScopes.php @@ -0,0 +1,35 @@ +whereBetween($column, [strtotime($timeRange[0]), strtotime($timeRange[1])]); + } + + public function scopeOfMonth($query, $column, $month, $withTime = true) + { + if (!$month) { + return $query; + } + $firstDate = $month . '-01'; + $lastDate = Time::getMonthLastDate($month); + $timeRange = Time::dateTimeRange([$firstDate, $lastDate], $withTime); + return $query->whereBetween($column, [strtotime($timeRange[0]), strtotime($timeRange[1])]); + } + + public function scopeTimeOverlay($query, $rangeColumns, $timeRange) + { + return $query->whereNot(function ($q) use ($rangeColumns, $timeRange) { + $q->where($rangeColumns[1], '<', $timeRange[0])->orWhere($rangeColumns[0], '<', $timeRange[1]); + }); + } +} diff --git a/app/Scopes/GameScopes.php b/app/Scopes/GameScopes.php new file mode 100644 index 0000000..59f052b --- /dev/null +++ b/app/Scopes/GameScopes.php @@ -0,0 +1,19 @@ +where('relation_game_id', $params['relation_game_id']); + } + if (!empty($params['base_game_id'])) { + $query->where('base_game_id', $params['base_game_id']); + } + if (!empty($params['sdk_version'])) { + $query->where('sdk_version', $params['sdk_version']); + } + } +} \ No newline at end of file diff --git a/app/Scopes/PlayerRoleScopes.php b/app/Scopes/PlayerRoleScopes.php new file mode 100644 index 0000000..507573d --- /dev/null +++ b/app/Scopes/PlayerRoleScopes.php @@ -0,0 +1,53 @@ +where('server_id', $params['server_id']); + } + if (!empty($params['sdk_version'])) { + $query->where('sdk_version', $params['sdk_version']); + } + if (!empty($params['game_id'])) { + $query->where('game_id', $params['game_id']); + } + if (!empty($params['role_name'])) { + $query->where('role_name', $params['role_name']); + } + if (!empty($params['server_name'])) { + $query->where('server_name', $params['server_name']); + } + if (!empty($params['user_account'])) { + $query->where('user_account', $params['user_account']); + } + if (!empty($params['role_id'])) { + $query->where('role_id', $params['role_id']); + } + } + + public function scopeRangeRoleLevel($query, ?array $roleLevelRange) + { + if (is_null($roleLevelRange)) { + return $query; + } + $min = $roleLevelRange[0] ?? null; + $min == '' ? null : $min; + + $max = $roleLevelRange[1] ?? null; + $max == '' ? null : $max; + + if (!is_null($min)) { + $query->where('role_level', '>=', $min); + } + + if (!is_null($max)) { + $query->where('role_level', '<=', $max); + } + + return $query; + } +} \ No newline at end of file diff --git a/app/Scopes/PlayerScopes.php b/app/Scopes/PlayerScopes.php new file mode 100644 index 0000000..cc99330 --- /dev/null +++ b/app/Scopes/PlayerScopes.php @@ -0,0 +1,8 @@ +where('level', $params['level']); + } + if (!empty($params['parent_id'])) { + $query->where('parent_id', $params['parent_id']); + } + if (!empty($params['account'])) { + $query->where('account', 'like', '%' . $params['account'] . '%'); + } + if (!empty($params['mobile'])) { + $query->where('mobile_phone', 'like', '%' . $params['mobile'] . '%'); + } + if (!empty($params['idcard'])) { + $query->where('idcard', 'like', '%' . $params['idcard'] . '%'); + } + if (!empty($params['realname'])) { + $query->where('real_name', 'like', '%' . $params['realname'] . '%'); + } + if (isset($params['status']) && $params['status'] != -1) { + $query->where('status', $params['status']); + } + } + + /** + * 查找子推广账号 + */ + public function scopeOfParent($query, $promote) + { + return $query->where('chain', 'like', $promote->chain . $promote->id . '/%'); + } +} \ No newline at end of file diff --git a/app/Scopes/SpendScopes.php b/app/Scopes/SpendScopes.php new file mode 100644 index 0000000..06add5c --- /dev/null +++ b/app/Scopes/SpendScopes.php @@ -0,0 +1,49 @@ +where('server_id', $params['server_id']); + } + if (!empty($params['server_name'])) { + $query->where('server_name', $params['server_name']); + } + if (!empty($params['game_id'])) { + $query->where('game_id', $params['game_id']); + } + if (!empty($params['game_name'])) { + $query->where('game_name', $params['game_name']); + } + if (isset($params['pay_status']) && $params['pay_status'] != -1) { + $query->where('pay_status', $params['pay_status']); + } + if (isset($params['pay_way']) && $params['pay_way'] != -99) { + $query->where('pay_way', $params['pay_way']); + } + if (!empty($params['pay_order_number'])) { + $query->where('pay_order_number', $params['pay_order_number']); + } + if (!empty($params['user_account'])) { + $query->where('user_account', $params['user_account']); + } + if (!empty($params['role_name'])) { + $query->where('game_player_name', $params['game_player_name']); + } + return $query; + } + + public function scopeSettleOrder($query, string $tableAlias = null) + { + $column = 'is_check'; + if ($tableAlias) { + $column = $tableAlias . '.' . $column; + } + return $query->where($column, 1); + } +} \ No newline at end of file diff --git a/app/Scopes/UserScopes.php b/app/Scopes/UserScopes.php new file mode 100644 index 0000000..22cab05 --- /dev/null +++ b/app/Scopes/UserScopes.php @@ -0,0 +1,17 @@ +where('account', $params['account']); + } + if (!empty($params['id'])) { + $query->where('id', $params['id']); + } + return $query; + } +} \ No newline at end of file diff --git a/app/Service/PlayerRoleService.php b/app/Service/PlayerRoleService.php new file mode 100644 index 0000000..d3fd4de --- /dev/null +++ b/app/Service/PlayerRoleService.php @@ -0,0 +1,136 @@ +first(['id', 'account', 'nickname', 'puid', 'promote_id', 'promote_account']); + if ($user == null) { + throw new BusinessException('用户不存在'); + } + + $game = Game::where('id', $gameId)->first(['id', 'game_name', 'sdk_version']); + if ($game == null) { + throw new BusinessException('游戏不存在'); + } + + $serverInfo = ['server_id' => $serverId, 'server_name' => $serverName]; + $roleInfo = ['role_id' => $roleId, 'role_name' => $roleName, 'role_level' => $roleLevel]; + + $this->saveRole($game, $user, $serverInfo, $roleInfo, $time, $clientIp); + $this->saveServer($serverInfo, $game, $time); + $this->saveServerUnion($serverInfo, $game, $time); + } + + private function saveRole( + Game $game, + User $user, + array $serverInfo, + array $roleInfo, + int $time = 0, + string $clientIp = '' + ) { + $role = PlayerRole::where('user_id', $user->id) + ->where('game_id', $game->id) + ->where('server_id', $serverInfo['server_id']) + ->where('role_id', $roleInfo['role_id']) + ->first(); + + if ($role == null) { + $role = new PlayerRole(); + $role->create_time = $time; + $role->create_ip = $clientIp; + $role->promote_id = $user->promote_id; + $role->promote_account = $user->promote_account; + } + + $role->game_id = $game->id; + $role->game_name = $game->game_name; + $role->server_id = $serverInfo['server_id']; + $role->server_name = $serverInfo['server_name']; + $role->role_id = $roleInfo['role_id']; + $role->role_name = $roleInfo['role_name']; + $role->role_level = $roleInfo['role_level']; + $role->game_role_id = $game->id . '#' . $roleInfo['role_id'];; + $role->user_id = $user->id; + $role->user_account = $user->account; + $role->user_nickname = $user->nickname; + $role->play_time = $time; + $role->sdk_version = $game->sdk_version; + $role->play_ip = $clientIp; + $role->pipuid = $user->puid; + $role->save(); + } + + private function saveServer(array $serverInfo, Game $game, int $time = 0) + { + $serverName = $serverInfo['server_name'] ?? ''; + $serverId = $serverInfo['server_id'] ?? 0; + + $server = Server::where('game_id', $game->id)->where('server_id', $serverId)->first(); + if ($server == null) { + $server = new Server(); + $server->game_id = $game->id; + $server->game_name = $game->game_name; + $server->server_name = $serverName; + $server->server_num = $serverId; + $server->server_id = $serverId; + $server->server_version = $game->sdk_version; + $server->create_time = $time; + $server->start_time = $time; + $server->save(); + } else { + if ($server->server_name != $serverName) { + $server->server_name = $serverName; + $server->save(); + } + } + } + + private function saveServerUnion(array $serverInfo, Game $game, int $time = 0) + { + $serverName = $serverInfo['server_name'] ?? ''; + $serverId = $serverInfo['server_id'] ?? 0; + + $server = Server::where('server_name', $serverName)->where('game_id', $game->id)->first(['id']); + if ($server) { + return; + } + + $serverUnion = ServerUnion::where('server_name', $serverName)->where('game_id', $game->id)->first(['id']); + if ($serverUnion == null) { + $serverUnion = new ServerUnion(); + $serverUnion->game_id = $game->id; + $serverUnion->game_name = $game->game_name; + $serverUnion->server_name = $serverName; + $serverUnion->server_num = $serverId; + $serverUnion->server_id = $serverId; + $serverUnion->server_version = $game->sdk_version; + $serverUnion->create_time = $time; + $serverUnion->start_time = $time; + $serverUnion->save(); + } + } +} \ No newline at end of file diff --git a/app/Service/PlayerService.php b/app/Service/PlayerService.php new file mode 100644 index 0000000..e9d0f3a --- /dev/null +++ b/app/Service/PlayerService.php @@ -0,0 +1,111 @@ +first(['id', 'chain', 'parent_id']); + } elseif ($companyId) { + $promoteCompany = PromoteCompany::where('id', $promoteId)->first(['id']); + } + + $dateList = Time::getDateList($startTime, $endTime); + + $startTime = strtotime($startTime . ' 00:00:00'); + $endTime = strtotime($endTime . ' 23:59:59'); + $dailyData = $this->getDailyRetention($startTime, $endTime, $gameIds, $promote, $promoteCompany); + + $dailyRecords = []; + foreach ($dailyData as $item) { + $dailyRecords[$item->date] = $item; + } + + $query = Player::select(DB::raw('FROM_UNIXTIME(create_time, "%Y-%m-%d") date'), DB::raw('count(*) count')) + ->whereBetween('create_time', [$startTime, $endTime]) + ->whereIn('game_id', $gameIds); + if ($promote) { + $query->ofPromote($promote, true); + } elseif ($promoteCompany) { + $query->ofPromoteCompany($promoteCompany); + } + + $countList = $query->groupBy('date')->get()->pluck('count', 'date'); + + $records = []; + foreach ($dateList as $date) { + $record = [ + 'date' => $date, + 'register_count' => isset($countList[$date]) ? $countList[$date] : 0, + ]; + foreach (PlayerRetention::$dayList as $day) { + $item = $dailyRecords[$date] ?? null; + $record['retention_day' . $day] = $item ? $item->{'day' . $day} : 0; + } + $records[] = $record; + } + + return $records; + } + + public function getDailyRetention($start, $end, $gameIds, $promote = null, $promoteCompany = null) + { + $columns = [ + 'FROM_UNIXTIME(b.create_time, "%Y-%m-%d") date', + 'sum(day1) day1', + 'sum(day2) day2', + 'sum(day3) day3', + 'sum(day4) day4', + 'sum(day5) day5', + 'sum(day6) day6', + 'sum(day7) day7', + 'sum(day15) day15', + 'sum(day30) day30' + ]; + + $query = PlayerRetention::fromAlias('a') + ->select(Db::raw(implode(',', $columns))) + ->leftJoin(Player::alias('b'), function ($join) { + $join->on('a.player_id', '=', 'b.id'); + }) + ->whereBetween('b.create_time', [$start, $end]) + ->whereIn('a.game_id', $gameIds) + ->groupBy('date'); + + $promoteTable = Promote::alias('c'); + if ($promote) { + $query->leftJoin($promoteTable, function ($join) { + $join->on('b.promote_id', '=', 'c.id'); + })->whereRaw('(c.chain like "'. $promote->chain . $promote->id . '/%" or c.id=' . $promote->id . ')'); + } elseif ($promoteCompany) { + $query->leftJoin($promoteTable, function ($join) { + $join->on('b.promote_id', '=', 'c.id'); + })->whereRaw('c.company_id = ' . $promoteCompany->id); + } + return $query->get(); + } +} \ No newline at end of file diff --git a/app/Service/RebateService.php b/app/Service/RebateService.php new file mode 100644 index 0000000..ddf99be --- /dev/null +++ b/app/Service/RebateService.php @@ -0,0 +1,1527 @@ + true, + ]; + $configs = [ + 75 => ['is_daily_repeat' => false], + 79 => ['is_daily_repeat' => false], + 81 => ['is_daily_repeat' => false], + 84 => ['is_daily_repeat' => false], + ]; + return $configs[$baseGame->id] ?? $commonConfig; + } + + public function getProps($baseGameId) + { + $props = []; + $props[75] = [ + 'I-8' => [['ref_id' => 99996014, 'name' => '8元充值卡', 'value' => 8]], + 'I-12' => [['ref_id' => 99996015, 'name' => '12元充值卡', 'value' => 12]], + 'I-18' => [['ref_id' => 99996016, 'name' => '18元充值卡', 'value' => 18]], + 'I-25' => [['ref_id' => 99996017, 'name' => '25元充值卡', 'value' => 25]], + 'I-38' => [['ref_id' => 99996024, 'name' => '38元充值卡', 'value' => 38]], + 'I-50' => [['ref_id' => 99996018, 'name' => '50元充值卡', 'value' => 50]], + 'I-88' => [['ref_id' => 99996019, 'name' => '88元充值卡', 'value' => 88]], + 'I-168' => [['ref_id' => 99996020, 'name' => '168元充值卡', 'value' => 168]], + 'I-296' => [['ref_id' => 99996021, 'name' => '296元充值卡', 'value' => 296]], + 'I-6' => [['ref_id' => 99996001, 'name' => '6元充值卡', 'value' => 6]], + 'I-30' => [['ref_id' => 99996002, 'name' => '30云充值卡', 'value' => 30]], + 'I-68' => [['ref_id' => 99996003, 'name' => '68元充值卡', 'value' => 68]], + 'I-98' => [['ref_id' => 99996004, 'name' => '98元充值卡', 'value' => 98]], + 'I-128' => [['ref_id' => 99996005, 'name' => '128元充值卡', 'value' => 128]], + 'I-198' => [['ref_id' => 99996006, 'name' => '198元充值卡', 'value' => 198]], + 'I-328' => [['ref_id' => 99996007, 'name' => '328元充值卡', 'value' => 328]], + 'I-648' => [['ref_id' => 99996008, 'name' => '648元充值卡', 'value' => 648]], + 'I-1000' => [['ref_id' => 99996009, 'name' => '1000元充值卡', 'value' => 1000]], + 'I-2000' => [['ref_id' => 99996010, 'name' => '2000元充值卡', 'value' => 2000]], + 'I-5000' => [['ref_id' => 99996011, 'name' => '5000元充值卡', 'value' => 5000]], + 'I-10000' => [['ref_id' => 99996012, 'name' => '10000元充值卡', 'value' => 10000]], + ]; + // 仅用于测试 + $props[9] = $props[75]; + $props[79] = [ + 'I-6' => [['ref_id' => 99996201, 'name' => '6元充值卡', 'value' => 6]], + 'I-30' => [['ref_id' => 99996202, 'name' => '30云充值卡', 'value' => 30]], + 'I-68' => [['ref_id' => 99996203, 'name' => '68元充值卡', 'value' => 68]], + 'I-98' => [['ref_id' => 99996204, 'name' => '98元充值卡', 'value' => 98]], + 'I-128' => [['ref_id' => 99996205, 'name' => '128元充值卡', 'value' => 128]], + 'I-198' => [['ref_id' => 99996206, 'name' => '198元充值卡', 'value' => 198]], + 'I-328' => [['ref_id' => 99996207, 'name' => '328元充值卡', 'value' => 328]], + 'I-648' => [['ref_id' => 99996208, 'name' => '648元充值卡', 'value' => 648]], + 'I-1000' => [['ref_id' => 99996209, 'name' => '1000元充值卡', 'value' => 1000]], + 'I-2000' => [['ref_id' => 99996210, 'name' => '2000元充值卡', 'value' => 2000]], + 'I-5000' => [['ref_id' => 99996211, 'name' => '5000元充值卡', 'value' => 5000]], + 'I-10000' => [['ref_id' => 99996212, 'name' => '10000元充值卡', 'value' => 10000]], + + 'I-3' => [['ref_id' => 99996213, 'name' => '3元充值卡', 'value' => 3]], + 'I-8' => [['ref_id' => 99996214, 'name' => '8元充值卡', 'value' => 8]], + 'I-12' => [['ref_id' => 99996215, 'name' => '12元充值卡', 'value' => 12]], + 'I-18' => [['ref_id' => 99996216, 'name' => '18元充值卡', 'value' => 18]], + 'I-25' => [['ref_id' => 99996217, 'name' => '25元充值卡', 'value' => 25]], + + 'I-50' => [['ref_id' => 99996218, 'name' => '50元充值卡', 'value' => 50]], + 'I-88' => [['ref_id' => 99996219, 'name' => '88元充值卡', 'value' => 88]], + 'I-168' => [['ref_id' => 99996220, 'name' => '168元充值卡', 'value' => 168]], + 'I-296' => [['ref_id' => 99996221, 'name' => '296元充值卡', 'value' => 296]], + 'I-298' => [['ref_id' => 99996222, 'name' => '298元充值卡', 'value' => 298]], + 'I-698' => [['ref_id' => 99996223, 'name' => '698元充值卡', 'value' => 698]], + + + 'I-38' => [['ref_id' => 99996224, 'name' => '38元充值卡', 'value' => 38]], + 'I-60' => [['ref_id' => 99996225, 'name' => '60元充值卡', 'value' => 60]], + 'I-199' => [['ref_id' => 99996226, 'name' => '199元充值卡', 'value' => 199]], + 'I-998' => [['ref_id' => 99996227, 'name' => '998元充值卡', 'value' => 998]], + 'I-1998' => [['ref_id' => 99996228, 'name' => '1998元充值卡', 'value' => 1998]], + + 'I-1314' => [['ref_id' => 99996229, 'name' => '1314元充值卡', 'value' => 1314]], + 'I-58' => [['ref_id' => 99996230, 'name' => '58元充值卡', 'value' => 58]], + 'I-108' => [['ref_id' => 99996231, 'name' => '108元充值卡', 'value' => 108]], + 'I-188' => [['ref_id' => 99996232, 'name' => '188元充值卡', 'value' => 188]], + 'I-388' => [['ref_id' => 99996233, 'name' => '388元充值卡', 'value' => 388]], + 'I-1288' => [['ref_id' => 99996234, 'name' => '1288元充值卡', 'value' => 1288]], + 'I-888' => [['ref_id' => 99996235, 'name' => '888元充值卡', 'value' => 888]], + + ]; + $props[81] = [ + 'I-3' => [['ref_id' => 99996213, 'name' => '3元充值卡', 'value' => 3]], + 'I-6' => [['ref_id' => 99996201, 'name' => '6元充值卡', 'value' => 6]], + 'I-8' => [['ref_id' => 99996214, 'name' => '8元充值卡', 'value' => 8]], + 'I-12' => [['ref_id' => 99996215, 'name' => '12元充值卡', 'value' => 12]], + 'I-18' => [['ref_id' =>99996216 , 'name' => '18元充值卡', 'value' => 18]], + 'I-25' => [['ref_id' =>99996217 , 'name' => '25元充值卡', 'value' => 25]], + 'I-30' => [['ref_id' =>99996202 , 'name' => '30元充值卡', 'value' => 30]], + 'I-38' => [['ref_id' =>99996224 , 'name' => '38元充值卡', 'value' => 38]], + 'I-50' => [['ref_id' =>99996218 , 'name' => '50元充值卡', 'value' => 50]], + 'I-58' => [['ref_id' =>99996230 , 'name' => '58元充值卡', 'value' => 58]], + 'I-60' => [['ref_id' =>99996225 , 'name' => '60元充值卡', 'value' => 60]], + 'I-68' => [['ref_id' =>99996203 , 'name' => '68元充值卡', 'value' => 68]], + 'I-88' => [['ref_id' =>99996219 , 'name' => '88元充值卡', 'value' => 88]], + 'I-98' => [['ref_id' =>99996204 , 'name' => '98元充值卡', 'value' => 98]], + 'I-108' => [['ref_id' =>99996231 , 'name' => '108元充值卡', 'value' => 108]], + 'I-128' => [['ref_id' =>99996205 , 'name' => '128元充值卡', 'value' => 128]], + 'I-168' => [['ref_id' =>99996220 , 'name' => '168元充值卡', 'value' => 168]], + 'I-188' => [['ref_id' =>99996232 , 'name' => '188元充值卡', 'value' => 188]], + 'I-198' => [['ref_id' =>99996206 , 'name' => '198元充值卡', 'value' => 198]], + 'I-199' => [['ref_id' =>99996226 , 'name' => '199元充值卡', 'value' => 199]], + 'I-296' => [['ref_id' =>99996221 , 'name' => '296元充值卡', 'value' => 296]], + 'I-298' => [['ref_id' =>99996222 , 'name' => '298元充值卡', 'value' => 298]], + 'I-328' => [['ref_id' =>99996207 , 'name' => '328元充值卡', 'value' => 328]], + 'I-388' => [['ref_id' =>99996233 , 'name' => '388元充值卡', 'value' => 388]], + 'I-648' => [['ref_id' =>99996208 , 'name' => '648元充值卡', 'value' => 648]], + 'I-698' => [['ref_id' => 99996223, 'name' => '698元充值卡', 'value' => 698]], + 'I-888' => [['ref_id' => 99996235, 'name' => '888元充值卡', 'value' => 888]], + 'I-998' => [['ref_id' => 99996227, 'name' => '998元充值卡', 'value' => 998]], + 'I-1000' => [['ref_id' => 99996209, 'name' => '1000元充值卡', 'value' => 1000]], + 'I-1288' => [['ref_id' => 99996234, 'name' => '1288元充值卡', 'value' => 1288]], + 'I-1314' => [['ref_id' => 99996229, 'name' => '1314元充值卡', 'value' => 1314]], + 'I-1998' => [['ref_id' => 99996228, 'name' => '1998元充值卡', 'value' => 1998]], + 'I-2000' => [['ref_id' => 99996210, 'name' => '2000元充值卡', 'value' => 2000]], + 'I-5000' => [['ref_id' => 99996211, 'name' => '5000元充值卡', 'value' => 5000]], + 'I-10000' => [['ref_id' => 99996212, 'name' => '10000元充值卡', 'value' => 10000]], + ]; + + $props[84] = [ + 'I-1' => [['ref_id' => 0, 'name' => '1元充值返利', 'value' => 1]], + 'I-3' => [['ref_id' => 0, 'name' => '3元充值返利', 'value' => 3]], + 'I-5' => [['ref_id' => 0, 'name' => '5元充值返利', 'value' => 5]], + 'I-6' => [['ref_id' => 0, 'name' => '6元充值返利', 'value' => 6]], + 'I-8' => [['ref_id' => 0, 'name' => '8元充值返利', 'value' => 8]], + 'I-10' => [['ref_id' => 0, 'name' => '10元充值返利', 'value' => 10]], + 'I-12' => [['ref_id' => 0, 'name' => '12元充值返利', 'value' => 12]], + 'I-18' => [['ref_id' => 0, 'name' => '18元充值返利', 'value' => 18]], + 'I-25' => [['ref_id' => 0, 'name' => '25元充值返利', 'value' => 25]], + 'I-30' => [['ref_id' => 0, 'name' => '30元充值返利', 'value' => 30]], + 'I-35' => [['ref_id' => 0, 'name' => '35元充值返利', 'value' => 35]], + 'I-38' => [['ref_id' => 0, 'name' => '38元充值返利', 'value' => 38]], + 'I-48' => [['ref_id' => 0, 'name' => '48元充值返利', 'value' => 48]], + 'I-50' => [['ref_id' => 0, 'name' => '50元充值返利', 'value' => 50]], + 'I-68' => [['ref_id' => 0, 'name' => '68元充值返利', 'value' => 68]], + 'I-88' => [['ref_id' => 0, 'name' => '88元充值返利', 'value' => 88]], + 'I-108' => [['ref_id' => 0, 'name' => '108元充值返利', 'value' => 108]], + 'I-120' => [['ref_id' => 0, 'name' => '120元充值返利', 'value' => 120]], + 'I-128' => [['ref_id' => 0, 'name' => '128元充值返利', 'value' => 128]], + 'I-136' => [['ref_id' => 0, 'name' => '136元充值返利', 'value' => 136]], + 'I-198' => [['ref_id' => 0 , 'name' => '198元充值返利', 'value' => 198]], + 'I-199' => [['ref_id' => 0 , 'name' => '199元充值返利', 'value' => 199]], + 'I-204' => [['ref_id' => 0 , 'name' => '204元充值返利', 'value' => 204]], + 'I-328' => [['ref_id' => 0 , 'name' => '328元充值返利', 'value' => 328]], + 'I-388' => [['ref_id' => 0 , 'name' => '388元充值返利', 'value' => 388]], + 'I-400' => [['ref_id' => 0 , 'name' => '400元充值返利', 'value' => 400]], + 'I-488' => [['ref_id' => 0 , 'name' => '488元充值返利', 'value' => 488]], + 'I-648' => [['ref_id' => 0 , 'name' => '648元充值返利', 'value' => 648]], + 'I-800' => [['ref_id' => 0 , 'name' => '800元充值返利', 'value' => 800]], + 'I-988' => [['ref_id' => 0 , 'name' => '988元充值返利', 'value' => 988]], + 'I-1000' => [['ref_id' => 0 , 'name' => '1000元充值返利', 'value' => 1000]], + 'I-1288' => [['ref_id' => 0 , 'name' => '1288元充值返利', 'value' => 1288]], + 'I-1688' => [['ref_id' => 0 , 'name' => '1688元充值返利', 'value' => 1688]], + 'I-2000' => [['ref_id' => 0 , 'name' => '2000元充值返利', 'value' => 2000]], + 'I-3000' => [['ref_id' => 0 , 'name' => '3000元充值返利', 'value' => 3000]], + 'I-5000' => [['ref_id' => 0 , 'name' => '5000元充值返利', 'value' => 5000]], + 'I-5888' => [['ref_id' => 0 , 'name' => '5888元充值返利', 'value' => 5888]], + 'I-6888' => [['ref_id' => 0 , 'name' => '6888元充值返利', 'value' => 6888]], + 'I-10000' => [['ref_id' => 0 , 'name' => '10000元充值返利', 'value' => 10000]], + 'I-20000' => [['ref_id' => 0 , 'name' => '20000元充值返利', 'value' => 20000]], + ]; + + $props[91] = [ + 'I-6' => [['ref_id' => 0, 'name' => '6元充值返利', 'value' => 6]], + 'I-30' => [['ref_id' => 0, 'name' => '30元充值返利', 'value' => 30]], + 'I-68' => [['ref_id' => 0, 'name' => '68元充值返利', 'value' => 68]], + 'I-128' => [['ref_id' => 0, 'name' => '128元充值返利', 'value' => 128]], + 'I-198' => [['ref_id' => 0 , 'name' => '198元充值返利', 'value' => 198]], + 'I-328' => [['ref_id' => 0 , 'name' => '328元充值返利', 'value' => 328]], + 'I-648' => [['ref_id' => 0 , 'name' => '648元充值返利', 'value' => 648]], + 'I-1000' => [['ref_id' => 0 , 'name' => '1000元充值返利', 'value' => 1000]], + 'I-2000' => [['ref_id' => 0 , 'name' => '2000元充值返利', 'value' => 2000]], + 'I-5000' => [['ref_id' => 0 , 'name' => '5000元充值返利', 'value' => 5000]], + 'I-10000' => [['ref_id' => 0 , 'name' => '10000元充值返利', 'value' => 10000]], + ]; + + return $props[$baseGameId] ?? null; + } + + private function getOrders(BaseGame $baseGame, array $timeRange, array $serverIds = null) + { + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + + $orderQuery = Spend::where('pay_status', 1)->whereIn('game_id', $gameIds)->whereBetween('pay_time', $timeRange); + if (!is_null($serverIds)) { + $orderQuery->whereIn('server_id', $serverIds); + } + $orders = $orderQuery->get(['pay_order_number', 'game_player_id', 'pay_amount', 'server_id', 'pay_time'])->toArray(); + + $simulateOrderQuery = SimulateSpend::where('base_game_id', $baseGame->id)->whereBetween('review_time', $timeRange)->where('status', 1); + if (!is_null($serverIds)) { + $simulateOrderQuery->whereIn('server_id', $serverIds); + } + $simulateOrders = $simulateOrderQuery->get([ + DB::raw('role_id as game_player_id'), + DB::raw('amount as pay_amount'), + DB::raw('order_no as pay_order_number'), + DB::raw('create_time as pay_time'), + 'server_id' + ]) + ->toArray(); + return array_merge($orders, $simulateOrders); + } + + /** + * 单笔充值福利生成 + */ + public function generateSingle($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'A')->where('base_game_id', $baseGame->id)->orderBy('amount', 'asc')->get(); + if (count($gifts) == 0) { + return; + } + $orders = $this->getOrders($baseGame, $timeRange); + $orderNumbers = array_column($orders, 'pay_order_number'); + $existItems = RebateOrder::whereIn('order_number', $orderNumbers) + ->where('type', 'A') + ->where('base_game_id', $baseGame->id) + ->get(['order_number']) + ->keyBy(function($item) { + return $item->order_number; + }); + + $roles = $this->getRolesByRoleIds($baseGame, array_column($orders, 'game_player_id')); + + $records = []; + foreach ($orders as $order) { + $maxGift = null; + foreach ($gifts as $gift) { + if ($order['pay_amount'] >= $gift->amount) { + $maxGift = $gift; + } + } + if ($maxGift && empty($existItems[$order['pay_order_number']])) { + $role = $roles[$order['game_player_id']] ?? null; + $record = $this->getCommonRecord($baseGame, $role, $maxGift); + $record = array_merge($record, [ + 'pay_amount' => $order['pay_amount'], + 'order_number' => $order['pay_order_number'], + ]); + $records[] = $record; + } + } + RebateOrder::insert($records); + } + + /** + * 单笔充值福利生成(暂时只是用玄灵契约) + */ + public function generateSingleTimes($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'I')->where('base_game_id', $baseGame->id)->orderBy('amount', 'asc')->get(); + if (count($gifts) == 0) { + return; + } + $defaultTimes = 0; + $setting = RebateTimesSetting::where('base_game_id', $baseGame->id)->where('type', 'I')->first(); + if ($setting) { + $defaultTimes = $setting->default_times; + } + $orders = $this->getOrders($baseGame, $timeRange); + $orderNumbers = array_column($orders, 'pay_order_number'); + $existItems = RebateOrder::whereIn('order_number', $orderNumbers) + ->where('type', 'I') + ->where('base_game_id', $baseGame->id) + ->get(['order_number']) + ->keyBy(function($item) { + return $item->order_number; + }); + + $roles = $this->getRolesByRoleIds($baseGame, array_column($orders, 'game_player_id')); + + $records = []; + foreach ($orders as $order) { + $maxGift = null; + foreach ($gifts as $gift) { + if ($order['pay_amount'] >= $gift->amount) { + $maxGift = $gift; + } + } + if ($maxGift && empty($existItems[$order['pay_order_number']])) { + [$giftProps, $giftContents] = $this->getOrderProps($maxGift, $defaultTimes); + $role = $roles[$order['game_player_id']] ?? null; + $record = $this->getCommonRecord($baseGame, $role, $maxGift); + $record = array_merge($record, [ + 'pay_amount' => $order['pay_amount'], + 'order_number' => $order['pay_order_number'], + 'times' => $defaultTimes, + 'props' => json_encode($giftProps, JSON_UNESCAPED_UNICODE), + 'gift_content' => implode('|', $giftContents), + ]); + $records[] = $record; + } + } + RebateOrder::insert($records); + } + + private function getOrderProps($gift, $defaultTimes) + { + $props = $this->getProps($gift->base_game_id); + $giftProps = $props[$gift->gift_key]; + $giftContents = []; + foreach ($giftProps as $key => $prop) { + $prop['num'] = $defaultTimes; + $giftProps[$key] = $prop; + $giftContents[] = $prop['name'] . '*' . $defaultTimes; + } + return [$giftProps, $giftContents]; + } + + private function getPayAmountGroupByRole($baseGame, $timeRange, $roleIds = null) + { + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + + $spendQuery = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereBetween('pay_time', $timeRange); + + if (is_array($roleIds)) { + $spendQuery->whereIn('game_player_id', $roleIds); + } + $items = $spendQuery->groupBy('game_player_id') + ->get(['game_player_id', DB::raw('sum(pay_amount) amount')]) + ->pluck('amount', 'game_player_id') + ->toArray(); + + $simulateQuery = SimulateSpend::where('base_game_id', $baseGame->id) + ->whereBetween('review_time', $timeRange) + ->where('status', 1); + + if (is_array($roleIds)) { + $simulateQuery->whereIn('role_id', $roleIds); + } + $simulateItems = $simulateQuery->groupBy('role_id') ->get(['role_id', DB::raw('sum(amount) amount')]); + + foreach ($simulateItems as $simulateItem) { + if (isset($items[$simulateItem->role_id])) { + $items[$simulateItem->role_id] += $simulateItem->amount; + } else { + $items[$simulateItem->role_id] = $simulateItem->amount; + } + } + return $items; + } + + /** + * 月卡福利 + */ + public function generateDaily($baseGame, $date) + { + $gifts = RebateGift::where('type', 'B')->where('base_game_id', $baseGame->id)->orderBy('amount', 'asc')->get(); + if (count($gifts) == 0) { + return; + } + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + $timeRange = [strtotime($date . ' 00:00:00'), strtotime($date . ' 23:59:59')]; + $items = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereBetween('pay_time', $timeRange) + ->groupBy('game_player_id') + ->get(['game_player_id', DB::raw('sum(pay_amount) amount')]) + ->pluck('amount', 'game_player_id') + ->toArray(); + + $simulateItems = SimulateSpend::where('base_game_id', $baseGame->id) + ->whereBetween('review_time', $timeRange) + ->where('status', 1) + ->groupBy('role_id') + ->get(['role_id', DB::raw('sum(amount) amount')]); + + foreach ($simulateItems as $simulateItem) { + if (isset($items[$simulateItem->role_id])) { + $items[$simulateItem->role_id] += $simulateItem->amount; + } else { + $items[$simulateItem->role_id] = $simulateItem->amount; + } + } + + $roleIds = array_keys($items); + $existQuery = RebateOrder::where('type', 'B')->where('base_game_id', $baseGame->id)->whereIn('role_id', $roleIds); + + $config = $this->getBaseGameConfig($baseGame); + if ($config['is_daily_repeat']) { + $existQuery->where('award_date', $date); + } else { + $tomorrow = date('Y-m-d', strtotime($date) + 24 * 3600); + $existQuery->where('award_started_at', '<=', $tomorrow)->where('award_ended_at', '>=', $tomorrow); + } + $existItems = $existQuery->get(['role_id', 'gift_key'])->keyBy(function($item) { + return $item->role_id . '-' . $item->gift_key; + }); + $roles = $this->getRolesByRoleIds($baseGame, $roleIds); + + $awardStartedAt = date('Y-m-d', strtotime($date) + 1 * 24 * 3600); + $awardEndedAt = date('Y-m-d', strtotime($date) + 30 * 24 * 3600); + + $records = []; + foreach ($items as $roleId => $amount) { + $maxGift = null; + foreach ($gifts as $gift) { + if ($amount >= $gift->amount) { + $maxGift = $gift; + } + } + + if (is_null($maxGift)) { + continue; + } + + $orderKey = $roleId . '-' . $maxGift->gift_key; + if (empty($existItems[$orderKey])) { + $role = $roles[$roleId] ?? null; + + $record = $this->getCommonRecord($baseGame, $role, $maxGift); + $record = array_merge($record, [ + 'pay_amount' => $amount, + 'award_date' => $date, + 'award_started_at' => $awardStartedAt, + 'award_ended_at' => $awardEndedAt, + 'order_number' => uniqid('total_').rand(100000, 999999) + ]); + $records[] = $record; + } + } + RebateOrder::insert($records); + } + + /** + * 累充福利生成 + */ + public function generateAccumulative($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'C') + ->where('base_game_id', $baseGame->id) + ->orderBy('amount', 'asc') + ->get(); + if (count($gifts) == 0) { + return; + } + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + $roleIds = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereBetween('pay_time', $timeRange) + ->get([DB::raw('DISTINCT game_player_id')]) + ->pluck('game_player_id') + ->toArray(); + + $simulateRoleIds = SimulateSpend::where('base_game_id', $baseGame->id) + ->whereBetween('review_time', $timeRange) + ->where('status', 1) + ->get([DB::raw('DISTINCT role_id')]) + ->pluck('role_id') + ->toArray(); + + $roleIds = array_unique(array_merge($roleIds, $simulateRoleIds)); + + $existItems = RebateOrder::whereIn('role_id', $roleIds) + ->where('type', 'C') + ->where('base_game_id', $baseGame->id) + ->get(['gift_key', 'role_id']) + ->keyBy(function($item) { + return $item->role_id . '-' . $item->gift_key; + }); + + $items = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereIn('game_player_id', $roleIds) + ->groupBy('game_player_id') + ->get(['game_player_id', DB::raw('sum(pay_amount) amount')]) + ->pluck('amount', 'game_player_id') + ->toArray(); + + $simulateItems = SimulateSpend::where('base_game_id', $baseGame->id) + ->where('status', 1) + ->whereIn('role_id', $roleIds) + ->groupBy('role_id') + ->get(['role_id', DB::raw('sum(amount) amount')]); + + foreach ($simulateItems as $simulateItem) { + if (isset($items[$simulateItem->role_id])) { + $items[$simulateItem->role_id] += $simulateItem->amount; + } else { + $items[$simulateItem->role_id] = $simulateItem->amount; + } + } + + $roles = $this->getRolesByRoleIds($baseGame, array_keys($items)); + + $records = []; + foreach ($items as $roleId => $amount) { + foreach ($gifts as $gift) { + if ($amount >= $gift->amount) { + $orderKey = $roleId . '-' . $gift->gift_key; + if (empty($existItems[$orderKey])) { + $role = $roles[$roleId] ?? null; + + $record = $this->getCommonRecord($baseGame, $role, $gift); + $record = array_merge($record, [ + 'pay_amount' => $amount, + 'order_number' => uniqid('total_').rand(100000, 999999) + ]); + $records[] = $record; + } + } + } + } + RebateOrder::insert($records); + } + + /** + * 首充福利生成 + * (注意:优化处理,没领过首充礼包的都算首充) + */ + public function generateFirstPay($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'D')->where('base_game_id', $baseGame->id)->get(); + if (count($gifts) == 0) { + return; + } + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + $items = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereBetween('pay_time', $timeRange) + ->orderBy('pay_time', 'asc') + ->get(['game_player_id', 'pay_amount', 'pay_order_number']) + ->toArray(); + + $simulateItems = SimulateSpend::where('base_game_id', $baseGame->id) + ->whereBetween('review_time', $timeRange) + ->where('status', 1) + ->get([ + DB::raw('role_id as game_player_id'), + DB::raw('amount as pay_amount'), + DB::raw('order_no as pay_order_number') + ]) + ->toArray(); + + $items = array_merge($items, $simulateItems); + + $roleIds = array_column($items, 'game_player_id'); + $existItems = RebateOrder::whereIn('role_id', $roleIds) + ->where('type', 'D') + ->where('base_game_id', $baseGame->id) + ->get(['gift_key', 'role_id']) + ->keyBy(function($item) { + return $item->role_id . '-' . $item->gift_key; + }); + + $roles = $this->getRolesByRoleIds($baseGame, $roleIds); + + $records = []; + $newOrderKeys = []; + foreach ($items as $item) { + foreach ($gifts as $gift) { + if ($item['pay_amount'] >= $gift->amount) { + $orderKey = $item['game_player_id'] . '-' . $gift->gift_key; + if (empty($existItems[$orderKey]) && empty($newOrderKeys[$orderKey])) { + $role = $roles[$item['game_player_id']] ?? null; + $newOrderKeys[$orderKey] = 1; + + $record = $this->getCommonRecord($baseGame, $role, $gift); + $record = array_merge($record, [ + 'pay_amount' => $item['pay_amount'], + 'order_number' => $item['pay_order_number'], + ]); + $records[] = $record; + } + } + } + } + RebateOrder::insert($records); + } + + + /** + * 单日累充福利生成 + */ + public function generateDayAccumulative($baseGame, $date) + { + $gifts = RebateGift::where('type', 'E')->where('base_game_id', $baseGame->id)->orderBy('amount', 'asc')->get(); + if (count($gifts) == 0) { + return; + } + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + $timeRange = [strtotime($date . ' 00:00:00'), strtotime($date . ' 23:59:59')]; + + $items = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereBetween('pay_time', $timeRange) + ->groupBy('game_player_id') + ->get(['game_player_id', DB::raw('sum(pay_amount) amount')]) + ->pluck('amount', 'game_player_id') + ->toArray(); + + $simulateItems = SimulateSpend::where('base_game_id', $baseGame->id) + ->whereBetween('review_time', $timeRange) + ->where('status', 1) + ->groupBy('role_id') + ->get(['role_id', DB::raw('sum(amount) amount')]); + + foreach ($simulateItems as $simulateItem) { + if (isset($items[$simulateItem->role_id])) { + $items[$simulateItem->role_id] += $simulateItem->amount; + } else { + $items[$simulateItem->role_id] = $simulateItem->amount; + } + } + + $roleIds = array_keys($items); + $existItems = RebateOrder::whereIn('role_id', $roleIds) + ->where('type', 'E') + ->where('base_game_id', $baseGame->id) + ->where('award_date', $date) + ->get(['gift_key', 'role_id']) + ->keyBy(function($item) { + return $item->role_id . '-' . $item->gift_key; + }); + + $roles = $this->getRolesByRoleIds($baseGame, $roleIds); + + $records = []; + foreach ($items as $roleId => $amount) { + foreach ($gifts as $gift) { + if ($amount >= $gift->amount) { + $orderKey = $roleId . '-' . $gift->gift_key; + if (empty($existItems[$orderKey])) { + $role = $roles[$roleId] ?? null; + + $record = $this->getCommonRecord($baseGame, $role, $gift); + $record = array_merge($record, [ + 'award_date' => $date, + 'pay_amount' => $amount, + 'order_number' => uniqid('total_').rand(100000, 999999) + ]); + $records[] = $record; + } + } + } + } + RebateOrder::insert($records); + } + + /** + * 周卡福利(聚宝周卡) + * 目前仅适用于玄灵契约(无普遍适用性) + */ + public function generateWeekly($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'F')->where('base_game_id', $baseGame->id)->orderBy('amount', 'asc')->get(); + if (count($gifts) == 0) { + return; + } + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + + $date = date('Y-m-d', $timeRange[0]); + $dateRange = [strtotime($date . ' 00:00:00'), strtotime($date . ' 23:59:59')]; + + $items = []; + $roleIds = []; + if (in_array($baseGame->id, [75, 79, 81])) { + $roleIds = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereBetween('pay_time', $timeRange) + ->where('extend', 'like', '%|123|%') // 玄灵契约聚宝盆活动标识 + ->get([DB::raw('DISTINCT game_player_id')]) + ->pluck('game_player_id') + ->toArray(); + + $items = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereIn('game_player_id', $roleIds) + ->whereBetween('pay_time', $dateRange) + ->where('extend', 'like', '%|123|%') // 玄灵契约聚宝盆活动标识 + ->groupBy('game_player_id') + ->get(['game_player_id', DB::raw('sum(pay_amount) amount')]) + ->pluck('amount', 'game_player_id') + ->toArray(); + } else { + $roleIds = Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereBetween('pay_time', $timeRange) + ->get([DB::raw('DISTINCT game_player_id')]) + ->pluck('game_player_id') + ->toArray(); + $items = $this->getPayAmountGroupByRole($baseGame, $dateRange, $roleIds); + } + + if (false) { + $giftExistItems = RebateOrder::where('type', 'F') + ->where('base_game_id', $baseGame->id) + ->whereIn('role_id', $roleIds) + ->get(['role_id']) + ->keyBy('role_id'); + } + + $existItems = RebateOrder::where('type', 'F') + ->where('base_game_id', $baseGame->id) + ->whereIn('role_id', $roleIds) + ->where('award_started_at', '<=', $date) + ->where('award_ended_at', '>=', $date) + ->get(['role_id']) + ->keyBy('role_id'); + + $roles = $this->getRolesByRoleIds($baseGame, $roleIds); + + // 当天开始发放 + $awardStartedAt = date('Y-m-d', strtotime($date) + 0 * 24 * 3600); + $awardEndedAt = date('Y-m-d', strtotime($date) + 6 * 24 * 3600); + + $records = []; + foreach ($items as $roleId => $amount) { + $maxGift = null; + foreach ($gifts as $gift) { + if ($amount >= $gift->amount) { + $maxGift = $gift; + } + } + if ($maxGift && empty($existItems[$roleId])) { + $role = $roles[$roleId] ?? null; + $record = $this->getCommonRecord($baseGame, $role, $maxGift); + $record = array_merge($record, [ + 'pay_amount' => $amount, + 'award_date' => $date, + 'award_started_at' => $awardStartedAt, + 'award_ended_at' => $awardEndedAt, + 'order_number' => uniqid('total_').rand(100000, 999999) + ]); + $records[] = $record; + } + } + RebateOrder::insert($records); + } + + /** + * 首次进游(每个角色一次) + */ + public function generateNewRole($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'G')->where('base_game_id', $baseGame->id)->get(); + if (count($gifts) == 0) { + return; + } + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + $roles = PlayerRole::whereIn('game_id', $gameIds) + ->whereBetween('create_time', $timeRange) + ->get(['user_id', 'role_name', 'role_id', 'server_id', 'server_name', 'user_account']); + + $roleIds = $roles->pluck('role_id')->toArray(); + $existItems = RebateOrder::whereIn('role_id', $roleIds) + ->where('type', 'G') + ->where('base_game_id', $baseGame->id) + ->get(['role_id']) + ->keyBy('role_id'); + + $gift = $gifts->first(); + + $records = []; + foreach ($roles as $role) { + if ($gift && empty($existItems[$role->role_id])) { + $record = $this->getCommonRecord($baseGame, $role, $gift); + $records[] = $record; + } + } + RebateOrder::insert($records); + } + + /** + * 签到福利发放(每个角色如果当天有登录发放) + */ + public function generateDailySign($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'H')->where('base_game_id', $baseGame->id)->get(); + if (count($gifts) == 0) { + return; + } + + $date = date('Y-m-d', $timeRange[0]); + + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + $roles = PlayerRole::whereIn('game_id', $gameIds) + ->whereBetween('play_time', $timeRange) + ->get(['user_id', 'role_name', 'role_id', 'server_id', 'server_name', 'user_account', 'play_time', 'create_time']); + + $roleIds = $roles->pluck('role_id')->toArray(); + + $maxItems = []; + if (!in_array($baseGame->id, [84])) { + $maxItems = RebateOrder::whereIn('role_id', $roleIds) + ->where('type', 'H') + ->where('base_game_id', $baseGame->id) + ->groupBy('role_id') + ->havingRaw('count(*) >= ?', [3]) + ->get(['role_id']) + ->keyBy('role_id'); + } + + $existItems = RebateOrder::whereIn('role_id', $roleIds) + ->where('type', 'H') + ->where('award_date', $date) + ->where('base_game_id', $baseGame->id) + ->get(['role_id']) + ->keyBy('role_id'); + + $gift = $gifts->first(); + + $records = []; + foreach ($roles as $role) { + if (date('Ymd', $role['play_time']) <= date('Ymd', $role['create_time'])) { + continue; + } + if ($gift && empty($existItems[$role->role_id]) && empty($maxItems[$role->role_id])) { + $record = $this->getCommonRecord($baseGame, $role, $gift); + $record = array_merge($record, [ + 'award_date' => $date, + ]); + $records[] = $record; + } + } + RebateOrder::insert($records); + } + + /** + * 开服七天活动 + */ + public function generateOpenSevenDay($baseGame, $timeRange) + { + $gifts = RebateGift::where('type', 'K')->where('base_game_id', $baseGame->id)->get()->keyBy('gift_key'); + if (count($gifts) == 0) { + return; + } + + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + $serverStartedAt = strtotime(date('Y-m-d 00:00:00', $timeRange[0] - 7*24*3600)); + $serverEndedAt = strtotime(date('Y-m-d 23:59:59', $timeRange[0])); + $servers = Server::whereIn('game_id', $gameIds)->whereBetween('start_time', [$serverStartedAt, $serverEndedAt])->get(['id', 'server_id', 'start_time']); + $servers = $servers->keyBy('server_id'); + + $serverIds = $servers->pluck('server_id')->toArray(); + $orders = $this->getOrders($baseGame, $timeRange, $serverIds); + + $orderNumbers = array_column($orders, 'pay_order_number'); + $existItems = RebateOrder::whereIn('order_number', $orderNumbers) + ->where('type', 'K') + ->where('base_game_id', $baseGame->id) + ->get(['order_number']) + ->keyBy(function($item) { + return $item->order_number; + }); + + $roles = $this->getRolesByRoleIds($baseGame, array_column($orders, 'game_player_id')); + + $records = []; + foreach ($orders as $order) { + $amount = intval($order['pay_amount']); + $server = $servers[$order['server_id']]; + if (is_null($server)) { + continue; + } + $num = 0; + if ($amount == 328) { + $num = 1; + } elseif ($amount == 648) { + $num = 2; + } elseif ($amount == 1000) { + $num = 3; + } + $day = ( + strtotime(date('Y-m-d 00:00:00', $order['pay_time'])) - + strtotime(date('Y-m-d 00:00:00', $server->start_time)) + )/(24*3600) + 1; + + $giftKey = 'K-'.$day; + $gift = $gifts[$giftKey] ?? null; + if ($gift && empty($existItems[$order['pay_order_number']])) { + $role = $roles[$order['game_player_id']] ?? null; + $record = $this->getCommonRecord($baseGame, $role, $gift); + $record = array_merge($record, [ + 'pay_amount' => $order['pay_amount'], + 'order_number' => $order['pay_order_number'], + ]); + for ($i=0; $i<$num; $i++) { + $records[] = $record; + } + } + } + RebateOrder::insert($records); + } + + private function getRolesByRoleIds($baseGame, $roleIds) + { + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + return PlayerRole::whereIn('game_id', $gameIds) + ->whereIn('role_id', $roleIds) + ->orderBy('role_level', 'desc') + ->get(['user_id', 'role_name', 'role_id', 'server_id', 'server_name', 'user_account']) + ->keyBy('role_id'); + } + + /* private function getGameRolesPayAmount($baseGame, $roleIds) + { + $gameIds = [$baseGame->android_game_id, $baseGame->ios_game_id]; + return Spend::where('pay_status', 1) + ->whereIn('game_id', $gameIds) + ->whereIn('game_player_id', $roleIds) + ->groupBy('game_player_id') + ->get(['game_player_id', DB::raw('sum(pay_amount) amount')]); + } */ + + private function getCommonRecord($baseGame, $role, $gift) + { + $record = [ + 'base_game_id' => $baseGame->id, + 'base_game_name' => $baseGame->name, + 'user_id' => $role ? $role->user_id : '', + 'user_account' => $role ? $role->user_account : '', + 'server_id' => $role ? $role->server_id : '', + 'server_name' => $role ? $role->server_name : '', + 'role_name' => $role ? $role->role_name : '', + 'role_id' => $role ? $role->role_id : '', + 'type' => $gift->type, + 'amount' => $gift->amount, + 'gift_key' => $gift->gift_key, + 'gift_content' => $gift->gift_content, + 'create_time' => time(), + 'creator_username' => '系统', + ]; + if (self::AUTO_REVIEW) { + $record = $this->addReviewParams($record); + } + return $record; + } + + private function addReviewParams($record) + { + $record['review_type'] = 0; + $record['reviewer_id'] = 0; + $record['reviewer_username'] = '系统'; + $record['review_status'] = 1; + $record['review_time'] = time(); + return $record; + } + + public function initRebateGifts70() + { + $aList = [ + ['gift_key' => 'A-328', 'amount' => 328, 'gifts' => [['id' => 161, 'num' => 1]], 'game_currency' => 328, 'gift_content' => '32801元宝|天仙套装宝箱*20|极品熔炼石*5|符咒令*10|秘境卷轴*5'], + ['gift_key' => 'A-648', 'amount' => 648, 'gifts' => [['id' => 163, 'num' => 1]], 'game_currency' => 648, 'gift_content' => '64801元宝|天神套装宝箱*20|百变橙色符咒Ⅰ*1|红色符咒精华宝箱*5|3倍经验药水*1'], + ['gift_key' => 'A-1000', 'amount' => 1000, 'gifts' => [['id' => 164, 'num' => 1]], 'game_currency' => 1000, 'gift_content' => '100001元宝|神王传承宝箱*2|红色星图宝箱*3|百变二转技能书*3|二级宝石礼包*10|兽神丹*100'], + ['gift_key' => 'A-2000', 'amount' => 2000, 'gifts' => [['id' => 165, 'num' => 1]], 'game_currency' => 2000, 'gift_content' => '200001元宝|百变红色符咒Ⅰ*1|极致熔炼石*5|红色符咒精华宝箱*10|橙色图鉴自选礼包*1|3倍经验药水*2'], + ['gift_key' => 'A-3000', 'amount' => 3000, 'gifts' => [['id' => 166, 'num' => 1]], 'game_currency' => 3000, 'gift_content' => '300001元宝|萌娃·魔法少女*1|爱情精华*30|百变三转技能书*3|红3星星图宝箱*1|神王传承宝箱*4'], + ['gift_key' => 'A-5000', 'amount' => 5000, 'gifts' => [['id' => 167, 'num' => 1]], 'game_currency' => 5000, 'gift_content' => '500001元宝|流光·绿茵星光*1|流光淬魂晶*5|粉色星图宝箱*1|诗经*34|橙色图鉴自选礼包*2|百变圣石*1'], + ['gift_key' => 'A-10000', 'amount' => 10000, 'gifts' => [['id' => 168, 'num' => 1]], 'game_currency' => 10000, 'gift_content' => '1000001元宝|神兵·泰阿*1|神兵麒麟天玉*5|粉色神王自选宝箱*2|风火轮·红*1|红色图鉴自选礼包*1|百变四转技能书*4'], + ['gift_key' => 'A-20000', 'amount' => 20000, 'gifts' => [['id' => 169, 'num' => 1]], 'game_currency' => 20000, 'gift_content' => '2000001元宝|仙翼·幻雪神羽*1|仙翼神凰仙羽*10|金五星自选礼包*1|混天绫·红*1|红色图鉴自选礼包*2|百变红色符咒Ⅲ*1'], + ]; + + $bList = [ + ['gift_key' => 'B-328', 'amount' => 328, 'gifts' => [['id' => 217, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '1280元宝'], + ['gift_key' => 'B-648', 'amount' => 648, 'gifts' => [['id' => 218, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '3280元宝'], + ['gift_key' => 'B-1000', 'amount' => 1000, 'gifts' => [['id' => 219, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '6480元宝'], + ['gift_key' => 'B-2000', 'amount' => 2000, 'gifts' => [['id' => 220, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '14800元宝'], + // ['gift_key' => 'B-3000', 'amount' => 3000, 'gifts' => ['id' => 0, 'num' => 0], 'game_currency' => 20000, 'gift_content' => '20000元宝'], + ]; + + $cList = [ + ['gift_key' => 'C-100', 'amount' => 100, 'gifts' => [['id' => 170, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '气泡·冒泡*1|装备寻宝令*10|灵兽丹*20|秘境卷轴*2|2倍经验药水*1'], + ['gift_key' => 'C-200', 'amount' => 200, 'gifts' => [['id' => 171, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '相框·气泡*1|符咒令*30|仙灵果*40|三级红宝石*2|三级蓝宝石*2'], + ['gift_key' => 'C-350', 'amount' => 350, 'gifts' => [['id' => 172, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '百变橙色符咒Ⅰ*1|红色符咒精华礼盒*5|人品花撵丹*12|地品花撵丹*12|3倍经验药水*1'], + ['gift_key' => 'C-500', 'amount' => 500, 'gifts' => [['id' => 173, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '时装·暗香盈袖*1|表情·吓死了*1|人品道果丹*16|地品道果丹*16|四级红宝石*2|四级蓝宝石*2'], + ['gift_key' => 'C-800', 'amount' => 800, 'gifts' => [['id' => 174, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神兵·桃花暗凋刃*1|萤草*15|人品披风丹*22|地品披风丹*22|太虚秘卷*1|太初秘卷*1'], + ['gift_key' => 'C-1000', 'amount' => 1000, 'gifts' => [['id' => 175, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '齐天大圣灵珠*100|坐骑·斩仙葫芦*1|人品阵法丹*26|地品阵法丹*26|大圣之刃*1|大圣战盾*1|高级坐骑技能礼盒*5'], + ['gift_key' => 'C-2000', 'amount' => 2000, 'gifts' => [['id' => 176, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '仙翼·如意吉祥*1|万古仙翼晶石*10|酒剑仙图鉴激活卡*2|人品宝甲丹*30|地品宝甲丹*30|五级红宝石*2|五级蓝宝石*2'], + ['gift_key' => 'C-3000', 'amount' => 3000, 'gifts' => [['id' => 177, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '剑阵·阴阳轮回剑*2|金轮法王图鉴激活卡*3|御雷真诀秘典*2|百变橙色符咒Ⅱ*1|天仙套装宝箱*40|天仙饰品宝箱*20|精致熔炼石*20'], + ['gift_key' => 'C-5000', 'amount' => 5000, 'gifts' => [['id' => 178, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '岁岁平安套装|图鉴·春*3|气泡·欢乐元宵*1|相框·欢乐元宵*1|红色星图宝箱*2|四级雷属性石*2|四级雷穿透石*2'], + ['gift_key' => 'C-7000', 'amount' => 7000, 'gifts' => [['id' => 179, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '流光·闪烁星光*2|图鉴·夏*3|流光塑形晶*50|流光赋灵晶*50|天神套装宝箱*40|天神饰品宝箱*20|六级红宝石*2|六级蓝宝石*2'], + ['gift_key' => 'C-10000', 'amount' => 10000, 'gifts' => [['id' => 180, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '腾蛇灵珠*100|金刚不坏秘典*2|红色星图宝箱*4|极致熔炼石*10|百变神石*6|混沌神石*6|腾蛇之刃*1|腾蛇战盔*1|腾蛇木龙魂*1'], + ['gift_key' => 'C-15000', 'amount' => 15000, 'gifts' => [['id' => 181, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '法器·凤天皇*2|图鉴·秋*3|怜雀羽*40|寒霜羽*40|百变红2星器灵*4|器灵强化礼包*20|百变红色符咒*2|红符咒精华宝箱*20|腾蛇毒龙魂*1'], + ['gift_key' => 'C-20000', 'amount' => 20000, 'gifts' => [['id' => 182, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '仙剑逍遥套装|万古神兵灵石*50|万古法宝灵晶*50|千手如来秘典*2|红2星星图宝箱*8|神王传承宝箱*4|五级土属性石*2|五级土穿透石*2|烈阳晶*99'], + ['gift_key' => 'C-25000', 'amount' => 25000, 'gifts' => [['id' => 183, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '萌娃·灵月姬*4|金耀道人碎片*200|图鉴·冬*4|灵月仙诀*10|天阶修炼石*200|太极神玉·镯*3|太极神玉·戒*3|七级红宝石*2|七级蓝宝石*2'], + ['gift_key' => 'C-30000', 'amount' => 30000, 'gifts' => [['id' => 184, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '玄武灵珠*200|坐骑·洞庭花月*1|4-6星坐骑宝箱*4|斗转星移秘典*2|粉色星图宝箱*2|粉色神王自选宝箱*2|神王淬炼灵石*10|玄武之刃*1|玄武王铠*1'], + ['gift_key' => 'C-40000', 'amount' => 40000, 'gifts' => [['id' => 185, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '仙童·桃花仙*2|4-6星仙童宝箱*8|冰凰玉璧*34|炎凤玉璧*34|粉四星自选礼包*4|完美熔炼石*10|六级火属性石*3|六级火穿透石*3|六级火防御石*3'], + ['gift_key' => 'C-50000', 'amount' => 50000, 'gifts' => [['id' => 186, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '龙化九天套装|流光·醉梦迷乡*1|天品宝甲仙丹*30|天品剑阵仙丹*30|金蚕丝甲珍篇*2|红色图鉴自选礼包Ⅰ*2|百变红色符咒Ⅱ*2|八级红宝石*2|八级蓝宝石*2'], + ['gift_key' => 'C-70000', 'amount' => 70000, 'gifts' => [['id' => 187, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '阵法·万鬼微尘阵*2|10阶神装项链*1|10阶神装玉佩*1|天品阵法仙丹*30|粉色星图宝箱*4|粉色神王自选宝箱*4|七级水属性石*4|七级雷穿透石*4|七级土防御石*4'], + ['gift_key' => 'C-90000', 'amount' => 90000, 'gifts' => [['id' => 188, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '披风·红尘大氅*3|魔天龙皇碎片*100|黄龙饶日玉璧*34|赤龙掩日玉璧*34|圆月潮汐珍篇*2|粉四星自选礼包*6|天品披风仙丹*30|百变神石*6|百变圣石*2'], + ['gift_key' => 'C-120000', 'amount' => 120000, 'gifts' => [['id' => 189, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '法宝·晓春灵蛙*5|灭世使者碎片*100|瀚海玉璧*34|生机玉璧*34|元素护盾奥义*1|金五星自选礼包*2|法宝火凤灵珠*30|四象灵石*6|百变圣石*4'], + ['gift_key' => 'C-150000', 'amount' => 150000, 'gifts' => [['id' => 190, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '鎏璃灵珠*100|九天玄女碎片*100|元素窃取奥义*1|粉色神王自选宝箱*8|八级火属性石*4|八级火穿透石*4|无极圣玉·镯*3|鎏璃之刃*1|鎏璃利爪*1'], + ['gift_key' => 'C-180000', 'amount' => 180000, 'gifts' => [['id' => 191, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑·觅心宝座*5|披风·桃花仙氅*5|红色图鉴自选礼包Ⅰ*3|完美熔炼石*20|元素之子奥义*1|九级红宝石*2|九级蓝宝石*2|八级水防御石*5|无极圣玉·戒*3'], + ['gift_key' => 'C-200000', 'amount' => 200000, 'gifts' => [['id' => 192, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '蚩尤碎片*200|元素衰竭奥义*1|粉色星图宝箱*8|金五星自选礼包*4|幻彩蝶*34|蓝蝶花*34|九级雷属性石*6|九级风穿透石*6|九级火防御石*6'], + ]; + + $this->saveRebateGifts(70, 'A', $aList); + $this->saveRebateGifts(70, 'B', $bList); + $this->saveRebateGifts(70, 'C', $cList); + } + + public function initRebateGifts73() + { + $aList = [ + ['gift_key' => 'A-10', 'amount' => 10, 'gifts' => [['id' => 1782, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '10000返利元宝'], + ['gift_key' => 'A-50', 'amount' => 50, 'gifts' => [['id' => 1781, 'num' => 5]], 'game_currency' => 25000, 'gift_content' => '25000返利元宝|25000充值元宝'], + ['gift_key' => 'A-100', 'amount' => 100, 'gifts' => [['id' => 1783, 'num' => 1]], 'game_currency' => 50000, 'gift_content' => '50000返利元宝|50000充值元宝'], + ['gift_key' => 'A-300', 'amount' => 300, 'gifts' => [['id' => 1783, 'num' => 3]], 'game_currency' => 150000, 'gift_content' => '150000返利元宝|150000充值元宝'], + ['gift_key' => 'A-500', 'amount' => 500, 'gifts' => [['id' => 1783, 'num' => 5]], 'game_currency' => 250000, 'gift_content' => '250000返利元宝|250000充值元宝'], + ['gift_key' => 'A-1000', 'amount' => 1000, 'gifts' => [['id' => 1784, 'num' => 5]], 'game_currency' => 500000, 'gift_content' => '500000返利元宝|500000充值元宝'], + ['gift_key' => 'A-3000', 'amount' => 3000, 'gifts' => [['id' => 1784, 'num' => 15]], 'game_currency' => 1500000, 'gift_content' => '1500000返利元宝|1500000充值元宝'], + ['gift_key' => 'A-5000', 'amount' => 5000, 'gifts' => [['id' => 1784, 'num' => 25]], 'game_currency' => 2500000, 'gift_content' => '2500000返利元宝|2500000充值元宝'], + ['gift_key' => 'A-10000', 'amount' => 10000, 'gifts' => [['id' => 1784, 'num' => 50]], 'game_currency' => 5000000, 'gift_content' => '5000000返利元宝|5000000充值元宝'], + ['gift_key' => 'A-20000', 'amount' => 20000, 'gifts' => [['id' => 1784, 'num' => 100]], 'game_currency' => 10000000, 'gift_content' => '10000000返利元宝|10000000充值元宝'], + ]; + $this->saveRebateGifts(73, 'A', $aList); + } + + public function initRebateGifts75() + { + $aList = [ + ['gift_key' => 'A-98', 'amount' => 98, 'gifts' => [['id' => 256, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*30|[史诗]头衔令牌*3| 守护培养丹(小)*30'], + ['gift_key' => 'A-128', 'amount' => 128, 'gifts' => [['id' => 257, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*50|[传说]头衔令牌*1|中级攻击神兵*10|灵气丹*2000'], + ['gift_key' => 'A-198', 'amount' => 198, 'gifts' => [['id' => 258, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*50|高级兽魂丹自选箱*3|中级狂暴神兵*10|宠物升级丹*100'], + ['gift_key' => 'A-328', 'amount' => 328, 'gifts' => [['id' => 259, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*100|【图鉴】十二星座自选*1|狂暴天赋卷轴*50|守护培养丹(中)*30'], + ['gift_key' => 'A-648', 'amount' => 648, 'gifts' => [['id' => 260, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*200|进阶资质丹任选宝箱*3|中级断罪圣器石*30|灵气丹*10000'], + ['gift_key' => 'A-1000', 'amount' => 1000, 'gifts' => [['id' => 261, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*300|阵眼·阴阳鱼*5|妖师元神*50|中级元素圣器石*40|守护培养丹(中)*50'], + ['gift_key' => 'A-2000', 'amount' => 2000, 'gifts' => [['id' => 262, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*600|【唯一】头衔令牌*3|至尊属性兽魂*1 +高级神兵自选*50|灵气丹*50000'], + ['gift_key' => 'A-5000', 'amount' => 5000, 'gifts' => [['id' => 263, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*1000|至尊属性兽魂*2|圣品图鉴任选*1|高级神兵自选*50|高级圣器材料任选*20|守护培养丹(大)*50'], + ['gift_key' => 'A-10000', 'amount' => 10000, 'gifts' => [['id' => 264, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*2000|永圣装碎片礼盒*1|至尊属性兽魂*5|圣品图鉴任选*1|天女元神*40|高级神兵自选*100|高级圣器材料任选*50|守护培养丹(大)*50|灵气丹*100000'], + ]; + + $bList = [ + ['gift_key' => 'B-648', 'amount' => 648, 'gifts' => [['id' => 254, 'num' => 1], ['id' => 285, 'num' => 1, 'once' => true]], 'game_currency' => 0, 'gift_content' => '2000元充值卡*1(首次)|1000充值卡*1'], + ['gift_key' => 'B-2000', 'amount' => 2000, 'gifts' => [['id' => 255, 'num' => 1], ['id' => 286, 'num' => 1, 'once' => true]], 'game_currency' => 0, 'gift_content' => '5000元充值卡*1(首次)|2000充值卡*1'], + ]; + + $cList = [ + ['gift_key' => 'C-100', 'amount' => 100, 'gifts' => [['id' => 272, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'R级相框·妖精物语|【史诗】头衔令牌*3|注灵石*10|进阶丹任选*50'], + ['gift_key' => 'C-200', 'amount' => 200, 'gifts' => [['id' => 273, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'R级气泡·夏日风情|八阵图秘盒*5|高级强化宝石*10|进阶丹任选*80'], + ['gift_key' => 'C-500', 'amount' => 500, 'gifts' => [['id' => 274, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SR幻武·缤纷夏日|【图鉴】十二星座自选*1|注灵石*20|进阶丹任选*100'], + ['gift_key' => 'C-1000', 'amount' => 1000, 'gifts' => [['id' => 275, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSR神行·呆萌小鸭|幸运神石*1|进阶资质丹任选箱*3|四象之术|灵脉心经*1,宝石淬炼石*50|进阶丹任选*200'], + ['gift_key' => 'C-3000', 'amount' => 3000, 'gifts' => [['id' => 276, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSR时装·梦回童乐*1|红色符文任选*2|双重符文任选*2|至尊减伤兽魂*1|灵脉心经*1|注灵石*100|进阶丹任选*500'], + ['gift_key' => 'C-5000', 'amount' => 5000, 'gifts' => [['id' => 277, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSR幻武·梦幻卡通*1|红色核心符文【绝对闪避】|至尊伤害兽魂*1|【唯一】头衔令牌*1|注灵石*100|进阶丹任选*500'], + ['gift_key' => 'C-8000', 'amount' => 8000, 'gifts' => [['id' => 278, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '妖灵·天女元神*40|SSSR坐骑·奇趣飞燕|红色核心符文【致命一击】|至尊属性兽魂*1|注灵石*150|进阶丹任选*800'], + ['gift_key' => 'C-12000', 'amount' => 12000, 'gifts' => [['id' => 279, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR翅膀·风车王国*1|3-4转SR守护进阶材料自选*1|圣器图鉴任选*1|永恒圣装碎片任选*15|辉煌宝石lv7*2|红色坐骑装备任选箱*1|神级淬炼石*10'], + ['gift_key' => 'C-18000', 'amount' => 18000, 'gifts' => [['id' => 280, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR时装·午夜狂欢*1|圣物·天雷欲动纹*1|圣器图鉴任选*1|永恒圣装碎片任选*20|400活跃度药水*1|红色灵翼装备任选箱*1|觉醒水晶*10'], + ['gift_key' => 'C-25000', 'amount' => 25000, 'gifts' => [['id' => 281, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR坐骑·上古焰龙兽|【至尊圣物】·玲珑玄黄经|圣器图鉴任选*1|永恒圣装碎片任选*30|至尊属性兽魂*3|红色宠物装备任选箱*2|荣耀·天赐觉醒石*3'], + ['gift_key' => 'C-35000', 'amount' => 35000, 'gifts' => [['id' => 282, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSS法宝·鲜血哀歌|SSSR相框·假面派对|圣器图鉴任选*2|永恒圣装碎片任选*40|至尊属性兽魂*3|法身新生石*2|【五转法身合成材料】琉璃火珠*3|红品洗炼神晶*10'], + ['gift_key' => 'C-50000', 'amount' => 50000, 'gifts' => [['id' => 283, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSS法宝·鎏金镇魂|SSSSR气泡·真龙天子|圣器图鉴任选*2|永恒圣装碎片任选*60|3-5转核心自选箱*1|法身新生石*2|【五转法身100%合成材料】扶桑树枝*3|高级护盾突破材料*3.'], + ]; + + $dList = [ + ['gift_key' => 'D-0', 'amount' => 0, 'gifts' => [['id' => 252, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SR【太初神剑】|装备探宝钥匙*10|100积分宝石'], + ]; + + $eList = [ + ['gift_key' => 'E-500', 'amount' => 500, 'gifts' => [['id' => 265, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '暗裔魔灵*550|进阶资质丹任选箱*2|幸运神石*2'], + ['gift_key' => 'E-1000', 'amount' => 1000, 'gifts' => [['id' => 266, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '春意盎然幻化套装|进阶资质丹任选箱*3丶精炼资质丹任选箱*1'], + ['gift_key' => 'E-2000', 'amount' => 2000, 'gifts' => [['id' => 267, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '妖师元神*150|永结同心幻化套装|至尊属性兽魂*1+初级属性兽魂*5|SR守护进阶礼包*1+觉醒水晶*3'], + ['gift_key' => 'E-3000', 'amount' => 3000, 'gifts' => [['id' => 268, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '清凉一夏幻化套装|至尊属性兽魂*1、进阶资质丹任选箱*5、金水菩提|红品坐骑进阶装备任选*1、天赐觉醒石*2、耀眼觉醒石*2'], + ['gift_key' => 'E-5000', 'amount' => 5000, 'gifts' => [['id' => 269, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '仙风道骨幻化套装|永恒圣装任选1件|至尊属性兽魂*2、进阶资质丹任选箱*5、传世皇金*1|3转炫彩宝石lv7、宝石淬炼石*408、神级淬炼石*60'], + ['gift_key' => 'E-10000', 'amount' => 10000, 'gifts' => [['id' => 270, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '仙灵元神*120|海枯石烂幻化套装|永恒圣装任选2件|至尊属性兽魂*5、水晶龙鳞*3|SSR守护进阶礼包*1、红品神行装备任选*1、红品法宝装备任选*1、荣耀·天赐觉醒石*3、荣耀·耀眼觉醒石*3'], + ['gift_key' => 'E-20000', 'amount' => 20000, 'gifts' => [['id' => 271, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '命运之轮幻化套装|永恒圣装任选5件|至尊属性兽魂*10、水晶龙鳞*5、天神灵银*3'], + ]; + + $fList = [ + ['gift_key' => 'F-227', 'amount' => 227, 'gifts' => [['id' => 253, 'num' => 1], ['id' => 284, 'num' => 1, 'once' => true]], 'game_currency' => 0, 'gift_content' => '648元充值卡*1(首次)|1000充值卡'], + ]; + + $gList = [ + ['gift_key' => 'G-0', 'amount' => 0, 'gifts' => [['id' => 329, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '2000元充值卡*1'], + ]; + + $hList = [ + ['gift_key' => 'H-0', 'amount' => 0, 'gifts' => [['id' => 330, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '2000元充值卡*1'], + ]; + $iList = [ + ['gift_key' => 'I-6', 'amount' => 6, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-8', 'amount' => 8, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-12', 'amount' => 12, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-18', 'amount' => 18, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-25', 'amount' => 25, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-30', 'amount' => 30, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-38', 'amount' => 38, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-50', 'amount' => 50, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-68', 'amount' => 68, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-88', 'amount' => 88, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-98', 'amount' => 98, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-128', 'amount' => 128, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-168', 'amount' => 168, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-198', 'amount' => 198, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-296', 'amount' => 296, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-328', 'amount' => 328, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-648', 'amount' => 648, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1000', 'amount' => 1000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-2000', 'amount' => 2000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-5000', 'amount' => 5000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-10000', 'amount' => 10000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ]; + + $gameId = 75; + /* $this->saveRebateGifts($gameId, 'A', $aList); + $this->saveRebateGifts($gameId, 'B', $bList); + $this->saveRebateGifts($gameId, 'C', $cList); + $this->saveRebateGifts($gameId, 'D', $dList); + $this->saveRebateGifts($gameId, 'E', $eList); + $this->saveRebateGifts($gameId, 'F', $fList); + $this->saveRebateGifts($gameId, 'G', $gList); + $this->saveRebateGifts($gameId, 'H', $hList); + $this->saveRebateGifts($gameId, 'I', $iList); */ + $this->saveRebateGifts($gameId, 'k', $kList); + $gameId = 79; + $this->saveRebateGifts($gameId, 'k', $kList); + } + + public function initRebateGifts79() + { + $gameId = 79; + RebateGift::where('type', 'C')->where('base_game_id', $gameId)->where('amount', '>=', 5000)->where('amount', '<=', 80000)->delete(); + $cList = [ + ['gift_key' => 'C-5000', 'amount' => 5000, 'gifts' => [['id' => 66, 'num' => 1], ['id' => 71, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSR坐骑·奇趣飞燕*1|红色核心符文【致命一击】|至尊属性兽魂*1|大地之书*1|注灵石*150|高级神兵自选宝箱*100|法宝SSSSS魔·鲜血哀歌*1|【至尊】天雷欲动纹*1|混沌天书*1'], + ['gift_key' => 'C-7000', 'amount' => 7000, 'gifts' => [['id' => 72, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '顶级妖灵·仙灵元神*40|3-5转SR守护进阶材料自选*1|至尊属性兽魂*1|辉煌宝石lv7*1|宝石淬炼石*500|神品淬炼石*100'], + ['gift_key' => 'C-8000', 'amount' => 8000, 'gifts' => [['id' => 67, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑SSSSS魔·绝影绯狱*1|【至尊】玲珑玄黄经*1|大地宝典*1'], + ['gift_key' => 'C-10000', 'amount' => 10000, 'gifts' => [['id' => 91, 'num' => 1], ['id' => 62, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '灵翼SSSSS魔·幻鸦黯羽*1|武器SSSSS[魔·吟龙]幻武宝箱自选*1|SSSSR翅膀·嗜血屠戮*1|守护觉醒自选|至尊属性兽魂*1|圣器图鉴任选*1|永恒圣装碎片任选*10|400活跃度药水*1|荣耀之纹 Lv.6*1'], + ['gift_key' => 'C-20000', 'amount' => 20000, 'gifts' => [['id' => 74, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR时装·午夜狂欢*1|圣物·天雷欲动纹*1|至尊属性兽魂*2|圣器图鉴任选*1|永恒圣装碎片任选*10|荣耀之纹 Lv.7*1|橙品守护装备任选箱*1 '], + ['gift_key' => 'C-30000', 'amount' => 30000, 'gifts' => [['id' => 75, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR坐骑·河洛之灵*1|[至尊]玲珑玄黄经*1|圣器图鉴任选*1|永恒圣装碎片任选*20|至尊属性兽魂*3|荣耀之纹 Lv.8*1|红品守护装备任选箱*1'], + ['gift_key' => 'C-50000', 'amount' => 50000, 'gifts' => [['id' => 76, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSS武器·神·凤凰涅槃*1|SSSR相框·假面派对*1|圣器图鉴任选*2|永恒圣装碎片任选*30|至尊属性兽魂*3|荣耀之纹 Lv.9*1|【五转法身合成材料】琉璃火珠*3|红品洗炼神晶*10'], + ['gift_key' => 'C-80000', 'amount' => 80000, 'gifts' => [['id' => 77, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSS法宝·神·鎏金镇魂*1|SSSSR气泡·真龙天子*1|圣器图鉴任选*2|永恒圣装碎片任选*40|3-5转核心自选箱*1|荣耀之纹 Lv.10*1|【五转法身100%合成材料】扶桑树枝*3|高级护盾突破材料*3'], + ]; + $this->saveRebateGifts($gameId, 'C', $cList); + } + + public function initRebateGifts81() + { + $aList = [ + ['gift_key' => 'A-98', 'amount' => 98, 'gifts' => [['id' => 46, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*30|[史诗]头衔令牌*3| 守护培养丹(小)*30'], + ['gift_key' => 'A-128', 'amount' => 128, 'gifts' => [['id' => 47, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*50|[传说]头衔令牌*1|中级攻击神兵*10|灵气丹*2000'], + ['gift_key' => 'A-198', 'amount' => 198, 'gifts' => [['id' => 48, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*50|高级兽魂丹自选箱*3|中级狂暴神兵*10|宠物升级丹*100'], + ['gift_key' => 'A-328', 'amount' => 328, 'gifts' => [['id' => 49, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*100|【图鉴】十二星座自选*1|狂暴天赋卷轴*50|守护培养丹(中)*30'], + ['gift_key' => 'A-648', 'amount' => 648, 'gifts' => [['id' => 50, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*200|进阶资质丹任选宝箱*3|中级断罪圣器石*30|灵气丹*10000'], + ['gift_key' => 'A-1000', 'amount' => 1000, 'gifts' => [['id' => 51, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*300|阵眼·阴阳鱼*5|妖师元神*50|中级元素圣器石*40|守护培养丹(中)*50'], + ['gift_key' => 'A-2000', 'amount' => 2000, 'gifts' => [['id' => 52, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*600|【唯一】头衔令牌*3|至尊属性兽魂*1 +高级神兵自选*50|灵气丹*50000'], + ['gift_key' => 'A-5000', 'amount' => 5000, 'gifts' => [['id' => 53, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*1000|至尊属性兽魂*2|圣品图鉴任选*1|高级神兵自选*50|高级圣器材料任选*20|守护培养丹(大)*50'], + ['gift_key' => 'A-10000', 'amount' => 10000, 'gifts' => [['id' => 54, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装备探宝钥匙*2000|永圣装碎片礼盒*1|至尊属性兽魂*5|圣品图鉴任选*1|天女元神*40|高级神兵自选*100|高级圣器材料任选*50|守护培养丹(大)*50|灵气丹*100000'], + ]; + + $bList = [ + ['gift_key' => 'B-648', 'amount' => 648, 'gifts' => [['id' => 44, 'num' => 1], ['id' => 41, 'num' => 1, 'once' => true]], 'game_currency' => 0, 'gift_content' => '2000元充值卡*1(首次)|648充值卡*2'], + ['gift_key' => 'B-2000', 'amount' => 2000, 'gifts' => [['id' => 45, 'num' => 1], ['id' => 42, 'num' => 1, 'once' => true]], 'game_currency' => 0, 'gift_content' => '5000元充值卡*1(首次)|648充值卡*4'], + ]; + + $cList = [ + ['gift_key' => 'C-100', 'amount' => 100, 'gifts' => [['id' => 63, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'R级相框·妖精物语|【史诗】头衔令牌*3|注灵石*10|初级神兵自选宝箱*10'], + ['gift_key' => 'C-128', 'amount' => 128, 'gifts' => [['id' => 55, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑SSR千纸鹤*1'], + ['gift_key' => 'C-198', 'amount' => 198, 'gifts' => [['id' => 56, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神行外观SSR呆萌小鸭*1'], + ['gift_key' => 'C-200', 'amount' => 200, 'gifts' => [['id' => 64, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'R级气泡·夏日风情|八阵图秘盒*3|高级强化宝石*10|初级神兵自选宝箱*20'], + ['gift_key' => 'C-328', 'amount' => 328, 'gifts' => [['id' => 57, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '武器SSSR[童话]幻武宝箱自选*1|神·永恒之战盔*1'], + ['gift_key' => 'C-500', 'amount' => 500, 'gifts' => [['id' => 65, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SR幻武·缤纷夏日|【图鉴】十二星座自选*1|注灵石*20|中级神兵自选宝箱*10'], + ['gift_key' => 'C-648', 'amount' => 648, 'gifts' => [['id' => 58, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '时装SSSR[童乐]时装宝箱自选*1|神·永恒之战甲*1'], + ['gift_key' => 'C-1000', 'amount' => 1000, 'gifts' => [['id' => 59, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神行外观SSSR黑暗能源*1|神·永恒之护腿*1'], + ['gift_key' => 'C-1500', 'amount' => 1500, 'gifts' => [['id' => 68, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSR神行·呆萌小鸭|幸运神石*1|进阶资质丹任选箱*3|四象之术|宝石淬炼石*50|中级神兵自选宝箱*20'], + ['gift_key' => 'C-2000', 'amount' => 2000, 'gifts' => [['id' => 60, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '灵翼SSSSR风车王国*1|神·永恒之护手*1'], + ['gift_key' => 'C-3000', 'amount' => 3000, 'gifts' => [['id' => 61, 'num' => 1], ['id' => 69, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '红色天兽·白龙马*1|神·永恒之战靴*1|SSR坐骑·无量莲台*1|红色符文任选*2|至尊减伤兽魂*1|灵脉心经|注灵石*100|高级神兵自选宝箱*20'], + ['gift_key' => 'C-5000', 'amount' => 5000, 'gifts' => [['id' => 66, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '法宝SSSSS魔·鲜血哀歌*1|【至尊】天雷欲动纹*1|混沌天书*1'], + ['gift_key' => 'C-6000', 'amount' => 6000, 'gifts' => [['id' => 70, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSR幻武·梦幻卡通*1|红色核心符文【绝对闪避】|至尊伤害兽魂*1|混沌天书*1|注灵石*100|高级神兵自选宝箱*50'], + ['gift_key' => 'C-8000', 'amount' => 8000, 'gifts' => [['id' => 67, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑SSSSS魔·绝影绯狱*1|【至尊】玲珑玄黄经*1|大地宝典*1'], + ['gift_key' => 'C-10000', 'amount' => 10000, 'gifts' => [['id' => 62, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '灵翼SSSSS魔·幻鸦黯羽*1|武器SSSSS[魔·吟龙]幻武宝箱自选*1'], + ['gift_key' => 'C-12000', 'amount' => 12000, 'gifts' => [['id' => 71, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSR坐骑·奇趣飞燕*1|红色核心符文【致命一击】|至尊属性兽魂*1|大地之书*1|注灵石*150|高级神兵自选宝箱*100'], + ['gift_key' => 'C-15000', 'amount' => 15000, 'gifts' => [['id' => 72, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '顶级妖灵·仙灵元神*40|3-5转SR守护进阶材料自选*1|至尊属性兽魂*1|辉煌宝石lv7*1|宝石淬炼石*500|神品淬炼石*100'], + ['gift_key' => 'C-20000', 'amount' => 20000, 'gifts' => [['id' => 73, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR翅膀·风车王国*1|守护觉醒自选|至尊属性兽魂*1|圣器图鉴任选*1|永恒圣装碎片任选*10|400活跃度药水*1|荣耀之纹 Lv.6*1'], + ['gift_key' => 'C-30000', 'amount' => 30000, 'gifts' => [['id' => 74, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR时装·午夜狂欢*1|圣物·天雷欲动纹*1|至尊属性兽魂*2|圣器图鉴任选*1|永恒圣装碎片任选*10|荣耀之纹 Lv.7*1|橙品守护装备任选箱*1'], + ['gift_key' => 'C-40000', 'amount' => 40000, 'gifts' => [['id' => 75, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSR坐骑·河洛之灵*1|[至尊]玲珑玄黄经*1|圣器图鉴任选*1|永恒圣装碎片任选*20|至尊属性兽魂*3|荣耀之纹 Lv.8*1|红品守护装备任选箱*1'], + ['gift_key' => 'C-50000', 'amount' => 50000, 'gifts' => [['id' => 76, 'num' => 1]], 'game_currency' => 0, 'gift_content' => 'SSSSS武器·神·凤凰涅槃*1|SSSR相框·假面派对*1|圣器图鉴任选*2|永恒圣装碎片任选*30|至尊属性兽魂*3|荣耀之纹 Lv.9*1|【五转法身合成材料】琉璃火珠*3|红品洗炼神晶*10'], + ]; + + $dList = [ + ['gift_key' => 'D-0', 'amount' => 0, 'gifts' => [['id' => 39, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑:SR【太初神剑】|装备探宝钥匙*10|100积分宝石'], + ]; + + $fList = [ + ['gift_key' => 'F-227', 'amount' => 227, 'gifts' => [['id' => 43, 'num' => 1], ['id' => 40, 'num' => 1, 'once' => true]], 'game_currency' => 0, 'gift_content' => '1000充值卡*1(首次)|648充值卡*1'], + ]; + + $gList = [ + ['gift_key' => 'G-0', 'amount' => 0, 'gifts' => [['id' => 37, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '648元充值卡*4'], + ]; + + $hList = [ + ['gift_key' => 'H-0', 'amount' => 0, 'gifts' => [['id' => 38, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '648元充值卡*4'], + ]; + + $iList = [ + ['gift_key' => 'I-3', 'amount' => 3, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-6', 'amount' => 6, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-8', 'amount' => 8, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-12', 'amount' => 12, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-18', 'amount' => 18, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-25', 'amount' => 25, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-30', 'amount' => 30, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-38', 'amount' => 38, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-50', 'amount' => 50, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-58', 'amount' => 58, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-60', 'amount' => 60, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-68', 'amount' => 68, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-88', 'amount' => 88, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-98', 'amount' => 98, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-108', 'amount' => 108, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-128', 'amount' => 128, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-168', 'amount' => 168, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-188', 'amount' => 188, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-198', 'amount' => 198, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-199', 'amount' => 199, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-296', 'amount' => 296, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-298', 'amount' => 298, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-328', 'amount' => 328, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-388', 'amount' => 388, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-648', 'amount' => 648, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-698', 'amount' => 698, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-888', 'amount' => 888, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-998', 'amount' => 998, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1000', 'amount' => 1000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1288', 'amount' => 1288, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1314', 'amount' => 1314, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1998', 'amount' => 1998, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-2000', 'amount' => 2000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-5000', 'amount' => 5000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-10000', 'amount' => 10000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ]; + + $kList = [ + ['gift_key' => 'K-1', 'amount' => 328, 'gifts' => [['id' => 79, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑进阶丹*100|坐骑祝福卡*20|蛇髓蜕骨丹*10|天魂融血丹*5|真龙化形丹*5'], + ['gift_key' => 'K-2', 'amount' => 328, 'gifts' => [['id' => 80, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '灵翼进阶丹*100|灵翼祝福卡*20|孔雀翎*10|毕方翎*5|凤凰翎*1'], + ['gift_key' => 'K-3', 'amount' => 328, 'gifts' => [['id' => 81, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '注灵石*50|进化宝石*50|强化宝石*30|中级强化宝石*10'], + ['gift_key' => 'K-4', 'amount' => 328, 'gifts' => [['id' => 82, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '法宝进阶丹*100|法宝祝福卡*20|锻器灵石*10|锻器灵玉*5|锻器神晶*1'], + ['gift_key' => 'K-5', 'amount' => 328, 'gifts' => [['id' => 83, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神行进阶丹*100|神行祝福卡*20|杀伐印记*10|战魂印记*5|修罗印记*1'], + ['gift_key' => 'K-6', 'amount' => 328, 'gifts' => [['id' => 84, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '宠物升级丹*300|初级攻击兽魂*5|初级生命兽魂*5|初级属性兽魂*2|高级暴击守护*1'], + ['gift_key' => 'K-7', 'amount' => 328, 'gifts' => [['id' => 85, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '中级生命神兵*20|中级攻击神兵*20|中级防御神兵*20|中级狂暴神兵*20'], + ]; + + $gameId = 81; + /* $this->saveRebateGifts($gameId, 'A', $aList); + $this->saveRebateGifts($gameId, 'B', $bList); + $this->saveRebateGifts($gameId, 'C', $cList); + $this->saveRebateGifts($gameId, 'D', $dList); + $this->saveRebateGifts($gameId, 'F', $fList); + $this->saveRebateGifts($gameId, 'G', $gList); + $this->saveRebateGifts($gameId, 'H', $hList); + $this->saveRebateGifts($gameId, 'I', $iList); */ + $this->saveRebateGifts($gameId, 'K', $kList); + } + + // 一剑斩仙309 310 84 + /** + * 'A' => '单笔充值福利', + 'B' => '月卡福利发放', + 'C' => '累充福利发放',创角累充福利 + 'D' => '首充福利发放', + 'E' => '单日累充福利发放', + 'F' => '周卡福利发放', + 'G' => '首次进游福利', + 'H' => '签到福利发放', + 'I' => '充值返利发放', + */ + public function initRebateGifts84() + { + $aList = [ + ['gift_key' => 'A-198', 'amount' => 198, 'gifts' => [['id' => 786, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*2000|紫灵石*200|七彩凝灵石*50|上品图鉴卡*50|铸灵宝匣*1'], + ['gift_key' => 'A-328', 'amount' => 328, 'gifts' => [['id' => 787, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*3800|仙品神灵丹*5|仙品神兵玄铁*5|上品图鉴卡*100|铸灵宝匣*3'], + ['gift_key' => 'A-648', 'amount' => 648, 'gifts' => [['id' => 788, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*8000|御·炫装灵玉*2|攻·炫装灵玉*2|仙品法宝精华*5|仙品宝灵丹*5'], + ['gift_key' => 'A-1000', 'amount' => 1000, 'gifts' => [['id' => 789, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*18000|至尊·炫装灵玉*2|仙品神兵玄铁*10|上品修为丹*20|仙品炼体丹*10'], + ['gift_key' => 'A-2000', 'amount' => 2000, 'gifts' => [['id' => 790, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*38000|神羽*100|至尊阵灵丹*3|仙兽装备图谱*5|上品修为丹*25|灵羽*200'], + ['gift_key' => 'A-3000', 'amount' => 3000, 'gifts' => [['id' => 791, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*58000|神羽*300|至尊羽灵丹*6|混元仙魄*50|法相符石*50|灵羽*300'], + ['gift_key' => 'A-5000', 'amount' => 5000, 'gifts' => [['id' => 792, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*80000 神羽*500|至尊兽灵丹*12|混元仙魄*100|法相符石*100|灵羽*500'], + ['gift_key' => 'A-10000', 'amount' => 10000, 'gifts' => [['id' => 793, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*180000|图鉴·一剑斩仙*2、1阶天级·宝典*2|至尊仙灵丹*20|紫灵石*3000|法相符石*150'], + ['gift_key' => 'A-20000', 'amount' => 20000, 'gifts' => [['id' => 794, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '绑定元宝*380000|图鉴·金刚破魔*2、1阶天级·阵旗*2|1阶真级·命盘*2|至尊兽灵丹*30|法相符石*200'], + ]; + + $bList = [ + ['gift_key' => 'B-328', 'amount' => 328, 'gifts' => [['id' => 779, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '328元充值卡*1(累充328元可激活,连续发放30天)'], + ['gift_key' => 'B-648', 'amount' => 648, 'gifts' => [['id' => 780, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '648元充值卡*1(累充648元可激活,连续发放30天)'], + ['gift_key' => 'B-1000', 'amount' => 1000, 'gifts' => [['id' => 781, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '1000元充值卡*1(累充1000元可激活,连续发放30天)'], + ['gift_key' => 'B-2000', 'amount' => 2000, 'gifts' => [['id' => 782, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '2000元充值卡*1(累充2000元可激活,连续发放30天)'], + ['gift_key' => 'B-3000', 'amount' => 3000, 'gifts' => [['id' => 783, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '3000元充值卡*1(累充3000元可激活,连续发放30天)'], + ['gift_key' => 'B-5000', 'amount' => 5000, 'gifts' => [['id' => 784, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '5000元充值卡*1(累充5000元可激活,连续发放30天)'], + ['gift_key' => 'B-10000', 'amount' => 10000, 'gifts' => [['id' => 785, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '10000元充值卡*1(累充10000元可激活,连续发放30天)'], + ]; + + $cList = [ + ['gift_key' => 'C-200', 'amount' => 200, 'gifts' => [['id' => 530, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '头像·喵星人*1、气泡·津门龙客*1炼体礼包*2、初级聚灵礼箱*2、坐骑培养礼包*2'], + ['gift_key' => 'C-500', 'amount' => 500, 'gifts' => [['id' => 531, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '像框·津门龙客*1、炫武·真龙天子*1、炼体礼包*5、初级聚灵礼箱*5、坐骑培养礼包*5'], + ['gift_key' => 'C-1000', 'amount' => 1000, 'gifts' => [['id' => 532, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '服饰·真龙天子*1、图鉴·金乌圣灵*2、炼体礼包*10、初级聚灵礼箱*10、坐骑培养礼包*10、骑兽腾云宝箱*2'], + ['gift_key' => 'C-2000', 'amount' => 2000, 'gifts' => [['id' => 533, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑·金铃辇车*1、头像·单身贵族*1、炼体礼包*20初级聚灵礼箱*20、坐骑培养礼包*20、灵羽*200'], + ['gift_key' => 'C-3000', 'amount' => 3000, 'gifts' => [['id' => 534, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '仙兽·时空骇客*1、相框·清风拂柳*1、炼体礼包*30、初级聚灵礼箱*30、坐骑培养礼包*30、骑兽腾云宝箱*5'], + ['gift_key' => 'C-4000', 'amount' => 4000, 'gifts' => [['id' => 795, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神兵·血阳裂天*1、至尊神灵丹*2、中品神灵丹*20、仙品神灵丹*10、上品神兵玄铁*50、灵羽*300'], + ['gift_key' => 'C-8000', 'amount' => 8000, 'gifts' => [['id' => 796, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '足迹·下弦之月*2、称号·坐拥金山银山*1、1阶橙色随机仙兽装备箱*3、仙兽装备图谱*5、天书宝鉴*5。骑兽腾云宝箱*5'], + ['gift_key' => 'C-13000', 'amount' => 13000, 'gifts' => [['id' => 797, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '炫武·落英羽织*2、气泡·赏花之旅*2、1阶橙色随机坐骑装备箱*3、坐骑装备图谱*5、天书宝鉴*5、灵羽*500'], + ['gift_key' => 'C-20000', 'amount' => 20000, 'gifts' => [['id' => 798, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '服饰·落英羽织*2、相框·赏花之旅*2、1阶橙色随机仙兽装备箱*6、仙兽装备图谱*10、天书宝鉴*10、骑兽腾云宝箱*10'], + ['gift_key' => 'C-25000', 'amount' => 25000, 'gifts' => [['id' => 799, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '羽翼·折扇乘风*1、御·炫装灵玉*5、1阶橙色随机坐骑装备箱*6、坐骑装备图谱*6、天书宝鉴*20、灵羽*1000'], + ['gift_key' => 'C-30000', 'amount' => 30000, 'gifts' => [['id' => 800, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑·卷猫寿司*1、攻·炫装灵玉*5、1阶红色随机仙兽装备箱*6、仙兽装备图谱*20、天书宝鉴*30、骑兽腾云宝箱*20'], + ['gift_key' => 'C-40000', 'amount' => 40000, 'gifts' => [['id' => 801, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '阵法·一箭倾心阵*2、至尊·炫装灵玉*5、1阶红色随机坐骑装备箱*6、坐骑装备图谱*20、天书宝鉴*50、灵羽*2000'], + ['gift_key' => 'C-50000', 'amount' => 50000, 'gifts' => [['id' => 802, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '法宝·御龙环*2、至尊宝灵丹*10、9阶4星粉色首饰自选箱*1、金凤宝珠*10、苍纹赤精*10、仙品宝灵丹*100、仙品法宝精华*100'], + ['gift_key' => 'C-70000', 'amount' => 70000, 'gifts' => [['id' => 803, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神兵·八卦宝炎*2、至尊神灵丹*10、9阶4星粉色首饰自选箱*2、金凤宝珠*20、苍纹赤精*20、中品神灵丹*100、仙品神兵玄铁*100'], + ['gift_key' => 'C-100000', 'amount' => 100000, 'gifts' => [['id' => 804, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '坐骑·墨雨邪凤*2、阵法·怒佛盛莲阵*2、9阶4星粉色首饰自选箱*3、金凤宝珠*30、苍纹赤精*30、至尊阵灵丹*20、仙品阵灵丹*100'], + ['gift_key' => 'C-150000', 'amount' => 150000, 'gifts' => [['id' => 805, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '服饰·九联神明*3、头像框·神之预言*3、女娲·天*5、女娲·风*5、女娲·水*5、女娲·山*5、至尊印灵丹*20'], + ['gift_key' => 'C-200000', 'amount' => 200000, 'gifts' => [['id' => 806, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '武饰·九联神明*3、气泡框·神之预言*3、女娲·地*5、女娲·雷*5女娲·火*5、女娲·泽*5、至尊护灵丹*20'], + ['gift_key' => 'C-250000', 'amount' => 250000, 'gifts' => [['id' => 807, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '黄金阵盘*3、坐骑·大力神猿*3、盘古·天*5、盘古·风*5、盘古·水*5、盘古·山*5、至尊羽灵丹*20'], + ['gift_key' => 'C-300000', 'amount' => 300000, 'gifts' => [['id' => 808, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '天龙阵盘*3 羽翼·太阳神翼*3 妖皇琉璃盏*3 盘古·地*5 盘古·雷*5 盘古·火*5 盘古·泽*5'], + ]; + + $dList = [ + ['gift_key' => 'D-0', 'amount' => 0, 'gifts' => [['id' => 778, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '头像框·喵呜*1、成长丹*50、骑兽丹*50、2倍经验丹*3、升星石*3 '], + ]; + + $gList = [ + ['gift_key' => 'G-0', 'amount' => 0, 'gifts' => [['id' => 776, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '3000元充值卡*1'], + ]; + $hList = [ + ['gift_key' => 'H-0', 'amount' => 0, 'gifts' => [['id' => 777, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '10000元宝'], + ]; + + + $iList = [ + ['gift_key' => 'I-1', 'amount' => 1, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-3', 'amount' => 3, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-5', 'amount' => 5, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-6', 'amount' => 6, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-8', 'amount' => 8, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-10', 'amount' => 10, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-12', 'amount' => 12, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-18', 'amount' => 18, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-25', 'amount' => 25, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-30', 'amount' => 30, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-35', 'amount' => 35, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-38', 'amount' => 38, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-48', 'amount' => 48, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-50', 'amount' => 50, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-68', 'amount' => 68, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-88', 'amount' => 88, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-108', 'amount' => 108, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-120', 'amount' => 120, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-128', 'amount' => 128, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-136', 'amount' => 136, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-198', 'amount' => 198, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-199', 'amount' => 199, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-204', 'amount' => 204, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-328', 'amount' => 328, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-388', 'amount' => 388, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-400', 'amount' => 400, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-488', 'amount' => 488, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-648', 'amount' => 648, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-800', 'amount' => 800, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-988', 'amount' => 988, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1000', 'amount' => 1000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1288', 'amount' => 1288, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-1688', 'amount' => 1688, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-2000', 'amount' => 2000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-3000', 'amount' => 3000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-5000', 'amount' => 5000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-5888', 'amount' => 5888, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-6888', 'amount' => 6888, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-10000', 'amount' => 10000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ['gift_key' => 'I-20000', 'amount' => 20000, 'gifts' => [], 'game_currency' => 0, 'gift_content' => ''], + ]; + + $fList = [ + ['gift_key' => 'F-328', 'amount' => 328, 'gifts' => [['id' => 719, 'num' => 1], ['id' => 925, 'num' => 1, 'once' => true]], 'game_currency' => 0, 'gift_content' => '觉醒套任选一套(仙帝,真灵,天师)(首次)|328元充值卡*1'], + ]; + + // $this->saveRebateGifts(84, 'A', $aList); + // $this->saveRebateGifts(84, 'B', $bList); + // $this->saveRebateGifts(84, 'C', $cList); + // $this->saveRebateGifts(84, 'D', $dList); + // $this->saveRebateGifts(84, 'G', $gList); + // $this->saveRebateGifts(84, 'H', $hList); + RebateGift::where('type', 'I')->where('base_game_id', 84)->delete(); + $this->saveRebateGifts(84, 'I', $iList); + } + + public function initRebateGifts91() + { + $aList = [ + ['gift_key' => 'A-6', 'amount' => 6, 'gifts' => [['id' => 32, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔6元充值返利'], + ['gift_key' => 'A-30', 'amount' => 30, 'gifts' => [['id' => 33, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔30元充值返利'], + ['gift_key' => 'A-68', 'amount' => 68, 'gifts' => [['id' => 34, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔68元充值返利'], + ['gift_key' => 'A-98', 'amount' => 98, 'gifts' => [['id' => 35, 'num' => 1], ['id' => 10, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔98元充值返利、寻宝牌*50、仙品石宝箱*10、礼金*980'], + ['gift_key' => 'A-128', 'amount' => 128, 'gifts' => [['id' => 36, 'num' => 1], ['id' => 13, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔128元充值返利、寻宝牌*100、仙品石宝箱*30、礼金*1280、3级宝石宝箱*5、灵纹宝箱*10、3倍经验药水*1'], + ['gift_key' => 'A-198', 'amount' => 198, 'gifts' => [['id' => 37, 'num' => 1], ['id' => 15, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔198元充值返利、寻宝牌*150、仙品石宝箱*50、礼金*1980、4级宝石宝箱*5、灵纹宝箱*20、晋升令*5、3倍经验药水*3'], + ['gift_key' => 'A-328', 'amount' => 328, 'gifts' => [['id' => 38, 'num' => 1], ['id' => 16, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔328元充值返利、寻宝牌*200、仙品石宝箱*100、礼金*3280、5级宝石宝箱*5、灵纹宝箱*50、晋升令*10、3倍经验药水*5'], + ['gift_key' => 'A-648', 'amount' => 648, 'gifts' => [['id' => 39, 'num' => 1], ['id' => 17, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔648元充值返利、寻宝牌*250、仙品石宝箱*200、礼金*6480、6级宝石宝箱*5、神品石宝箱*30、晋升令*20、神兽拓展卡*1、3倍经验药水*10'], + ['gift_key' => 'A-1000', 'amount' => 1000, 'gifts' => [['id' => 40, 'num' => 1], ['id' => 18, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔1000元充值返利、寻宝牌*350、仙品石宝箱*300、礼金*10000、7级宝石宝箱*5、神品石宝箱*50、晋升令*20、神兽拓展卡*1、神兽石*2、魂石*500、3倍经验药水*15'], + ['gift_key' => 'A-2000', 'amount' => 2000, 'gifts' => [['id' => 41, 'num' => 1], ['id' => 22, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔2000元充值返利、寻宝牌*500、仙品石宝箱*400、礼金*20000、8级宝石宝箱*5、神品石宝箱*100、晋升令*20、神兽拓展卡*2、神兽石*5、魂石*700、3倍经验药水*25、红晶魄*100'], + ['gift_key' => 'A-5000', 'amount' => 5000, 'gifts' => [['id' => 42, 'num' => 1], ['id' => 29, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔5000元充值返利、寻宝牌*800、仙品石宝箱*500、礼金*50000、9级宝石宝箱*5、神品石宝箱*200、晋升令*20、神兽拓展卡*5、神兽石*10、魂石*700、3倍经验药水*35、红晶魄*200、粉色神兽宝箱*5'], + ['gift_key' => 'A-10000', 'amount' => 10000, 'gifts' => [['id' => 43, 'num' => 1], ['id' => 28, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '单笔10000元充值返利、寻宝牌*1000、仙品石宝箱*600、礼金*100000、9级宝石宝箱*10、神品石宝箱*300、晋升令*20、神兽拓展卡*10、神兽石*20、魂石*700、3倍经验药水*50、红晶魄*5000、粉色神兽宝箱*10、橙色骑装宝箱*10'], + ]; + + $cList = [ + ['gift_key' => 'C-100', 'amount' => 100, 'gifts' => [['id' => 2, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '装饰·小黄鸡*1、气泡·富甲天下*1、高级红水晶*60、高级蓝水晶*60'], + ['gift_key' => 'C-300', 'amount' => 300, 'gifts' => [['id' => 20, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '侍宠幻化·爱心护士*1、坐骑幻化·地狱战马*1、侍宠进阶丹*300、坐骑进阶丹*300、侍宠灵性丹*30、坐骑灵性丹*30、坐骑技能书*10 '], + ['gift_key' => 'C-500', 'amount' => 500, 'gifts' => [['id' => 5, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '相框·勇冠三军*1、侍宠飞升丹*20、坐骑飞升丹*20、侍宠潜能丹*30、坐骑潜能丹*30、侍宠技能书*10'], + ['gift_key' => 'C-1000', 'amount' => 1000, 'gifts' => [['id' => 7, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '宠翼·森林幻羽*1、法宝幻化·浩然魂钟*1、宠翼进阶丹*400、法宝进阶丹*400、宠翼飞升丹*20、法宝飞升丹*20、宠翼潜能丹*30、法宝潜能丹*30、宠翼技能书*10'], + ['gift_key' => 'C-1500', 'amount' => 1500, 'gifts' => [['id' => 8, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '宠武幻化·鬼武扇*1、仙器幻化·天心邀月*1、宠武进阶丹*600、仙器进阶丹*600、宠武飞升丹*30、仙器飞升丹*30、宠武潜能丹*40、仙器潜能丹*40、宠武技能书*10'], + ['gift_key' => 'C-3000', 'amount' => 3000, 'gifts' => [['id' => 9, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '宠骑幻化·萝卜兔*1、齐天大圣·觉醒*1、宠骑进阶丹*800、觉醒进阶丹*800、注灵石*400、宠骑飞升丹*50、宠骑潜能丹*80、宠骑灵性丹*100、宠骑技能书*20'], + ['gift_key' => 'C-5000', 'amount' => 5000, 'gifts' => [['id' => 21, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '宠骑幻化·萝卜兔*1、齐天大圣·觉醒*1、宠骑进阶丹*800、觉醒进阶丹*800、注灵石*400、宠骑飞升丹*50、宠骑潜能丹*80、宠骑灵性丹*100、宠骑技能书*20'], + ['gift_key' => 'C-8000', 'amount' => 8000, 'gifts' => [['id' => 11, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '侍宠幻化·蓬莱神女*1、红色核心符文【绝对防御】、坐骑幻化·暴龙领主*1、侍宠进阶丹*1000、坐骑进阶丹*1000、神之圣印*100、五行圣印*100、神速飞骑*10、轩辕剑*1'], + ['gift_key' => 'C-10000', 'amount' => 10000, 'gifts' => [['id' => 12, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '法宝幻化·太极鱼*1、足迹幻化·龙战于野*1、法宝进阶丹*1200、足迹进阶丹*1200、戒指合成石*20、手镯合成石*20、8级宝石宝箱*20、战场鬼车*10、卡牌【炼药壶】*1'], + ['gift_key' => 'C-20000', 'amount' => 20000, 'gifts' => [['id' => 14, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神魄(火鎧疾梟)*2、红色3星神兽宝箱*1、仙器幻化·定海旗*1、仙器进阶丹*1400、9级宝石宝箱*20、装备神炼石礼包*400、诸葛连弩*10、万能图鉴*150、卡牌【昊天塔】*1'], + ['gift_key' => 'C-40000', 'amount' => 40000, 'gifts' => [['id' => 19, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '高级外观自选礼包*6、五阶神翼碎片*阴*2、红色双属性灵魂【仙魂•英烈】*1、孙子兵法*10、高级神炼石礼包*400、卡牌【射日弓】*1、装备技能书礼包*400、晓梦蝴蝶*7、灵晶·次元*2000'], + ['gift_key' => 'C-50000', 'amount' => 50000, 'gifts' => [['id' => 27, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '神魄(烈火狻猊)*2、五阶神翼碎片*阳*2、红色双属性灵魂【仙魂•勇猛】*1、红色幻灵(迅捷飞龙)*1、号令之旗*1、卡牌【太极图】*1、高级红水晶*500、激海将风*7、附灵石·次元200'], + ['gift_key' => 'C-80000', 'amount' => 80000, 'gifts' => [['id' => 25, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '法宝·善恶由心*1,红色3星神兽宝箱*3,红色初级铭刻石*2400,红色高级铭刻石*150,开光道具礼包*400,五阶翅膀碎片*阴*3,五阶翅膀碎片*阳*3,足迹进阶丹*2000,足迹飞升丹*40'], + ['gift_key' => 'C-100000', 'amount' => 100000, 'gifts' => [['id' => 26, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '【伏羲】雨之仙坠*1,【伏羲】风之仙镯*1,【伏羲】暗之仙戒*1,【伏羲】雷之仙符*1,【伏羲】幻之神翼*1,仙之圣印*200,魔之圣印*200,宠翼进阶丹*2500,宠翼飞升丹*40'], + ]; + + $dList = [ + ['gift_key' => 'D-0', 'amount' => 0, 'gifts' => [['id' => 1, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '注灵石*100,觉醒进阶丹*20,相框:大土豪*1'], + ]; + + $gList = [ + ['gift_key' => 'G-0', 'amount' => 0, 'gifts' => [['id' => 30, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '648元充值卡*10+坐骑外形:地狱冥虎'], + ]; + + $hList = [ + ['gift_key' => 'H-0', 'amount' => 0, 'gifts' => [['id' => 31, 'num' => 1]], 'game_currency' => 0, 'gift_content' => '648充值卡*1'], + ]; + + $gameId = 91; + $this->saveRebateGifts($gameId, 'A', $aList); + $this->saveRebateGifts($gameId, 'C', $cList); + $this->saveRebateGifts($gameId, 'D', $dList); + $this->saveRebateGifts($gameId, 'G', $gList); + $this->saveRebateGifts($gameId, 'H', $hList); + } + + public function saveRebateGifts($baseGameId, $type, $items) + { + $records = []; + foreach ($items as $item) { + $item['type'] = $type; + $item['base_game_id'] = $baseGameId; + $item['gifts'] = json_encode($item['gifts']); + $records[] = $item; + } + RebateGift::insert($records); + } + + public function getListColumnMap($type) + { + $columns = [ + 'base_game_name' => '游戏名称', + 'server_name' => '区服', + 'user_account' => '账号', + 'role_id' => '角色ID', + 'role_name' => '角色名称', + 'promote_account' => '所属推广员', + ]; + + if ($type == 'A') { + $columns['pay_amount'] = '充值金额'; + } elseif ($type == 'B') { + $columns['pay_amount'] = '当日累计充值金额'; + $columns['award_date_range'] = '可领取福利日期'; + } elseif ($type == 'C') { + $columns['amount'] = '达到档位金额'; + } elseif ($type == 'D') { + $columns['pay_amount'] = '首充金额'; + } elseif($type == 'E') { + $columns['pay_amount'] = '当日累计充值金额'; + $columns['award_date'] = '达成日期'; + } elseif($type == 'F') { + $columns['award_date_range'] = '可领取福利日期'; + } elseif($type == 'H') { + $columns['award_date'] = '签到日期'; + } elseif ($type == 'I') { + $columns['pay_amount'] = '充值金额'; + $columns['times'] = '返利倍数'; + } elseif($type == 'J') { + $columns['award_date'] = '达成日期'; + $columns['pay_amount'] = '当日累充总额'; + $columns['times'] = '返利倍数'; + $columns['amount'] = '申请总价值'; + } + + if ($type == 'J') { + $columns['gift_content'] = '申请道具'; + } elseif($type == 'I') { + + } else { + $columns['gift_content'] = '奖励内容'; + } + + $columns = array_merge($columns, [ + 'create_time' => '订单生成时间', + 'review_status_text' => '审核状态', + 'review_time' => '审核时间', + 'send_status_text' => '发放状态', + 'send_time' => '发放时间', + 'reviewer_username' => '审核人', + ]); + return $columns; + } + + public function getListColumns($type) + { + $columns = []; + foreach ($this->getListColumnMap($type) as $key => $name) { + $columns[] = ['key' => $key, 'name' => $name]; + } + return $columns; + } +} \ No newline at end of file diff --git a/app/Service/Service.php b/app/Service/Service.php new file mode 100644 index 0000000..16309c9 --- /dev/null +++ b/app/Service/Service.php @@ -0,0 +1,9 @@ +first(); + if (!$spend) { + throw new BusinessException('订单不存在'); + } + if ($spend->pay_status != 1) { + throw new BusinessException('订单支付未成功'); + } + if ($spend->event_status == 1) { + throw new BusinessException('该订单已处理'); + } + + $this->saveUserPlayDataCountBySpend($spend); + $this->addUserDataPayAmount($spend); + $this->addGameDataPayAmount($spend); + + $spend->event_status = 1; + $spend->save(); + } + + private function saveUserPlayDataCountBySpend(Spend $spend) + { + $date = strtotime(date('Y-m-d 00:00:00', $spend->pay_time)); + $record = UserPlayDataCount::where('user_id', $spend->user_id) + ->where('game_id', $spend->game_id) + ->where('server_id', $spend->server_id) + ->where('role_id', $spend->game_player_id) + ->where('create_time', $date) + ->first(); + if (!$record) { + $record = new UserPlayDataCount(); + $record->user_id = $spend->user_id; + $record->promote_id = $spend->promote_id; + $record->game_id = $spend->game_id; + $record->server_id = $spend->server_id; + $record->role_id = $spend->game_player_id; + $record->create_time = $date; + $record->recharge_cost = $spend->pay_amount; + $record->recharge_count = 1; + } else { + $record->recharge_cost = Db::raw('recharge_cost+' . $spend->pay_amount); + $record->recharge_count = Db::raw('recharge_count+1'); + } + $record->save(); + } + + private function addUserDataPayAmount($spend) + { + UserData::updateOrCreate( + ['user_id' => $spend->user_id], + ['pay_amount' => Db::raw('pay_amount+' . $spend->pay_amount)] + ); + } + + private function addGameDataPayAmount($spend) + { + GameData::updateOrCreate( + ['game_id' => $spend->game_id], + ['pay_amount' => Db::raw('pay_amount+' . $spend->pay_amount)] + ); + } +} \ No newline at end of file diff --git a/app/Service/UserService.php b/app/Service/UserService.php new file mode 100644 index 0000000..7dd0db0 --- /dev/null +++ b/app/Service/UserService.php @@ -0,0 +1,76 @@ +where('game_id', $gameId)->first(['id', 'create_time']); + if (!$player) { + throw new BusinessException('玩家信息不存在'); + } + + $playerRetention = PlayerRetention::where('player_id', $player->id)->first(); + + $retentionDay = $this->getRetentionDay($player->create_time, $loginTime); + if ($retentionDay > 0) { + if (!$playerRetention) { + $playerRetention = new PlayerRetention(); + $playerRetention->player_id = $player->id; + $playerRetention->game_id = $gameId; + $playerRetention->user_id = $userId; + } + $playerRetention->{'day' . $retentionDay} = 1; + $playerRetention->save(); + } + } + + private function getRetentionDay($createTime, $loginTime) + { + $dayTime = 24 * 60 * 60; + $retentionDay = 0; + foreach (PlayerRetention::$dayList as $day) { + $date = date('Ymd', $createTime + $day * $dayTime); + if ($date == date('Ymd', $loginTime)) { + $retentionDay = $day; + continue; + } + } + return $retentionDay; + } + + public function afterRegister($userId) + { + Log::info('[USER-REGISTER]用户['. $userId . ']注册'); + + $user = User::where('id', $userId)->first(['device_number', 'register_ip', 'id']); + if (!$user) { + throw new BusinessException('用户不存在'); + } + + $repeatUser = User::where('device_number', $user->device_number) + ->where('register_ip', $user->register_ip) + ->where('id', '<', $user->id) + ->first(); + if ($repeatUser) { + $user->is_repeat = 1; + $user->save(); + Log::info('[USER-REGISTER]用户['. $userId . ']为重复账号'); + } + } +} \ No newline at end of file diff --git a/bin/hyperf.php b/bin/hyperf.php new file mode 100644 index 0000000..0e5439a --- /dev/null +++ b/bin/hyperf.php @@ -0,0 +1,24 @@ +#!/usr/bin/env php +get(Hyperf\Contract\ApplicationInterface::class); + $application->run(); +})(); diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..20eda0b --- /dev/null +++ b/composer.json @@ -0,0 +1,89 @@ +{ + "name": "hyperf/hyperf-skeleton", + "type": "project", + "keywords": [ + "php", + "swoole", + "framework", + "hyperf", + "microservice", + "middleware" + ], + "description": "A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.", + "license": "Apache-2.0", + "require": { + "php": ">=7.3", + "hyperf/async-queue": "~2.2.0", + "hyperf/cache": "~2.2.0", + "hyperf/command": "~2.2.0", + "hyperf/config": "~2.2.0", + "hyperf/constants": "~2.2.0", + "hyperf/database": "~2.2.0", + "hyperf/db-connection": "~2.2.0", + "hyperf/framework": "~2.2.0", + "hyperf/guzzle": "~2.2.0", + "hyperf/http-server": "~2.2.0", + "hyperf/json-rpc": "~2.2.0", + "hyperf/logger": "~2.2.0", + "hyperf/memory": "~2.2.0", + "hyperf/model-cache": "~2.2.0", + "hyperf/process": "~2.2.0", + "hyperf/redis": "~2.2.0", + "hyperf/rpc": "~2.2.0", + "hyperf/rpc-client": "~2.2.0", + "hyperf/rpc-server": "~2.2.0", + "hyperf/validation": "^2.2", + "phpoffice/phpspreadsheet": "^1.24" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/devtool": "~2.2.0", + "hyperf/ide-helper": "~2.2.0", + "hyperf/testing": "~2.2.0", + "mockery/mockery": "^1.0", + "phpstan/phpstan": "^0.12", + "swoole/ide-helper": "^4.5" + }, + "suggest": { + "ext-openssl": "Required to use HTTPS.", + "ext-json": "Required to use JSON.", + "ext-pdo": "Required to use MySQL Client.", + "ext-pdo_mysql": "Required to use MySQL Client.", + "ext-redis": "Required to use Redis Client." + }, + "autoload": { + "psr-4": { + "App\\": "app/" + }, + "files": [ + "app/Helper/Functions.php" + ] + }, + "autoload-dev": { + "psr-4": { + "HyperfTest\\": "./test/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "extra": [], + "scripts": { + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-autoload-dump": [ + "rm -rf runtime/container" + ], + "test": "co-phpunit --prepend test/bootstrap.php -c phpunit.xml --colors=always", + "cs-fix": "php-cs-fixer fix $1", + "analyse": "phpstan analyse --memory-limit 300M -l 0 -c phpstan.neon ./app ./config", + "start": [ + "Composer\\Config::disableProcessTimeout", + "php ./bin/hyperf.php start" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..9d4ebf4 --- /dev/null +++ b/composer.lock @@ -0,0 +1,9278 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "0497aa465f49ca6858436c805a387c26", + "packages": [ + { + "name": "doctrine/annotations", + "version": "1.13.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.3" + }, + "time": "2022-07-02T10:48:51+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-02-28T11:07:21+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "doctrine/lexer": "^1.2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2022-06-18T20:57:19+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.14.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/12ab42bd6e742c70c0a52f7b82477fcd44e64b75", + "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.14.0" + }, + "time": "2021-12-25T01:21:49+00:00" + }, + { + "name": "fig/http-message-util", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Fig\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" + }, + "time": "2020-11-24T22:02:12+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "0690bde05318336c7221785f2a932467f98b64ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", + "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2021-11-21T21:41:47+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-08-28T15:39:27+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/69568e4293f4fa993f3b0e51c9723e1e17c41379", + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:45:39+00:00" + }, + { + "name": "hyperf/async-queue", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/async-queue.git", + "reference": "6e8da55c8b19322023d5fdd970bcbddf774e79f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/async-queue/zipball/6e8da55c8b19322023d5fdd970bcbddf774e79f0", + "reference": "6e8da55c8b19322023d5fdd970bcbddf774e79f0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/command": "~2.2.0", + "hyperf/contract": "~2.2.8", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations.", + "hyperf/event": "Required to dispatch a event.", + "hyperf/logger": "Required to use QueueHandleListener.", + "hyperf/process": "Auto register the consumer process for server." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\AsyncQueue\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\AsyncQueue\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A async queue component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "async-queue", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/cache", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/cache.git", + "reference": "5d133778db7b38bd40be8ef970dcb2d75a5b68ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/cache/zipball/5d133778db7b38bd40be8ef970dcb2d75a5b68ed", + "reference": "5d133778db7b38bd40be8ef970dcb2d75a5b68ed", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/simple-cache": "^1.0" + }, + "suggest": { + "hyperf/di": "Use cache annotations.", + "hyperf/event": "Use listener to delete annotation cache." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Cache\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A cache component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "cache", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/command", + "version": "v2.2.35", + "source": { + "type": "git", + "url": "https://github.com/hyperf/command.git", + "reference": "48cd9789166ecf5f3009de45bcf128b997ec5f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/command/zipball/48cd9789166ecf5f3009de45bcf128b997ec5f88", + "reference": "48cd9789166ecf5f3009de45bcf128b997ec5f88", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/event-dispatcher": "^1.0", + "symfony/console": ">=5.0 <5.4.12" + }, + "suggest": { + "hyperf/di": "Required to use annotations." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Command\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Command for hyperf", + "keywords": [ + "command", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/command/issues", + "source": "https://github.com/hyperf/command/tree/v2.2.35" + }, + "time": "2022-08-27T07:28:56+00:00" + }, + { + "name": "hyperf/config", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/config.git", + "reference": "9437f45aea36358840c907691e9b28492550e9a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/config/zipball/9437f45aea36358840c907691e9b28492550e9a3", + "reference": "9437f45aea36358840c907691e9b28492550e9a3", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "symfony/finder": "^5.0" + }, + "suggest": { + "hyperf/di": "Allows using @Value annotation", + "hyperf/event": "Allows using @Value annotation", + "hyperf/framework": "Allows using @Value annotation", + "vlucas/phpdotenv": "Allows using enviroment value to override the config" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Config\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "./src/Functions.php" + ], + "psr-4": { + "Hyperf\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent component that provides configuration container.", + "homepage": "https://hyperf.io", + "keywords": [ + "config", + "configuration", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/constants", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/constants.git", + "reference": "adb652d446bde384af9ad907cfabe900f3dd08b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/constants/zipball/adb652d446bde384af9ad907cfabe900f3dd08b8", + "reference": "adb652d446bde384af9ad907cfabe900f3dd08b8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/di": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2" + }, + "suggest": { + "hyperf/translation": "Required to use translation." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Constants\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Constants\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A constants component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "constants", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/context", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/context.git", + "reference": "f2e77442693a07d47f7ca97f8b2fdb8e17196a47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/context/zipball/f2e77442693a07d47f7ca97f8b2fdb8e17196a47", + "reference": "f2e77442693a07d47f7ca97f8b2fdb8e17196a47", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/engine": "^1.1", + "php": ">=7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Context\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine context library.", + "homepage": "https://hyperf.io", + "keywords": [ + "Context", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/contract", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/contract.git", + "reference": "1ebf037c91d76ec05af9e5cb3335b0f5ec810e27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/contract/zipball/1ebf037c91d76ec05af9e5cb3335b0f5ec810e27", + "reference": "1ebf037c91d76ec05af9e5cb3335b0f5ec810e27", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The contracts of Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/database", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/database.git", + "reference": "e3c879f238fd92d79aef3196515aa7894aeff5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/database/zipball/e3c879f238fd92d79aef3196515aa7894aeff5a0", + "reference": "e3c879f238fd92d79aef3196515aa7894aeff5a0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/macroable": "~2.2.0", + "hyperf/utils": "~2.2.8", + "nesbot/carbon": "^2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns (^3.0).", + "nikic/php-parser": "Required to use ModelCommand. (^4.0)", + "php-di/phpdoc-reader": "Required to use ModelCommand. (^2.2)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Database\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A flexible database library.", + "homepage": "https://hyperf.io", + "keywords": [ + "database", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/db-connection", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/db-connection.git", + "reference": "05d2a1e858f01682739e066430b339a9bcdef837" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/db-connection/zipball/05d2a1e858f01682739e066430b339a9bcdef837", + "reference": "05d2a1e858f01682739e066430b339a9bcdef837", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/database": "~2.2.0", + "hyperf/di": "~2.2.0", + "hyperf/framework": "~2.2.0", + "hyperf/model-listener": "~2.2.0", + "hyperf/pool": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\DbConnection\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\DbConnection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A hyperf db connection handler for hyperf/database.", + "homepage": "https://hyperf.io", + "keywords": [ + "Connection", + "database", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/di", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/di.git", + "reference": "471c3cf9e0c02ab3aaa0c6e9884062bd541e4577" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/di/zipball/471c3cf9e0c02ab3aaa0c6e9884062bd541e4577", + "reference": "471c3cf9e0c02ab3aaa0c6e9884062bd541e4577", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "doctrine/annotations": "^1.6", + "doctrine/instantiator": "^1.0", + "nikic/php-parser": "^4.1", + "php": ">=7.3", + "php-di/phpdoc-reader": "^2.2", + "psr/container": "^1.0|^2.0", + "symfony/finder": "^5.0", + "vlucas/phpdotenv": "^5.0" + }, + "suggest": { + "ext-pcntl": "Required to scan annotations.", + "hyperf/config": "Require this component for annotation scan progress to retrieve the scan path." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Di\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Di\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A DI for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "annotation", + "di", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/dispatcher", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/dispatcher.git", + "reference": "bcffa8faa11367204c4e00e93f6425d600603e03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/bcffa8faa11367204c4e00e93f6425d600603e03", + "reference": "bcffa8faa11367204c4e00e93f6425d600603e03", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0", + "psr/http-server-middleware": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Dispatcher\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Dispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "dispatcher", + "filter", + "hyperf", + "middleware", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/engine", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine.git", + "reference": "12fdb2b4cec9ee92fc808321a7378cc6251e52cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine/zipball/12fdb2b4cec9ee92fc808321a7378cc6251e52cd", + "reference": "12fdb2b4cec9ee92fc808321a7378cc6251e52cd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/guzzle": "^2.2", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^9.4", + "swoole/ide-helper": "dev-master" + }, + "suggest": { + "ext-swoole": ">=4.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Engine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "keywords": [ + "hyperf", + "php" + ], + "support": { + "issues": "https://github.com/hyperf/engine/issues", + "source": "https://github.com/hyperf/engine/tree/v1.2.2" + }, + "time": "2022-08-06T05:25:43+00:00" + }, + { + "name": "hyperf/event", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/event.git", + "reference": "cd92f5c1218c65f29b15c4d12dcf5835e0426ac8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/event/zipball/cd92f5c1218c65f29b15c4d12dcf5835e0426ac8", + "reference": "cd92f5c1218c65f29b15c4d12dcf5835e0426ac8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "php": ">=7.2", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotatioins." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Event\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "an event manager that implements PSR-14.", + "homepage": "https://hyperf.io", + "keywords": [ + "event", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/exception-handler", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/exception-handler.git", + "reference": "4ec8f6debf530b661bb2b436ef96da53ce0abbdc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/4ec8f6debf530b661bb2b436ef96da53ce0abbdc", + "reference": "4ec8f6debf530b661bb2b436ef96da53ce0abbdc", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/dispatcher": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\ExceptionHandler\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\ExceptionHandler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Exception handler for hyperf", + "homepage": "https://hyperf.io", + "keywords": [ + "exception-handler", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/framework", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/framework.git", + "reference": "49e98fb747214bcac79aecadda8349e70b8f2891" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/framework/zipball/49e98fb747214bcac79aecadda8349e70b8f2891", + "reference": "49e98fb747214bcac79aecadda8349e70b8f2891", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "fig/http-message-util": "^1.1.2", + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "suggest": { + "ext-swoole": "Required to use swoole engine.", + "hyperf/command": "Required to use Command annotation.", + "hyperf/di": "Required to use Command annotation.", + "hyperf/dispatcher": "Required to use BootApplication event.", + "symfony/event-dispatcher": "Required to use symfony event dispatcher (^5.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Framework\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Framework\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.", + "homepage": "https://hyperf.io", + "keywords": [ + "Microservice", + "framework", + "hyperf", + "middleware", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/guzzle", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/guzzle.git", + "reference": "ef4d6b02778cf44b7f0edefd9c33a5d8d08ad48f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/guzzle/zipball/ef4d6b02778cf44b7f0edefd9c33a5d8d08ad48f", + "reference": "ef4d6b02778cf44b7f0edefd9c33a5d8d08ad48f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "guzzlehttp/guzzle": "^6.3|^7.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.0", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0" + }, + "suggest": { + "hyperf/pool": "Required to use pool handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Guzzle\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Swoole coroutine handler for guzzle", + "keywords": [ + "Guzzle", + "handler", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/guzzle/issues", + "source": "https://github.com/hyperf/guzzle/tree/v2.2.33" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/http-message", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-message.git", + "reference": "d71d796177ec72fe30d116c57ed8bd8121a57b6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-message/zipball/d71d796177ec72fe30d116c57ed8bd8121a57b6e", + "reference": "d71d796177ec72fe30d116c57ed8bd8121a57b6e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/utils": "~2.2.0", + "laminas/laminas-mime": "^2.7", + "psr/http-message": "^1.0" + }, + "suggest": { + "psr/container": "Required to replace RequestParserInterface." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpMessage\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpMessage\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "microservice framework base on swoole", + "keywords": [ + "http-message", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/http-message/issues", + "source": "https://github.com/hyperf/http-message/tree/v2.2.33" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/http-server", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-server.git", + "reference": "0f1f22d408de82c9f8fb3f2cf57457e319210798" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-server/zipball/0f1f22d408de82c9f8fb3f2cf57457e319210798", + "reference": "0f1f22d408de82c9f8fb3f2cf57457e319210798", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/dispatcher": "~2.2.0", + "hyperf/event": "~2.2.0", + "hyperf/exception-handler": "~2.2.0", + "hyperf/http-message": "~2.2.0", + "hyperf/macroable": "~2.2.0", + "hyperf/server": "~2.2.0", + "hyperf/utils": "~2.2.0", + "nikic/fast-route": "^1.3", + "php": ">=7.2", + "psr/container": "^1.0|^2.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpServer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpServer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "http", + "http-server", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/json-rpc", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/json-rpc.git", + "reference": "bcd5b395edb4a4d237fbfbc08cb187cbea8088b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/json-rpc/zipball/bcd5b395edb4a4d237fbfbc08cb187cbea8088b5", + "reference": "bcd5b395edb4a4d237fbfbc08cb187cbea8088b5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/http-message": "~2.2.0", + "hyperf/load-balancer": "~2.2.0", + "hyperf/rpc": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0" + }, + "suggest": { + "hyperf/event": "Register the objects to ProtocolManager automatically.", + "hyperf/framework": "Register the objects to ProtocolManager automatically.", + "hyperf/guzzle": "Required to use JSON RPC with HTTP protocol.", + "hyperf/rpc-client": "Reqiured to use JSON RPC in hyperf rpc client.", + "hyperf/rpc-server": "Reqiured to use JSON RPC in hyperf rpc server." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\JsonRpc\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\JsonRpc\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A JSON RPC component for Hyperf RPC Server or Client.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "json-rpc", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/load-balancer", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/load-balancer.git", + "reference": "aa7dfcf274db9905aaf8a54bd88067b1e9170c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/load-balancer/zipball/aa7dfcf274db9905aaf8a54bd88067b1e9170c28", + "reference": "aa7dfcf274db9905aaf8a54bd88067b1e9170c28", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "markrogoyski/math-php": "^2.0", + "php": ">=7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\LoadBalancer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\LoadBalancer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A load balancer library for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "load-balancer", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/logger", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/logger.git", + "reference": "f19929efaeca4aba2b91e7452f4f1b3245bfac51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/logger/zipball/f19929efaeca4aba2b91e7452f4f1b3245bfac51", + "reference": "f19929efaeca4aba2b91e7452f4f1b3245bfac51", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "monolog/monolog": "^2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "conflict": { + "monolog/monolog": ">=2.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Logger\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Logger\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A logger component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "logger", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/macroable", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/macroable.git", + "reference": "e4e1b3ed614a5a9d4c24a48b0b3a554eb712af9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/macroable/zipball/e4e1b3ed614a5a9d4c24a48b0b3a554eb712af9f", + "reference": "e4e1b3ed614a5a9d4c24a48b0b3a554eb712af9f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Macroable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/macroable", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "macroable", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/memory", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/memory.git", + "reference": "8adfac46a0f52385a4ad2e8bc4f956c34cb6f25e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/memory/zipball/8adfac46a0f52385a4ad2e8bc4f956c34cb6f25e", + "reference": "8adfac46a0f52385a4ad2e8bc4f956c34cb6f25e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Memory\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Memory\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent component that use to operate and manage memory.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "memory", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/model-cache", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/model-cache.git", + "reference": "f1e4148da7f6dc4b5eae74594311e53674fd532d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/model-cache/zipball/f1e4148da7f6dc4b5eae74594311e53674fd532d", + "reference": "f1e4148da7f6dc4b5eae74594311e53674fd532d", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/db-connection": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/simple-cache": "^1.0" + }, + "suggest": { + "hyperf/event": "Required to use DeleteCacheListener." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\ModelCache\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\ModelCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A model cache component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "model-cache", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/model-listener", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/model-listener.git", + "reference": "0ac64b517db0d9e192650cd70f81a2962cd54e63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/model-listener/zipball/0ac64b517db0d9e192650cd70f81a2962cd54e63", + "reference": "0ac64b517db0d9e192650cd70f81a2962cd54e63", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/database": "~2.2.0", + "hyperf/di": "~2.2.0", + "hyperf/event": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\ModelListener\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\ModelListener\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A model listener for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "model-listener", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/pool", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/pool.git", + "reference": "b66965453f404f09570a166e9c103a074d2dbd4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/pool/zipball/b66965453f404f09570a166e9c103a074d2dbd4e", + "reference": "b66965453f404f09570a166e9c103a074d2dbd4e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Pool\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Pool\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent universal connection pool component.", + "homepage": "https://hyperf.io", + "keywords": [ + "connection-pool", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/process", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/process.git", + "reference": "a93b2a4bf0455e3f639649046705e7b3b6ccd137" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/process/zipball/a93b2a4bf0455e3f639649046705e7b3b6ccd137", + "reference": "a93b2a4bf0455e3f639649046705e7b3b6ccd137", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations.", + "hyperf/event": "Required to dump the message before and after process.", + "hyperf/framework": "Required to use BootProcessListener." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Process\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Process\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A process component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "process" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/redis", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/redis.git", + "reference": "f0b858bec45b479d7b8cc4a70a792b144a6a680e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/redis/zipball/f0b858bec45b479d7b8cc4a70a792b144a6a680e", + "reference": "f0b858bec45b479d7b8cc4a70a792b144a6a680e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-redis": "*", + "hyperf/contract": "~2.2.0", + "hyperf/pool": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0" + }, + "suggest": { + "ext-redis": "Required to use sentinel mode (>=5.2).", + "hyperf/di": "Create the RedisPool via dependency injection." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Redis\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Redis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A redis component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "pool", + "redis" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/rpc", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/rpc.git", + "reference": "5d8dafe3d1787fc9af8a57b788e57d70bad1472f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/rpc/zipball/5d8dafe3d1787fc9af8a57b788e57d70bad1472f", + "reference": "5d8dafe3d1787fc9af8a57b788e57d70bad1472f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": [] + }, + "autoload": { + "psr-4": { + "Hyperf\\Rpc\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A rpc basic library for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "rpc", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/rpc-client", + "version": "v2.2.35", + "source": { + "type": "git", + "url": "https://github.com/hyperf/rpc-client.git", + "reference": "f5a44fd2ef597eca0de5208c6cf3ebcc1caa0859" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/rpc-client/zipball/f5a44fd2ef597eca0de5208c6cf3ebcc1caa0859", + "reference": "f5a44fd2ef597eca0de5208c6cf3ebcc1caa0859", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/load-balancer": "~2.2.0", + "hyperf/rpc": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0" + }, + "suggest": { + "hyperf/di": "For better container experience.", + "hyperf/pool": "Required to use connection pool.", + "hyperf/service-governance": "Required to fetch the nodes info from service governance." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\RpcClient\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\RpcClient\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An abstract rpc server component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "json-rpc", + "php", + "rpc", + "rpc-client", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-08-10T12:58:39+00:00" + }, + { + "name": "hyperf/rpc-server", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/rpc-server.git", + "reference": "e0416764f4f0a6f15ca64f52eed1f3da3d1d97d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/rpc-server/zipball/e0416764f4f0a6f15ca64f52eed1f3da3d1d97d5", + "reference": "e0416764f4f0a6f15ca64f52eed1f3da3d1d97d5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/http-server": "~2.2.0", + "hyperf/rpc": "~2.2.0", + "php": ">=7.2" + }, + "suggest": { + "hyperf/di": "Required to use annotations." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\RpcServer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\RpcServer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An abstract rpc server component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "rpc", + "rpc-server", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/server", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/server.git", + "reference": "1d3364520e37777a7ed83d8bc1597da42f8d6c1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/server/zipball/1d3364520e37777a7ed83d8bc1597da42f8d6c1b", + "reference": "1d3364520e37777a7ed83d8bc1597da42f8d6c1b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/console": "^5.0" + }, + "suggest": { + "hyperf/event": "Dump the info after server start.", + "hyperf/framework": "Dump the info after server start." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Server\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A base server library for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "server", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/translation", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/translation.git", + "reference": "66c018e6e1605a446db212b0d3905e1d816dba77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/translation/zipball/66c018e6e1605a446db212b0d3905e1d816dba77", + "reference": "66c018e6e1605a446db212b0d3905e1d816dba77", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/macroable": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Translation\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Translation\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent translation component, forked by illuminate/translation.", + "keywords": [ + "hyperf", + "translation" + ], + "support": { + "issues": "https://github.com/hyperf/translation/issues", + "source": "https://github.com/hyperf/translation/tree/v2.2.33" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/utils", + "version": "v2.2.34", + "source": { + "type": "git", + "url": "https://github.com/hyperf/utils.git", + "reference": "9c8519392166a6c8057cc52f7d02e1ac638581f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/utils/zipball/9c8519392166a6c8057cc52f7d02e1ac638581f5", + "reference": "9c8519392166a6c8057cc52f7d02e1ac638581f5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "doctrine/inflector": "^2.0", + "hyperf/context": "~2.2.0", + "hyperf/contract": "~2.2.0", + "hyperf/engine": "^1.1", + "hyperf/macroable": "~2.2.0", + "php": ">=7.2" + }, + "suggest": { + "ext-swoole": "Required to use methods related to swoole (>=4.5).", + "hyperf/di": "Required to use ExceptionNormalizer", + "nikic/php-parser": "Required to use PhpParser. (^4.0)", + "symfony/property-access": "Required to use SymfonyNormalizer (^5.0)", + "symfony/serializer": "Required to use SymfonyNormalizer (^5.0)", + "symfony/var-dumper": "Required to use the dd function (^5.0)." + }, + "type": "library", + "extra": { + "hyperf": { + "config": "Hyperf\\Utils\\ConfigProvider" + }, + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Utils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A tools package that could help developer solved the problem quickly.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "utils" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-07-21T05:42:54+00:00" + }, + { + "name": "hyperf/validation", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/validation.git", + "reference": "d4513923ed4cac88b4b5368bc6497b460465c1e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/validation/zipball/d4513923ed4cac88b4b5368bc6497b460465c1e0", + "reference": "d4513923ed4cac88b4b5368bc6497b460465c1e0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "egulias/email-validator": "^3.0", + "hyperf/contract": "~2.2.0", + "hyperf/database": "~2.2.0", + "hyperf/di": "~2.2.0", + "hyperf/framework": "~2.2.0", + "hyperf/http-server": "~2.2.0", + "hyperf/macroable": "~2.2.0", + "hyperf/translation": "~2.2.0", + "hyperf/utils": "~2.2.0", + "nesbot/carbon": "^2.21", + "php": ">=7.2", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Validation\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Validation\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "hyperf validation", + "keywords": [ + "hyperf", + "validation" + ], + "support": { + "issues": "https://github.com/hyperf/validation/issues", + "source": "https://github.com/hyperf/validation/tree/v2.2.33" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "laminas/laminas-mime", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-mime.git", + "reference": "62a899a7c9100889c2d2386b1357003a2cb52fa9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/62a899a7c9100889c2d2386b1357003a2cb52fa9", + "reference": "62a899a7c9100889c2d2386b1357003a2cb52fa9", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "php": "^7.3 || ~8.0.0 || ~8.1.0" + }, + "conflict": { + "zendframework/zend-mime": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.2.1", + "laminas/laminas-mail": "^2.12", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "laminas/laminas-mail": "Laminas\\Mail component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Mime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create and parse MIME messages and parts", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "mime" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-mime/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-mime/issues", + "rss": "https://github.com/laminas/laminas-mime/releases.atom", + "source": "https://github.com/laminas/laminas-mime" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-08-30T09:38:41+00:00" + }, + { + "name": "laminas/laminas-stdlib", + "version": "3.13.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-stdlib.git", + "reference": "66a6d03c381f6c9f1dd988bf8244f9afb9380d76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/66a6d03c381f6c9f1dd988bf8244f9afb9380d76", + "reference": "66a6d03c381f6c9f1dd988bf8244f9afb9380d76", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.4 || ~8.0.0 || ~8.1.0" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.3.0", + "phpbench/phpbench": "^1.2.6", + "phpstan/phpdoc-parser": "^0.5.4", + "phpunit/phpunit": "^9.5.23", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.26" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "stdlib" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "source": "https://github.com/laminas/laminas-stdlib" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-08-24T13:56:50+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "211e9ba1530ea5260b45d90c9ea252f56ec52729" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/211e9ba1530ea5260b45d90c9ea252f56ec52729", + "reference": "211e9ba1530ea5260b45d90c9ea252f56ec52729", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": "^7.4 || ^8.0", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5.8 || ^9.4.2", + "vimeo/psalm": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.1" + }, + "funding": [ + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2022-05-18T15:52:06+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/ab8bc271e404909db09ff2d5ffa1e538085c0f22", + "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.1" + }, + "time": "2021-06-29T15:32:53+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/c66aefcafb4f6c269510e9ac46b82619a904c576", + "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.0" + }, + "time": "2021-07-01T19:01:15+00:00" + }, + { + "name": "markrogoyski/math-php", + "version": "v2.6.0", + "source": { + "type": "git", + "url": "https://github.com/markrogoyski/math-php.git", + "reference": "85d7d7fe205a6df2b20f956720e25341f3b1462a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/markrogoyski/math-php/zipball/85d7d7fe205a6df2b20f956720e25341f3b1462a", + "reference": "85d7d7fe205a6df2b20f956720e25341f3b1462a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phploc/phploc": "*", + "phpmd/phpmd": "^2.6", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "MathPHP\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Rogoyski", + "email": "mark@rogoyski.com", + "homepage": "https://github.com/markrogoyski", + "role": "Lead developer" + }, + { + "name": "Kevin Nowaczyk", + "homepage": "https://github.com/Beakerboy", + "role": "Developer" + }, + { + "name": "MathPHP Community of Contributors", + "homepage": "https://github.com/markrogoyski/math-php/graphs/contributors" + } + ], + "description": "Math Library for PHP. Features descriptive statistics and regressions; Continuous and discrete probability distributions; Linear algebra with matrices and vectors, Numerical analysis; special mathematical functions; Algebra", + "homepage": "https://github.com/markrogoyski/math-php/", + "keywords": [ + "algebra", + "combinatorics", + "distributions", + "linear algebra", + "math", + "mathematics", + "matrix", + "numerical analysis", + "probability", + "regressions", + "statistics" + ], + "support": { + "issues": "https://github.com/markrogoyski/math-php/issues", + "source": "https://github.com/markrogoyski/math-php/tree/v2.6.0" + }, + "time": "2022-04-10T05:15:37+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "4192345e260f1d51b365536199744b987e160edc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4192345e260f1d51b365536199744b987e160edc", + "reference": "4192345e260f1d51b365536199744b987e160edc", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": ">=0.90@dev", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.5.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2022-04-08T15:43:54+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "b942d263c641ddb5190929ff840c68f78713e937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", + "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2021-07-05T08:18:36+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.61.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "bdf4f4fe3a3eac4de84dbec0738082a862c68ba6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bdf4f4fe3a3eac4de84dbec0738082a862c68ba6", + "reference": "bdf4f4fe3a3eac4de84dbec0738082a862c68ba6", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2022-08-06T12:41:24+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.14.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + }, + "time": "2022-05-31T20:59:12+00:00" + }, + { + "name": "php-di/phpdoc-reader", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PhpDocReader.git", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpDocReader\\": "src/PhpDocReader" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "keywords": [ + "phpdoc", + "reflection" + ], + "support": { + "issues": "https://github.com/PHP-DI/PhpDocReader/issues", + "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + }, + "time": "2020-10-12T12:39:22+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.24.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "ebe8745c92a7cac4514d040758393b5399633b83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/ebe8745c92a7cac4514d040758393b5399633b83", + "reference": "ebe8745c92a7cac4514d040758393b5399633b83", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.13", + "maennchen/zipstream-php": "^2.1", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.3 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "dompdf/dompdf": "^1.0 || ^2.0", + "friendsofphp/php-cs-fixer": "^3.2", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.4" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.24.0" + }, + "time": "2022-07-09T13:49:09+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2021-12-04T23:24:31+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-handler/issues", + "source": "https://github.com/php-fig/http-server-handler/tree/master" + }, + "time": "2018-10-30T16:46:14+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/master" + }, + "time": "2018-10-30T17:12:04+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/535846c7ee6bc4dd027ca0d93220601456734b10", + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-22T10:42:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-29T07:37:50+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-10T07:21:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/191afdcb5804db960d26d8566b7e9a2843cab3a0", + "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.1.3" + }, + "suggest": { + "psr/container": "", + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v1.1.2" + }, + "time": "2019-05-28T07:50:59+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2fc515e512d721bf31ea76bd02fe23ada4640058", + "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-12T17:03:11+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "42ecc77eb4f229ce2df702a648ec93b8478d76ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/42ecc77eb4f229ce2df702a648ec93b8478d76ae", + "reference": "42ecc77eb4f229ce2df702a648ec93b8478d76ae", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/console": "<5.3", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-02T15:52:22+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T16:58:25+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-12-12T23:22:04+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T20:21:48+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.9.6", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "732803ab23524b670f26287e870b8aebdb935389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/732803ab23524b670f26287e870b8aebdb935389", + "reference": "732803ab23524b670f26287e870b8aebdb935389", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "composer/semver": "^3.2", + "composer/xdebug-handler": "^3.0.3", + "doctrine/annotations": "^1.13", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0", + "symfony/console": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/options-resolver": "^5.4 || ^6.0", + "symfony/polyfill-mbstring": "^1.23", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php81": "^1.25", + "symfony/process": "^5.4 || ^6.0", + "symfony/stopwatch": "^5.4 || ^6.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^1.5", + "mikey179/vfsstream": "^1.6.10", + "php-coveralls/php-coveralls": "^2.5.2", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.15", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "phpunitgoodpractices/polyfill": "^1.5", + "phpunitgoodpractices/traits": "^1.9.1", + "symfony/phpunit-bridge": "^6.0", + "symfony/yaml": "^5.4 || ^6.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.9.6" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2022-08-17T20:25:15+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "hyperf/devtool", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/devtool.git", + "reference": "f447311bf7507ff2b13658250ef3bcff7a9bc881" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/devtool/zipball/f447311bf7507ff2b13658250ef3bcff7a9bc881", + "reference": "f447311bf7507ff2b13658250ef3bcff7a9bc881", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/command": "~2.2.0", + "hyperf/contract": "~2.2.0", + "hyperf/di": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "hyperf": { + "config": "Hyperf\\Devtool\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Devtool\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A Devtool for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "devtool", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/ide-helper", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/ide-helper.git", + "reference": "e7e26af552f7cf5512c357df9604ff9aa77ed3f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/ide-helper/zipball/e7e26af552f7cf5512c357df9604ff9aa77ed3f3", + "reference": "e7e26af552f7cf5512c357df9604ff9aa77ed3f3", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "IDE help files for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "ide-helper", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "hyperf/testing", + "version": "v2.2.33", + "source": { + "type": "git", + "url": "https://github.com/hyperf/testing.git", + "reference": "63726e3b4e999a96dd4dd62a54f8b2f8f48f850e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/testing/zipball/63726e3b4e999a96dd4dd62a54f8b2f8f48f850e", + "reference": "63726e3b4e999a96dd4dd62a54f8b2f8f48f850e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hyperf/contract": "~2.2.0", + "hyperf/http-message": "~2.2.0", + "hyperf/http-server": "~2.2.0", + "hyperf/utils": "~2.2.0", + "php": ">=7.2", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0|^2.0" + }, + "bin": [ + "co-phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Testing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Testing for hyperf", + "keywords": [ + "php", + "swoole", + "testing" + ], + "support": { + "source": "https://github.com/hyperf/testing/tree/v2.2.33" + }, + "time": "2022-05-24T13:10:54+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", + "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.5.0" + }, + "time": "2022-01-20T13:18:17+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "0.12.99", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b4d40f1d759942f523be267a1bab6884f46ca3f7", + "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.1|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/0.12.99" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2021-09-12T20:09:55+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.14", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-08-30T12:24:04+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.24", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", + "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.24" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-08-30T07:42:16+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-03T09:37:03+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-11-11T14:18:36+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "1a85ce43937631895a6116907e2eb25d3b8c0297" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/1a85ce43937631895a6116907e2eb25d3b8c0297", + "reference": "1a85ce43937631895a6116907e2eb25d3b8c0297", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-08-29T06:35:27+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "swoole/ide-helper", + "version": "4.8.11", + "source": { + "type": "git", + "url": "https://github.com/swoole/ide-helper.git", + "reference": "edcf955501271b1fd5d77efef31027b1e08f4a85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swoole/ide-helper/zipball/edcf955501271b1fd5d77efef31027b1e08f4a85", + "reference": "edcf955501271b1fd5d77efef31027b1e08f4a85", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Team Swoole", + "email": "team@swoole.com" + } + ], + "description": "IDE help files for Swoole.", + "support": { + "issues": "https://github.com/swoole/ide-helper/issues", + "source": "https://github.com/swoole/ide-helper/tree/4.8.11" + }, + "funding": [ + { + "url": "https://gitee.com/swoole/swoole?donate=true", + "type": "custom" + }, + { + "url": "https://github.com/swoole", + "type": "github" + } + ], + "time": "2022-07-09T06:20:31+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-05T16:45:39+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d67c1f9a1937406a9be3171b4b22250c0a11447", + "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-02T13:48:16+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T16:58:25+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", + "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-02-18T16:06:09+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=7.3" + }, + "platform-dev": [], + "plugin-api-version": "2.2.0" +} diff --git a/config/autoload/annotations.php b/config/autoload/annotations.php new file mode 100644 index 0000000..1423a25 --- /dev/null +++ b/config/autoload/annotations.php @@ -0,0 +1,21 @@ + [ + 'paths' => [ + BASE_PATH . '/app', + ], + 'ignore_annotations' => [ + 'mixin', + ], + ], +]; diff --git a/config/autoload/aspects.php b/config/autoload/aspects.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/aspects.php @@ -0,0 +1,13 @@ + [ + 'driver' => Hyperf\AsyncQueue\Driver\RedisDriver::class, + 'redis' => [ + 'pool' => 'default', + ], + 'channel' => '{queue}', + 'timeout' => 2, + 'retry_seconds' => 5, + 'handle_timeout' => 10, + 'processes' => 1, + 'concurrent' => [ + 'limit' => 10, + ], + ], +]; diff --git a/config/autoload/cache.php b/config/autoload/cache.php new file mode 100644 index 0000000..def82eb --- /dev/null +++ b/config/autoload/cache.php @@ -0,0 +1,18 @@ + [ + 'driver' => Hyperf\Cache\Driver\RedisDriver::class, + 'packer' => Hyperf\Utils\Packer\PhpSerializerPacker::class, + 'prefix' => 'c:', + ], +]; diff --git a/config/autoload/clients.php b/config/autoload/clients.php new file mode 100644 index 0000000..87663a5 --- /dev/null +++ b/config/autoload/clients.php @@ -0,0 +1,12 @@ + [ + 'base_url' => env('LANHUO_URL', 'https://c.lshygame.com'), + 'app_id' => 'LLWF71700000001644', + 'app_key' => '31h8a', + 'app_secret' => '9b0c2130ea023243ff76bf7bc724cfc2', + ], +]; diff --git a/config/autoload/commands.php b/config/autoload/commands.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/commands.php @@ -0,0 +1,13 @@ + [ + 'driver' => env('DB_DRIVER', 'mysql'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', 3306), + 'database' => env('DB_DATABASE', 'hyperf'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => env('DB_PREFIX', ''), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => 10, + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60), + ], + 'cache' => [ + 'handler' => Hyperf\ModelCache\Handler\RedisHandler::class, + 'cache_key' => '{mc:%s:m:%s}:%s:%s', + 'prefix' => 'default', + 'ttl' => 3600 * 24, + 'empty_model_ttl' => 600, + 'load_script' => true, + ], + 'commands' => [ + 'gen:model' => [ + 'path' => 'app/Model', + 'force_casts' => true, + 'inheritance' => 'Model', + 'uses' => '', + 'table_mapping' => [], + ], + ], + ], +]; diff --git a/config/autoload/dependencies.php b/config/autoload/dependencies.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/dependencies.php @@ -0,0 +1,13 @@ + [ + 'amqp' => [ + 'consumer' => [ + 'namespace' => 'App\\Amqp\\Consumer', + ], + 'producer' => [ + 'namespace' => 'App\\Amqp\\Producer', + ], + ], + 'aspect' => [ + 'namespace' => 'App\\Aspect', + ], + 'command' => [ + 'namespace' => 'App\\Command', + ], + 'controller' => [ + 'namespace' => 'App\\Controller', + ], + 'job' => [ + 'namespace' => 'App\\Job', + ], + 'listener' => [ + 'namespace' => 'App\\Listener', + ], + 'middleware' => [ + 'namespace' => 'App\\Middleware', + ], + 'Process' => [ + 'namespace' => 'App\\Processes', + ], + ], +]; diff --git a/config/autoload/exceptions.php b/config/autoload/exceptions.php new file mode 100644 index 0000000..b848177 --- /dev/null +++ b/config/autoload/exceptions.php @@ -0,0 +1,19 @@ + [ + 'http' => [ + Hyperf\HttpServer\Exception\Handler\HttpExceptionHandler::class, + App\Exception\Handler\AppExceptionHandler::class, + ], + ], +]; diff --git a/config/autoload/listeners.php b/config/autoload/listeners.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/listeners.php @@ -0,0 +1,13 @@ + [ + 'handler' => [ + 'class' => \Monolog\Handler\StreamHandler::class, + 'constructor' => [ + 'stream' => $logFileName, + 'level' => \Monolog\Logger::DEBUG, + ], + ], + 'formatter' => [ + 'class' => \Monolog\Formatter\LineFormatter::class, + 'constructor' => [ + 'format' => null, + 'dateFormat' => null, + 'allowInlineLineBreaks' => true, + ] + ], + ], +]; */ + +return [ + 'default' => [ + 'handler' => [ + 'class' => Monolog\Handler\RotatingFileHandler::class, + 'constructor' => [ + 'filename' => $logFileName, + 'maxFiles' => env('LOG_MAX_FILES', 7), + 'level' => Monolog\Logger::DEBUG, + ], + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [ + 'format' => null, + 'dateFormat' => 'Y-m-d H:i:s', + 'allowInlineLineBreaks' => true, + ], + ], + ], +]; \ No newline at end of file diff --git a/config/autoload/middlewares.php b/config/autoload/middlewares.php new file mode 100644 index 0000000..49bdec2 --- /dev/null +++ b/config/autoload/middlewares.php @@ -0,0 +1,15 @@ + [ + ], +]; diff --git a/config/autoload/processes.php b/config/autoload/processes.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/processes.php @@ -0,0 +1,13 @@ + [ + 'host' => env('REDIS_HOST', 'localhost'), + 'auth' => env('REDIS_AUTH', null), + 'port' => (int) env('REDIS_PORT', 6379), + 'db' => (int) env('REDIS_DB', 0), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => 10, + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60), + ], + ], +]; diff --git a/config/autoload/server.php b/config/autoload/server.php new file mode 100644 index 0000000..56f6afb --- /dev/null +++ b/config/autoload/server.php @@ -0,0 +1,46 @@ + SWOOLE_PROCESS, + 'servers' => [ + [ + 'name' => 'http', + 'type' => Server::SERVER_HTTP, + 'host' => '0.0.0.0', + 'port' => 9501, + 'sock_type' => SWOOLE_SOCK_TCP, + 'callbacks' => [ + Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'], + ], + ], + ], + 'settings' => [ + Constant::OPTION_ENABLE_COROUTINE => true, + Constant::OPTION_WORKER_NUM => swoole_cpu_num(), + Constant::OPTION_PID_FILE => BASE_PATH . '/runtime/hyperf.pid', + Constant::OPTION_OPEN_TCP_NODELAY => true, + Constant::OPTION_MAX_COROUTINE => 100000, + Constant::OPTION_OPEN_HTTP2_PROTOCOL => true, + Constant::OPTION_MAX_REQUEST => 100000, + Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024, + Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024, + ], + 'callbacks' => [ + Event::ON_WORKER_START => [Hyperf\Framework\Bootstrap\WorkerStartCallback::class, 'onWorkerStart'], + Event::ON_PIPE_MESSAGE => [Hyperf\Framework\Bootstrap\PipeMessageCallback::class, 'onPipeMessage'], + Event::ON_WORKER_EXIT => [Hyperf\Framework\Bootstrap\WorkerExitCallback::class, 'onWorkerExit'], + ], +]; diff --git a/config/autoload/services.php b/config/autoload/services.php new file mode 100644 index 0000000..656b616 --- /dev/null +++ b/config/autoload/services.php @@ -0,0 +1,29 @@ + [ + [ + // The service name, this name should as same as with the name of service provider. + 'name' => 'YourServiceName', + // The service registry, if `nodes` is missing below, then you should provide this configs. + 'registry' => [ + 'protocol' => 'consul', + 'address' => 'Enter the address of service registry', + ], + // If `registry` is missing, then you should provide the nodes configs. + 'nodes' => [ + // Provide the host and port of the service provider. + // ['host' => 'The host of the service provider', 'port' => 9502] + ], + ], + ], +]; diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..38823e0 --- /dev/null +++ b/config/config.php @@ -0,0 +1,31 @@ + env('APP_NAME', 'skeleton'), + 'app_env' => env('APP_ENV', 'dev'), + 'scan_cacheable' => env('SCAN_CACHEABLE', false), + StdoutLoggerInterface::class => [ + 'log_level' => [ + LogLevel::ALERT, + LogLevel::CRITICAL, + LogLevel::DEBUG, + LogLevel::EMERGENCY, + LogLevel::ERROR, + LogLevel::INFO, + LogLevel::NOTICE, + LogLevel::WARNING, + ], + ], +]; diff --git a/config/container.php b/config/container.php new file mode 100644 index 0000000..2a09133 --- /dev/null +++ b/config/container.php @@ -0,0 +1,24 @@ + + + + + ./test + + + + + ./app + + + diff --git a/service.sh b/service.sh new file mode 100644 index 0000000..6afef6a --- /dev/null +++ b/service.sh @@ -0,0 +1,41 @@ +#/bin/bash + +echo "================= rsync files ================="; +rsync -av --delete --exclude=vendor --exclude=runtime /data/project/service/ /home/project/service; + +echo "" + +while getopts "io" opt; do + case $opt in + i) + echo "================= composer install ================="; + echo "dist:" + cd /home/project/service; + composer install; + echo "" + echo "source:" + cd /data/project/service; + composer install; + echo "" + ;; + o) + echo "================= composer dump-autoload -o ================="; + echo "dist:" + cd /home/project/service; + composer dump-autoload -o; + echo "" + echo "source:" + cd /data/project/service; + composer dump-autoload -o; + echo "" + ;; + \?) + echo "Invalid option: -$OPTARG" + echo "" + ;; + esac +done + +echo "================= start service ================="; +cd /home/project/service; +php bin/hyperf.php start; \ No newline at end of file diff --git a/test/Cases/ExampleTest.php b/test/Cases/ExampleTest.php new file mode 100644 index 0000000..6f28d24 --- /dev/null +++ b/test/Cases/ExampleTest.php @@ -0,0 +1,27 @@ +assertTrue(true); + $this->assertTrue(is_array($this->get('/'))); + } +} diff --git a/test/HttpTestCase.php b/test/HttpTestCase.php new file mode 100644 index 0000000..cabfcbf --- /dev/null +++ b/test/HttpTestCase.php @@ -0,0 +1,42 @@ +client = make(Client::class); + } + + public function __call($name, $arguments) + { + return $this->client->{$name}(...$arguments); + } +} diff --git a/test/bootstrap.php b/test/bootstrap.php new file mode 100644 index 0000000..8396ecb --- /dev/null +++ b/test/bootstrap.php @@ -0,0 +1,29 @@ +get(Hyperf\Contract\ApplicationInterface::class);