Skip to content

Bug: explicit class parameter in #[AsResource] is always overwritten by the resource PHP class #1157

@nfacciolo

Description

@nfacciolo

Description

When using #[AsResource(class: SomeEntity::class)] to explicitly set the entity class on a Resource DTO, the class parameter is silently ignored. ResourceMetadata::getClass() always returns the Resource PHP class itself (e.g. FruitResource) instead of the explicitly configured entity class (e.g. Fruit).

Steps to reproduce

#[AsResource(
    alias: 'app.fruit',
    class: Fruit::class,
    driver: false,
)]
final class FruitResource implements ResourceInterface {}

$collection = $factory->create(FruitResource::class);
$metadata->getClass(); // Expected: Fruit — Actual: FruitResource

Root cause

OperationDefaultsTrait::getResourceWithDefaults() unconditionally overwrites the class property with $resourceClass, ignoring the value from #[AsResource(class:)]:

 // line 34 — always overwrites
 $resource = $resource->withClass($resourceClass);

This is inconsistent with every other property in the same method, all of which use null-checks before applying defaults (alias, applicationName, name).

Proposed fix

- $resource = $resource->withClass($resourceClass);
+ if (null === $resource->getClass()) {
+     $resource = $resource->withClass($resourceClass);
+ }

Versions

Reproduced on v1.14.0 and branch 1.15.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions