{"id":"4f645619f3074556","repo":"laravel/framework","slug":"failed-to-find-resource-class-for-model-s","errorCode":null,"errorMessage":"Failed to find resource class for model [%s].","messagePattern":"Failed to find resource class for model \\[(.+?)\\]\\.","errorType":"exception","errorClass":"LogicException","httpStatus":null,"severity":"error","filePath":"src/Illuminate/Collections/Traits/TransformsToResourceCollection.php","lineNumber":85,"sourceCode":"        }\n\n        $resourceClasses = $className::guessResourceName();\n\n        foreach ($resourceClasses as $resourceClass) {\n            $resourceCollection = $resourceClass.'Collection';\n\n            if (is_string($resourceCollection) && class_exists($resourceCollection)) {\n                return new $resourceCollection($this);\n            }\n        }\n\n        foreach ($resourceClasses as $resourceClass) {\n            if (is_string($resourceClass) && class_exists($resourceClass)) {\n                return $resourceClass::collection($this);\n            }\n        }\n\n        throw new LogicException(sprintf('Failed to find resource class for model [%s].', $className));\n    }\n\n    /**\n     * Get the resource class from the class attribute.\n     *\n     * @param  class-string<\\Illuminate\\Http\\Resources\\Json\\JsonResource>  $class\n     * @return class-string<*>|null\n     */\n    protected function resolveResourceFromAttribute(string $class): ?string\n    {\n        if (! class_exists($class)) {\n            return null;\n        }\n\n        $attributes = (new ReflectionClass($class))->getAttributes(UseResource::class);\n\n        return $attributes !== []\n            ? $attributes[0]->newInstance()->class","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/laravel/framework/blob/bd6b5437e6ad87bb49f9b426724f07a9f64e9683/src/Illuminate/Collections/Traits/TransformsToResourceCollection.php#L67-L103","documentation":"Thrown by guessResourceCollection() when no resource class can be resolved for the model. The guesser checks UseResourceCollection/UseResource attributes, then calls guessResourceName() and looks for a matching '*Collection' class and then the resource class itself. If none exist in the autoloader, LogicException is thrown naming the model.","triggerScenarios":"Calling toResourceCollection() on a model whose guessResourceName() returns a class that does not exist, or no matching *Collection / resource class is defined. Forgetting to create UserResource / UserResourceCollection.","commonSituations":"Model uses TransformsToResource and guessResourceName returns 'App\\Http\\Resources\\UserResource', but the file was never generated. Namespace mismatch between model and resource convention.","solutions":["Create the referenced resource (and/or *Collection) class at the expected namespace.","Align guessResourceName()'s return value with the actual resource class FQN.","Pass an explicit resource class to toResourceCollection() to skip guessing."],"exampleFix":"// before\n// UserResource does not exist; guesser fails\nreturn $users->toResourceCollection();\n\n// after\nreturn $users->toResourceCollection(App\\Http\\Resources\\UserResource::class);","handlingStrategy":"try-catch","validationCode":"$guessed = get_class($collection->first())::guessResourceName();\nforeach ($guessed as $cls) {\n    if (class_exists($cls) || class_exists($cls.'Collection')) {\n        return $collection->toResourceCollection();\n    }\n}\nreturn $collection->toResourceCollection(DefaultResource::class);","typeGuard":"function resourceResolvable(string $modelClass): bool {\n    if (! method_exists($modelClass, 'guessResourceName')) return false;\n    foreach ($modelClass::guessResourceName() as $r) {\n        if (class_exists($r) || class_exists($r.'Collection')) return true;\n    }\n    return false;\n}","tryCatchPattern":"try {\n    $resource = $collection->toResourceCollection();\n} catch (\\LogicException $e) {\n    $resource = $collection->toResourceCollection(DefaultResource::class);\n}","preventionTips":["Create resource classes (and matching *Collection) at the convention guessResourceName() returns.","Pass an explicit resource class to avoid relying on guess resolution.","Cover resource guessing in a smoke test so missing classes fail CI."],"tags":["laravel","collections","resources","api-resources","missing-class"],"analyzedSha":"bd6b5437e6ad87bb49f9b426724f07a9f64e9683","analyzedAt":"2026-08-06T00:28:32.783Z","schemaVersion":2}