Skip to content

Commit 6ee8717

Browse files
committed
⚡️Huge performance improvment
1 parent a56dc5d commit 6ee8717

File tree

10 files changed

+72
-158
lines changed

10 files changed

+72
-158
lines changed

config/rest.php

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,6 @@
2626
],
2727
],
2828

29-
/*
30-
|--------------------------------------------------------------------------
31-
| Rest Resources
32-
|--------------------------------------------------------------------------
33-
|
34-
| This is the core of the Laravel Rest Api package, resources allows you
35-
| to define your own logic and take full advantage of your API. Here
36-
| you can disable the cache on all exposed data
37-
|
38-
*/
39-
40-
'resources' => [
41-
'cache' => [
42-
'enabled' => true,
43-
'default' => 5, // Cache minutes by default
44-
],
45-
],
46-
4729
/*
4830
|--------------------------------------------------------------------------
4931
| Rest Authorizations

src/Actions/Actionable.php

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77

88
trait Actionable
99
{
10+
/**
11+
* The calculated actions if already done in this request.
12+
*
13+
* @var array
14+
*/
15+
protected array $calculatedActions;
16+
1017
/**
1118
* The actions that should be linked.
1219
*
@@ -28,19 +35,7 @@ public function actions(RestRequest $request): array
2835
*/
2936
public function getActions(\Lomkit\Rest\Http\Requests\RestRequest $request): array
3037
{
31-
$resolver = function () use ($request) {
32-
return $this->actions($request);
33-
};
34-
35-
if ($this->isResourceCacheEnabled()) {
36-
return Cache::remember(
37-
$this->getResourceCacheKey($request, 'actions'),
38-
$this->cacheResourceFor(),
39-
$resolver
40-
);
41-
}
42-
43-
return $resolver();
38+
return $this->calculatedActions ?? ($this->calculatedActions = $this->actions($request));
4439
}
4540

4641
/**

src/Concerns/Resource/ConfiguresRestParameters.php

Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,18 @@
44

55
use Illuminate\Support\Facades\Cache;
66
use Lomkit\Rest\Http\Requests\RestRequest;
7+
use Lomkit\Rest\Tests\Support\Rest\Resources\HasOneResource;
78

89
trait ConfiguresRestParameters
910
{
10-
//@TODO: V2: Pass all fields / relations / other methods in private
11+
12+
/**
13+
* The calculated fields if already done in this request.
14+
*
15+
* @var array
16+
*/
17+
protected array $calculatedFields;
18+
1119
/**
1220
* The fields that could be provided.
1321
*
@@ -29,19 +37,7 @@ public function fields(RestRequest $request): array
2937
*/
3038
public function getFields(\Lomkit\Rest\Http\Requests\RestRequest $request): array
3139
{
32-
$resolver = function () use ($request) {
33-
return $this->fields($request);
34-
};
35-
36-
if ($this->isResourceCacheEnabled()) {
37-
return Cache::remember(
38-
$this->getResourceCacheKey($request, 'fields'),
39-
$this->cacheResourceFor(),
40-
$resolver
41-
);
42-
}
43-
44-
return $resolver();
40+
return $this->calculatedFields ?? ($this->calculatedFields = $this->fields($request));
4541
}
4642

4743
/**
@@ -86,6 +82,13 @@ function ($field) use ($prefix) {
8682
return $fields;
8783
}
8884

85+
/**
86+
* The calculated scopes if already done in this request.
87+
*
88+
* @var array
89+
*/
90+
protected array $calculatedScopes;
91+
8992
/**
9093
* The scopes that could be provided.
9194
*
@@ -107,21 +110,16 @@ public function scopes(RestRequest $request): array
107110
*/
108111
public function getScopes(\Lomkit\Rest\Http\Requests\RestRequest $request): array
109112
{
110-
$resolver = function () use ($request) {
111-
return $this->scopes($request);
112-
};
113-
114-
if ($this->isResourceCacheEnabled()) {
115-
return Cache::remember(
116-
$this->getResourceCacheKey($request, 'scopes'),
117-
$this->cacheResourceFor(),
118-
$resolver
119-
);
120-
}
121-
122-
return $resolver();
113+
return $this->calculatedScopes ?? ($this->calculatedScopes = $this->scopes($request));
123114
}
124115

116+
/**
117+
* The calculated limits if already done in this request.
118+
*
119+
* @var array
120+
*/
121+
protected array $calculatedLimits;
122+
125123
/**
126124
* The limits that could be provided.
127125
*
@@ -147,18 +145,6 @@ public function limits(RestRequest $request): array
147145
*/
148146
public function getLimits(\Lomkit\Rest\Http\Requests\RestRequest $request): array
149147
{
150-
$resolver = function () use ($request) {
151-
return $this->limits($request);
152-
};
153-
154-
if ($this->isResourceCacheEnabled()) {
155-
return Cache::remember(
156-
$this->getResourceCacheKey($request, 'limits'),
157-
$this->cacheResourceFor(),
158-
$resolver
159-
);
160-
}
161-
162-
return $resolver();
148+
return $this->calculatedLimits ?? ($this->calculatedLimits = $this->limits($request));
163149
}
164150
}

