commandID = strtoupper($commandID); $this->setArguments($arguments); } /** * Creates a new raw command using a variadic method. * * @param string $commandID Redis command ID * @param string ...$args Arguments list for the command * * @return CommandInterface */ public static function create($commandID, ...$args) { $arguments = func_get_args(); return new static(array_shift($arguments), $arguments); } /** * {@inheritdoc} */ public function getId() { return $this->commandID; } /** * {@inheritdoc} */ public function setArguments(array $arguments) { $this->arguments = $arguments; unset($this->slot); } /** * {@inheritdoc} */ public function setRawArguments(array $arguments) { $this->setArguments($arguments); } /** * {@inheritdoc} */ public function getArguments() { return $this->arguments; } /** * {@inheritdoc} */ public function getArgument($index) { if (isset($this->arguments[$index])) { return $this->arguments[$index]; } } /** * {@inheritdoc} */ public function setSlot($slot) { $this->slot = $slot; } /** * {@inheritdoc} */ public function getSlot() { return $this->slot ?? null; } /** * {@inheritdoc} */ public function parseResponse($data) { return $data; } /** * {@inheritdoc} */ public function parseResp3Response($data) { return $data; } /** * {@inheritDoc} */ public function serializeCommand(): string { $commandID = $this->getId(); $arguments = $this->getArguments(); $cmdlen = strlen($commandID); $reqlen = count($arguments) + 1; $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; foreach ($arguments as $argument) { $arglen = strlen(strval($argument)); $buffer .= "\${$arglen}\r\n{$argument}\r\n"; } return $buffer; } public static function deserializeCommand(string $serializedCommand): CommandInterface { if ($serializedCommand[0] !== '*') { throw new UnexpectedValueException('Invalid serializing format'); } $commandArray = explode("\r\n", $serializedCommand); $commandId = $commandArray[2]; $classPath = __NAMESPACE__ . '\Redis\\'; // Check if given command is a module command. if (count($commandIdArray = explode('.', $commandId)) > 1) { // Fetch module configuration to resolve namespace. $moduleConfiguration = array_filter( ClientConfiguration::getModules(), static function ($module) use ($commandIdArray) { return $module['commandPrefix'] === $commandIdArray[0]; } ); $commandClass = strtoupper($commandIdArray[0] . $commandIdArray[1]); $classPath .= array_shift($moduleConfiguration)['name'] . '\\' . $commandClass; } else { $classPath .= $commandIdArray[0]; } $command = new $classPath(); $arguments = []; for ($i = 4, $iMax = count($commandArray); $i < $iMax; $i++) { $arguments[] = $commandArray[$i]; ++$i; } $command->setArguments($arguments); return $command; } }