{"record":{"id":"f990945cf1f895ff","repo":"laravel/framework","slug":"expected-class-s-to-implement-guessresourcename-m","errorCode":null,"errorMessage":"Expected class %s to implement guessResourceName method. Make sure the model uses the TransformsToResource trait.","messagePattern":"Expected class (.+?) to implement guessResourceName method\\. Make sure the model uses the TransformsToResource trait\\.","errorType":"exception","errorClass":"LogicException","httpStatus":null,"severity":"error","filePath":"src/Illuminate/Collections/Traits/TransformsToResourceCollection.php","lineNumber":54,"sourceCode":"     * @throws \\Throwable\n     */\n    protected function guessResourceCollection(): ResourceCollection\n    {\n        if ($this->isEmpty()) {\n            return new ResourceCollection($this);\n        }\n\n        $model = $this->items[0] ?? null;\n\n        if (! is_object($model)) {\n            throw new LogicException('Resource collection guesser expects the collection to contain objects.');\n        }\n\n        /** @var class-string<Model> $className */\n        $className = get_class($model);\n\n        if (! method_exists($className, 'guessResourceName')) {\n            throw new LogicException(sprintf('Expected class %s to implement guessResourceName method. Make sure the model uses the TransformsToResource trait.', $className));\n        }\n\n        $useResourceCollection = $this->resolveResourceCollectionFromAttribute($className);\n\n        if ($useResourceCollection !== null && class_exists($useResourceCollection)) {\n            return new $useResourceCollection($this);\n        }\n\n        $useResource = $this->resolveResourceFromAttribute($className);\n\n        if ($useResource !== null && class_exists($useResource)) {\n            return $useResource::collection($this);\n        }\n\n        $resourceClasses = $className::guessResourceName();\n\n        foreach ($resourceClasses as $resourceClass) {\n            $resourceCollection = $resourceClass.'Collection';","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/laravel/framework/blob/e0f6eb3518ac29fbbca8529e97d0df7fc9f24481/src/Illuminate/Collections/Traits/TransformsToResourceCollection.php#L36-L72","documentation":"Thrown by guessResourceCollection() when the first item is an object but its class does not implement a guessResourceName method and has no UseResource/UseResourceCollection PHP attribute. The guesser needs either the method (provided by the TransformsToResource trait) or a resource attribute to resolve the resource class; without either it throws LogicException naming the offending class.","triggerScenarios":"Calling ->toResourceCollection() on a collection of plain stdClass or a domain object that does not use the TransformsToResource trait and has no UseResource attribute.","commonSituations":"Migrating to the attribute-based resource resolution and forgetting the trait on a new model; using stdClass/DTOs in a collection and expecting auto resource resolution; partial adoption of the feature across models.","solutions":["Add the TransformsToResource trait to the model (provides guessResourceName).","Add a #[UseResource(MyResource::class)] or #[UseResourceCollection(...)] PHP attribute on the model class.","Pass the resource class explicitly: ->toResourceCollection(MyResource::class)."],"exampleFix":"// before\nclass Order {\n    // no trait, no attribute\n}\n// after\nuse Illuminate\\Database\\Eloquent\\Attributes\\UseResource;\n\n#[UseResource(OrderResource::class)]\nclass Order extends Model {\n    use \\Illuminate\\Support\\Traits\\TransformsToResource;\n}","handlingStrategy":"validation","validationCode":"$first = $collection->first();\nif (is_object($first) && ! method_exists($first, 'guessResourceName') && empty((new \\ReflectionClass($first))->getAttributes())) {\n    // will fail guessing; pass explicit class\n}\nreturn $collection->toResourceCollection(\\App\\Http\\Resources\\MyResource::class);","typeGuard":"function canGuessResource(object $model): bool {\n    return method_exists($model, 'guessResourceName')\n        || (new \\ReflectionClass($model))->getAttributes(\\Illuminate\\Database\\Eloquent\\Attributes\\UseResource::class) !== []\n        || (new \\ReflectionClass($model))->getAttributes(\\Illuminate\\Database\\Eloquent\\Attributes\\UseResourceCollection::class) !== [];\n}","tryCatchPattern":"try {\n    return $collection->toResourceCollection();\n} catch (\\LogicException $e) {\n    return $collection->toResourceCollection(\\App\\Http\\Resources\\FallbackResource::class);\n}","preventionTips":["Apply the TransformsToResource trait consistently across models.","Use #[UseResource] / #[UseResourceCollection] attributes for declarative resolution.","Pass an explicit resource class in generic code to bypass guessing."],"tags":["api-resources","eloquent","configuration","laravel"],"backgroundTag":null,"analyzedSha":"e0f6eb3518ac29fbbca8529e97d0df7fc9f24481","analyzedAt":"2026-08-11T20:52:37.562Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}