{"id":"d2548de1c2f8c9aa","repo":"laravel/framework","slug":"unable-to-resolve-dependency-parameter-in-cla","errorCode":null,"errorMessage":"Unable to resolve dependency [{$parameter}] in class {$parameter->getDeclaringClass()->getName()}","messagePattern":"Unable to resolve dependency \\[(.+?)\\] in class (.+?)","errorType":"exception","errorClass":"BindingResolutionException","httpStatus":null,"severity":"error","filePath":"src/Illuminate/Container/BoundMethod.php","lineNumber":200,"sourceCode":"\n                unset($parameters[$className]);\n            } elseif ($parameter->isVariadic()) {\n                $variadicDependencies = $container->make($className);\n\n                $pendingDependencies = array_merge($pendingDependencies, is_array($variadicDependencies)\n                    ? $variadicDependencies\n                    : [$variadicDependencies]);\n            } elseif ($parameter->isDefaultValueAvailable() && ! $container->bound($className)) {\n                $pendingDependencies[] = $parameter->getDefaultValue();\n            } else {\n                $pendingDependencies[] = $container->make($className);\n            }\n        } elseif ($parameter->isDefaultValueAvailable()) {\n            $pendingDependencies[] = $parameter->getDefaultValue();\n        } elseif (! $parameter->isOptional() && ! array_key_exists($paramName, $parameters)) {\n            $message = \"Unable to resolve dependency [{$parameter}] in class {$parameter->getDeclaringClass()->getName()}\";\n\n            throw new BindingResolutionException($message);\n        }\n\n        foreach ($pendingDependencies as $dependency) {\n            $container->fireAfterResolvingAttributeCallbacks($parameter->getAttributes(), $dependency);\n        }\n\n        $dependencies = array_merge($dependencies, $pendingDependencies);\n    }\n\n    /**\n     * Determine if the given string is in Class@method syntax.\n     *\n     * @param  mixed  $callback\n     * @return bool\n     */\n    protected static function isCallableWithAtSign($callback)\n    {\n        return is_string($callback) && str_contains($callback, '@');","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/laravel/framework/blob/bd6b5437e6ad87bb49f9b426724f07a9f64e9683/src/Illuminate/Container/BoundMethod.php#L182-L218","documentation":"Thrown by BoundMethod::addDependencyForCallParameter while Container::call injects dependencies for a closure/method. When a parameter has no type-hinted class, no contextual attribute, no default value, is not optional, and is not present in the supplied parameters array, the container cannot supply a value and throws BindingResolutionException naming the parameter and its declaring class.","triggerScenarios":"Calling $container->call([$obj, 'send'], ['to' => 'x']) where send(Mailer $mailer, $message) has an untyped $message with no default and 'message' was not passed. Any method invoked via call() with a required untyped/missing scalar or object parameter.","commonSituations":"Refactoring a method signature to add a new required parameter without updating all Container::call sites; passing positional instead of named parameters (call() resolves by name); a service method that needs a primitive the caller forgot.","solutions":["Pass the missing parameter by name in the parameters array: $container->call([$obj, 'send'], ['message' => $body]).","Give the parameter a default value ($message = '') or make it nullable / optional.","Add a class type-hint so the container can auto-resolve it, or register a contextual binding for the primitive ('$message' => ...)."],"exampleFix":"// before\npublic function send(Mailer $mailer, string $message): void {...}\napp()->call([$service, 'send'], []);\n\n// after\napp()->call([$service, 'send'], ['message' => 'Hello']);","handlingStrategy":"try-catch","validationCode":"$reflection = new \\ReflectionMethod($service, 'send');\n$missing = [];\nforeach ($reflection->getParameters() as $p) {\n    if (! $p->isOptional()\n        && $p->getClass() === null\n        && ! array_key_exists($p->getName(), $params)) {\n        $missing[] = $p->getName();\n    }\n}\nif ($missing) throw new \\InvalidArgumentException('Missing params: '.implode(',', $missing));\napp()->call([$service, 'send'], $params);","typeGuard":"function allRequiredParamsProvidied(object $obj, string $method, array $params): bool\n{\n    $r = new \\ReflectionMethod($obj, $method);\n    foreach ($r->getParameters() as $p) {\n        if (! $p->isOptional() && $p->getType() === null && ! array_key_exists($p->getName(), $params)) {\n            return false;\n        }\n    }\n    return true;\n}","tryCatchPattern":"use Illuminate\\Contracts\\Container\\BindingResolutionException;\ntry {\n    app()->call([$service, 'send'], $params);\n} catch (BindingResolutionException $e) {\n    if (str_starts_with($e->getMessage(), 'Unable to resolve dependency')) {\n        // log and supply default, or rethrow as domain error\n    }\n    throw $e;\n}","preventionTips":["Prefer named keys when passing parameters to Container::call.","Give optional defaults to primitive parameters.","Write integration tests that exercise Container::call paths."],"tags":["container","dependency-injection","method-call","di"],"analyzedSha":"bd6b5437e6ad87bb49f9b426724f07a9f64e9683","analyzedAt":"2026-08-06T00:28:32.783Z","schemaVersion":2}