升级tp6.0.4核心
This commit is contained in:
parent
13ca055f74
commit
864f5a68fe
129
composer.lock
generated
129
composer.lock
generated
@ -152,16 +152,16 @@
|
||||
},
|
||||
{
|
||||
"name": "league/mime-type-detection",
|
||||
"version": "1.4.0",
|
||||
"version": "1.5.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/mime-type-detection.git",
|
||||
"reference": "fda190b62b962d96a069fcc414d781db66d65b69"
|
||||
"reference": "ea2fbfc988bade315acd5967e6d02274086d0f28"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/fda190b62b962d96a069fcc414d781db66d65b69",
|
||||
"reference": "fda190b62b962d96a069fcc414d781db66d65b69",
|
||||
"url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ea2fbfc988bade315acd5967e6d02274086d0f28",
|
||||
"reference": "ea2fbfc988bade315acd5967e6d02274086d0f28",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -195,87 +195,20 @@
|
||||
}
|
||||
],
|
||||
"description": "Mime-type detection for Flysystem",
|
||||
"time": "2020-08-09T10:34:01+00:00"
|
||||
},
|
||||
{
|
||||
"name": "opis/closure",
|
||||
"version": "3.5.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/opis/closure.git",
|
||||
"reference": "4531e53afe2fc660403e76fb7644e95998bff7bf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/opis/closure/zipball/4531e53afe2fc660403e76fb7644e95998bff7bf",
|
||||
"reference": "4531e53afe2fc660403e76fb7644e95998bff7bf",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||
"preferred": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"require": {
|
||||
"php": "^5.4 || ^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"jeremeamia/superclosure": "^2.0",
|
||||
"phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.5.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Opis\\Closure\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"functions.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Marius Sarca",
|
||||
"email": "marius.sarca@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Sorin Sarca",
|
||||
"email": "sarca_sorin@hotmail.com"
|
||||
}
|
||||
],
|
||||
"description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
|
||||
"homepage": "https://opis.io/closure",
|
||||
"keywords": [
|
||||
"anonymous functions",
|
||||
"closure",
|
||||
"function",
|
||||
"serializable",
|
||||
"serialization",
|
||||
"serialize"
|
||||
],
|
||||
"time": "2020-09-06T17:02:15+00:00"
|
||||
"time": "2020-09-21T18:10:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpmailer/phpmailer",
|
||||
"version": "v6.1.7",
|
||||
"version": "v6.1.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHPMailer/PHPMailer.git",
|
||||
"reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0"
|
||||
"reference": "917ab212fa00dc6eacbb26e8bc387ebe40993bc1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0",
|
||||
"reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0",
|
||||
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/917ab212fa00dc6eacbb26e8bc387ebe40993bc1",
|
||||
"reference": "917ab212fa00dc6eacbb26e8bc387ebe40993bc1",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -287,6 +220,7 @@
|
||||
"require": {
|
||||
"ext-ctype": "*",
|
||||
"ext-filter": "*",
|
||||
"ext-hash": "*",
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
@ -330,7 +264,7 @@
|
||||
}
|
||||
],
|
||||
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
|
||||
"time": "2020-07-14T18:50:27+00:00"
|
||||
"time": "2020-10-09T14:55:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/cache",
|
||||
@ -603,16 +537,16 @@
|
||||
},
|
||||
{
|
||||
"name": "topthink/framework",
|
||||
"version": "v6.0.3",
|
||||
"version": "v6.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/framework.git",
|
||||
"reference": "b4046fb21e6163ba23a792b694162693dbe71b4b"
|
||||
"reference": "4b252d78562d4a51a501651f837c26cb9d91624f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/framework/zipball/b4046fb21e6163ba23a792b694162693dbe71b4b",
|
||||
"reference": "b4046fb21e6163ba23a792b694162693dbe71b4b",
|
||||
"url": "https://api.github.com/repos/top-think/framework/zipball/4b252d78562d4a51a501651f837c26cb9d91624f",
|
||||
"reference": "4b252d78562d4a51a501651f837c26cb9d91624f",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -626,7 +560,6 @@
|
||||
"ext-mbstring": "*",
|
||||
"league/flysystem": "^1.0",
|
||||
"league/flysystem-cached-adapter": "^1.0",
|
||||
"opis/closure": "^3.1",
|
||||
"php": ">=7.1.0",
|
||||
"psr/container": "~1.0",
|
||||
"psr/log": "~1.0",
|
||||
@ -667,7 +600,7 @@
|
||||
"orm",
|
||||
"thinkphp"
|
||||
],
|
||||
"time": "2020-06-26T16:03:10+00:00"
|
||||
"time": "2020-09-29T02:19:59+00:00"
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-captcha",
|
||||
@ -821,16 +754,16 @@
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-orm",
|
||||
"version": "v2.0.33",
|
||||
"version": "v2.0.34",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/think-orm.git",
|
||||
"reference": "35ca511a1e4d671b39f7afb4c887703c16ef6957"
|
||||
"reference": "57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/think-orm/zipball/35ca511a1e4d671b39f7afb4c887703c16ef6957",
|
||||
"reference": "35ca511a1e4d671b39f7afb4c887703c16ef6957",
|
||||
"url": "https://api.github.com/repos/top-think/think-orm/zipball/57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629",
|
||||
"reference": "57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -868,7 +801,7 @@
|
||||
"database",
|
||||
"orm"
|
||||
],
|
||||
"time": "2020-06-22T14:57:28+00:00"
|
||||
"time": "2020-09-28T08:24:57+00:00"
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-template",
|
||||
@ -1224,16 +1157,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/var-dumper",
|
||||
"version": "v4.4.13",
|
||||
"version": "v4.4.15",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/var-dumper.git",
|
||||
"reference": "1bef32329f3166486ab7cb88599cae4875632b99"
|
||||
"reference": "0dc22bdf9d1197467bb04d505355180b6f20bcca"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/1bef32329f3166486ab7cb88599cae4875632b99",
|
||||
"reference": "1bef32329f3166486ab7cb88599cae4875632b99",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/0dc22bdf9d1197467bb04d505355180b6f20bcca",
|
||||
"reference": "0dc22bdf9d1197467bb04d505355180b6f20bcca",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -1303,20 +1236,20 @@
|
||||
"debug",
|
||||
"dump"
|
||||
],
|
||||
"time": "2020-08-17T07:31:35+00:00"
|
||||
"time": "2020-09-18T08:35:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-trace",
|
||||
"version": "v1.3",
|
||||
"version": "v1.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/think-trace.git",
|
||||
"reference": "d8da2e39df268ab8775013de699f0c3012e51318"
|
||||
"reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/think-trace/zipball/d8da2e39df268ab8775013de699f0c3012e51318",
|
||||
"reference": "d8da2e39df268ab8775013de699f0c3012e51318",
|
||||
"url": "https://api.github.com/repos/top-think/think-trace/zipball/9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
|
||||
"reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -1356,7 +1289,7 @@
|
||||
}
|
||||
],
|
||||
"description": "thinkphp debug trace",
|
||||
"time": "2020-03-18T07:59:53+00:00"
|
||||
"time": "2020-06-29T05:27:28+00:00"
|
||||
}
|
||||
],
|
||||
"aliases": [],
|
||||
|
1
vendor/composer/autoload_files.php
vendored
1
vendor/composer/autoload_files.php
vendored
@ -7,7 +7,6 @@ $baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'9b552a3cc426e3287cc811caefa3cf53' => $vendorDir . '/topthink/think-helper/src/helper.php',
|
||||
'538ca81a9a966a6716601ecf48f4eaef' => $vendorDir . '/opis/closure/functions.php',
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
|
||||
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
|
||||
|
1
vendor/composer/autoload_psr4.php
vendored
1
vendor/composer/autoload_psr4.php
vendored
@ -22,7 +22,6 @@ return array(
|
||||
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
|
||||
'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
|
||||
'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src'),
|
||||
'Opis\\Closure\\' => array($vendorDir . '/opis/closure/src'),
|
||||
'League\\MimeTypeDetection\\' => array($vendorDir . '/league/mime-type-detection/src'),
|
||||
'League\\Flysystem\\Cached\\' => array($vendorDir . '/league/flysystem-cached-adapter/src'),
|
||||
'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
|
||||
|
9
vendor/composer/autoload_static.php
vendored
9
vendor/composer/autoload_static.php
vendored
@ -8,7 +8,6 @@ class ComposerStaticInit1b32198725235c8d6500c87262ef30c2
|
||||
{
|
||||
public static $files = array (
|
||||
'9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php',
|
||||
'538ca81a9a966a6716601ecf48f4eaef' => __DIR__ . '/..' . '/opis/closure/functions.php',
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
|
||||
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
|
||||
@ -46,10 +45,6 @@ class ComposerStaticInit1b32198725235c8d6500c87262ef30c2
|
||||
'Psr\\Cache\\' => 10,
|
||||
'PHPMailer\\PHPMailer\\' => 20,
|
||||
),
|
||||
'O' =>
|
||||
array (
|
||||
'Opis\\Closure\\' => 13,
|
||||
),
|
||||
'L' =>
|
||||
array (
|
||||
'League\\MimeTypeDetection\\' => 25,
|
||||
@ -127,10 +122,6 @@ class ComposerStaticInit1b32198725235c8d6500c87262ef30c2
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/phpmailer/phpmailer/src',
|
||||
),
|
||||
'Opis\\Closure\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/opis/closure/src',
|
||||
),
|
||||
'League\\MimeTypeDetection\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/league/mime-type-detection/src',
|
||||
|
143
vendor/composer/installed.json
vendored
143
vendor/composer/installed.json
vendored
@ -149,17 +149,17 @@
|
||||
},
|
||||
{
|
||||
"name": "league/mime-type-detection",
|
||||
"version": "1.4.0",
|
||||
"version_normalized": "1.4.0.0",
|
||||
"version": "1.5.0",
|
||||
"version_normalized": "1.5.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/mime-type-detection.git",
|
||||
"reference": "fda190b62b962d96a069fcc414d781db66d65b69"
|
||||
"reference": "ea2fbfc988bade315acd5967e6d02274086d0f28"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/fda190b62b962d96a069fcc414d781db66d65b69",
|
||||
"reference": "fda190b62b962d96a069fcc414d781db66d65b69",
|
||||
"url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ea2fbfc988bade315acd5967e6d02274086d0f28",
|
||||
"reference": "ea2fbfc988bade315acd5967e6d02274086d0f28",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -176,7 +176,7 @@
|
||||
"phpstan/phpstan": "^0.12.36",
|
||||
"phpunit/phpunit": "^8.5.8"
|
||||
},
|
||||
"time": "2020-08-09T10:34:01+00:00",
|
||||
"time": "2020-09-21T18:10:53+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@ -196,88 +196,19 @@
|
||||
],
|
||||
"description": "Mime-type detection for Flysystem"
|
||||
},
|
||||
{
|
||||
"name": "opis/closure",
|
||||
"version": "3.5.7",
|
||||
"version_normalized": "3.5.7.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/opis/closure.git",
|
||||
"reference": "4531e53afe2fc660403e76fb7644e95998bff7bf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/opis/closure/zipball/4531e53afe2fc660403e76fb7644e95998bff7bf",
|
||||
"reference": "4531e53afe2fc660403e76fb7644e95998bff7bf",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||
"preferred": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"require": {
|
||||
"php": "^5.4 || ^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"jeremeamia/superclosure": "^2.0",
|
||||
"phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
|
||||
},
|
||||
"time": "2020-09-06T17:02:15+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.5.x-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Opis\\Closure\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"functions.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Marius Sarca",
|
||||
"email": "marius.sarca@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Sorin Sarca",
|
||||
"email": "sarca_sorin@hotmail.com"
|
||||
}
|
||||
],
|
||||
"description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
|
||||
"homepage": "https://opis.io/closure",
|
||||
"keywords": [
|
||||
"anonymous functions",
|
||||
"closure",
|
||||
"function",
|
||||
"serializable",
|
||||
"serialization",
|
||||
"serialize"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "phpmailer/phpmailer",
|
||||
"version": "v6.1.7",
|
||||
"version_normalized": "6.1.7.0",
|
||||
"version": "v6.1.8",
|
||||
"version_normalized": "6.1.8.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHPMailer/PHPMailer.git",
|
||||
"reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0"
|
||||
"reference": "917ab212fa00dc6eacbb26e8bc387ebe40993bc1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0",
|
||||
"reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0",
|
||||
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/917ab212fa00dc6eacbb26e8bc387ebe40993bc1",
|
||||
"reference": "917ab212fa00dc6eacbb26e8bc387ebe40993bc1",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -289,6 +220,7 @@
|
||||
"require": {
|
||||
"ext-ctype": "*",
|
||||
"ext-filter": "*",
|
||||
"ext-hash": "*",
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
@ -304,7 +236,7 @@
|
||||
"stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
|
||||
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
|
||||
},
|
||||
"time": "2020-07-14T18:50:27+00:00",
|
||||
"time": "2020-10-09T14:55:58+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@ -771,17 +703,17 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/var-dumper",
|
||||
"version": "v4.4.13",
|
||||
"version_normalized": "4.4.13.0",
|
||||
"version": "v4.4.15",
|
||||
"version_normalized": "4.4.15.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/var-dumper.git",
|
||||
"reference": "1bef32329f3166486ab7cb88599cae4875632b99"
|
||||
"reference": "0dc22bdf9d1197467bb04d505355180b6f20bcca"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/1bef32329f3166486ab7cb88599cae4875632b99",
|
||||
"reference": "1bef32329f3166486ab7cb88599cae4875632b99",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/0dc22bdf9d1197467bb04d505355180b6f20bcca",
|
||||
"reference": "0dc22bdf9d1197467bb04d505355180b6f20bcca",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -811,7 +743,7 @@
|
||||
"ext-intl": "To show region name in time zone dump",
|
||||
"symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
|
||||
},
|
||||
"time": "2020-08-17T07:31:35+00:00",
|
||||
"time": "2020-09-18T08:35:10+00:00",
|
||||
"bin": [
|
||||
"Resources/bin/var-dump-server"
|
||||
],
|
||||
@ -913,17 +845,17 @@
|
||||
},
|
||||
{
|
||||
"name": "topthink/framework",
|
||||
"version": "v6.0.3",
|
||||
"version_normalized": "6.0.3.0",
|
||||
"version": "v6.0.4",
|
||||
"version_normalized": "6.0.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/framework.git",
|
||||
"reference": "b4046fb21e6163ba23a792b694162693dbe71b4b"
|
||||
"reference": "4b252d78562d4a51a501651f837c26cb9d91624f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/framework/zipball/b4046fb21e6163ba23a792b694162693dbe71b4b",
|
||||
"reference": "b4046fb21e6163ba23a792b694162693dbe71b4b",
|
||||
"url": "https://api.github.com/repos/top-think/framework/zipball/4b252d78562d4a51a501651f837c26cb9d91624f",
|
||||
"reference": "4b252d78562d4a51a501651f837c26cb9d91624f",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -937,7 +869,6 @@
|
||||
"ext-mbstring": "*",
|
||||
"league/flysystem": "^1.0",
|
||||
"league/flysystem-cached-adapter": "^1.0",
|
||||
"opis/closure": "^3.1",
|
||||
"php": ">=7.1.0",
|
||||
"psr/container": "~1.0",
|
||||
"psr/log": "~1.0",
|
||||
@ -950,7 +881,7 @@
|
||||
"mockery/mockery": "^1.2",
|
||||
"phpunit/phpunit": "^7.0"
|
||||
},
|
||||
"time": "2020-06-26T16:03:10+00:00",
|
||||
"time": "2020-09-29T02:19:59+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@ -1139,17 +1070,17 @@
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-orm",
|
||||
"version": "v2.0.33",
|
||||
"version_normalized": "2.0.33.0",
|
||||
"version": "v2.0.34",
|
||||
"version_normalized": "2.0.34.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/think-orm.git",
|
||||
"reference": "35ca511a1e4d671b39f7afb4c887703c16ef6957"
|
||||
"reference": "57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/think-orm/zipball/35ca511a1e4d671b39f7afb4c887703c16ef6957",
|
||||
"reference": "35ca511a1e4d671b39f7afb4c887703c16ef6957",
|
||||
"url": "https://api.github.com/repos/top-think/think-orm/zipball/57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629",
|
||||
"reference": "57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -1165,7 +1096,7 @@
|
||||
"psr/simple-cache": "^1.0",
|
||||
"topthink/think-helper": "^3.1"
|
||||
},
|
||||
"time": "2020-06-22T14:57:28+00:00",
|
||||
"time": "2020-09-28T08:24:57+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@ -1237,17 +1168,17 @@
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-trace",
|
||||
"version": "v1.3",
|
||||
"version_normalized": "1.3.0.0",
|
||||
"version": "v1.4",
|
||||
"version_normalized": "1.4.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/think-trace.git",
|
||||
"reference": "d8da2e39df268ab8775013de699f0c3012e51318"
|
||||
"reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/think-trace/zipball/d8da2e39df268ab8775013de699f0c3012e51318",
|
||||
"reference": "d8da2e39df268ab8775013de699f0c3012e51318",
|
||||
"url": "https://api.github.com/repos/top-think/think-trace/zipball/9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
|
||||
"reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@ -1260,7 +1191,7 @@
|
||||
"php": ">=7.1.0",
|
||||
"topthink/framework": "^6.0.0"
|
||||
},
|
||||
"time": "2020-03-18T07:59:53+00:00",
|
||||
"time": "2020-06-29T05:27:28+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"think": {
|
||||
|
@ -181,6 +181,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap
|
||||
'dart' => 'application/vnd.dart',
|
||||
'dataless' => 'application/vnd.fdsn.seed',
|
||||
'davmount' => 'application/davmount+xml',
|
||||
'dbf' => 'application/vnd.dbf',
|
||||
'dbk' => 'application/docbook+xml',
|
||||
'dcr' => 'application/x-director',
|
||||
'dcurl' => 'text/vnd.curl.dcurl',
|
||||
@ -468,6 +469,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap
|
||||
'ksp' => 'application/vnd.kde.kspread',
|
||||
'ktr' => 'application/vnd.kahootz',
|
||||
'ktx' => 'image/ktx',
|
||||
'ktx2' => 'image/ktx2',
|
||||
'ktz' => 'application/vnd.kahootz',
|
||||
'kwd' => 'application/vnd.kde.kword',
|
||||
'kwt' => 'application/vnd.kde.kword',
|
||||
|
43
vendor/opis/closure/.github/workflows/tests.yml
vendored
43
vendor/opis/closure/.github/workflows/tests.yml
vendored
@ -1,43 +0,0 @@
|
||||
name: "Tests"
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
php: [5.4, 5.5, 5.6, 7.0, 7.1, 7.2, 7.3, 7.4]
|
||||
stability: [prefer-stable]
|
||||
|
||||
name: PHP ${{ matrix.php }}
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.composer/cache/files
|
||||
key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
coverage: none
|
||||
|
||||
- name: Update composer
|
||||
run: composer self-update
|
||||
|
||||
- name: Install dependencies
|
||||
run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-progress
|
||||
|
||||
- name: Execute tests
|
||||
run: vendor/bin/phpunit --verbose
|
247
vendor/opis/closure/CHANGELOG.md
vendored
247
vendor/opis/closure/CHANGELOG.md
vendored
@ -1,247 +0,0 @@
|
||||
CHANGELOG
|
||||
---------
|
||||
### v3.5.7, 2020.09.06
|
||||
|
||||
- Fixed issue [#76](https://github.com/opis/closure/issues/76).
|
||||
- Fixed issue [#78](https://github.com/opis/closure/issues/78).
|
||||
|
||||
### v3.5.6, 2020.08.11
|
||||
|
||||
- Fixed issue [#70](https://github.com/opis/closure/issues/70)
|
||||
|
||||
### v3.5.5, 2020.06.17
|
||||
|
||||
- Fixed a false-positive when using `Opis\Closure\ReflectionClosure::isScopeRequired` method
|
||||
|
||||
### v3.5.4, 2020.06.07
|
||||
|
||||
- Fixed a false-positive when using `Opis\Closure\ReflectionClosure::isScopeRequired` method
|
||||
- Fixed a bug related to `T_STRING_VARNAME`
|
||||
|
||||
### v3.5.3, 2020.05.25
|
||||
|
||||
- Improved parser
|
||||
- The class scope optimisation is no longer used. We always bind now to the closure's original class scope.
|
||||
When the class scope was `null`, the optimisation failed to work as expected and kept the wrong `SerializableClosure` scope.
|
||||
|
||||
### v3.5.2, 2020.05.21
|
||||
|
||||
- Removed extra semicolon in short closures, since is not part of the closure's body.
|
||||
|
||||
### v3.5.1, 2019.11.30
|
||||
|
||||
- Bugfix. See #47
|
||||
|
||||
### v3.5.0, 2019.11.29
|
||||
|
||||
- Added support for short closures (arrow functions)
|
||||
- Added `isShortClosure` method to `Opis\Closure\ReflectionClosure`
|
||||
|
||||
### v3.4.2, 2019.11.29
|
||||
|
||||
- Added `stream_set_option()`
|
||||
|
||||
### v3.4.1, 2019.10.19
|
||||
|
||||
- Fixed a [bug](https://github.com/opis/closure/issues/40) that prevented serialization to work correctly.
|
||||
|
||||
### v3.4.0, 2019.09.03
|
||||
|
||||
- Added `createClosure` static method in `Opis\Closure\SerializableClosure`.
|
||||
This method creates a new closure from arbitrary code, emulating `create_function`,
|
||||
but without using eval
|
||||
|
||||
### v3.3.1, 2019.07.10
|
||||
|
||||
- Use `sha1` instead of `md5` for hashing file names in `Opis\Closure\ReflectionClosure` class
|
||||
|
||||
### v3.3.0, 2019.05.31
|
||||
|
||||
- Fixed a bug that prevented signed closures to properly work when the serialized string
|
||||
contains invalid UTF-8 chars. Starting with this version `json_encode` is no longer used
|
||||
when signing a closure. Backward compatibility is maintained and all closures that were
|
||||
previously signed using the old method will continue to work.
|
||||
|
||||
### v3.2.0, 2019.05.05
|
||||
|
||||
- Since an unsigned closure can be unserialized when no security provider is set,
|
||||
there is no reason to treat differently a signed closure in the same situation.
|
||||
Therefore, the `Opis\Closure\SecurityException` exception is no longer thrown when
|
||||
unserializing a signed closure, if no security provider is set.
|
||||
|
||||
### v3.1.6, 2019.02.22
|
||||
|
||||
- Fixed a bug that occurred when trying to set properties of classes that were not defined in user-land.
|
||||
Those properties are now ignored.
|
||||
|
||||
### v3.1.5, 2019.01.14
|
||||
|
||||
- Improved parser
|
||||
|
||||
### v3.1.4, 2019.01.14
|
||||
|
||||
- Added support for static methods that are named using PHP keywords or magic constants.
|
||||
Ex: `A::new()`, `A::use()`, `A::if()`, `A::function()`, `A::__DIR__()`, etc.
|
||||
- Used `@internal` to mark classes & methods that are for internal use only and
|
||||
backward compatibility is not guaranteed.
|
||||
|
||||
### v3.1.3, 2019.01.07
|
||||
|
||||
- Fixed a bug that prevented traits to be correctly resolved when used by an
|
||||
anonymous class
|
||||
- Fixed a bug that occurred when `$this` keyword was used inside an anonymous class
|
||||
|
||||
### v3.1.2, 2018.12.16
|
||||
|
||||
* Fixed a bug regarding comma trail in group-use statements. See [issue 23](https://github.com/opis/closure/issues/23)
|
||||
|
||||
### v3.1.1, 2018.10.02
|
||||
|
||||
* Fixed a bug where `parent` keyword was treated like a class-name and scope was not added to the
|
||||
serialized closure
|
||||
* Fixed a bug where return type was not properly handled for nested closures
|
||||
* Support for anonymous classes was improved
|
||||
|
||||
### v3.1.0, 2018.09.20
|
||||
|
||||
* Added `transformUseVariables` and `resolveUseVariables` to
|
||||
`Opis\Closure\SerializableClosure` class.
|
||||
* Added `removeSecurityProvider` static method to
|
||||
`Opis\Closure\SerializableClosure` class.
|
||||
* Fixed some security related issues where a user was able to unserialize an unsigned
|
||||
closure, even when a security provider was in use.
|
||||
|
||||
### v3.0.12, 2018.02.23
|
||||
|
||||
* Bugfix. See [issue 20](https://github.com/opis/closure/issues/20)
|
||||
|
||||
### v3.0.11, 2018.01.22
|
||||
|
||||
* Bugfix. See [issue 18](https://github.com/opis/closure/issues/18)
|
||||
|
||||
### v3.0.10, 2018.01.04
|
||||
|
||||
* Improved support for PHP 7.1 & 7.2
|
||||
|
||||
### v3.0.9, 2018.01.04
|
||||
|
||||
* Fixed a bug where the return type was not properly resolved.
|
||||
See [issue 17](https://github.com/opis/closure/issues/17)
|
||||
* Added more tests
|
||||
|
||||
### v3.0.8, 2017.12.18
|
||||
|
||||
* Fixed a bug. See [issue 16](https://github.com/opis/closure/issues/16)
|
||||
|
||||
### v3.0.7, 2017.10.31
|
||||
|
||||
* Bugfix: static properties are ignored now, since they are not serializable
|
||||
|
||||
### v3.0.6, 2017.10.06
|
||||
|
||||
* Fixed a bug introduced by accident in 3.0.5
|
||||
|
||||
### v3.0.5, 2017.09.18
|
||||
|
||||
* Fixed a bug related to nested references
|
||||
|
||||
### v3.0.4, 2017.09.18
|
||||
|
||||
* \[*internal*\] Refactored `SerializableClosure::mapPointers` method
|
||||
* \[*internal*\] Added a new optional argument to `SerializableClosure::unwrapClosures`
|
||||
* \[*internal*\] Removed `SerializableClosure::getClosurePointer` method
|
||||
* Fixed various bugs
|
||||
|
||||
### v3.0.3, 2017.09.06
|
||||
|
||||
* Fixed a bug related to nested object references
|
||||
* \[*internal*\] `Opis\Closure\ClosureScope` now extends `SplObjectStorage`
|
||||
* \[*internal*\] The `storage` property was removed from `Opis\Closure\ClosureScope`
|
||||
* \[*internal*\] The `instances` and `objects` properties were removed from `Opis\Closure\ClosureContext`
|
||||
|
||||
### v3.0.2, 2017.08.28
|
||||
|
||||
* Fixed a bug where `$this` object was not handled properly inside the
|
||||
`SerializableClosre::serialize` method.
|
||||
|
||||
### v3.0.1, 2017.04.13
|
||||
|
||||
* Fixed a bug in 'ignore_next' state
|
||||
|
||||
### v3.0.0, 2017.04.07
|
||||
|
||||
* Dropped PHP 5.3 support
|
||||
* Moved source files from `lib` to `src` folder
|
||||
* Removed second parameter from `Opis\Closure\SerializableClosure::from` method and from constructor
|
||||
* Removed `Opis\Closure\{SecurityProviderInterface, DefaultSecurityProvider, SecureClosure}` classes
|
||||
* Refactored how signed closures were handled
|
||||
* Added `wrapClosures` and `unwrapClosures` static methods to `Opis\Closure\SerializableClosure` class
|
||||
* Added `Opis\Colosure\serialize` and `Opis\Closure\unserialize` functions
|
||||
* Improved serialization. You can now serialize arbitrary objects and the library will automatically wrap all closures
|
||||
|
||||
### v2.4.0, 2016.12.16
|
||||
|
||||
* The parser was refactored and improved
|
||||
* Refactored `Opis\Closure\SerializableClosure::__invoke` method
|
||||
* `Opis\Closure\{ISecurityProvider, SecurityProvider}` were added
|
||||
* `Opis\Closure\{SecurityProviderInterface, DefaultSecurityProvider, SecureClosure}` were deprecated
|
||||
and they will be removed in the next major version
|
||||
* `setSecretKey` and `addSecurityProvider` static methods were added to `Opis\Closure\SerializableClosure`
|
||||
|
||||
### v2.3.2, 2016.12.15
|
||||
|
||||
* Fixed a bug that prevented namespace resolution to be done properly
|
||||
|
||||
### v2.3.1, 2016.12.13
|
||||
|
||||
* Hotfix. See [PR](https://github.com/opis/closure/pull/7)
|
||||
|
||||
### v2.3.0, 2016.11.17
|
||||
|
||||
* Added `isBindingRequired` and `isScopeRequired` to the `Opis\Closure\ReflectionClosure` class
|
||||
* Automatically detects when the scope and/or the bound object of a closure needs to be serialized.
|
||||
|
||||
### v2.2.1, 2016.08.20
|
||||
|
||||
* Fixed a bug in `Opis\Closure\ReflectionClosure::fetchItems`
|
||||
|
||||
### v2.2.0, 2016.07.26
|
||||
|
||||
* Fixed CS
|
||||
* `Opis\Closure\ClosureContext`, `Opis\Closure\ClosureScope`, `Opis\Closure\SelfReference`
|
||||
and `Opis\Closure\SecurityException` classes were moved into separate files
|
||||
* Added support for PHP7 syntax
|
||||
* Fixed some bugs in `Opis\Closure\ReflectionClosure` class
|
||||
* Improved closure parser
|
||||
* Added an analyzer for SuperClosure library
|
||||
|
||||
### v2.1.0, 2015.09.30
|
||||
|
||||
* Added support for the missing `__METHOD__`, `__FUNCTION__` and `__TRAIT__` magic constants
|
||||
* Added some security related classes and interfaces: `Opis\Closure\SecurityProviderInterface`,
|
||||
`Opis\Closure\DefaultSecurityProvider`, `Opis\Closure\SecureClosure`, `Opis\Closure\SecurityException`.
|
||||
* Fiexed a bug in `Opis\Closure\ReflectionClosure::getClasses` method
|
||||
* Other minor bugfixes
|
||||
* Added support for static closures
|
||||
* Added public `isStatic` method to `Opis\Closure\ReflectionClosure` class
|
||||
|
||||
|
||||
### v2.0.1, 2015.09.23
|
||||
|
||||
* Removed `branch-alias` property from `composer.json`
|
||||
* Bugfix. See [issue #6](https://github.com/opis/closure/issues/6)
|
||||
|
||||
### v2.0.0, 2015.07.31
|
||||
|
||||
* The closure parser was improved
|
||||
* Class names are now automatically resolved
|
||||
* Added support for the `#trackme` directive which allows tracking closure's residing source
|
||||
|
||||
### v1.3.0, 2014.10.18
|
||||
|
||||
* Added autoload file
|
||||
* Changed README file
|
||||
|
||||
### Opis Closure 1.2.2
|
||||
|
||||
* Started changelog
|
20
vendor/opis/closure/LICENSE
vendored
20
vendor/opis/closure/LICENSE
vendored
@ -1,20 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018-2019 Zindex Software
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
vendor/opis/closure/NOTICE
vendored
9
vendor/opis/closure/NOTICE
vendored
@ -1,9 +0,0 @@
|
||||
Opis Closure
|
||||
Copyright 2018-2019 Zindex Software
|
||||
|
||||
This product includes software developed at
|
||||
Zindex Software (http://zindex.software).
|
||||
|
||||
This software was originally developed by Marius Sarca and Sorin Sarca
|
||||
(Copyright 2014-2018). The copyright info was changed with the permission
|
||||
of the original authors.
|
92
vendor/opis/closure/README.md
vendored
92
vendor/opis/closure/README.md
vendored
@ -1,92 +0,0 @@
|
||||
Opis Closure
|
||||
====================
|
||||
[](https://github.com/opis/closure/actions)
|
||||
[](https://packagist.org/packages/opis/closure)
|
||||
[](https://packagist.org/packages/opis/closure)
|
||||
[](https://packagist.org/packages/opis/closure)
|
||||
|
||||
Serializable closures
|
||||
---------------------
|
||||
**Opis Closure** is a library that aims to overcome PHP's limitations regarding closure
|
||||
serialization by providing a wrapper that will make all closures serializable.
|
||||
|
||||
**The library's key features:**
|
||||
|
||||
- Serialize any closure
|
||||
- Serialize arbitrary objects
|
||||
- Doesn't use `eval` for closure serialization or unserialization
|
||||
- Works with any PHP version that has support for closures
|
||||
- Supports PHP 7 syntax
|
||||
- Handles all variables referenced/imported in `use()` and automatically wraps all referenced/imported closures for
|
||||
proper serialization
|
||||
- Handles recursive closures
|
||||
- Handles magic constants like `__FILE__`, `__DIR__`, `__LINE__`, `__NAMESPACE__`, `__CLASS__`,
|
||||
`__TRAIT__`, `__METHOD__` and `__FUNCTION__`.
|
||||
- Automatically resolves all class names, function names and constant names used inside the closure
|
||||
- Track closure's residing source by using the `#trackme` directive
|
||||
- Simple and very fast parser
|
||||
- Any error or exception, that might occur when executing an unserialized closure, can be caught and treated properly
|
||||
- You can serialize/unserialize any closure unlimited times, even those previously unserialized
|
||||
(this is possible because `eval()` is not used for unserialization)
|
||||
- Handles static closures
|
||||
- Supports cryptographically signed closures
|
||||
- Provides a reflector that can give you information about the serialized closure
|
||||
- Provides an analyzer for *SuperClosure* library
|
||||
- Automatically detects when the scope and/or the bound object of a closure needs to be serialized
|
||||
in order for the closure to work after deserialization
|
||||
|
||||
## Documentation
|
||||
|
||||
The full documentation for this library can be found [here][documentation].
|
||||
|
||||
## License
|
||||
|
||||
**Opis Closure** is licensed under the [MIT License (MIT)][license].
|
||||
|
||||
## Requirements
|
||||
|
||||
* PHP ^5.4 || ^7.0
|
||||
|
||||
## Installation
|
||||
|
||||
**Opis Closure** is available on [Packagist] and it can be installed from a
|
||||
command line interface by using [Composer].
|
||||
|
||||
```bash
|
||||
composer require opis/closure
|
||||
```
|
||||
|
||||
Or you could directly reference it into your `composer.json` file as a dependency
|
||||
|
||||
```json
|
||||
{
|
||||
"require": {
|
||||
"opis/closure": "^3.5"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Migrating from 2.x
|
||||
|
||||
If your project needs to support PHP 5.3 you can continue using the `2.x` version
|
||||
of **Opis Closure**. Otherwise, assuming you are not using one of the removed/refactored classes or features(see
|
||||
[CHANGELOG]), migrating to version `3.x` is simply a matter of updating your `composer.json` file.
|
||||
|
||||
### Semantic versioning
|
||||
|
||||
**Opis Closure** follows [semantic versioning][SemVer] specifications.
|
||||
|
||||
### Arbitrary object serialization
|
||||
|
||||
We've added this feature in order to be able to support the serialization of a closure's bound object.
|
||||
The implementation is far from being perfect, and it's really hard to make it work flawless.
|
||||
We will try to improve this, but we can't guarantee anything.
|
||||
So our advice regarding the `Opis\Closure\serialize|unserialize` functions is to use them with caution.
|
||||
|
||||
|
||||
[documentation]: https://www.opis.io/closure "Opis Closure"
|
||||
[license]: http://opensource.org/licenses/MIT "MIT License"
|
||||
[Packagist]: https://packagist.org/packages/opis/closure "Packagist"
|
||||
[Composer]: https://getcomposer.org "Composer"
|
||||
[SemVer]: http://semver.org/ "Semantic versioning"
|
||||
[CHANGELOG]: https://github.com/opis/closure/blob/master/CHANGELOG.md "Changelog"
|
39
vendor/opis/closure/autoload.php
vendored
39
vendor/opis/closure/autoload.php
vendored
@ -1,39 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
require_once 'functions.php';
|
||||
|
||||
spl_autoload_register(function($class){
|
||||
|
||||
$class = ltrim($class, '\\');
|
||||
$dir = __DIR__ . '/src';
|
||||
$namespace = 'Opis\Closure';
|
||||
|
||||
if(strpos($class, $namespace) === 0)
|
||||
{
|
||||
$class = substr($class, strlen($namespace));
|
||||
$path = '';
|
||||
if(($pos = strripos($class, '\\')) !== FALSE)
|
||||
{
|
||||
$path = str_replace('\\', '/', substr($class, 0, $pos)) . '/';
|
||||
$class = substr($class, $pos + 1);
|
||||
}
|
||||
$path .= str_replace('_', '/', $class) . '.php';
|
||||
$dir .= '/' . $path;
|
||||
|
||||
if(file_exists($dir))
|
||||
{
|
||||
include $dir;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
});
|
40
vendor/opis/closure/composer.json
vendored
40
vendor/opis/closure/composer.json
vendored
@ -1,40 +0,0 @@
|
||||
{
|
||||
"name": "opis/closure",
|
||||
"description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
|
||||
"keywords": ["closure", "serialization", "function", "serializable", "serialize", "anonymous functions"],
|
||||
"homepage": "https://opis.io/closure",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Marius Sarca",
|
||||
"email": "marius.sarca@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Sorin Sarca",
|
||||
"email": "sarca_sorin@hotmail.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^5.4 || ^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"jeremeamia/superclosure": "^2.0",
|
||||
"phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Opis\\Closure\\": "src/"
|
||||
},
|
||||
"files": ["functions.php"]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Opis\\Closure\\Test\\": "tests/"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.5.x-dev"
|
||||
}
|
||||
}
|
||||
}
|
41
vendor/opis/closure/functions.php
vendored
41
vendor/opis/closure/functions.php
vendored
@ -1,41 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
/**
|
||||
* Serialize
|
||||
*
|
||||
* @param mixed $data
|
||||
* @return string
|
||||
*/
|
||||
function serialize($data)
|
||||
{
|
||||
SerializableClosure::enterContext();
|
||||
SerializableClosure::wrapClosures($data);
|
||||
$data = \serialize($data);
|
||||
SerializableClosure::exitContext();
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unserialize
|
||||
*
|
||||
* @param string $data
|
||||
* @param array|null $options
|
||||
* @return mixed
|
||||
*/
|
||||
function unserialize($data, array $options = null)
|
||||
{
|
||||
SerializableClosure::enterContext();
|
||||
$data = ($options === null || \PHP_MAJOR_VERSION < 7)
|
||||
? \unserialize($data)
|
||||
: \unserialize($data, $options);
|
||||
SerializableClosure::unwrapClosures($data);
|
||||
SerializableClosure::exitContext();
|
||||
return $data;
|
||||
}
|
62
vendor/opis/closure/src/Analyzer.php
vendored
62
vendor/opis/closure/src/Analyzer.php
vendored
@ -1,62 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
use Closure;
|
||||
use SuperClosure\Analyzer\ClosureAnalyzer;
|
||||
|
||||
/**
|
||||
* @deprecated We'll remove this class
|
||||
*/
|
||||
class Analyzer extends ClosureAnalyzer
|
||||
{
|
||||
/**
|
||||
* Analyzer a given closure.
|
||||
*
|
||||
* @param Closure $closure
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function analyze(Closure $closure)
|
||||
{
|
||||
$reflection = new ReflectionClosure($closure);
|
||||
$scope = $reflection->getClosureScopeClass();
|
||||
|
||||
$data = [
|
||||
'reflection' => $reflection,
|
||||
'code' => $reflection->getCode(),
|
||||
'hasThis' => $reflection->isBindingRequired(),
|
||||
'context' => $reflection->getUseVariables(),
|
||||
'hasRefs' => false,
|
||||
'binding' => $reflection->getClosureThis(),
|
||||
'scope' => $scope ? $scope->getName() : null,
|
||||
'isStatic' => $reflection->isStatic(),
|
||||
];
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @return mixed
|
||||
*/
|
||||
protected function determineCode(array &$data)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @return mixed
|
||||
*/
|
||||
protected function determineContext(array &$data)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
34
vendor/opis/closure/src/ClosureContext.php
vendored
34
vendor/opis/closure/src/ClosureContext.php
vendored
@ -1,34 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
/**
|
||||
* Closure context class
|
||||
* @internal
|
||||
*/
|
||||
class ClosureContext
|
||||
{
|
||||
/**
|
||||
* @var ClosureScope Closures scope
|
||||
*/
|
||||
public $scope;
|
||||
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
public $locks;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->scope = new ClosureScope();
|
||||
$this->locks = 0;
|
||||
}
|
||||
}
|
25
vendor/opis/closure/src/ClosureScope.php
vendored
25
vendor/opis/closure/src/ClosureScope.php
vendored
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
/**
|
||||
* Closure scope class
|
||||
* @internal
|
||||
*/
|
||||
class ClosureScope extends \SplObjectStorage
|
||||
{
|
||||
/**
|
||||
* @var integer Number of serializations in current scope
|
||||
*/
|
||||
public $serializations = 0;
|
||||
|
||||
/**
|
||||
* @var integer Number of closures that have to be serialized
|
||||
*/
|
||||
public $toserialize = 0;
|
||||
}
|
99
vendor/opis/closure/src/ClosureStream.php
vendored
99
vendor/opis/closure/src/ClosureStream.php
vendored
@ -1,99 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class ClosureStream
|
||||
{
|
||||
const STREAM_PROTO = 'closure';
|
||||
|
||||
protected static $isRegistered = false;
|
||||
|
||||
protected $content;
|
||||
|
||||
protected $length;
|
||||
|
||||
protected $pointer = 0;
|
||||
|
||||
function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
$this->content = "<?php\nreturn " . substr($path, strlen(static::STREAM_PROTO . '://')) . ";";
|
||||
$this->length = strlen($this->content);
|
||||
return true;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$value = substr($this->content, $this->pointer, $count);
|
||||
$this->pointer += $count;
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return $this->pointer >= $this->length;
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
$stat = stat(__FILE__);
|
||||
$stat[7] = $stat['size'] = $this->length;
|
||||
return $stat;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$stat = stat(__FILE__);
|
||||
$stat[7] = $stat['size'] = $this->length;
|
||||
return $stat;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence = SEEK_SET)
|
||||
{
|
||||
$crt = $this->pointer;
|
||||
|
||||
switch ($whence) {
|
||||
case SEEK_SET:
|
||||
$this->pointer = $offset;
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
$this->pointer += $offset;
|
||||
break;
|
||||
case SEEK_END:
|
||||
$this->pointer = $this->length + $offset;
|
||||
break;
|
||||
}
|
||||
|
||||
if ($this->pointer < 0 || $this->pointer >= $this->length) {
|
||||
$this->pointer = $crt;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->pointer;
|
||||
}
|
||||
|
||||
public static function register()
|
||||
{
|
||||
if (!static::$isRegistered) {
|
||||
static::$isRegistered = stream_wrapper_register(static::STREAM_PROTO, __CLASS__);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
25
vendor/opis/closure/src/ISecurityProvider.php
vendored
25
vendor/opis/closure/src/ISecurityProvider.php
vendored
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
interface ISecurityProvider
|
||||
{
|
||||
/**
|
||||
* Sign serialized closure
|
||||
* @param string $closure
|
||||
* @return array
|
||||
*/
|
||||
public function sign($closure);
|
||||
|
||||
/**
|
||||
* Verify signature
|
||||
* @param array $data
|
||||
* @return bool
|
||||
*/
|
||||
public function verify(array $data);
|
||||
}
|
1042
vendor/opis/closure/src/ReflectionClosure.php
vendored
1042
vendor/opis/closure/src/ReflectionClosure.php
vendored
File diff suppressed because it is too large
Load Diff
18
vendor/opis/closure/src/SecurityException.php
vendored
18
vendor/opis/closure/src/SecurityException.php
vendored
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* Security exception class
|
||||
*/
|
||||
class SecurityException extends Exception
|
||||
{
|
||||
|
||||
}
|
42
vendor/opis/closure/src/SecurityProvider.php
vendored
42
vendor/opis/closure/src/SecurityProvider.php
vendored
@ -1,42 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
class SecurityProvider implements ISecurityProvider
|
||||
{
|
||||
/** @var string */
|
||||
protected $secret;
|
||||
|
||||
/**
|
||||
* SecurityProvider constructor.
|
||||
* @param string $secret
|
||||
*/
|
||||
public function __construct($secret)
|
||||
{
|
||||
$this->secret = $secret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function sign($closure)
|
||||
{
|
||||
return array(
|
||||
'closure' => $closure,
|
||||
'hash' => base64_encode(hash_hmac('sha256', $closure, $this->secret, true)),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function verify(array $data)
|
||||
{
|
||||
return base64_encode(hash_hmac('sha256', $data['closure'], $this->secret, true)) === $data['hash'];
|
||||
}
|
||||
}
|
31
vendor/opis/closure/src/SelfReference.php
vendored
31
vendor/opis/closure/src/SelfReference.php
vendored
@ -1,31 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
|
||||
/**
|
||||
* Helper class used to indicate a reference to an object
|
||||
* @internal
|
||||
*/
|
||||
class SelfReference
|
||||
{
|
||||
/**
|
||||
* @var string An unique hash representing the object
|
||||
*/
|
||||
public $hash;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $hash
|
||||
*/
|
||||
public function __construct($hash)
|
||||
{
|
||||
$this->hash = $hash;
|
||||
}
|
||||
}
|
678
vendor/opis/closure/src/SerializableClosure.php
vendored
678
vendor/opis/closure/src/SerializableClosure.php
vendored
@ -1,678 +0,0 @@
|
||||
<?php
|
||||
/* ===========================================================================
|
||||
* Copyright (c) 2018-2019 Zindex Software
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
* =========================================================================== */
|
||||
|
||||
namespace Opis\Closure;
|
||||
|
||||
use Closure;
|
||||
use Serializable;
|
||||
use SplObjectStorage;
|
||||
use ReflectionObject;
|
||||
|
||||
/**
|
||||
* Provides a wrapper for serialization of closures
|
||||
*/
|
||||
class SerializableClosure implements Serializable
|
||||
{
|
||||
/**
|
||||
* @var Closure Wrapped closure
|
||||
*
|
||||
* @see \Opis\Closure\SerializableClosure::getClosure()
|
||||
*/
|
||||
protected $closure;
|
||||
|
||||
/**
|
||||
* @var ReflectionClosure A reflection instance for closure
|
||||
*
|
||||
* @see \Opis\Closure\SerializableClosure::getReflector()
|
||||
*/
|
||||
protected $reflector;
|
||||
|
||||
/**
|
||||
* @var mixed Used at deserialization to hold variables
|
||||
*
|
||||
* @see \Opis\Closure\SerializableClosure::unserialize()
|
||||
* @see \Opis\Closure\SerializableClosure::getReflector()
|
||||
*/
|
||||
protected $code;
|
||||
|
||||
/**
|
||||
* @var string Closure's ID
|
||||
*/
|
||||
protected $reference;
|
||||
|
||||
/**
|
||||
* @var string Closure scope
|
||||
*/
|
||||
protected $scope;
|
||||
|
||||
/**
|
||||
* @var ClosureContext Context of closure, used in serialization
|
||||
*/
|
||||
protected static $context;
|
||||
|
||||
/**
|
||||
* @var ISecurityProvider|null
|
||||
*/
|
||||
protected static $securityProvider;
|
||||
|
||||
/** Array recursive constant*/
|
||||
const ARRAY_RECURSIVE_KEY = '¯\_(ツ)_/¯';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Closure $closure Closure you want to serialize
|
||||
*/
|
||||
public function __construct(Closure $closure)
|
||||
{
|
||||
$this->closure = $closure;
|
||||
if (static::$context !== null) {
|
||||
$this->scope = static::$context->scope;
|
||||
$this->scope->toserialize++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Closure object
|
||||
*
|
||||
* @return Closure The wrapped closure
|
||||
*/
|
||||
public function getClosure()
|
||||
{
|
||||
return $this->closure;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the reflector for closure
|
||||
*
|
||||
* @return ReflectionClosure
|
||||
*/
|
||||
public function getReflector()
|
||||
{
|
||||
if ($this->reflector === null) {
|
||||
$this->reflector = new ReflectionClosure($this->closure, $this->code);
|
||||
$this->code = null;
|
||||
}
|
||||
|
||||
return $this->reflector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of magic method __invoke()
|
||||
*/
|
||||
public function __invoke()
|
||||
{
|
||||
return call_user_func_array($this->closure, func_get_args());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of Serializable::serialize()
|
||||
*
|
||||
* @return string The serialized closure
|
||||
*/
|
||||
public function serialize()
|
||||
{
|
||||
if ($this->scope === null) {
|
||||
$this->scope = new ClosureScope();
|
||||
$this->scope->toserialize++;
|
||||
}
|
||||
|
||||
$this->scope->serializations++;
|
||||
|
||||
$scope = $object = null;
|
||||
$reflector = $this->getReflector();
|
||||
|
||||
if($reflector->isBindingRequired()){
|
||||
$object = $reflector->getClosureThis();
|
||||
static::wrapClosures($object, $this->scope);
|
||||
if($scope = $reflector->getClosureScopeClass()){
|
||||
$scope = $scope->name;
|
||||
}
|
||||
} else {
|
||||
if($scope = $reflector->getClosureScopeClass()){
|
||||
$scope = $scope->name;
|
||||
}
|
||||
}
|
||||
|
||||
$this->reference = spl_object_hash($this->closure);
|
||||
|
||||
$this->scope[$this->closure] = $this;
|
||||
|
||||
$use = $this->transformUseVariables($reflector->getUseVariables());
|
||||
$code = $reflector->getCode();
|
||||
|
||||
$this->mapByReference($use);
|
||||
|
||||
$ret = \serialize(array(
|
||||
'use' => $use,
|
||||
'function' => $code,
|
||||
'scope' => $scope,
|
||||
'this' => $object,
|
||||
'self' => $this->reference,
|
||||
));
|
||||
|
||||
if (static::$securityProvider !== null) {
|
||||
$data = static::$securityProvider->sign($ret);
|
||||
$ret = '@' . $data['hash'] . '.' . $data['closure'];
|
||||
}
|
||||
|
||||
if (!--$this->scope->serializations && !--$this->scope->toserialize) {
|
||||
$this->scope = null;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform the use variables before serialization.
|
||||
*
|
||||
* @param array $data The Closure's use variables
|
||||
* @return array
|
||||
*/
|
||||
protected function transformUseVariables($data)
|
||||
{
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of Serializable::unserialize()
|
||||
*
|
||||
* @param string $data Serialized data
|
||||
* @throws SecurityException
|
||||
*/
|
||||
public function unserialize($data)
|
||||
{
|
||||
ClosureStream::register();
|
||||
|
||||
if (static::$securityProvider !== null) {
|
||||
if ($data[0] !== '@') {
|
||||
throw new SecurityException("The serialized closure is not signed. ".
|
||||
"Make sure you use a security provider for both serialization and unserialization.");
|
||||
}
|
||||
|
||||
if ($data[1] !== '{') {
|
||||
$separator = strpos($data, '.');
|
||||
if ($separator === false) {
|
||||
throw new SecurityException('Invalid signed closure');
|
||||
}
|
||||
$hash = substr($data, 1, $separator - 1);
|
||||
$closure = substr($data, $separator + 1);
|
||||
|
||||
$data = ['hash' => $hash, 'closure' => $closure];
|
||||
|
||||
unset($hash, $closure);
|
||||
} else {
|
||||
$data = json_decode(substr($data, 1), true);
|
||||
}
|
||||
|
||||
if (!is_array($data) || !static::$securityProvider->verify($data)) {
|
||||
throw new SecurityException("Your serialized closure might have been modified and it's unsafe to be unserialized. " .
|
||||
"Make sure you use the same security provider, with the same settings, " .
|
||||
"both for serialization and unserialization.");
|
||||
}
|
||||
|
||||
$data = $data['closure'];
|
||||
} elseif ($data[0] === '@') {
|
||||
if ($data[1] !== '{') {
|
||||
$separator = strpos($data, '.');
|
||||
if ($separator === false) {
|
||||
throw new SecurityException('Invalid signed closure');
|
||||
}
|
||||
$hash = substr($data, 1, $separator - 1);
|
||||
$closure = substr($data, $separator + 1);
|
||||
|
||||
$data = ['hash' => $hash, 'closure' => $closure];
|
||||
|
||||
unset($hash, $closure);
|
||||
} else {
|
||||
$data = json_decode(substr($data, 1), true);
|
||||
}
|
||||
|
||||
if (!is_array($data) || !isset($data['closure']) || !isset($data['hash'])) {
|
||||
throw new SecurityException('Invalid signed closure');
|
||||
}
|
||||
|
||||
$data = $data['closure'];
|
||||
}
|
||||
|
||||
$this->code = \unserialize($data);
|
||||
|
||||
// unset data
|
||||
unset($data);
|
||||
|
||||
$this->code['objects'] = array();
|
||||
|
||||
if ($this->code['use']) {
|
||||
$this->scope = new ClosureScope();
|
||||
$this->code['use'] = $this->resolveUseVariables($this->code['use']);
|
||||
$this->mapPointers($this->code['use']);
|
||||
extract($this->code['use'], EXTR_OVERWRITE | EXTR_REFS);
|
||||
$this->scope = null;
|
||||
}
|
||||
|
||||
$this->closure = include(ClosureStream::STREAM_PROTO . '://' . $this->code['function']);
|
||||
|
||||
if($this->code['this'] === $this){
|
||||
$this->code['this'] = null;
|
||||
}
|
||||
|
||||
$this->closure = $this->closure->bindTo($this->code['this'], $this->code['scope']);
|
||||
|
||||
if(!empty($this->code['objects'])){
|
||||
foreach ($this->code['objects'] as $item){
|
||||
$item['property']->setValue($item['instance'], $item['object']->getClosure());
|
||||
}
|
||||
}
|
||||
|
||||
$this->code = $this->code['function'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the use variables after unserialization.
|
||||
*
|
||||
* @param array $data The Closure's transformed use variables
|
||||
* @return array
|
||||
*/
|
||||
protected function resolveUseVariables($data)
|
||||
{
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a closure and sets the serialization context (if any)
|
||||
*
|
||||
* @param Closure $closure Closure to be wrapped
|
||||
*
|
||||
* @return self The wrapped closure
|
||||
*/
|
||||
public static function from(Closure $closure)
|
||||
{
|
||||
if (static::$context === null) {
|
||||
$instance = new static($closure);
|
||||
} elseif (isset(static::$context->scope[$closure])) {
|
||||
$instance = static::$context->scope[$closure];
|
||||
} else {
|
||||
$instance = new static($closure);
|
||||
static::$context->scope[$closure] = $instance;
|
||||
}
|
||||
|
||||
return $instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments the context lock counter or creates a new context if none exist
|
||||
*/
|
||||
public static function enterContext()
|
||||
{
|
||||
if (static::$context === null) {
|
||||
static::$context = new ClosureContext();
|
||||
}
|
||||
|
||||
static::$context->locks++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrements the context lock counter and destroy the context when it reaches to 0
|
||||
*/
|
||||
public static function exitContext()
|
||||
{
|
||||
if (static::$context !== null && !--static::$context->locks) {
|
||||
static::$context = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $secret
|
||||
*/
|
||||
public static function setSecretKey($secret)
|
||||
{
|
||||
if(static::$securityProvider === null){
|
||||
static::$securityProvider = new SecurityProvider($secret);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ISecurityProvider $securityProvider
|
||||
*/
|
||||
public static function addSecurityProvider(ISecurityProvider $securityProvider)
|
||||
{
|
||||
static::$securityProvider = $securityProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove security provider
|
||||
*/
|
||||
public static function removeSecurityProvider()
|
||||
{
|
||||
static::$securityProvider = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return null|ISecurityProvider
|
||||
*/
|
||||
public static function getSecurityProvider()
|
||||
{
|
||||
return static::$securityProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap closures
|
||||
*
|
||||
* @internal
|
||||
* @param $data
|
||||
* @param ClosureScope|SplObjectStorage|null $storage
|
||||
*/
|
||||
public static function wrapClosures(&$data, SplObjectStorage $storage = null)
|
||||
{
|
||||
if($storage === null){
|
||||
$storage = static::$context->scope;
|
||||
}
|
||||
|
||||
if($data instanceof Closure){
|
||||
$data = static::from($data);
|
||||
} elseif (is_array($data)){
|
||||
if(isset($data[self::ARRAY_RECURSIVE_KEY])){
|
||||
return;
|
||||
}
|
||||
$data[self::ARRAY_RECURSIVE_KEY] = true;
|
||||
foreach ($data as $key => &$value){
|
||||
if($key === self::ARRAY_RECURSIVE_KEY){
|
||||
continue;
|
||||
}
|
||||
static::wrapClosures($value, $storage);
|
||||
}
|
||||
unset($value);
|
||||
unset($data[self::ARRAY_RECURSIVE_KEY]);
|
||||
} elseif($data instanceof \stdClass){
|
||||
if(isset($storage[$data])){
|
||||
$data = $storage[$data];
|
||||
return;
|
||||
}
|
||||
$data = $storage[$data] = clone($data);
|
||||
foreach ($data as &$value){
|
||||
static::wrapClosures($value, $storage);
|
||||
}
|
||||
unset($value);
|
||||
} elseif (is_object($data) && ! $data instanceof static){
|
||||
if(isset($storage[$data])){
|
||||
$data = $storage[$data];
|
||||
return;
|
||||
}
|
||||
$instance = $data;
|
||||
$reflection = new ReflectionObject($instance);
|
||||
if(!$reflection->isUserDefined()){
|
||||
$storage[$instance] = $data;
|
||||
return;
|
||||
}
|
||||
$storage[$instance] = $data = $reflection->newInstanceWithoutConstructor();
|
||||
|
||||
do{
|
||||
if(!$reflection->isUserDefined()){
|
||||
break;
|
||||
}
|
||||
foreach ($reflection->getProperties() as $property){
|
||||
if($property->isStatic() || !$property->getDeclaringClass()->isUserDefined()){
|
||||
continue;
|
||||
}
|
||||
$property->setAccessible(true);
|
||||
if (PHP_VERSION >= 7.4 && !$property->isInitialized($instance)) {
|
||||
continue;
|
||||
}
|
||||
$value = $property->getValue($instance);
|
||||
if(is_array($value) || is_object($value)){
|
||||
static::wrapClosures($value, $storage);
|
||||
}
|
||||
$property->setValue($data, $value);
|
||||
};
|
||||
} while($reflection = $reflection->getParentClass());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unwrap closures
|
||||
*
|
||||
* @internal
|
||||
* @param $data
|
||||
* @param SplObjectStorage|null $storage
|
||||
*/
|
||||
public static function unwrapClosures(&$data, SplObjectStorage $storage = null)
|
||||
{
|
||||
if($storage === null){
|
||||
$storage = static::$context->scope;
|
||||
}
|
||||
|
||||
if($data instanceof static){
|
||||
$data = $data->getClosure();
|
||||
} elseif (is_array($data)){
|
||||
if(isset($data[self::ARRAY_RECURSIVE_KEY])){
|
||||
return;
|
||||
}
|
||||
$data[self::ARRAY_RECURSIVE_KEY] = true;
|
||||
foreach ($data as $key => &$value){
|
||||
if($key === self::ARRAY_RECURSIVE_KEY){
|
||||
continue;
|
||||
}
|
||||
static::unwrapClosures($value, $storage);
|
||||
}
|
||||
unset($data[self::ARRAY_RECURSIVE_KEY]);
|
||||
}elseif ($data instanceof \stdClass){
|
||||
if(isset($storage[$data])){
|
||||
return;
|
||||
}
|
||||
$storage[$data] = true;
|
||||
foreach ($data as &$property){
|
||||
static::unwrapClosures($property, $storage);
|
||||
}
|
||||
} elseif (is_object($data) && !($data instanceof Closure)){
|
||||
if(isset($storage[$data])){
|
||||
return;
|
||||
}
|
||||
$storage[$data] = true;
|
||||
$reflection = new ReflectionObject($data);
|
||||
|
||||
do{
|
||||
if(!$reflection->isUserDefined()){
|
||||
break;
|
||||
}
|
||||
foreach ($reflection->getProperties() as $property){
|
||||
if($property->isStatic() || !$property->getDeclaringClass()->isUserDefined()){
|
||||
continue;
|
||||
}
|
||||
$property->setAccessible(true);
|
||||
if (PHP_VERSION >= 7.4 && !$property->isInitialized($data)) {
|
||||
continue;
|
||||
}
|
||||
$value = $property->getValue($data);
|
||||
if(is_array($value) || is_object($value)){
|
||||
static::unwrapClosures($value, $storage);
|
||||
$property->setValue($data, $value);
|
||||
}
|
||||
};
|
||||
} while($reflection = $reflection->getParentClass());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new closure from arbitrary code,
|
||||
* emulating create_function, but without using eval
|
||||
*
|
||||
* @param string$args
|
||||
* @param string $code
|
||||
* @return Closure
|
||||
*/
|
||||
public static function createClosure($args, $code)
|
||||
{
|
||||
ClosureStream::register();
|
||||
return include(ClosureStream::STREAM_PROTO . '://function(' . $args. '){' . $code . '};');
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method used to map closure pointers
|
||||
* @internal
|
||||
* @param $data
|
||||
*/
|
||||
protected function mapPointers(&$data)
|
||||
{
|
||||
$scope = $this->scope;
|
||||
|
||||
if ($data instanceof static) {
|
||||
$data = &$data->closure;
|
||||
} elseif (is_array($data)) {
|
||||
if(isset($data[self::ARRAY_RECURSIVE_KEY])){
|
||||
return;
|
||||
}
|
||||
$data[self::ARRAY_RECURSIVE_KEY] = true;
|
||||
foreach ($data as $key => &$value){
|
||||
if($key === self::ARRAY_RECURSIVE_KEY){
|
||||
continue;
|
||||
} elseif ($value instanceof static) {
|
||||
$data[$key] = &$value->closure;
|
||||
} elseif ($value instanceof SelfReference && $value->hash === $this->code['self']){
|
||||
$data[$key] = &$this->closure;
|
||||
} else {
|
||||
$this->mapPointers($value);
|
||||
}
|
||||
}
|
||||
unset($value);
|
||||
unset($data[self::ARRAY_RECURSIVE_KEY]);
|
||||
} elseif ($data instanceof \stdClass) {
|
||||
if(isset($scope[$data])){
|
||||
return;
|
||||
}
|
||||
$scope[$data] = true;
|
||||
foreach ($data as $key => &$value){
|
||||
if ($value instanceof SelfReference && $value->hash === $this->code['self']){
|
||||
$data->{$key} = &$this->closure;
|
||||
} elseif(is_array($value) || is_object($value)) {
|
||||
$this->mapPointers($value);
|
||||
}
|
||||
}
|
||||
unset($value);
|
||||
} elseif (is_object($data) && !($data instanceof Closure)){
|
||||
if(isset($scope[$data])){
|
||||
return;
|
||||
}
|
||||
$scope[$data] = true;
|
||||
$reflection = new ReflectionObject($data);
|
||||
do{
|
||||
if(!$reflection->isUserDefined()){
|
||||
break;
|
||||
}
|
||||
foreach ($reflection->getProperties() as $property){
|
||||
if($property->isStatic() || !$property->getDeclaringClass()->isUserDefined()){
|
||||
continue;
|
||||
}
|
||||
$property->setAccessible(true);
|
||||
if (PHP_VERSION >= 7.4 && !$property->isInitialized($data)) {
|
||||
continue;
|
||||
}
|
||||
$item = $property->getValue($data);
|
||||
if ($item instanceof SerializableClosure || ($item instanceof SelfReference && $item->hash === $this->code['self'])) {
|
||||
$this->code['objects'][] = array(
|
||||
'instance' => $data,
|
||||
'property' => $property,
|
||||
'object' => $item instanceof SelfReference ? $this : $item,
|
||||
);
|
||||
} elseif (is_array($item) || is_object($item)) {
|
||||
$this->mapPointers($item);
|
||||
$property->setValue($data, $item);
|
||||
}
|
||||
}
|
||||
} while($reflection = $reflection->getParentClass());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method used to map closures by reference
|
||||
*
|
||||
* @internal
|
||||
* @param mixed &$data
|
||||
*/
|
||||
protected function mapByReference(&$data)
|
||||
{
|
||||
if ($data instanceof Closure) {
|
||||
if($data === $this->closure){
|
||||
$data = new SelfReference($this->reference);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($this->scope[$data])) {
|
||||
$data = $this->scope[$data];
|
||||
return;
|
||||
}
|
||||
|
||||
$instance = new static($data);
|
||||
|
||||
if (static::$context !== null) {
|
||||
static::$context->scope->toserialize--;
|
||||
} else {
|
||||
$instance->scope = $this->scope;
|
||||
}
|
||||
|
||||
$data = $this->scope[$data] = $instance;
|
||||
} elseif (is_array($data)) {
|
||||
if(isset($data[self::ARRAY_RECURSIVE_KEY])){
|
||||
return;
|
||||
}
|
||||
$data[self::ARRAY_RECURSIVE_KEY] = true;
|
||||
foreach ($data as $key => &$value){
|
||||
if($key === self::ARRAY_RECURSIVE_KEY){
|
||||
continue;
|
||||
}
|
||||
$this->mapByReference($value);
|
||||
}
|
||||
unset($value);
|
||||
unset($data[self::ARRAY_RECURSIVE_KEY]);
|
||||
} elseif ($data instanceof \stdClass) {
|
||||
if(isset($this->scope[$data])){
|
||||
$data = $this->scope[$data];
|
||||
return;
|
||||
}
|
||||
$instance = $data;
|
||||
$this->scope[$instance] = $data = clone($data);
|
||||
|
||||
foreach ($data as &$value){
|
||||
$this->mapByReference($value);
|
||||
}
|
||||
unset($value);
|
||||
} elseif (is_object($data) && !$data instanceof SerializableClosure){
|
||||
if(isset($this->scope[$data])){
|
||||
$data = $this->scope[$data];
|
||||
return;
|
||||
}
|
||||
|
||||
$instance = $data;
|
||||
$reflection = new ReflectionObject($data);
|
||||
if(!$reflection->isUserDefined()){
|
||||
$this->scope[$instance] = $data;
|
||||
return;
|
||||
}
|
||||
$this->scope[$instance] = $data = $reflection->newInstanceWithoutConstructor();
|
||||
|
||||
do{
|
||||
if(!$reflection->isUserDefined()){
|
||||
break;
|
||||
}
|
||||
foreach ($reflection->getProperties() as $property){
|
||||
if($property->isStatic() || !$property->getDeclaringClass()->isUserDefined()){
|
||||
continue;
|
||||
}
|
||||
$property->setAccessible(true);
|
||||
if (PHP_VERSION >= 7.4 && !$property->isInitialized($instance)) {
|
||||
continue;
|
||||
}
|
||||
$value = $property->getValue($instance);
|
||||
if(is_array($value) || is_object($value)){
|
||||
$this->mapByReference($value);
|
||||
}
|
||||
$property->setValue($data, $value);
|
||||
}
|
||||
} while($reflection = $reflection->getParentClass());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
2
vendor/phpmailer/phpmailer/VERSION
vendored
2
vendor/phpmailer/phpmailer/VERSION
vendored
@ -1 +1 @@
|
||||
6.1.7
|
||||
6.1.8
|
3
vendor/phpmailer/phpmailer/composer.json
vendored
3
vendor/phpmailer/phpmailer/composer.json
vendored
@ -28,7 +28,8 @@
|
||||
"require": {
|
||||
"php": ">=5.5.0",
|
||||
"ext-ctype": "*",
|
||||
"ext-filter": "*"
|
||||
"ext-filter": "*",
|
||||
"ext-hash": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^2.2",
|
||||
|
@ -8,7 +8,7 @@
|
||||
* @author Jim Jagielski (jimjag) <jimjag@gmail.com>
|
||||
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
|
||||
* @author Brent R. Matzelle (original founder)
|
||||
* @copyright 2012 - 2017 Marcus Bointon
|
||||
* @copyright 2012 - 2020 Marcus Bointon
|
||||
* @copyright 2010 - 2012 Jim Jagielski
|
||||
* @copyright 2004 - 2009 Andy Prevost
|
||||
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
|
||||
|
@ -15,6 +15,8 @@ $PHPMAILER_LANG['file_open'] = 'Dateifehler: Konnte folgende Datei ni
|
||||
$PHPMAILER_LANG['from_failed'] = 'Die folgende Absenderadresse ist nicht korrekt: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Mail-Funktion konnte nicht initialisiert werden.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Die Adresse ist ungültig: ';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Ungültiger Hosteintrag: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Ungültiger Host: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Bitte geben Sie mindestens eine Empfängeradresse an.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP-Fehler: Die folgenden Empfänger sind nicht korrekt: ';
|
||||
|
@ -4,6 +4,7 @@
|
||||
* @package PHPMailer
|
||||
* @author Cecep Prawiro <cecep.prawiro@gmail.com>
|
||||
* @author @januridp
|
||||
* @author Ian Mustafa <mail@ianmustafa.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'Kesalahan SMTP: Tidak dapat mengotentikasi.';
|
||||
@ -11,17 +12,19 @@ $PHPMAILER_LANG['connect_host'] = 'Kesalahan SMTP: Tidak dapat terhubung
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'Kesalahan SMTP: Data tidak diterima.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Isi pesan kosong';
|
||||
$PHPMAILER_LANG['encoding'] = 'Pengkodean karakter tidak dikenali: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Tidak dapat menjalankan proses : ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses berkas : ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Kesalahan File: Berkas tidak dapat dibuka : ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Alamat pengirim berikut mengakibatkan kesalahan : ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Tidak dapat menginisialisasi fungsi surel';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Gagal terkirim, alamat surel tidak benar : ';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Harus disediakan minimal satu alamat tujuan';
|
||||
$PHPMAILER_LANG['execute'] = 'Tidak dapat menjalankan proses: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses berkas: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Kesalahan Berkas: Berkas tidak dapat dibuka: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Alamat pengirim berikut mengakibatkan kesalahan: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Tidak dapat menginisialisasi fungsi surel.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Gagal terkirim, alamat surel tidak sesuai: ';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Gagal terkirim, entri host tidak sesuai: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Gagal terkirim, host tidak sesuai: ';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Harus tersedia minimal satu alamat tujuan';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tidak didukung';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'Kesalahan SMTP: Alamat tujuan berikut menghasilkan kesalahan : ';
|
||||
$PHPMAILER_LANG['signing'] = 'Kesalahan dalam tanda tangan : ';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'Kesalahan SMTP: Alamat tujuan berikut menyebabkan kesalahan: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Kesalahan dalam penandatangan SSL: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() gagal.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Kesalahan pada pelayan SMTP : ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Tidak dapat mengatur atau mengatur ulang variable : ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Ekstensi hilang: ';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Kesalahan pada pelayan SMTP: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Tidak dapat mengatur atau mengatur ulang variabel: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Ekstensi PHP tidak tersedia: ';
|
||||
|
@ -3,25 +3,25 @@
|
||||
* Tagalog PHPMailer language file: refer to English translation for definitive list
|
||||
*
|
||||
* @package PHPMailer
|
||||
* @author Adriane Justine Tan <adrianetan12@gmail.com>
|
||||
* @author Adriane Justine Tan <eidoriantan@gmail.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Hindi mapatotohanan.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Hindi makakonekta sa SMTP host.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Ang datos ay hindi maaaring matatanggap.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Ang datos ay hindi naitanggap.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Walang laman ang mensahe';
|
||||
$PHPMAILER_LANG['encoding'] = 'Hindi alam ang encoding: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Hindi maisasagawa: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Hindi ma-access ang file: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Hindi mabuksan ang file: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'File Error: Hindi mabuksan ang file: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Ang sumusunod na address ay nabigo: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Hindi maaaring magbigay ng institusyon ang mail';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Hindi maisimulan ang instance ng mail function.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Hindi wasto ang address na naibigay: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = 'Ang mailer ay hindi suportado';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Kailangan mong magbigay ng kahit isang email address na tatanggap';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = 'Ang mailer ay hindi suportado.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Kailangan mong magbigay ng kahit isang email address na tatanggap.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Ang mga sumusunod na tatanggap ay nabigo: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Hindi ma-sign';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'Ang SMTP connect() ay nabigo';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Ang server ng SMTP ay nabigo';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Hindi matatakda ang mga variables: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Nawawala ang extension';
|
||||
$PHPMAILER_LANG['signing'] = 'Hindi ma-sign: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'Ang SMTP connect() ay nabigo.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Ang server ng SMTP ay nabigo: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Hindi matatakda o ma-reset ang mga variables: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Nawawala ang extension: ';
|
||||
|
2
vendor/phpmailer/phpmailer/src/Exception.php
vendored
2
vendor/phpmailer/phpmailer/src/Exception.php
vendored
@ -9,7 +9,7 @@
|
||||
* @author Jim Jagielski (jimjag) <jimjag@gmail.com>
|
||||
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
|
||||
* @author Brent R. Matzelle (original founder)
|
||||
* @copyright 2012 - 2017 Marcus Bointon
|
||||
* @copyright 2012 - 2020 Marcus Bointon
|
||||
* @copyright 2010 - 2012 Jim Jagielski
|
||||
* @copyright 2004 - 2009 Andy Prevost
|
||||
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
|
||||
|
2
vendor/phpmailer/phpmailer/src/OAuth.php
vendored
2
vendor/phpmailer/phpmailer/src/OAuth.php
vendored
@ -9,7 +9,7 @@
|
||||
* @author Jim Jagielski (jimjag) <jimjag@gmail.com>
|
||||
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
|
||||
* @author Brent R. Matzelle (original founder)
|
||||
* @copyright 2012 - 2015 Marcus Bointon
|
||||
* @copyright 2012 - 2020 Marcus Bointon
|
||||
* @copyright 2010 - 2012 Jim Jagielski
|
||||
* @copyright 2004 - 2009 Andy Prevost
|
||||
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
|
||||
|
60
vendor/phpmailer/phpmailer/src/PHPMailer.php
vendored
60
vendor/phpmailer/phpmailer/src/PHPMailer.php
vendored
@ -9,7 +9,7 @@
|
||||
* @author Jim Jagielski (jimjag) <jimjag@gmail.com>
|
||||
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
|
||||
* @author Brent R. Matzelle (original founder)
|
||||
* @copyright 2012 - 2019 Marcus Bointon
|
||||
* @copyright 2012 - 2020 Marcus Bointon
|
||||
* @copyright 2010 - 2012 Jim Jagielski
|
||||
* @copyright 2004 - 2009 Andy Prevost
|
||||
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
|
||||
@ -747,7 +747,7 @@ class PHPMailer
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '6.1.7';
|
||||
const VERSION = '6.1.8';
|
||||
|
||||
/**
|
||||
* Error severity: message only, continue processing.
|
||||
@ -899,6 +899,7 @@ class PHPMailer
|
||||
switch ($this->Debugoutput) {
|
||||
case 'error_log':
|
||||
//Don't output, just log
|
||||
/** @noinspection ForgottenDebugOutputInspection */
|
||||
error_log($str);
|
||||
break;
|
||||
case 'html':
|
||||
@ -1350,7 +1351,7 @@ class PHPMailer
|
||||
/*
|
||||
* This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
|
||||
*
|
||||
* @see http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
|
||||
* @see https://html.spec.whatwg.org/#e-mail-state-(type=email)
|
||||
*/
|
||||
return (bool) preg_match(
|
||||
'/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
|
||||
@ -1609,6 +1610,9 @@ class PHPMailer
|
||||
return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
|
||||
}
|
||||
} catch (Exception $exc) {
|
||||
if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) {
|
||||
$this->smtp->reset();
|
||||
}
|
||||
$this->setError($exc->getMessage());
|
||||
$this->edebug($exc->getMessage());
|
||||
if ($this->exceptions) {
|
||||
@ -1749,6 +1753,23 @@ class PHPMailer
|
||||
return !preg_match('#^[a-z]+://#i', $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a file path is safe, accessible, and readable.
|
||||
*
|
||||
* @param string $path A relative or absolute path to a file
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected static function fileIsAccessible($path)
|
||||
{
|
||||
$readable = file_exists($path);
|
||||
//If not a UNC path (expected to start with \\), check read permission, see #2069
|
||||
if (strpos($path, '\\\\') !== 0) {
|
||||
$readable = $readable && is_readable($path);
|
||||
}
|
||||
return static::isPermittedPath($path) && $readable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send mail using the PHP mail() function.
|
||||
*
|
||||
@ -2002,7 +2023,12 @@ class PHPMailer
|
||||
}
|
||||
$host = $hostinfo[2];
|
||||
$port = $this->Port;
|
||||
if (array_key_exists(3, $hostinfo) && is_numeric($hostinfo[3]) && $hostinfo[3] > 0 && $hostinfo[3] < 65536) {
|
||||
if (
|
||||
array_key_exists(3, $hostinfo) &&
|
||||
is_numeric($hostinfo[3]) &&
|
||||
$hostinfo[3] > 0 &&
|
||||
$hostinfo[3] < 65536
|
||||
) {
|
||||
$port = (int) $hostinfo[3];
|
||||
}
|
||||
if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
|
||||
@ -2132,7 +2158,7 @@ class PHPMailer
|
||||
// There is no English translation file
|
||||
if ('en' !== $langcode) {
|
||||
// Make sure language file path is readable
|
||||
if (!static::isPermittedPath($lang_file) || !file_exists($lang_file)) {
|
||||
if (!static::fileIsAccessible($lang_file)) {
|
||||
$foundlang = false;
|
||||
} else {
|
||||
// Overwrite language-specific strings.
|
||||
@ -2380,21 +2406,18 @@ class PHPMailer
|
||||
|
||||
$result .= $this->headerLine('Date', '' === $this->MessageDate ? self::rfcDate() : $this->MessageDate);
|
||||
|
||||
// To be created automatically by mail()
|
||||
if ($this->SingleTo) {
|
||||
if ('mail' !== $this->Mailer) {
|
||||
// The To header is created automatically by mail(), so needs to be omitted here
|
||||
if ('mail' !== $this->Mailer) {
|
||||
if ($this->SingleTo) {
|
||||
foreach ($this->to as $toaddr) {
|
||||
$this->SingleToArray[] = $this->addrFormat($toaddr);
|
||||
}
|
||||
}
|
||||
} elseif (count($this->to) > 0) {
|
||||
if ('mail' !== $this->Mailer) {
|
||||
} elseif (count($this->to) > 0) {
|
||||
$result .= $this->addrAppend('To', $this->to);
|
||||
} elseif (count($this->cc) === 0) {
|
||||
$result .= $this->headerLine('To', 'undisclosed-recipients:;');
|
||||
}
|
||||
} elseif (count($this->cc) === 0) {
|
||||
$result .= $this->headerLine('To', 'undisclosed-recipients:;');
|
||||
}
|
||||
|
||||
$result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]);
|
||||
|
||||
// sendmail and mail() extract Cc from the header before sending
|
||||
@ -2949,7 +2972,7 @@ class PHPMailer
|
||||
* @param string $path Path to the attachment
|
||||
* @param string $name Overrides the attachment name
|
||||
* @param string $encoding File encoding (see $Encoding)
|
||||
* @param string $type File extension (MIME) type
|
||||
* @param string $type MIME type, e.g. `image/jpeg`; determined automatically from $path if not specified
|
||||
* @param string $disposition Disposition to use
|
||||
*
|
||||
* @throws Exception
|
||||
@ -2964,7 +2987,7 @@ class PHPMailer
|
||||
$disposition = 'attachment'
|
||||
) {
|
||||
try {
|
||||
if (!static::isPermittedPath($path) || !@is_file($path) || !is_readable($path)) {
|
||||
if (!static::fileIsAccessible($path)) {
|
||||
throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
|
||||
}
|
||||
|
||||
@ -3138,7 +3161,7 @@ class PHPMailer
|
||||
protected function encodeFile($path, $encoding = self::ENCODING_BASE64)
|
||||
{
|
||||
try {
|
||||
if (!static::isPermittedPath($path) || !file_exists($path) || !is_readable($path)) {
|
||||
if (!static::fileIsAccessible($path)) {
|
||||
throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);
|
||||
}
|
||||
$file_buffer = file_get_contents($path);
|
||||
@ -3524,7 +3547,7 @@ class PHPMailer
|
||||
$disposition = 'inline'
|
||||
) {
|
||||
try {
|
||||
if (!static::isPermittedPath($path) || !@is_file($path) || !is_readable($path)) {
|
||||
if (!static::fileIsAccessible($path)) {
|
||||
throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
|
||||
}
|
||||
|
||||
@ -4215,6 +4238,7 @@ class PHPMailer
|
||||
'tiff' => 'image/tiff',
|
||||
'tif' => 'image/tiff',
|
||||
'webp' => 'image/webp',
|
||||
'avif' => 'image/avif',
|
||||
'heif' => 'image/heif',
|
||||
'heifs' => 'image/heif-sequence',
|
||||
'heic' => 'image/heic',
|
||||
|
4
vendor/phpmailer/phpmailer/src/POP3.php
vendored
4
vendor/phpmailer/phpmailer/src/POP3.php
vendored
@ -9,7 +9,7 @@
|
||||
* @author Jim Jagielski (jimjag) <jimjag@gmail.com>
|
||||
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
|
||||
* @author Brent R. Matzelle (original founder)
|
||||
* @copyright 2012 - 2019 Marcus Bointon
|
||||
* @copyright 2012 - 2020 Marcus Bointon
|
||||
* @copyright 2010 - 2012 Jim Jagielski
|
||||
* @copyright 2004 - 2009 Andy Prevost
|
||||
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
|
||||
@ -45,7 +45,7 @@ class POP3
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '6.1.7';
|
||||
const VERSION = '6.1.8';
|
||||
|
||||
/**
|
||||
* Default POP3 port number.
|
||||
|
8
vendor/phpmailer/phpmailer/src/SMTP.php
vendored
8
vendor/phpmailer/phpmailer/src/SMTP.php
vendored
@ -9,7 +9,7 @@
|
||||
* @author Jim Jagielski (jimjag) <jimjag@gmail.com>
|
||||
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
|
||||
* @author Brent R. Matzelle (original founder)
|
||||
* @copyright 2012 - 2019 Marcus Bointon
|
||||
* @copyright 2012 - 2020 Marcus Bointon
|
||||
* @copyright 2010 - 2012 Jim Jagielski
|
||||
* @copyright 2004 - 2009 Andy Prevost
|
||||
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
|
||||
@ -34,7 +34,7 @@ class SMTP
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '6.1.7';
|
||||
const VERSION = '6.1.8';
|
||||
|
||||
/**
|
||||
* SMTP line break constant.
|
||||
@ -417,8 +417,8 @@ class SMTP
|
||||
// Windows does not have support for this timeout function
|
||||
if (strpos(PHP_OS, 'WIN') !== 0) {
|
||||
$max = (int)ini_get('max_execution_time');
|
||||
// Don't bother if unlimited
|
||||
if (0 !== $max && $timeout > $max) {
|
||||
// Don't bother if unlimited, or if set_time_limit is disabled
|
||||
if (0 !== $max && $timeout > $max && strpos(ini_get('disable_functions'), 'set_time_limit') === false) {
|
||||
@set_time_limit($timeout);
|
||||
}
|
||||
stream_set_timeout($connection, $timeout, 0);
|
||||
|
2
vendor/services.php
vendored
2
vendor/services.php
vendored
@ -1,5 +1,5 @@
|
||||
<?php
|
||||
// This file is automatically generated at:2020-09-20 15:13:17
|
||||
// This file is automatically generated at:2020-10-11 14:54:36
|
||||
declare (strict_types = 1);
|
||||
return array (
|
||||
0 => 'think\\captcha\\CaptchaService',
|
||||
|
36
vendor/symfony/var-dumper/Caster/AmqpCaster.php
vendored
36
vendor/symfony/var-dumper/Caster/AmqpCaster.php
vendored
@ -23,27 +23,27 @@ use Symfony\Component\VarDumper\Cloner\Stub;
|
||||
class AmqpCaster
|
||||
{
|
||||
private static $flags = [
|
||||
AMQP_DURABLE => 'AMQP_DURABLE',
|
||||
AMQP_PASSIVE => 'AMQP_PASSIVE',
|
||||
AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE',
|
||||
AMQP_AUTODELETE => 'AMQP_AUTODELETE',
|
||||
AMQP_INTERNAL => 'AMQP_INTERNAL',
|
||||
AMQP_NOLOCAL => 'AMQP_NOLOCAL',
|
||||
AMQP_AUTOACK => 'AMQP_AUTOACK',
|
||||
AMQP_IFEMPTY => 'AMQP_IFEMPTY',
|
||||
AMQP_IFUNUSED => 'AMQP_IFUNUSED',
|
||||
AMQP_MANDATORY => 'AMQP_MANDATORY',
|
||||
AMQP_IMMEDIATE => 'AMQP_IMMEDIATE',
|
||||
AMQP_MULTIPLE => 'AMQP_MULTIPLE',
|
||||
AMQP_NOWAIT => 'AMQP_NOWAIT',
|
||||
AMQP_REQUEUE => 'AMQP_REQUEUE',
|
||||
\AMQP_DURABLE => 'AMQP_DURABLE',
|
||||
\AMQP_PASSIVE => 'AMQP_PASSIVE',
|
||||
\AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE',
|
||||
\AMQP_AUTODELETE => 'AMQP_AUTODELETE',
|
||||
\AMQP_INTERNAL => 'AMQP_INTERNAL',
|
||||
\AMQP_NOLOCAL => 'AMQP_NOLOCAL',
|
||||
\AMQP_AUTOACK => 'AMQP_AUTOACK',
|
||||
\AMQP_IFEMPTY => 'AMQP_IFEMPTY',
|
||||
\AMQP_IFUNUSED => 'AMQP_IFUNUSED',
|
||||
\AMQP_MANDATORY => 'AMQP_MANDATORY',
|
||||
\AMQP_IMMEDIATE => 'AMQP_IMMEDIATE',
|
||||
\AMQP_MULTIPLE => 'AMQP_MULTIPLE',
|
||||
\AMQP_NOWAIT => 'AMQP_NOWAIT',
|
||||
\AMQP_REQUEUE => 'AMQP_REQUEUE',
|
||||
];
|
||||
|
||||
private static $exchangeTypes = [
|
||||
AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT',
|
||||
AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT',
|
||||
AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC',
|
||||
AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS',
|
||||
\AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT',
|
||||
\AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT',
|
||||
\AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC',
|
||||
\AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS',
|
||||
];
|
||||
|
||||
public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, $isNested)
|
||||
|
70
vendor/symfony/var-dumper/Caster/DOMCaster.php
vendored
70
vendor/symfony/var-dumper/Caster/DOMCaster.php
vendored
@ -23,44 +23,44 @@ use Symfony\Component\VarDumper\Cloner\Stub;
|
||||
class DOMCaster
|
||||
{
|
||||
private static $errorCodes = [
|
||||
DOM_PHP_ERR => 'DOM_PHP_ERR',
|
||||
DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR',
|
||||
DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR',
|
||||
DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR',
|
||||
DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR',
|
||||
DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR',
|
||||
DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR',
|
||||
DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR',
|
||||
DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR',
|
||||
DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR',
|
||||
DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR',
|
||||
DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR',
|
||||
DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR',
|
||||
DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR',
|
||||
DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR',
|
||||
DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR',
|
||||
DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR',
|
||||
\DOM_PHP_ERR => 'DOM_PHP_ERR',
|
||||
\DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR',
|
||||
\DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR',
|
||||
\DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR',
|
||||
\DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR',
|
||||
\DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR',
|
||||
\DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR',
|
||||
\DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR',
|
||||
\DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR',
|
||||
\DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR',
|
||||
\DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR',
|
||||
\DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR',
|
||||
\DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR',
|
||||
\DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR',
|
||||
\DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR',
|
||||
\DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR',
|
||||
\DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR',
|
||||
];
|
||||
|
||||
private static $nodeTypes = [
|
||||
XML_ELEMENT_NODE => 'XML_ELEMENT_NODE',
|
||||
XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE',
|
||||
XML_TEXT_NODE => 'XML_TEXT_NODE',
|
||||
XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE',
|
||||
XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE',
|
||||
XML_ENTITY_NODE => 'XML_ENTITY_NODE',
|
||||
XML_PI_NODE => 'XML_PI_NODE',
|
||||
XML_COMMENT_NODE => 'XML_COMMENT_NODE',
|
||||
XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE',
|
||||
XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE',
|
||||
XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE',
|
||||
XML_NOTATION_NODE => 'XML_NOTATION_NODE',
|
||||
XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE',
|
||||
XML_DTD_NODE => 'XML_DTD_NODE',
|
||||
XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE',
|
||||
XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE',
|
||||
XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE',
|
||||
XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE',
|
||||
\XML_ELEMENT_NODE => 'XML_ELEMENT_NODE',
|
||||
\XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE',
|
||||
\XML_TEXT_NODE => 'XML_TEXT_NODE',
|
||||
\XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE',
|
||||
\XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE',
|
||||
\XML_ENTITY_NODE => 'XML_ENTITY_NODE',
|
||||
\XML_PI_NODE => 'XML_PI_NODE',
|
||||
\XML_COMMENT_NODE => 'XML_COMMENT_NODE',
|
||||
\XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE',
|
||||
\XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE',
|
||||
\XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE',
|
||||
\XML_NOTATION_NODE => 'XML_NOTATION_NODE',
|
||||
\XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE',
|
||||
\XML_DTD_NODE => 'XML_DTD_NODE',
|
||||
\XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE',
|
||||
\XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE',
|
||||
\XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE',
|
||||
\XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE',
|
||||
];
|
||||
|
||||
public static function castException(\DOMException $e, array $a, Stub $stub, $isNested)
|
||||
|
@ -27,21 +27,21 @@ class ExceptionCaster
|
||||
public static $srcContext = 1;
|
||||
public static $traceArgs = true;
|
||||
public static $errorTypes = [
|
||||
E_DEPRECATED => 'E_DEPRECATED',
|
||||
E_USER_DEPRECATED => 'E_USER_DEPRECATED',
|
||||
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
|
||||
E_ERROR => 'E_ERROR',
|
||||
E_WARNING => 'E_WARNING',
|
||||
E_PARSE => 'E_PARSE',
|
||||
E_NOTICE => 'E_NOTICE',
|
||||
E_CORE_ERROR => 'E_CORE_ERROR',
|
||||
E_CORE_WARNING => 'E_CORE_WARNING',
|
||||
E_COMPILE_ERROR => 'E_COMPILE_ERROR',
|
||||
E_COMPILE_WARNING => 'E_COMPILE_WARNING',
|
||||
E_USER_ERROR => 'E_USER_ERROR',
|
||||
E_USER_WARNING => 'E_USER_WARNING',
|
||||
E_USER_NOTICE => 'E_USER_NOTICE',
|
||||
E_STRICT => 'E_STRICT',
|
||||
\E_DEPRECATED => 'E_DEPRECATED',
|
||||
\E_USER_DEPRECATED => 'E_USER_DEPRECATED',
|
||||
\E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
|
||||
\E_ERROR => 'E_ERROR',
|
||||
\E_WARNING => 'E_WARNING',
|
||||
\E_PARSE => 'E_PARSE',
|
||||
\E_NOTICE => 'E_NOTICE',
|
||||
\E_CORE_ERROR => 'E_CORE_ERROR',
|
||||
\E_CORE_WARNING => 'E_CORE_WARNING',
|
||||
\E_COMPILE_ERROR => 'E_COMPILE_ERROR',
|
||||
\E_COMPILE_WARNING => 'E_COMPILE_WARNING',
|
||||
\E_USER_ERROR => 'E_USER_ERROR',
|
||||
\E_USER_WARNING => 'E_USER_WARNING',
|
||||
\E_USER_NOTICE => 'E_USER_NOTICE',
|
||||
\E_STRICT => 'E_STRICT',
|
||||
];
|
||||
|
||||
private static $framesCache = [];
|
||||
|
54
vendor/symfony/var-dumper/Caster/PgSqlCaster.php
vendored
54
vendor/symfony/var-dumper/Caster/PgSqlCaster.php
vendored
@ -36,37 +36,37 @@ class PgSqlCaster
|
||||
];
|
||||
|
||||
private static $transactionStatus = [
|
||||
PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE',
|
||||
PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE',
|
||||
PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS',
|
||||
PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR',
|
||||
PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN',
|
||||
\PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE',
|
||||
\PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE',
|
||||
\PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS',
|
||||
\PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR',
|
||||
\PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN',
|
||||
];
|
||||
|
||||
private static $resultStatus = [
|
||||
PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY',
|
||||
PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK',
|
||||
PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK',
|
||||
PGSQL_COPY_OUT => 'PGSQL_COPY_OUT',
|
||||
PGSQL_COPY_IN => 'PGSQL_COPY_IN',
|
||||
PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE',
|
||||
PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR',
|
||||
PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR',
|
||||
\PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY',
|
||||
\PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK',
|
||||
\PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK',
|
||||
\PGSQL_COPY_OUT => 'PGSQL_COPY_OUT',
|
||||
\PGSQL_COPY_IN => 'PGSQL_COPY_IN',
|
||||
\PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE',
|
||||
\PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR',
|
||||
\PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR',
|
||||
];
|
||||
|
||||
private static $diagCodes = [
|
||||
'severity' => PGSQL_DIAG_SEVERITY,
|
||||
'sqlstate' => PGSQL_DIAG_SQLSTATE,
|
||||
'message' => PGSQL_DIAG_MESSAGE_PRIMARY,
|
||||
'detail' => PGSQL_DIAG_MESSAGE_DETAIL,
|
||||
'hint' => PGSQL_DIAG_MESSAGE_HINT,
|
||||
'statement position' => PGSQL_DIAG_STATEMENT_POSITION,
|
||||
'internal position' => PGSQL_DIAG_INTERNAL_POSITION,
|
||||
'internal query' => PGSQL_DIAG_INTERNAL_QUERY,
|
||||
'context' => PGSQL_DIAG_CONTEXT,
|
||||
'file' => PGSQL_DIAG_SOURCE_FILE,
|
||||
'line' => PGSQL_DIAG_SOURCE_LINE,
|
||||
'function' => PGSQL_DIAG_SOURCE_FUNCTION,
|
||||
'severity' => \PGSQL_DIAG_SEVERITY,
|
||||
'sqlstate' => \PGSQL_DIAG_SQLSTATE,
|
||||
'message' => \PGSQL_DIAG_MESSAGE_PRIMARY,
|
||||
'detail' => \PGSQL_DIAG_MESSAGE_DETAIL,
|
||||
'hint' => \PGSQL_DIAG_MESSAGE_HINT,
|
||||
'statement position' => \PGSQL_DIAG_STATEMENT_POSITION,
|
||||
'internal position' => \PGSQL_DIAG_INTERNAL_POSITION,
|
||||
'internal query' => \PGSQL_DIAG_INTERNAL_QUERY,
|
||||
'context' => \PGSQL_DIAG_CONTEXT,
|
||||
'file' => \PGSQL_DIAG_SOURCE_FILE,
|
||||
'line' => \PGSQL_DIAG_SOURCE_LINE,
|
||||
'function' => \PGSQL_DIAG_SOURCE_FUNCTION,
|
||||
];
|
||||
|
||||
public static function castLargeObject($lo, array $a, Stub $stub, $isNested)
|
||||
@ -79,7 +79,7 @@ class PgSqlCaster
|
||||
public static function castLink($link, array $a, Stub $stub, $isNested)
|
||||
{
|
||||
$a['status'] = pg_connection_status($link);
|
||||
$a['status'] = new ConstStub(PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']);
|
||||
$a['status'] = new ConstStub(\PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']);
|
||||
$a['busy'] = pg_connection_busy($link);
|
||||
|
||||
$a['transaction'] = pg_transaction_status($link);
|
||||
@ -115,7 +115,7 @@ class PgSqlCaster
|
||||
if (isset(self::$resultStatus[$a['status']])) {
|
||||
$a['status'] = new ConstStub(self::$resultStatus[$a['status']], $a['status']);
|
||||
}
|
||||
$a['command-completion tag'] = pg_result_status($result, PGSQL_STATUS_STRING);
|
||||
$a['command-completion tag'] = pg_result_status($result, \PGSQL_STATUS_STRING);
|
||||
|
||||
if (-1 === $a['num rows']) {
|
||||
foreach (self::$diagCodes as $k => $v) {
|
||||
|
@ -120,7 +120,7 @@ class ReflectionCaster
|
||||
'file' => $c->getExecutingFile(),
|
||||
'line' => $c->getExecutingLine(),
|
||||
];
|
||||
if ($trace = $c->getTrace(DEBUG_BACKTRACE_IGNORE_ARGS)) {
|
||||
if ($trace = $c->getTrace(\DEBUG_BACKTRACE_IGNORE_ARGS)) {
|
||||
$function = new \ReflectionGenerator($c->getExecutingGenerator());
|
||||
array_unshift($trace, [
|
||||
'function' => 'yield',
|
||||
|
28
vendor/symfony/var-dumper/Caster/SplCaster.php
vendored
28
vendor/symfony/var-dumper/Caster/SplCaster.php
vendored
@ -94,10 +94,32 @@ class SplCaster
|
||||
unset($a["\0SplFileInfo\0fileName"]);
|
||||
unset($a["\0SplFileInfo\0pathName"]);
|
||||
|
||||
if (false === $c->getPathname()) {
|
||||
$a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state';
|
||||
if (\PHP_VERSION_ID < 80000) {
|
||||
if (false === $c->getPathname()) {
|
||||
$a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state';
|
||||
|
||||
return $a;
|
||||
return $a;
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
$c->isReadable();
|
||||
} catch (\RuntimeException $e) {
|
||||
if ('Object not initialized' !== $e->getMessage()) {
|
||||
throw $e;
|
||||
}
|
||||
|
||||
$a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state';
|
||||
|
||||
return $a;
|
||||
} catch (\Error $e) {
|
||||
if ('Object not initialized' !== $e->getMessage()) {
|
||||
throw $e;
|
||||
}
|
||||
|
||||
$a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state';
|
||||
|
||||
return $a;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($map as $key => $accessor) {
|
||||
|
@ -23,28 +23,28 @@ use Symfony\Component\VarDumper\Cloner\Stub;
|
||||
class XmlResourceCaster
|
||||
{
|
||||
private static $xmlErrors = [
|
||||
XML_ERROR_NONE => 'XML_ERROR_NONE',
|
||||
XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY',
|
||||
XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX',
|
||||
XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS',
|
||||
XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN',
|
||||
XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN',
|
||||
XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR',
|
||||
XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH',
|
||||
XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE',
|
||||
XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT',
|
||||
XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF',
|
||||
XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY',
|
||||
XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF',
|
||||
XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY',
|
||||
XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF',
|
||||
XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF',
|
||||
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF',
|
||||
XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI',
|
||||
XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING',
|
||||
XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING',
|
||||
XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION',
|
||||
XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING',
|
||||
\XML_ERROR_NONE => 'XML_ERROR_NONE',
|
||||
\XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY',
|
||||
\XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX',
|
||||
\XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS',
|
||||
\XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN',
|
||||
\XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN',
|
||||
\XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR',
|
||||
\XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH',
|
||||
\XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE',
|
||||
\XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT',
|
||||
\XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF',
|
||||
\XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY',
|
||||
\XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF',
|
||||
\XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY',
|
||||
\XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF',
|
||||
\XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF',
|
||||
\XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF',
|
||||
\XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI',
|
||||
\XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING',
|
||||
\XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING',
|
||||
\XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION',
|
||||
\XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING',
|
||||
];
|
||||
|
||||
public static function castXml($h, array $a, Stub $stub, $isNested)
|
||||
|
@ -244,7 +244,7 @@ abstract class AbstractCloner implements ClonerInterface
|
||||
public function cloneVar($var, $filter = 0)
|
||||
{
|
||||
$this->prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) {
|
||||
if (E_RECOVERABLE_ERROR === $type || E_USER_ERROR === $type) {
|
||||
if (\E_RECOVERABLE_ERROR === $type || \E_USER_ERROR === $type) {
|
||||
// Cloner never dies
|
||||
throw new \ErrorException($msg, 0, $type, $file, $line);
|
||||
}
|
||||
|
2
vendor/symfony/var-dumper/Cloner/Data.php
vendored
2
vendor/symfony/var-dumper/Cloner/Data.php
vendored
@ -328,7 +328,7 @@ class Data implements \ArrayAccess, \Countable, \IteratorAggregate
|
||||
}
|
||||
} elseif (Stub::TYPE_REF === $item->type) {
|
||||
if ($item->handle) {
|
||||
if (!isset($refs[$r = $item->handle - (PHP_INT_MAX >> 1)])) {
|
||||
if (!isset($refs[$r = $item->handle - (\PHP_INT_MAX >> 1)])) {
|
||||
$cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0];
|
||||
} else {
|
||||
$firstSeen = false;
|
||||
|
@ -125,8 +125,8 @@ abstract class AbstractDumper implements DataDumperInterface, DumperInterface
|
||||
$this->decimalPoint = localeconv();
|
||||
$this->decimalPoint = $this->decimalPoint['decimal_point'];
|
||||
|
||||
if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(LC_NUMERIC, 0) : null) {
|
||||
setlocale(LC_NUMERIC, 'C');
|
||||
if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(\LC_NUMERIC, 0) : null) {
|
||||
setlocale(\LC_NUMERIC, 'C');
|
||||
}
|
||||
|
||||
if ($returnDump = true === $output) {
|
||||
@ -150,7 +150,7 @@ abstract class AbstractDumper implements DataDumperInterface, DumperInterface
|
||||
$this->setOutput($prevOutput);
|
||||
}
|
||||
if ($locale) {
|
||||
setlocale(LC_NUMERIC, $locale);
|
||||
setlocale(\LC_NUMERIC, $locale);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -149,8 +149,8 @@ class CliDumper extends AbstractDumper
|
||||
$style = 'num';
|
||||
|
||||
switch (true) {
|
||||
case INF === $value: $value = 'INF'; break;
|
||||
case -INF === $value: $value = '-INF'; break;
|
||||
case \INF === $value: $value = 'INF'; break;
|
||||
case -\INF === $value: $value = '-INF'; break;
|
||||
case is_nan($value): $value = 'NAN'; break;
|
||||
default:
|
||||
$value = (string) $value;
|
||||
|
@ -40,7 +40,7 @@ final class SourceContextProvider implements ContextProviderInterface
|
||||
|
||||
public function getContext(): ?array
|
||||
{
|
||||
$trace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS, $this->limit);
|
||||
$trace = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, $this->limit);
|
||||
|
||||
$file = $trace[1]['file'];
|
||||
$line = $trace[1]['line'];
|
||||
|
@ -159,7 +159,7 @@ class HtmlDumper extends CliDumper
|
||||
return $this->dumpHeader;
|
||||
}
|
||||
|
||||
$line = str_replace('{$options}', json_encode($this->displayOptions, JSON_FORCE_OBJECT), <<<'EOHTML'
|
||||
$line = str_replace('{$options}', json_encode($this->displayOptions, \JSON_FORCE_OBJECT), <<<'EOHTML'
|
||||
<script>
|
||||
Sfdump = window.Sfdump || (function (doc) {
|
||||
|
||||
@ -971,7 +971,7 @@ EOHTML
|
||||
if (-1 === $depth) {
|
||||
$args = ['"'.$this->dumpId.'"'];
|
||||
if ($this->extraDisplayOptions) {
|
||||
$args[] = json_encode($this->extraDisplayOptions, JSON_FORCE_OBJECT);
|
||||
$args[] = json_encode($this->extraDisplayOptions, \JSON_FORCE_OBJECT);
|
||||
}
|
||||
// Replace is for BC
|
||||
$this->line .= sprintf(str_replace('"%s"', '%s', $this->dumpSuffix), implode(', ', $args));
|
||||
@ -1000,5 +1000,5 @@ EOHTML
|
||||
|
||||
function esc($str)
|
||||
{
|
||||
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
|
||||
return htmlspecialchars($str, \ENT_QUOTES, 'UTF-8');
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ class Connection
|
||||
return true;
|
||||
}
|
||||
if (!$socketIsFresh) {
|
||||
stream_socket_shutdown($this->socket, STREAM_SHUT_RDWR);
|
||||
stream_socket_shutdown($this->socket, \STREAM_SHUT_RDWR);
|
||||
fclose($this->socket);
|
||||
$this->socket = $this->createSocket();
|
||||
}
|
||||
@ -87,7 +87,7 @@ class Connection
|
||||
{
|
||||
set_error_handler([self::class, 'nullErrorHandler']);
|
||||
try {
|
||||
return stream_socket_client($this->host, $errno, $errstr, 3, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT);
|
||||
return stream_socket_client($this->host, $errno, $errstr, 3, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT);
|
||||
} finally {
|
||||
restore_error_handler();
|
||||
}
|
||||
|
2
vendor/topthink/framework/README.md
vendored
2
vendor/topthink/framework/README.md
vendored
@ -13,7 +13,7 @@ ThinkPHP 6.0
|
||||
|
||||
ThinkPHP6.0底层架构采用PHP7.1改写和进一步优化。
|
||||
|
||||
[官方应用服务市场](https://www.thinkphp.cn/service) | [`ThinkPHP`开发者扶持计划](https://sites.thinkphp.cn/1782366)
|
||||
[官方应用服务市场](https://market.topthink.com) | [`ThinkPHP`开发者扶持计划](https://sites.thinkphp.cn/1782366)
|
||||
|
||||
## 主要新特性
|
||||
|
||||
|
1
vendor/topthink/framework/composer.json
vendored
1
vendor/topthink/framework/composer.json
vendored
@ -24,7 +24,6 @@
|
||||
"ext-mbstring": "*",
|
||||
"league/flysystem": "^1.0",
|
||||
"league/flysystem-cached-adapter": "^1.0",
|
||||
"opis/closure": "^3.1",
|
||||
"psr/log": "~1.0",
|
||||
"psr/container": "~1.0",
|
||||
"psr/simple-cache": "^1.0",
|
||||
|
2
vendor/topthink/framework/src/think/App.php
vendored
2
vendor/topthink/framework/src/think/App.php
vendored
@ -39,7 +39,7 @@ use think\initializer\RegisterService;
|
||||
*/
|
||||
class App extends Container
|
||||
{
|
||||
const VERSION = '6.0.3';
|
||||
const VERSION = '6.0.4';
|
||||
|
||||
/**
|
||||
* 应用调试模式
|
||||
|
@ -116,6 +116,10 @@ class Config
|
||||
*/
|
||||
public function has(string $name): bool
|
||||
{
|
||||
if (false === strpos($name, '.') && !isset($this->config[strtolower($name)])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return !is_null($this->get($name));
|
||||
}
|
||||
|
||||
|
83
vendor/topthink/framework/src/think/Console.php
vendored
83
vendor/topthink/framework/src/think/Console.php
vendored
@ -57,7 +57,7 @@ class Console
|
||||
protected $catchExceptions = true;
|
||||
protected $autoExit = true;
|
||||
protected $definition;
|
||||
protected $defaultCommand = 'list';
|
||||
protected $defaultCommand = 'list';
|
||||
|
||||
protected $defaultCommands = [
|
||||
'help' => Help::class,
|
||||
@ -91,9 +91,7 @@ class Console
|
||||
{
|
||||
$this->app = $app;
|
||||
|
||||
if (!$this->app->initialized()) {
|
||||
$this->app->initialize();
|
||||
}
|
||||
$this->initialize();
|
||||
|
||||
$this->definition = $this->getDefaultInputDefinition();
|
||||
|
||||
@ -103,6 +101,63 @@ class Console
|
||||
$this->start();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化
|
||||
*/
|
||||
protected function initialize()
|
||||
{
|
||||
if (!$this->app->initialized()) {
|
||||
$this->app->initialize();
|
||||
}
|
||||
$this->makeRequest();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造request
|
||||
*/
|
||||
protected function makeRequest()
|
||||
{
|
||||
$uri = $this->app->config->get('app.url', 'http://localhost');
|
||||
|
||||
$components = parse_url($uri);
|
||||
|
||||
$server = $_SERVER;
|
||||
|
||||
if (isset($components['path'])) {
|
||||
$server = array_merge($server, [
|
||||
'SCRIPT_FILENAME' => $components['path'],
|
||||
'SCRIPT_NAME' => $components['path'],
|
||||
]);
|
||||
}
|
||||
|
||||
if (isset($components['host'])) {
|
||||
$server['SERVER_NAME'] = $components['host'];
|
||||
$server['HTTP_HOST'] = $components['host'];
|
||||
}
|
||||
|
||||
if (isset($components['scheme'])) {
|
||||
if ('https' === $components['scheme']) {
|
||||
$server['HTTPS'] = 'on';
|
||||
$server['SERVER_PORT'] = 443;
|
||||
} else {
|
||||
unset($server['HTTPS']);
|
||||
$server['SERVER_PORT'] = 80;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($components['port'])) {
|
||||
$server['SERVER_PORT'] = $components['port'];
|
||||
$server['HTTP_HOST'] .= ':' . $components['port'];
|
||||
}
|
||||
|
||||
$server['REQUEST_URI'] = $uri;
|
||||
|
||||
/** @var Request $request */
|
||||
$request = $this->app->make('request');
|
||||
|
||||
$request->withServer($server);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加初始化器
|
||||
* @param Closure $callback
|
||||
@ -161,7 +216,7 @@ class Console
|
||||
/**
|
||||
* @access public
|
||||
* @param string $command
|
||||
* @param array $parameters
|
||||
* @param array $parameters
|
||||
* @param string $driver
|
||||
* @return Output|Buffer
|
||||
*/
|
||||
@ -226,7 +281,7 @@ class Console
|
||||
/**
|
||||
* 执行指令
|
||||
* @access public
|
||||
* @param Input $input
|
||||
* @param Input $input
|
||||
* @param Output $output
|
||||
* @return int
|
||||
*/
|
||||
@ -344,7 +399,7 @@ class Console
|
||||
* 添加一个指令
|
||||
* @access public
|
||||
* @param string|Command $command 指令对象或者指令类名
|
||||
* @param string $name 指令名 留空则自动获取
|
||||
* @param string $name 指令名 留空则自动获取
|
||||
* @return Command|void
|
||||
*/
|
||||
public function addCommand($command, string $name = '')
|
||||
@ -462,7 +517,7 @@ class Console
|
||||
$expr = preg_replace_callback('{([^:]+|)}', function ($matches) {
|
||||
return preg_quote($matches[1]) . '[^:]*';
|
||||
}, $namespace);
|
||||
$namespaces = preg_grep('{^' . $expr . '}', $allNamespaces);
|
||||
$namespaces = preg_grep('{^' . $expr . '}', $allNamespaces);
|
||||
|
||||
if (empty($namespaces)) {
|
||||
$message = sprintf('There are no commands defined in the "%s" namespace.', $namespace);
|
||||
@ -560,7 +615,7 @@ class Console
|
||||
/**
|
||||
* 配置基于用户的参数和选项的输入和输出实例。
|
||||
* @access protected
|
||||
* @param Input $input 输入实例
|
||||
* @param Input $input 输入实例
|
||||
* @param Output $output 输出实例
|
||||
*/
|
||||
protected function configureIO(Input $input, Output $output): void
|
||||
@ -590,8 +645,8 @@ class Console
|
||||
* 执行指令
|
||||
* @access protected
|
||||
* @param Command $command 指令实例
|
||||
* @param Input $input 输入实例
|
||||
* @param Output $output 输出实例
|
||||
* @param Input $input 输入实例
|
||||
* @param Output $output 输出实例
|
||||
* @return int
|
||||
* @throws \Exception
|
||||
*/
|
||||
@ -644,8 +699,8 @@ class Console
|
||||
/**
|
||||
* 返回命名空间部分
|
||||
* @access public
|
||||
* @param string $name 指令
|
||||
* @param int $limit 部分的命名空间的最大数量
|
||||
* @param string $name 指令
|
||||
* @param int $limit 部分的命名空间的最大数量
|
||||
* @return string
|
||||
*/
|
||||
public function extractNamespace(string $name, int $limit = 0): string
|
||||
@ -659,7 +714,7 @@ class Console
|
||||
/**
|
||||
* 查找可替代的建议
|
||||
* @access private
|
||||
* @param string $name
|
||||
* @param string $name
|
||||
* @param array|\Traversable $collection
|
||||
* @return array
|
||||
*/
|
||||
|
@ -152,8 +152,9 @@ class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, C
|
||||
$this->instance($abstract, $concrete);
|
||||
} else {
|
||||
$abstract = $this->getAlias($abstract);
|
||||
|
||||
$this->bind[$abstract] = $concrete;
|
||||
if ($abstract != $concrete) {
|
||||
$this->bind[$abstract] = $concrete;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -445,9 +446,9 @@ class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, C
|
||||
$args[] = $this->getObjectParam($class->getName(), $vars);
|
||||
} elseif (1 == $type && !empty($vars)) {
|
||||
$args[] = array_shift($vars);
|
||||
} elseif (0 == $type && isset($vars[$name])) {
|
||||
} elseif (0 == $type && array_key_exists($name, $vars)) {
|
||||
$args[] = $vars[$name];
|
||||
} elseif (0 == $type && isset($vars[$lowerName])) {
|
||||
} elseif (0 == $type && array_key_exists($lowerName, $vars)) {
|
||||
$args[] = $vars[$lowerName];
|
||||
} elseif ($param->isDefaultValueAvailable()) {
|
||||
$args[] = $param->getDefaultValue();
|
||||
|
12
vendor/topthink/framework/src/think/Http.php
vendored
12
vendor/topthink/framework/src/think/Http.php
vendored
@ -42,6 +42,12 @@ class Http
|
||||
*/
|
||||
protected $path;
|
||||
|
||||
/**
|
||||
* 路由路径
|
||||
* @var string
|
||||
*/
|
||||
protected $routePath;
|
||||
|
||||
/**
|
||||
* 是否绑定应用
|
||||
* @var bool
|
||||
@ -117,7 +123,6 @@ class Http
|
||||
* 设置路由目录
|
||||
* @access public
|
||||
* @param string $path 路由定义目录
|
||||
* @return string
|
||||
*/
|
||||
public function setRoutePath(string $path): void
|
||||
{
|
||||
@ -154,6 +159,9 @@ class Http
|
||||
*/
|
||||
public function run(Request $request = null): Response
|
||||
{
|
||||
//初始化
|
||||
$this->initialize();
|
||||
|
||||
//自动创建request对象
|
||||
$request = $request ?? $this->app->make('request', [], true);
|
||||
$this->app->instance('request', $request);
|
||||
@ -186,8 +194,6 @@ class Http
|
||||
*/
|
||||
protected function runWithRequest(Request $request)
|
||||
{
|
||||
$this->initialize();
|
||||
|
||||
// 加载全局中间件
|
||||
$this->loadMiddleware();
|
||||
|
||||
|
12
vendor/topthink/framework/src/think/Lang.php
vendored
12
vendor/topthink/framework/src/think/Lang.php
vendored
@ -153,6 +153,18 @@ class Lang
|
||||
if (function_exists('yaml_parse_file')) {
|
||||
$result = yaml_parse_file($file);
|
||||
}
|
||||
break;
|
||||
case 'json':
|
||||
$data = file_get_contents($file);
|
||||
|
||||
if($data !== false) {
|
||||
$data = json_decode($data, true);
|
||||
|
||||
if(json_last_error() === JSON_ERROR_NONE) {
|
||||
$result = $data;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
18
vendor/topthink/framework/src/think/Route.php
vendored
18
vendor/topthink/framework/src/think/Route.php
vendored
@ -165,12 +165,12 @@ class Route
|
||||
// 读取路由映射文件
|
||||
$this->import(include $this->app->getRuntimePath() . 'route.php');
|
||||
}
|
||||
|
||||
$this->config = array_merge($this->config, $this->app->config->get('route'));
|
||||
}
|
||||
|
||||
protected function init()
|
||||
{
|
||||
$this->config = array_merge($this->config, $this->app->config->get('route'));
|
||||
|
||||
if (!empty($this->config['middleware'])) {
|
||||
$this->app->middleware->import($this->config['middleware'], 'route');
|
||||
}
|
||||
@ -423,7 +423,7 @@ class Route
|
||||
* @param string $name 路由标识
|
||||
* @param string $domain 域名
|
||||
* @param string $method 请求类型
|
||||
* @return RuleItem[]
|
||||
* @return array
|
||||
*/
|
||||
public function getName(string $name = null, string $domain = null, string $method = '*'): array
|
||||
{
|
||||
@ -681,6 +681,18 @@ class Route
|
||||
public function redirect(string $rule, string $route = '', int $status = 301): RuleItem
|
||||
{
|
||||
return $this->rule($rule, function () use ($status, $route) {
|
||||
$search = $replace = [];
|
||||
$matches = $this->request->rule()->getVars();
|
||||
|
||||
foreach ($matches as $key => $value) {
|
||||
$search[] = '<' . $key . '>';
|
||||
$replace[] = $value;
|
||||
|
||||
$search[] = ':' . $key;
|
||||
$replace[] = $value;
|
||||
}
|
||||
|
||||
$route = str_replace($search, $replace, $route);
|
||||
return Response::create($route, 'redirect')->code($status);
|
||||
}, '*');
|
||||
}
|
||||
|
@ -605,6 +605,7 @@ class Validate
|
||||
if (isset($this->append[$field])) {
|
||||
// 追加额外的验证规则
|
||||
$rules = array_unique(array_merge($rules, $this->append[$field]), SORT_REGULAR);
|
||||
unset($this->append[$field]);
|
||||
}
|
||||
|
||||
if (empty($rules)) {
|
||||
@ -663,7 +664,7 @@ class Validate
|
||||
$i++;
|
||||
}
|
||||
|
||||
return $result;
|
||||
return $result ?? true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -87,7 +87,7 @@ class Redis extends Driver
|
||||
}
|
||||
|
||||
if (0 != $this->options['select']) {
|
||||
$this->handler->select($this->options['select']);
|
||||
$this->handler->select( (int) $this->options['select']);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@ class {%className%} extends Command
|
||||
|
||||
protected function execute(Input $input, Output $output)
|
||||
{
|
||||
// 指令输出
|
||||
$output->writeln('{%commandName%}');
|
||||
// 指令输出
|
||||
$output->writeln('{%commandName%}');
|
||||
}
|
||||
}
|
||||
|
@ -3,9 +3,8 @@ declare (strict_types = 1);
|
||||
|
||||
namespace {%namespace%};
|
||||
|
||||
class {%className%} extends \think\Service
|
||||
class {%className%} extends \think\Service
|
||||
{
|
||||
|
||||
/**
|
||||
* 注册服务
|
||||
*
|
||||
@ -16,7 +15,6 @@ class {%className%} extends \think\Service
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 执行服务
|
||||
*
|
||||
|
@ -9,15 +9,15 @@ class {%className%} extends Validate
|
||||
{
|
||||
/**
|
||||
* 定义验证规则
|
||||
* 格式:'字段名' => ['规则1','规则2'...]
|
||||
* 格式:'字段名' => ['规则1','规则2'...]
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $rule = [];
|
||||
protected $rule = [];
|
||||
|
||||
/**
|
||||
* 定义错误信息
|
||||
* 格式:'字段名.规则名' => '错误信息'
|
||||
* 格式:'字段名.规则名' => '错误信息'
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
|
@ -46,7 +46,7 @@ class Route extends Command
|
||||
$this->app->route->lazy(false);
|
||||
|
||||
// 路由检测
|
||||
$path = $this->app->getRootPath() . ($dir ? 'app' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR : '') . 'route' . DIRECTORY_SEPARATOR ;
|
||||
$path = $this->app->getRootPath() . ($dir ? 'app' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR : '') . 'route' . DIRECTORY_SEPARATOR;
|
||||
|
||||
$files = is_dir($path) ? scandir($path) : [];
|
||||
|
||||
@ -58,10 +58,9 @@ class Route extends Command
|
||||
|
||||
//触发路由载入完成事件
|
||||
$this->app->event->trigger(RouteLoaded::class);
|
||||
$rules = $this->app->route->getName();
|
||||
|
||||
$content = '<?php ' . PHP_EOL . 'return ';
|
||||
$content .= '\Opis\Closure\unserialize(\'' . \Opis\Closure\serialize($this->app->route->getName()) . '\');';
|
||||
return $content;
|
||||
return '<?php ' . PHP_EOL . 'return unserialize(\'' . serialize($rules) . '\');';
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -11,18 +11,49 @@
|
||||
|
||||
namespace think\console\input;
|
||||
|
||||
/**
|
||||
* 命令行选项
|
||||
* @package think\console\input
|
||||
*/
|
||||
class Option
|
||||
{
|
||||
|
||||
// 无需传值
|
||||
const VALUE_NONE = 1;
|
||||
// 必须传值
|
||||
const VALUE_REQUIRED = 2;
|
||||
// 可选传值
|
||||
const VALUE_OPTIONAL = 4;
|
||||
// 传数组值
|
||||
const VALUE_IS_ARRAY = 8;
|
||||
|
||||
/**
|
||||
* 选项名
|
||||
* @var string
|
||||
*/
|
||||
private $name;
|
||||
|
||||
/**
|
||||
* 选项短名称
|
||||
* @var string
|
||||
*/
|
||||
private $shortcut;
|
||||
|
||||
/**
|
||||
* 选项类型
|
||||
* @var int
|
||||
*/
|
||||
private $mode;
|
||||
|
||||
/**
|
||||
* 选项默认值
|
||||
* @var mixed
|
||||
*/
|
||||
private $default;
|
||||
|
||||
/**
|
||||
* 选项描述
|
||||
* @var string
|
||||
*/
|
||||
private $description;
|
||||
|
||||
/**
|
||||
|
@ -61,17 +61,24 @@ class CheckRequestCache
|
||||
public function handle($request, Closure $next, $cache = null)
|
||||
{
|
||||
if ($request->isGet() && false !== $cache) {
|
||||
$cache = $cache ?: $this->getRequestCache($request);
|
||||
if (false === $this->config['request_cache_key']) {
|
||||
// 关闭当前缓存
|
||||
$cache = false;
|
||||
}
|
||||
|
||||
$cache = $cache ?? $this->getRequestCache($request);
|
||||
|
||||
if ($cache) {
|
||||
if (is_array($cache)) {
|
||||
[$key, $expire, $tag] = $cache;
|
||||
[$key, $expire, $tag] = array_pad($cache, 3, null);
|
||||
} else {
|
||||
$key = str_replace('|', '/', $request->url());
|
||||
$key = md5($request->url(true));
|
||||
$expire = $cache;
|
||||
$tag = null;
|
||||
}
|
||||
|
||||
$key = $this->parseCacheKey($request, $key);
|
||||
|
||||
if (strtotime($request->server('HTTP_IF_MODIFIED_SINCE', '')) + $expire > $request->server('REQUEST_TIME')) {
|
||||
// 读取缓存
|
||||
return Response::create()->code(304);
|
||||
@ -111,6 +118,24 @@ class CheckRequestCache
|
||||
$except = $this->config['request_cache_except'];
|
||||
$tag = $this->config['request_cache_tag'];
|
||||
|
||||
foreach ($except as $rule) {
|
||||
if (0 === stripos($request->url(), $rule)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return [$key, $expire, $tag];
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取当前地址的请求缓存信息
|
||||
* @access protected
|
||||
* @param Request $request
|
||||
* @param mixed $key
|
||||
* @return null|string
|
||||
*/
|
||||
protected function parseCacheKey($request, $key)
|
||||
{
|
||||
if ($key instanceof \Closure) {
|
||||
$key = call_user_func($key, $request);
|
||||
}
|
||||
@ -120,12 +145,6 @@ class CheckRequestCache
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($except as $rule) {
|
||||
if (0 === stripos($request->url(), $rule)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (true === $key) {
|
||||
// 自动缓存功能
|
||||
$key = '__URL__';
|
||||
@ -140,6 +159,7 @@ class CheckRequestCache
|
||||
|
||||
if (false !== strpos($key, ':')) {
|
||||
$param = $request->param();
|
||||
|
||||
foreach ($param as $item => $val) {
|
||||
if (is_string($val) && false !== strpos($key, ':' . $item)) {
|
||||
$key = str_replace(':' . $item, $val, $key);
|
||||
@ -158,6 +178,6 @@ class CheckRequestCache
|
||||
$key = $fun($key);
|
||||
}
|
||||
|
||||
return [$key, $expire, $tag];
|
||||
return $key;
|
||||
}
|
||||
}
|
||||
|
@ -237,11 +237,17 @@ abstract class Rule
|
||||
*/
|
||||
public function getPattern(string $name = '')
|
||||
{
|
||||
if ('' === $name) {
|
||||
return $this->pattern;
|
||||
$pattern = $this->pattern;
|
||||
|
||||
if ($this->parent) {
|
||||
$pattern = array_merge($this->parent->getPattern(), $pattern);
|
||||
}
|
||||
|
||||
return $this->pattern[$name] ?? null;
|
||||
if ('' === $name) {
|
||||
return $pattern;
|
||||
}
|
||||
|
||||
return $pattern[$name] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -253,11 +259,26 @@ abstract class Rule
|
||||
*/
|
||||
public function getOption(string $name = '', $default = null)
|
||||
{
|
||||
if ('' === $name) {
|
||||
return $this->option;
|
||||
$option = $this->option;
|
||||
|
||||
if ($this->parent) {
|
||||
$parentOption = $this->parent->getOption();
|
||||
|
||||
// 合并分组参数
|
||||
foreach ($this->mergeOptions as $item) {
|
||||
if (isset($parentOption[$item]) && isset($option[$item])) {
|
||||
$option[$item] = array_merge($parentOption[$item], $option[$item]);
|
||||
}
|
||||
}
|
||||
|
||||
$option = array_merge($parentOption, $option);
|
||||
}
|
||||
|
||||
return $this->option[$name] ?? $default;
|
||||
if ('' === $name) {
|
||||
return $option;
|
||||
}
|
||||
|
||||
return $option[$name] ?? $default;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -551,26 +572,6 @@ abstract class Rule
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 合并分组参数
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function mergeGroupOptions(): array
|
||||
{
|
||||
$parentOption = $this->parent->getOption();
|
||||
// 合并分组参数
|
||||
foreach ($this->mergeOptions as $item) {
|
||||
if (isset($parentOption[$item]) && isset($this->option[$item])) {
|
||||
$this->option[$item] = array_merge($parentOption[$item], $this->option[$item]);
|
||||
}
|
||||
}
|
||||
|
||||
$this->option = array_merge($parentOption, $this->option);
|
||||
|
||||
return $this->option;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析匹配到的规则路由
|
||||
* @access public
|
||||
@ -590,24 +591,31 @@ abstract class Rule
|
||||
}
|
||||
|
||||
// 替换路由地址中的变量
|
||||
if (is_string($route) && !empty($matches)) {
|
||||
$search = $replace = [];
|
||||
$extraParams = true;
|
||||
$search = $replace = [];
|
||||
$depr = $this->router->config('pathinfo_depr');
|
||||
foreach ($matches as $key => $value) {
|
||||
$search[] = '<' . $key . '>';
|
||||
$replace[] = $value;
|
||||
|
||||
foreach ($matches as $key => $value) {
|
||||
$search[] = '<' . $key . '>';
|
||||
$replace[] = $value;
|
||||
$search[] = ':' . $key;
|
||||
$replace[] = $value;
|
||||
|
||||
$search[] = ':' . $key;
|
||||
$replace[] = $value;
|
||||
if (strpos($value, $depr)) {
|
||||
$extraParams = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_string($route)) {
|
||||
$route = str_replace($search, $replace, $route);
|
||||
}
|
||||
|
||||
// 解析额外参数
|
||||
$count = substr_count($rule, '/');
|
||||
$url = array_slice(explode('|', $url), $count + 1);
|
||||
$this->parseUrlParams(implode('|', $url), $matches);
|
||||
if ($extraParams) {
|
||||
$count = substr_count($rule, '/');
|
||||
$url = array_slice(explode('|', $url), $count + 1);
|
||||
$this->parseUrlParams(implode('|', $url), $matches);
|
||||
}
|
||||
|
||||
$this->vars = $matches;
|
||||
|
||||
@ -630,7 +638,7 @@ abstract class Rule
|
||||
} elseif ($route instanceof Closure) {
|
||||
// 执行闭包
|
||||
$result = new CallbackDispatch($request, $this, $route, $this->vars);
|
||||
} elseif (false !== strpos($route, '@') || false !== strpos($route, '::')) {
|
||||
} elseif (false !== strpos($route, '@') || false !== strpos($route, '::') || false !== strpos($route, '\\')) {
|
||||
// 路由到类的方法
|
||||
$route = str_replace('::', '@', $route);
|
||||
$result = $this->dispatchMethod($request, $route);
|
||||
|
@ -147,19 +147,13 @@ class RuleGroup extends Rule
|
||||
// 获取当前路由规则
|
||||
$method = strtolower($request->method());
|
||||
$rules = $this->getRules($method);
|
||||
$option = $this->getOption();
|
||||
|
||||
if ($this->parent) {
|
||||
// 合并分组参数
|
||||
$this->mergeGroupOptions();
|
||||
// 合并分组变量规则
|
||||
$this->pattern = array_merge($this->parent->getPattern(), $this->pattern);
|
||||
if (isset($option['complete_match'])) {
|
||||
$completeMatch = $option['complete_match'];
|
||||
}
|
||||
|
||||
if (isset($this->option['complete_match'])) {
|
||||
$completeMatch = $this->option['complete_match'];
|
||||
}
|
||||
|
||||
if (!empty($this->option['merge_rule_regex'])) {
|
||||
if (!empty($option['merge_rule_regex'])) {
|
||||
// 合并路由正则规则进行路由匹配检查
|
||||
$result = $this->checkMergeRuleRegex($request, $rules, $url, $completeMatch);
|
||||
|
||||
@ -179,7 +173,7 @@ class RuleGroup extends Rule
|
||||
|
||||
if ($this->miss && in_array($this->miss->getMethod(), ['*', $method])) {
|
||||
// 未匹配所有路由的路由规则处理
|
||||
$result = $this->parseRule($request, '', $this->miss->getRoute(), $url, $this->miss->mergeGroupOptions());
|
||||
$result = $this->parseRule($request, '', $this->miss->getRoute(), $url, $this->miss->getOption());
|
||||
} else {
|
||||
$result = false;
|
||||
}
|
||||
@ -495,7 +489,7 @@ class RuleGroup extends Rule
|
||||
}
|
||||
|
||||
return array_filter($this->rules, function ($item) use ($method) {
|
||||
return $method == $item[0] || $item[0] == '*';
|
||||
return $method == $item[0] || '*' == $item[0];
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -191,12 +191,12 @@ class RuleItem extends Rule
|
||||
}
|
||||
|
||||
// 合并分组参数
|
||||
$option = $this->mergeGroupOptions();
|
||||
|
||||
$url = $this->urlSuffixCheck($request, $url, $option);
|
||||
$option = $this->getOption();
|
||||
$pattern = $this->getPattern();
|
||||
$url = $this->urlSuffixCheck($request, $url, $option);
|
||||
|
||||
if (is_null($match)) {
|
||||
$match = $this->match($url, $option, $completeMatch);
|
||||
$match = $this->match($url, $option, $pattern, $completeMatch);
|
||||
}
|
||||
|
||||
if (false !== $match) {
|
||||
@ -248,17 +248,17 @@ class RuleItem extends Rule
|
||||
* @access private
|
||||
* @param string $url URL地址
|
||||
* @param array $option 路由参数
|
||||
* @param bool $completeMatch 路由是否完全匹配
|
||||
* @param array $pattern 变量规则
|
||||
* @param bool $completeMatch 是否完全匹配
|
||||
* @return array|false
|
||||
*/
|
||||
private function match(string $url, array $option, bool $completeMatch)
|
||||
private function match(string $url, array $option, array $pattern, bool $completeMatch)
|
||||
{
|
||||
if (isset($option['complete_match'])) {
|
||||
$completeMatch = $option['complete_match'];
|
||||
}
|
||||
|
||||
$depr = $this->router->config('pathinfo_depr');
|
||||
$pattern = array_merge($this->parent->getPattern(), $this->pattern);
|
||||
$depr = $this->router->config('pathinfo_depr');
|
||||
|
||||
// 检查完整规则定义
|
||||
if (isset($pattern['__url__']) && !preg_match(0 === strpos($pattern['__url__'], '/') ? $pattern['__url__'] : '/^' . $pattern['__url__'] . ($completeMatch ? '$' : '') . '/', str_replace('|', $depr, $url))) {
|
||||
|
@ -46,10 +46,11 @@ class RuleName
|
||||
public function setName(string $name, RuleItem $ruleItem, bool $first = false): void
|
||||
{
|
||||
$name = strtolower($name);
|
||||
$item = $this->getRuleItemInfo($ruleItem);
|
||||
if ($first && isset($this->item[$name])) {
|
||||
array_unshift($this->item[$name], $ruleItem);
|
||||
array_unshift($this->item[$name], $item);
|
||||
} else {
|
||||
$this->item[$name][] = $ruleItem;
|
||||
$this->item[$name][] = $item;
|
||||
}
|
||||
}
|
||||
|
||||
@ -179,8 +180,8 @@ class RuleName
|
||||
$result = $this->item[$name];
|
||||
} else {
|
||||
foreach ($this->item[$name] as $item) {
|
||||
$itemDomain = $item->getDomain();
|
||||
$itemMethod = $item->getMethod();
|
||||
$itemDomain = $item['domain'];
|
||||
$itemMethod = $item['method'];
|
||||
|
||||
if (($itemDomain == $domain || '-' == $itemDomain) && ('*' == $itemMethod || '*' == $method || $method == $itemMethod)) {
|
||||
$result[] = $item;
|
||||
@ -192,4 +193,19 @@ class RuleName
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取路由信息
|
||||
* @access protected
|
||||
* @param RuleItem $item 路由规则
|
||||
* @return array
|
||||
*/
|
||||
protected function getRuleItemInfo(RuleItem $item): array
|
||||
{
|
||||
return [
|
||||
'rule' => $item->getRule(),
|
||||
'domain' => $item->getDomain(),
|
||||
'method' => $item->getMethod(),
|
||||
'suffix' => $item->getSuffix(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -302,10 +302,10 @@ class Url
|
||||
$port = $request->port();
|
||||
|
||||
foreach ($rule as $item) {
|
||||
$url = $item->getRule();
|
||||
$url = $item['rule'];
|
||||
$pattern = $this->parseVar($url);
|
||||
$domain = $item->getDomain();
|
||||
$suffix = $item->getSuffix();
|
||||
$domain = $item['domain'];
|
||||
$suffix = $item['suffix'];
|
||||
|
||||
if ('-' == $domain) {
|
||||
$domain = is_string($allowDomain) ? $allowDomain : $request->host(true);
|
||||
|
@ -39,7 +39,7 @@ class File implements SessionHandlerInterface
|
||||
$this->config = array_merge($this->config, $config);
|
||||
|
||||
if (empty($this->config['path'])) {
|
||||
$this->config['path'] = $app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR . 'session' . DIRECTORY_SEPARATOR;
|
||||
$this->config['path'] = $app->getRuntimePath() . 'session' . DIRECTORY_SEPARATOR;
|
||||
} elseif (substr($this->config['path'], -1) != DIRECTORY_SEPARATOR) {
|
||||
$this->config['path'] .= DIRECTORY_SEPARATOR;
|
||||
}
|
||||
|
@ -149,6 +149,7 @@ class ContainerTest extends TestCase
|
||||
|
||||
$container->bind('name2', $object);
|
||||
|
||||
$container->bind('name3', Taylor::class);
|
||||
$container->bind('name3', Taylor::class);
|
||||
|
||||
$container->name4 = $object;
|
||||
|
1
vendor/topthink/framework/tests/HttpTest.php
vendored
1
vendor/topthink/framework/tests/HttpTest.php
vendored
@ -123,6 +123,7 @@ class HttpTest extends TestCase
|
||||
$response = m::mock(Response::class);
|
||||
|
||||
$this->app->shouldReceive('instance')->once()->with('request', $request);
|
||||
$this->app->shouldReceive('initialize')->once();
|
||||
|
||||
$exception = new Exception();
|
||||
|
||||
|
@ -203,7 +203,7 @@ abstract class PDOConnection extends Connection
|
||||
* @param array $config 连接信息
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function parseDsn(array $config);
|
||||
abstract protected function parseDsn(array $config): string;
|
||||
|
||||
/**
|
||||
* 取得数据表的字段信息
|
||||
@ -211,7 +211,7 @@ abstract class PDOConnection extends Connection
|
||||
* @param string $tableName 数据表名称
|
||||
* @return array
|
||||
*/
|
||||
abstract public function getFields(string $tableName);
|
||||
abstract public function getFields(string $tableName): array;
|
||||
|
||||
/**
|
||||
* 取得数据库的表信息
|
||||
@ -219,7 +219,7 @@ abstract class PDOConnection extends Connection
|
||||
* @param string $dbName 数据库名称
|
||||
* @return array
|
||||
*/
|
||||
abstract public function getTables(string $dbName);
|
||||
abstract public function getTables(string $dbName = ''): array;
|
||||
|
||||
/**
|
||||
* 对返数据表字段信息进行大小写转换出来
|
||||
@ -728,16 +728,13 @@ abstract class PDOConnection extends Connection
|
||||
*/
|
||||
public function getPDOStatement(string $sql, array $bind = [], bool $master = false, bool $procedure = false): PDOStatement
|
||||
{
|
||||
$this->initConnect($this->readMaster ?: $master);
|
||||
|
||||
// 记录SQL语句
|
||||
$this->queryStr = $sql;
|
||||
|
||||
$this->bind = $bind;
|
||||
|
||||
$this->db->updateQueryTimes();
|
||||
|
||||
try {
|
||||
$this->initConnect($this->readMaster ?: $master);
|
||||
// 记录SQL语句
|
||||
$this->queryStr = $sql;
|
||||
$this->bind = $bind;
|
||||
|
||||
$this->db->updateQueryTimes();
|
||||
$this->queryStartTime = microtime(true);
|
||||
|
||||
// 预处理
|
||||
@ -1394,11 +1391,11 @@ abstract class PDOConnection extends Connection
|
||||
*/
|
||||
public function startTrans(): void
|
||||
{
|
||||
$this->initConnect(true);
|
||||
|
||||
++$this->transTimes;
|
||||
|
||||
try {
|
||||
$this->initConnect(true);
|
||||
|
||||
++$this->transTimes;
|
||||
|
||||
if (1 == $this->transTimes) {
|
||||
$this->linkID->beginTransaction();
|
||||
} elseif ($this->transTimes > 1 && $this->supportSavepoint()) {
|
||||
@ -1412,8 +1409,9 @@ abstract class PDOConnection extends Connection
|
||||
--$this->transTimes;
|
||||
++$this->reConnectTimes;
|
||||
$this->close()->startTrans();
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -378,7 +378,7 @@ trait WhereQuery
|
||||
} elseif (is_string($field)) {
|
||||
if (preg_match('/[,=\<\'\"\(\s]/', $field)) {
|
||||
return $this->whereRaw($field, is_array($op) ? $op : [], $logic);
|
||||
} elseif (is_string($op) && strtolower($op) == 'exp') {
|
||||
} elseif (is_string($op) && strtolower($op) == 'exp' && !is_null($condition)) {
|
||||
$bind = isset($param[2]) && is_array($param[2]) ? $param[2] : [];
|
||||
return $this->whereExp($field, $condition, $bind, $logic);
|
||||
}
|
||||
@ -514,17 +514,9 @@ trait WhereQuery
|
||||
}
|
||||
|
||||
if ($condition) {
|
||||
if ($query instanceof Closure) {
|
||||
$query($this, $condition);
|
||||
} elseif (is_array($query)) {
|
||||
$this->where($query);
|
||||
}
|
||||
$this->where($query);
|
||||
} elseif ($otherwise) {
|
||||
if ($otherwise instanceof Closure) {
|
||||
$otherwise($this, $condition);
|
||||
} elseif (is_array($otherwise)) {
|
||||
$this->where($otherwise);
|
||||
}
|
||||
$this->where($otherwise);
|
||||
}
|
||||
|
||||
return $this;
|
||||
|
@ -17,65 +17,94 @@ use Exception;
|
||||
/**
|
||||
* Database相关异常处理类
|
||||
*/
|
||||
class DbException extends Exception
|
||||
{
|
||||
/**
|
||||
* DbException constructor.
|
||||
* @access public
|
||||
* @param string $message
|
||||
* @param array $config
|
||||
* @param string $sql
|
||||
* @param int $code
|
||||
*/
|
||||
public function __construct(string $message, array $config = [], string $sql = '', int $code = 10500)
|
||||
if (class_exists('think\Exception')) {
|
||||
class DbException extends \think\Exception
|
||||
{
|
||||
$this->message = $message;
|
||||
$this->code = $code;
|
||||
/**
|
||||
* DbException constructor.
|
||||
* @access public
|
||||
* @param string $message
|
||||
* @param array $config
|
||||
* @param string $sql
|
||||
* @param int $code
|
||||
*/
|
||||
public function __construct(string $message, array $config = [], string $sql = '', int $code = 10500)
|
||||
{
|
||||
$this->message = $message;
|
||||
$this->code = $code;
|
||||
|
||||
$this->setData('Database Status', [
|
||||
'Error Code' => $code,
|
||||
'Error Message' => $message,
|
||||
'Error SQL' => $sql,
|
||||
]);
|
||||
$this->setData('Database Status', [
|
||||
'Error Code' => $code,
|
||||
'Error Message' => $message,
|
||||
'Error SQL' => $sql,
|
||||
]);
|
||||
|
||||
unset($config['username'], $config['password']);
|
||||
$this->setData('Database Config', $config);
|
||||
unset($config['username'], $config['password']);
|
||||
$this->setData('Database Config', $config);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
/**
|
||||
* 保存异常页面显示的额外Debug数据
|
||||
* @var array
|
||||
*/
|
||||
protected $data = [];
|
||||
|
||||
/**
|
||||
* 设置异常额外的Debug数据
|
||||
* 数据将会显示为下面的格式
|
||||
*
|
||||
* Exception Data
|
||||
* --------------------------------------------------
|
||||
* Label 1
|
||||
* key1 value1
|
||||
* key2 value2
|
||||
* Label 2
|
||||
* key1 value1
|
||||
* key2 value2
|
||||
*
|
||||
* @param string $label 数据分类,用于异常页面显示
|
||||
* @param array $data 需要显示的数据,必须为关联数组
|
||||
*/
|
||||
final protected function setData($label, array $data)
|
||||
class DbException extends Exception
|
||||
{
|
||||
$this->data[$label] = $data;
|
||||
}
|
||||
/**
|
||||
* DbException constructor.
|
||||
* @access public
|
||||
* @param string $message
|
||||
* @param array $config
|
||||
* @param string $sql
|
||||
* @param int $code
|
||||
*/
|
||||
public function __construct(string $message, array $config = [], string $sql = '', int $code = 10500)
|
||||
{
|
||||
$this->message = $message;
|
||||
$this->code = $code;
|
||||
|
||||
/**
|
||||
* 获取异常额外Debug数据
|
||||
* 主要用于输出到异常页面便于调试
|
||||
* @return array 由setData设置的Debug数据
|
||||
*/
|
||||
final public function getData()
|
||||
{
|
||||
return $this->data;
|
||||
$this->setData('Database Status', [
|
||||
'Error Code' => $code,
|
||||
'Error Message' => $message,
|
||||
'Error SQL' => $sql,
|
||||
]);
|
||||
|
||||
unset($config['username'], $config['password']);
|
||||
$this->setData('Database Config', $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存异常页面显示的额外Debug数据
|
||||
* @var array
|
||||
*/
|
||||
protected $data = [];
|
||||
|
||||
/**
|
||||
* 设置异常额外的Debug数据
|
||||
* 数据将会显示为下面的格式
|
||||
*
|
||||
* Exception Data
|
||||
* --------------------------------------------------
|
||||
* Label 1
|
||||
* key1 value1
|
||||
* key2 value2
|
||||
* Label 2
|
||||
* key1 value1
|
||||
* key2 value2
|
||||
*
|
||||
* @param string $label 数据分类,用于异常页面显示
|
||||
* @param array $data 需要显示的数据,必须为关联数组
|
||||
*/
|
||||
final protected function setData($label, array $data)
|
||||
{
|
||||
$this->data[$label] = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取异常额外Debug数据
|
||||
* 主要用于输出到异常页面便于调试
|
||||
* @return array 由setData设置的Debug数据
|
||||
*/
|
||||
final public function getData()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
20
vendor/topthink/think-orm/src/model/Relation.php
vendored
20
vendor/topthink/think-orm/src/model/Relation.php
vendored
@ -99,6 +99,26 @@ abstract class Relation
|
||||
return $this->query;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取关联表外键
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getForeignKey()
|
||||
{
|
||||
return $this->foreignKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取关联表主键
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getLocalKey()
|
||||
{
|
||||
return $this->localKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前的关联模型类的实例
|
||||
* @access public
|
||||
|
@ -185,7 +185,11 @@ trait Attribute
|
||||
*/
|
||||
protected function getRealFieldName(string $name): string
|
||||
{
|
||||
return $this->strict ? $name : Str::snake($name);
|
||||
if ($this->convertNameToCamel || !$this->strict) {
|
||||
return Str::snake($name);
|
||||
}
|
||||
|
||||
return $name;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -302,7 +306,7 @@ trait Attribute
|
||||
|
||||
// 只读字段不允许更新
|
||||
foreach ($this->readonly as $key => $field) {
|
||||
if (isset($data[$field])) {
|
||||
if (array_key_exists($field, $data)) {
|
||||
unset($data[$field]);
|
||||
}
|
||||
}
|
||||
|
@ -48,6 +48,24 @@ trait Conversion
|
||||
*/
|
||||
protected $resultSetType;
|
||||
|
||||
/**
|
||||
* 数据命名是否自动转为驼峰
|
||||
* @var bool
|
||||
*/
|
||||
protected $convertNameToCamel;
|
||||
|
||||
/**
|
||||
* 转换数据为驼峰命名(用于输出)
|
||||
* @access public
|
||||
* @param bool $toCamel 是否自动驼峰命名
|
||||
* @return $this
|
||||
*/
|
||||
public function convertNameToCamel(bool $toCamel = true)
|
||||
{
|
||||
$this->convertNameToCamel = $toCamel;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置需要附加的输出属性
|
||||
* @access public
|
||||
@ -181,6 +199,16 @@ trait Conversion
|
||||
$this->appendAttrToArray($item, $key, $name);
|
||||
}
|
||||
|
||||
if ($this->convertNameToCamel) {
|
||||
foreach ($item as $key => $val) {
|
||||
$name = Str::camel($key);
|
||||
if ($name !== $key) {
|
||||
$item[$name] = $val;
|
||||
unset($item[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $item;
|
||||
}
|
||||
|
||||
|
@ -440,20 +440,23 @@ class BelongsToMany extends Relation
|
||||
protected function belongsToManyQuery(string $foreignKey, string $localKey, array $condition = []): Query
|
||||
{
|
||||
// 关联查询封装
|
||||
$tableName = $this->query->getTable();
|
||||
$table = $this->pivot->db()->getTable();
|
||||
$fields = $this->getQueryFields($tableName);
|
||||
if (empty($this->baseQuery)) {
|
||||
$tableName = $this->query->getTable();
|
||||
$table = $this->pivot->db()->getTable();
|
||||
$fields = $this->getQueryFields($tableName);
|
||||
|
||||
if ($this->withLimit) {
|
||||
$this->query->limit($this->withLimit);
|
||||
}
|
||||
|
||||
$this->query
|
||||
->field($fields)
|
||||
->tableField(true, $table, 'pivot', 'pivot__')
|
||||
->join([$table => 'pivot'], 'pivot.' . $foreignKey . '=' . $tableName . '.' . $this->query->getPk())
|
||||
->where($condition);
|
||||
|
||||
if ($this->withLimit) {
|
||||
$this->query->limit($this->withLimit);
|
||||
}
|
||||
|
||||
$this->query
|
||||
->field($fields)
|
||||
->tableField(true, $table, 'pivot', 'pivot__')
|
||||
->join([$table => 'pivot'], 'pivot.' . $foreignKey . '=' . $tableName . '.' . $this->query->getPk())
|
||||
->where($condition);
|
||||
|
||||
return $this->query;
|
||||
}
|
||||
|
||||
@ -666,7 +669,11 @@ class BelongsToMany extends Relation
|
||||
$localKey = $this->localKey;
|
||||
|
||||
// 关联查询
|
||||
$condition = ['pivot.' . $localKey, '=', $this->parent->getKey()];
|
||||
if (null === $this->parent->getKey()) {
|
||||
$condition = ['pivot.' . $localKey, 'exp', new Raw('=' . $this->parent->getTable() . '.' . $this->parent->getPk())];
|
||||
} else {
|
||||
$condition = ['pivot.' . $localKey, '=', $this->parent->getKey()];
|
||||
}
|
||||
|
||||
$this->belongsToManyQuery($foreignKey, $localKey, [$condition]);
|
||||
|
||||
|
@ -181,7 +181,7 @@ class HasOne extends OneToOne
|
||||
|
||||
$fields = $this->getRelationQueryFields($fields, $model);
|
||||
$softDelete = $this->query->getOptions('soft_delete');
|
||||
$query = $query ?: $this->parent->db()->alias($model);
|
||||
$query = $query ? $query->alias($model) : $this->parent->db()->alias($model);
|
||||
|
||||
return $query->field($fields)
|
||||
->join([$table => $relation], $model . '.' . $this->localKey . '=' . $relation . '.' . $this->foreignKey, $joinType ?: $this->joinType)
|
||||
|
@ -307,10 +307,6 @@ abstract class OneToOne extends Relation
|
||||
$this->query->field($this->withField);
|
||||
}
|
||||
|
||||
if ($this->query->getOptions('order')) {
|
||||
$this->query->group($key);
|
||||
}
|
||||
|
||||
$list = $this->query
|
||||
->where($where)
|
||||
->with($subRelation)
|
||||
|
7
vendor/topthink/think-trace/src/Console.php
vendored
7
vendor/topthink/think-trace/src/Console.php
vendored
@ -40,12 +40,15 @@ class Console
|
||||
{
|
||||
$request = $app->request;
|
||||
$contentType = $response->getHeader('Content-Type');
|
||||
$accept = $request->header('accept', '');
|
||||
if (strpos($accept, 'application/json') === 0 || $request->isAjax()) {
|
||||
|
||||
if ($request->isJson() || $request->isAjax()) {
|
||||
return false;
|
||||
} elseif (!empty($contentType) && strpos($contentType, 'html') === false) {
|
||||
return false;
|
||||
} elseif ($response->getCode() == 204) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取基本信息
|
||||
$runtime = number_format(microtime(true) - $app->getBeginTime(), 10, '.', '');
|
||||
$reqs = $runtime > 0 ? number_format(1 / $runtime, 2) : '∞';
|
||||
|
9
vendor/topthink/think-trace/src/Html.php
vendored
9
vendor/topthink/think-trace/src/Html.php
vendored
@ -40,14 +40,15 @@ class Html
|
||||
*/
|
||||
public function output(App $app, Response $response, array $log = [])
|
||||
{
|
||||
$request = $app->request;
|
||||
|
||||
$request = $app->request;
|
||||
$contentType = $response->getHeader('Content-Type');
|
||||
$accept = $request->header('accept', '');
|
||||
if (strpos($accept, 'application/json') === 0 || $request->isAjax()) {
|
||||
|
||||
if ($request->isJson() || $request->isAjax()) {
|
||||
return false;
|
||||
} elseif (!empty($contentType) && strpos($contentType, 'html') === false) {
|
||||
return false;
|
||||
} elseif ($response->getCode() == 204) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取基本信息
|
||||
|
Loading…
x
Reference in New Issue
Block a user