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.
Description
When using
#[AsResource(class: SomeEntity::class)]to explicitly set the entity class on a Resource DTO, theclassparameter 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: FruitResourceRoot cause
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
Versions
Reproduced on v1.14.0 and branch 1.15.