diff --git a/src/Concerns/Attributes.php b/src/Concerns/Attributes.php index 6693421..15e2b37 100644 --- a/src/Concerns/Attributes.php +++ b/src/Concerns/Attributes.php @@ -68,7 +68,7 @@ private function requestedAttributes(Request $request) */ private function resolveAttributes(Request $request) { - return Collection::make($this->attributes) + return Collection::make(property_exists($this, 'attributes') ? $this->attributes : []) ->mapWithKeys(fn (string $attribute, int|string $key): array => [ $attribute => fn () => $this->resource->{$attribute}, ]) diff --git a/src/Concerns/Relationships.php b/src/Concerns/Relationships.php index 4545dec..8d6bf7d 100644 --- a/src/Concerns/Relationships.php +++ b/src/Concerns/Relationships.php @@ -129,7 +129,7 @@ private function resolveInclude(mixed $resource, string $prefix) */ private function resolveRelationships(Request $request) { - return Collection::make($this->relationships ?? []) + return Collection::make(property_exists($this, 'relationships') ? $this->relationships : []) ->mapWithKeys(fn (string $value, int|string $key) => ! is_int($key) ? [ $key => $value, ] : [ diff --git a/tests/Unit/AttributesAsPropertiesTest.php b/tests/Unit/AttributesAsPropertiesTest.php index 9445634..f192b74 100644 --- a/tests/Unit/AttributesAsPropertiesTest.php +++ b/tests/Unit/AttributesAsPropertiesTest.php @@ -4,10 +4,13 @@ namespace Tests\Unit; +use Exception; +use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Tests\Models\BasicModel; use Tests\Resources\PostResource; use Tests\TestCase; +use TiMacDonald\JsonApi\JsonApiResource; class AttributesAsPropertiesTest extends TestCase { @@ -78,4 +81,22 @@ public function toAttributes($request) 'links' => [], ], $response->getData(true)['data']); } + + public function testItDoesntTryToAccessMagicAttributeProperty() + { + $instance = new class extends Model { + public function getAttributesAttribute() + { + throw new \Exception('xxxx'); + } + }; + $resource = new class ($instance) extends JsonApiResource { + // + }; + + $response = $resource->toResponse(Request::create('https://timacdonald.me')); + + $this->assertValidJsonApi($response->content()); + $this->assertSame([], $response->getData(true)['data']['attributes']); + } } diff --git a/tests/Unit/RelationshipsAsPropertiesTest.php b/tests/Unit/RelationshipsAsPropertiesTest.php index 4ab3ce7..e1c1549 100644 --- a/tests/Unit/RelationshipsAsPropertiesTest.php +++ b/tests/Unit/RelationshipsAsPropertiesTest.php @@ -4,6 +4,7 @@ namespace Tests\Unit; +use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Illuminate\Support\Str; use Tests\Models\BasicModel; @@ -222,4 +223,22 @@ public function toRelationships($request) ], $response->getData(true)['included']); JsonApiResource::guessRelationshipResourceUsing(null); } + + public function testItDoesntTryToAccessMagicAttributeProperty() + { + $instance = new class extends Model { + public function getRelationshipsAttribute() + { + throw new \Exception('xxxx'); + } + }; + $resource = new class ($instance) extends JsonApiResource { + // + }; + + $response = $resource->toResponse(Request::create('https://timacdonald.me')); + + $this->assertValidJsonApi($response->content()); + $this->assertSame([], $response->getData(true)['data']['relationships']); + } }