src/Concerns/Resource/DisableResourceCache.php

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/Concerns/Resource/Relationable.php

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public function relation($name)
4040
*
4141
* @param string $name
4242
*
43-
* @return resource|null
43+
* @return \Lomkit\Rest\Http\Resource
4444
*/
4545
public function relationResource($name)
4646
{
@@ -80,6 +80,13 @@ public function nestedRelations(RestRequest $request, string $prefix = '', array
8080
return $relations;
8181
}
8282

83+
/**
84+
* The calculated relations if already done in this request.
85+
*
86+
* @var array
87+
*/
88+
protected array $calculatedRelations;
89+
8390
/**
8491
* The relations that could be provided.
8592
*
@@ -101,20 +108,12 @@ public function relations(RestRequest $request): array
101108
*/
102109
public function getRelations(RestRequest $request)
103110
{
104-
$resolver = function () use ($request) {
105-
return array_map(function (Relation $relation) {
106-
return $relation->fromResource($this);
107-
}, $this->relations($request));
108-
};
109-
110-
if ($this->isResourceCacheEnabled()) {
111-
return Cache::remember(
112-
$this->getResourceCacheKey($request, 'relations'),
113-
$this->cacheResourceFor(),
114-
$resolver
111+
return $this->calculatedRelations ??
112+
(
113+
$this->calculatedRelations =
114+
array_map(function (Relation $relation) {
115+
return $relation->fromResource($this);
116+
}, $this->relations($request))
115117
);
116-
}
117-
118-
return $resolver();
119118
}
120119
}

src/Http/Controllers/Controller.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public static function newResource(): Resource
2727
{
2828
$resource = static::$resource;
2929

30-
return new $resource();
30+
// If the resource isn't registered, do it
31+
if (!app()->has($resource)) {
32+
app()->singleton($resource);
33+
}
34+
35+
return app()->make($resource);
3136
}
3237
}

src/Http/Resource.php

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -140,45 +140,6 @@ public function cacheAuthorizationFor()
140140
return now()->addMinutes(config('rest.authorizations.cache.default', 5));
141141
}
142142

143-
/**
144-
* Check if resource cache is enabled for this resource.
145-
*
146-
* @return bool
147-
*/
148-
public function isResourceCacheEnabled(): bool
149-
{
150-
return config('rest.resources.cache.enabled');
151-
}
152-
153-
/**
154-
* Get the resource cache key.
155-
*
156-
* @param RestRequest $request
157-
*
158-
* @return string
159-
*/
160-
public function getResourceCacheKey(RestRequest $request, string $identifier)
161-
{
162-
$class = Str::snake((new \ReflectionClass($this))->getShortName());
163-
164-
return sprintf(
165-
'rest.resource.%s.%s.%s',
166-
$class,
167-
$identifier,
168-
$request->user()?->getKey()
169-
);
170-
}
171-
172-
/**
173-
* Determine for how much time the resource cache should be keeped.
174-
*
175-
* @return \DateTimeInterface|\DateInterval
176-
*/
177-
public function cacheResourceFor()
178-
{
179-
return now()->addMinutes(config('rest.resources.cache.default', 5));
180-
}
181-
182143
/**
183144
* Serialize the resource into a JSON-serializable format.
184145
*

src/Instructions/Instructionable.php

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77

88
trait Instructionable
99
{
10+
/**
11+
* The calculated instructions if already done in this request.
12+
*
13+
* @var array
14+
*/
15+
protected array $calculatedInstructions;
16+
1017
/**
1118
* The instructions that should be linked.
1219
*
@@ -28,19 +35,7 @@ public function instructions(RestRequest $request): array
2835
*/
2936
public function getInstructions(\Lomkit\Rest\Http\Requests\RestRequest $request): array
3037
{
31-
$resolver = function () use ($request) {
32-
return $this->instructions($request);
33-
};
34-
35-
if ($this->isResourceCacheEnabled()) {
36-
return Cache::remember(
37-
$this->getResourceCacheKey($request, 'instructions'),
38-
$this->cacheResourceFor(),
39-
$resolver
40-
);
41-
}
42-
43-
return $resolver();
38+
return $this->calculatedInstructions ?? ($this->calculatedInstructions = $this->instructions($request));
4439
}
4540

4641
/**

src/Query/Traits/PerformSearch.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public function filter($field, $operator, $value, $type = 'and', $nested = null)
8989

9090
return $relation->filter($this->queryBuilder, $field, $operator, $value, $type, function ($query) use ($relation) {
9191
$relation->applySearchQuery($query);
92-
}, $this->resource);
92+
});
9393
} else {
9494
if (in_array($operator, ['in', 'not in'])) {
9595
$this->queryBuilder->whereIn($this->queryBuilder->getModel()->getTable().'.'.$field, $value, $type, $operator === 'not in');

src/Relations/Relation.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,18 @@ public function hasMultipleEntries()
100100
/**
101101
* Get the resource associated with this relation.
102102
*
103-
* @return resource
103+
* @return Resource
104104
*/
105105
public function resource()
106106
{
107-
return new $this->types[0]();
107+
$resource = $this->types[0];
108+
109+
// If the resource isn't registered, do it
110+
if (!app()->has($resource)) {
111+
app()->singleton($resource);
112+
}
113+
114+
return app()->make($resource);
108115
}
109116

110117
/**

0 commit comments

Comments
 (0)