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

  1. Add the TransformsToResource trait to the model (or implement guessResourceName).
  2. Add a #[UseResource(UserResource::class)] or #[UseResourceCollection(...)] attribute to the model.
  3. 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

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


AI-assisted analysis of laravel/framework@bd6b5437e6 (2026-08-06). Data as JSON: /data/errors/f990945cf1f895ff.json. Report an issue: GitHub.