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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions