Skip to content

Commit e89093a

Browse files
authored
Merge pull request #55 from Lomkit/feature/performance-improvment
⚡️Huge performance improvment
2 parents a56dc5d + f623cf9 commit e89093a

File tree

10 files changed

+70
-162
lines changed

10 files changed

+70
-162
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 & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
namespace Lomkit\Rest\Actions;
44

5-
use Illuminate\Support\Facades\Cache;
65
use Lomkit\Rest\Http\Requests\RestRequest;
76

87
trait Actionable
98
{
9+
/**
10+
* The calculated actions if already done in this request.
11+
*
12+
* @var array
13+
*/
14+
protected array $calculatedActions;
15+
1016
/**
1117
* The actions that should be linked.
1218
*
@@ -28,19 +34,7 @@ public function actions(RestRequest $request): array
2834
*/
2935
public function getActions(\Lomkit\Rest\Http\Requests\RestRequest $request): array
3036
{
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();
37+
return $this->calculatedActions ?? ($this->calculatedActions = $this->actions($request));
4438
}
4539

4640
/**

src/Concerns/Resource/ConfiguresRestParameters.php

Lines changed: 24 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
22

33
namespace Lomkit\Rest\Concerns\Resource;
44

5-
use Illuminate\Support\Facades\Cache;
65
use Lomkit\Rest\Http\Requests\RestRequest;
76

87
trait ConfiguresRestParameters
98
{
10-
//@TODO: V2: Pass all fields / relations / other methods in private
9+
/**
10+
* The calculated fields if already done in this request.
11+
*
12+
* @var array
13+
*/
14+
protected array $calculatedFields;
15+
1116
/**
1217
* The fields that could be provided.
1318
*
@@ -29,19 +34,7 @@ public function fields(RestRequest $request): array
2934
*/
3035
public function getFields(\Lomkit\Rest\Http\Requests\RestRequest $request): array
3136
{
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();
37+
return $this->calculatedFields ?? ($this->calculatedFields = $this->fields($request));
4538
}
4639

4740
/**
@@ -86,6 +79,13 @@ function ($field) use ($prefix) {
8679
return $fields;
8780
}
8881

82+
/**
83+
* The calculated scopes if already done in this request.
84+
*
85+
* @var array
86+
*/
87+
protected array $calculatedScopes;
88+
8989
/**
9090
* The scopes that could be provided.
9191
*
@@ -107,21 +107,16 @@ public function scopes(RestRequest $request): array
107107
*/
108108
public function getScopes(\Lomkit\Rest\Http\Requests\RestRequest $request): array
109109
{
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();
110+
return $this->calculatedScopes ?? ($this->calculatedScopes = $this->scopes($request));
123111
}
124112

113+
/**
114+
* The calculated limits if already done in this request.
115+
*
116+
* @var array
117+
*/
118+
protected array $calculatedLimits;
119+
125120
/**
126121
* The limits that could be provided.
127122
*
@@ -147,18 +142,6 @@ public function limits(RestRequest $request): array
147142
*/
148143
public function getLimits(\Lomkit\Rest\Http\Requests\RestRequest $request): array
149144
{
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();
145+
return $this->calculatedLimits ?? ($this->calculatedLimits = $this->limits($request));
163146
}
164147
}

src/Concerns/Resource/DisableResourceCache.php

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

src/Concerns/Resource/Relationable.php

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Lomkit\Rest\Concerns\Resource;
44

55
use Illuminate\Support\Arr;
6-
use Illuminate\Support\Facades\Cache;
76
use Illuminate\Support\Str;
87
use Lomkit\Rest\Http\Requests\RestRequest;
98
use Lomkit\Rest\Relations\Relation;
@@ -40,7 +39,7 @@ public function relation($name)
4039
*
4140
* @param string $name
4241
*
43-
* @return resource|null
42+
* @return \Lomkit\Rest\Http\Resource
4443
*/
4544
public function relationResource($name)
4645
{
@@ -80,6 +79,13 @@ public function nestedRelations(RestRequest $request, string $prefix = '', array
8079
return $relations;
8180
}
8281

82+
/**
83+
* The calculated relations if already done in this request.
84+
*
85+
* @var array
86+
*/
87+
protected array $calculatedRelations;
88+
8389
/**
8490
* The relations that could be provided.
8591
*
@@ -101,20 +107,12 @@ public function relations(RestRequest $request): array
101107
*/
102108
public function getRelations(RestRequest $request)
103109
{
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
110+
return $this->calculatedRelations ??
111+
(
112+
$this->calculatedRelations =
113+
array_map(function (Relation $relation) {
114+
return $relation->fromResource($this);
115+
}, $this->relations($request))
115116
);
116-
}
117-
118-
return $resolver();
119117
}
120118
}

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 & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
namespace Lomkit\Rest\Instructions;
44

5-
use Illuminate\Support\Facades\Cache;
65
use Lomkit\Rest\Http\Requests\RestRequest;
76

87
trait Instructionable
98
{
9+
/**
10+
* The calculated instructions if already done in this request.
11+
*
12+
* @var array
13+
*/
14+
protected array $calculatedInstructions;
15+
1016
/**
1117
* The instructions that should be linked.
1218
*
@@ -28,19 +34,7 @@ public function instructions(RestRequest $request): array
2834
*/
2935
public function getInstructions(\Lomkit\Rest\Http\Requests\RestRequest $request): array
3036
{
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();
37+
return $this->calculatedInstructions ?? ($this->calculatedInstructions = $this->instructions($request));
4438
}
4539

4640
/**

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 \Lomkit\Rest\Http\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)