{"record":{"id":"b21e4bb90d406742","repo":"ellite/Wallos","slug":"parameter-s-does-not-exist","errorCode":null,"errorMessage":"Parameter \"%s\" does not exist","messagePattern":"Parameter \"(.+?)\" does not exist","errorType":"exception","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"libs/OTPHP/ParameterTrait.php","lineNumber":112,"sourceCode":"    {\n        $value = $this->getParameter('algorithm');\n        (is_string($value) && $value !== '') || throw new InvalidArgumentException('Invalid \"algorithm\" parameter.');\n\n        return $value;\n    }\n\n    public function hasParameter(string $parameter): bool\n    {\n        return array_key_exists($parameter, $this->parameters);\n    }\n\n    public function getParameter(string $parameter): mixed\n    {\n        if ($this->hasParameter($parameter)) {\n            return $this->getParameters()[$parameter];\n        }\n\n        throw new InvalidArgumentException(sprintf('Parameter \"%s\" does not exist', $parameter));\n    }\n\n    public function setParameter(string $parameter, mixed $value): void\n    {\n        $map = $this->getParameterMap();\n\n        if (array_key_exists($parameter, $map) === true) {\n            $callback = $map[$parameter];\n            $value = $callback($value);\n        }\n\n        if (property_exists($this, $parameter)) {\n            $this->{$parameter} = $value;\n        } else {\n            $this->parameters[$parameter] = $value;\n        }\n    }\n","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/ellite/Wallos/blob/52820e87ca5a6e105fdbb7f1c0c681bc0cfee2fd/libs/OTPHP/ParameterTrait.php#L94-L130","documentation":"getParameter() looks up a parameter among the OTP object's set parameters. When the requested parameter key was never set, it throws this InvalidArgumentException instead of returning null, forcing callers to treat missing parameters as programming errors.","triggerScenarios":"Calling getParameter('period')/getParameter('algorithm')/etc. on an OTP object where that key was never passed to createFromSecret/createFromDigits or setParameter; getSecret/getDigits/getDigest all funnel through this method.","commonSituations":"Building an OTP object step by step and reading a parameter before setting it; copy-pasting code between HOTP and TOTP where only one has 'period'; deserializing a partial parameter array.","solutions":["Set the parameter via setParameter() or the factory method (e.g. createFromSecret) before reading it","Check hasParameter('x') before calling getParameter('x')","Use getParameters() to inspect all currently set keys"],"exampleFix":"// before\n$digits = $otp->getParameter('digits'); // throws if unset\n// after\nif ($otp->hasParameter('digits')) {\n    $digits = $otp->getParameter('digits');\n}","handlingStrategy":"try-catch","validationCode":"if (!$otp->hasParameter('digits')) {\n    throw new \\LogicException('digits must be configured first');\n}","typeGuard":"function paramOrNull($otp, string $key): mixed {\n    return $otp->hasParameter($key) ? $otp->getParameter($key) : null;\n}","tryCatchPattern":"try {\n    $value = $otp->getParameter('period');\n} catch (\\InvalidArgumentException $e) {\n    $value = 30; // default period\n}","preventionTips":["Use hasParameter() before getParameter() for optional keys","Inspect getParameters() during debugging to see which keys exist","Configure all parameters at construction time, not lazily"],"tags":["php","otp","missing-parameter"],"backgroundTag":"missing-config-key","analyzedSha":"52820e87ca5a6e105fdbb7f1c0c681bc0cfee2fd","analyzedAt":"2026-09-13T14:09:30.873Z","contentChangedAt":"2026-09-13T14:09:30.873Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}