laravel/framework · error · LogicException
Expected class %s to implement guessResourceName method. Mak
Error message
Expected class %s to implement guessResourceName method. Make sure the model uses the TransformsToResource trait.
What it means
Thrown by guessResourceCollection() when the first item's class does not implement a guessResourceName method. The auto-guessing mechanism requires the model to use the TransformsToResource trait (which provides guessResourceName). Without it, the guesser cannot resolve a resource class. LogicException is thrown.
Source
Thrown at src/Illuminate/Collections/Traits/TransformsToResourceCollection.php:54
* @throws \Throwable
*/
protected function guessResourceCollection(): ResourceCollection
{
if ($this->isEmpty()) {
return new ResourceCollection($this);
}
$model = $this->items[0] ?? null;
if (! is_object($model)) {
throw new LogicException('Resource collection guesser expects the collection to contain objects.');
}
/** @var class-string<Model> $className */
$className = get_class($model);
if (! method_exists($className, 'guessResourceName')) {
throw new LogicException(sprintf('Expected class %s to implement guessResourceName method. Make sure the model uses the TransformsToResource trait.', $className));
}
$useResourceCollection = $this->resolveResourceCollectionFromAttribute($className);
if ($useResourceCollection !== null && class_exists($useResourceCollection)) {
return new $useResourceCollection($this);
}
$useResource = $this->resolveResourceFromAttribute($className);
if ($useResource !== null && class_exists($useResource)) {
return $useResource::collection($this);
}
$resourceClasses = $className::guessResourceName();
foreach ($resourceClasses as $resourceClass) {
$resourceCollection = $resourceClass.'Collection';View on GitHub (pinned to bd6b5437e6)
Solutions
- Add the TransformsToResource trait to the model (or implement guessResourceName).
- Add a #[UseResource(UserResource::class)] or #[UseResourceCollection(...)] attribute to the model.
- Pass an explicit resource class to toResourceCollection() to bypass guessing.
Example fix
// before
class User extends Model {}
return $users->toResourceCollection();
// after
use Illuminate\Support\Traits\TransformsToResource;
class User extends Model
{
use TransformsToResource;
}
return $users->toResourceCollection(); Defensive patterns
Strategy: validation
Validate before calling
if (! method_exists(get_class($collection->first()), 'guessResourceName')) {
return $collection->toResourceCollection(UserResource::class);
}
return $collection->toResourceCollection(); Type guard
function usesTransformsToResource(string $class): bool {
return in_array(\Illuminate\Support\Traits\TransformsToResource::class, class_uses_recursive($class), true);
} Try / catch
try {
$resource = $collection->toResourceCollection();
} catch (\LogicException $e) {
$resource = $collection->toResourceCollection(UserResource::class);
} Prevention
- Add the TransformsToResource trait (or a UseResource attribute) to every model exposed as a resource.
- Pass an explicit resource class to skip guessing when unsure.
When it happens
Trigger: Calling toResourceCollection() on a collection of models that don't use the TransformsToResource trait and have no #[UseResource]/#[UseResourceCollection] PHP attribute. Adding a new model without the trait.
Common situations: Upgrading to a Laravel version that introduced TransformsToResource-based guessing and forgetting to add the trait to legacy models. Using third-party models you don't control.
Related errors
- Resource collection guesser expects the collection to contai
- Failed to find resource class for model [%s].
- Array value for key [%s] must be an array, %s found.
- Array value for key [%s] must be a boolean, %s found.
- Array value for key [%s] must be a float, %s found.
AI-assisted analysis of laravel/framework@bd6b5437e6 (2026-08-06).
Data as JSON: /data/errors/f990945cf1f895ff.json.
Report an issue: GitHub.