Skip to content
This repository was archived by the owner on Feb 14, 2023. It is now read-only.

Commit 3c0d680

Browse files
committed
Add JsonApi facade & JsonApiable contract interface
1 parent 488d8c4 commit 3c0d680

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

src/Contracts/JsonApiable.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace SkoreLabs\JsonApi\Contracts;
4+
5+
interface JsonApiable
6+
{
7+
/**
8+
* Get a custom resource type for JSON:API formatting.
9+
*
10+
* @return string
11+
*/
12+
public function resourceType(): string;
13+
}

src/Http/Resources/JsonApiResource.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Illuminate\Http\Resources\MissingValue;
77
use Illuminate\Support\Str;
88
use SkoreLabs\JsonApi\Concerns\HasConfig;
9+
use SkoreLabs\JsonApi\Support\JsonApi;
910

1011
class JsonApiResource extends JsonResource
1112
{
@@ -81,7 +82,7 @@ public function getResourceIdentifier()
8182
{
8283
return [
8384
$this->resource->getKeyName() => (string) $this->resource->getKey(),
84-
'type' => Str::snake(class_basename($this->resource)),
85+
'type' => JsonApi::getResourceType($this->resource),
8586
];
8687
}
8788

src/Support/Facades/JsonApi.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace SkoreLabs\JsonApi\Support\Facades;
4+
5+
use Illuminate\Support\Facades\Facade;
6+
7+
class JsonApi extends Facade
8+
{
9+
protected static function getFacadeAccessor()
10+
{
11+
return 'json-api';
12+
}
13+
}

src/Support/JsonApi.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace SkoreLabs\JsonApi\Support;
4+
5+
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
6+
use Illuminate\Support\Collection;
7+
use SkoreLabs\JsonApi\Contracts\JsonApiable;
8+
use SkoreLabs\JsonApi\Http\Resources\JsonApiCollection;
9+
use SkoreLabs\JsonApi\Http\Resources\JsonApiResource;
10+
use Illuminate\Support\Str;
11+
12+
class JsonApi
13+
{
14+
/**
15+
* Format the input contents to JSON:API.
16+
*
17+
* @param mixed $value
18+
* @return \SkoreLabs\JsonApi\Http\Resources\JsonApiResource
19+
*/
20+
public static function format($value)
21+
{
22+
if ($value instanceof LengthAwarePaginator || $value instanceof Collection) {
23+
return JsonApiCollection::make($value);
24+
}
25+
26+
return JsonApiResource::make($value);
27+
}
28+
29+
/**
30+
* Get resource type from a model.
31+
*
32+
* @param \Illuminate\Database\Eloquent\Model|string $model
33+
* @return string
34+
*/
35+
public static function getResourceType($model)
36+
{
37+
if ($model instanceof JsonApiable) {
38+
return $model->resourceType();
39+
}
40+
41+
return Str::snake(class_basename(is_string($model) ? $model : $model::class));
42+
}
43+
}

0 commit comments

Comments
 (0)