Skip to content

Commit 0b13462

Browse files
committed
feat: add ConditionallyLoadsAttributes with <whenIncluded> method
1 parent 54426f0 commit 0b13462

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Ark4ne\JsonApi\Resource\Concerns;
4+
5+
use Ark4ne\JsonApi\Resource\Support\Includes;
6+
use Illuminate\Http\Request;
7+
8+
trait ConditionallyLoadsAttributes
9+
{
10+
/**
11+
* Retrieve a relationship if it has been included.
12+
*
13+
* @template T
14+
*
15+
* @param \Illuminate\Http\Request $request
16+
* @param string $type
17+
* @param T $value
18+
*
19+
* @return \Illuminate\Http\Resources\MissingValue|T
20+
*/
21+
protected function whenIncluded(Request $request, string $type, mixed $value)
22+
{
23+
return $this->when(Includes::include($request, $type), $value);
24+
}
25+
}

src/JsonApiCollection.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
class JsonApiCollection extends ResourceCollection implements Resourceable
1111
{
1212
use Concerns\Relationize,
13+
Concerns\ConditionallyLoadsAttributes,
1314
Concerns\ToResponse;
1415

1516
public $collects;

src/JsonApiResource.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
abstract class JsonApiResource extends JsonResource implements Resourceable
99
{
1010
use Concerns\Relationize,
11+
Concerns\ConditionallyLoadsAttributes,
1112
Concerns\Identifier,
1213
Concerns\Attributes,
1314
Concerns\Relationships,
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Test\Unit\Concerns;
4+
5+
use Ark4ne\JsonApi\Resource\Concerns\ConditionallyLoadsAttributes;
6+
use Illuminate\Http\Request;
7+
use Illuminate\Http\Resources\Json\JsonResource;
8+
use Illuminate\Http\Resources\MissingValue;
9+
use Test\Support\Reflect;
10+
use Test\TestCase;
11+
12+
class ConditionallyLoadsAttributesTest extends TestCase
13+
{
14+
private function dataWhenInclude()
15+
{
16+
return [
17+
[false, 'test', []],
18+
[true, 'test', ['test']]
19+
];
20+
}
21+
22+
/**
23+
* @dataProvider dataWhenInclude
24+
*/
25+
public function testWhenInclude($expected, $property, $query)
26+
{
27+
$request = new Request(['include' => implode(',', $query)]);
28+
29+
$stub = new class(null) extends JsonResource {
30+
use ConditionallyLoadsAttributes;
31+
};
32+
33+
$this->assertEquals(
34+
$expected ?: new MissingValue,
35+
Reflect::invoke($stub, 'whenIncluded', $request, $property, true)
36+
);
37+
}
38+
}

0 commit comments

Comments
 (0)