Skip to content

Commit a96f861

Browse files
dnwjnryanmitchell
andauthored
Only retrieve forms once instead of for every item (#330)
* Only retrieve forms once instead of for every item * Add Blink to FormRepository retrieval methods * Clear blink cache on save/delete * Add test coverage --------- Co-authored-by: Ryan Mitchell <[email protected]>
1 parent 47d3b3a commit a96f861

File tree

3 files changed

+86
-9
lines changed

3 files changed

+86
-9
lines changed

src/Forms/Form.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Statamic\Contracts\Forms\Form as Contract;
77
use Statamic\Events\FormDeleted;
88
use Statamic\Events\FormSaved;
9+
use Statamic\Facades\Blink;
910
use Statamic\Forms\Form as FileEntry;
1011

1112
class Form extends FileEntry
@@ -60,6 +61,9 @@ public function save()
6061

6162
$this->model($model->fresh());
6263

64+
Blink::forget("eloquent-forms-{$this->handle()}");
65+
Blink::forget('eloquent-forms');
66+
6367
FormSaved::dispatch($this);
6468
}
6569

@@ -68,6 +72,9 @@ public function delete()
6872
$this->submissions()->each->delete();
6973
$this->model()->delete();
7074

75+
Blink::forget("eloquent-forms-{$this->handle()}");
76+
Blink::forget('eloquent-forms');
77+
7178
FormDeleted::dispatch($this);
7279
}
7380
}

src/Forms/FormRepository.php

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,32 @@
33
namespace Statamic\Eloquent\Forms;
44

55
use Statamic\Contracts\Forms\Form as FormContract;
6+
use Statamic\Facades\Blink;
67
use Statamic\Forms\FormRepository as StacheRepository;
78

89
class FormRepository extends StacheRepository
910
{
1011
public function find($handle)
1112
{
12-
$model = app('statamic.eloquent.forms.model')::whereHandle($handle)->first();
13+
return Blink::once("eloquent-forms-{$handle}", function () use ($handle) {
14+
$model = app('statamic.eloquent.forms.model')::whereHandle($handle)->first();
1315

14-
if (! $model) {
15-
return;
16-
}
16+
if (! $model) {
17+
return;
18+
}
1719

18-
return app(FormContract::class)->fromModel($model);
20+
return app(FormContract::class)->fromModel($model);
21+
});
1922
}
2023

2124
public function all()
2225
{
23-
return app('statamic.eloquent.forms.model')::all()
24-
->map(function ($form) {
25-
return app(FormContract::class)::fromModel($form);
26-
});
26+
return Blink::once('eloquent-forms', function () {
27+
return app('statamic.eloquent.forms.model')::all()
28+
->map(function ($form) {
29+
return app(FormContract::class)::fromModel($form);
30+
});
31+
});
2732
}
2833

2934
public function make($handle = null)

tests/Forms/FormTest.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
namespace Tests\Forms;
4+
5+
use PHPUnit\Framework\Attributes\Test;
6+
use Statamic\Facades;
7+
use Tests\TestCase;
8+
9+
class FormTest extends TestCase
10+
{
11+
#[Test]
12+
public function finding_a_form_sets_the_blink_cache()
13+
{
14+
Facades\Form::make('test')->title('Test form')->save();
15+
16+
$form = Facades\Form::find('test');
17+
18+
$this->assertSame(Facades\Blink::get('eloquent-forms-test'), $form);
19+
}
20+
21+
#[Test]
22+
public function getting_all_forms_sets_the_blink_cache()
23+
{
24+
$form = tap(Facades\Form::make('test')->title('Test form'))->save();
25+
26+
Facades\Form::all();
27+
28+
$this->assertCount(1, Facades\Blink::get('eloquent-forms'));
29+
$this->assertSame($form->handle(), Facades\Blink::get('eloquent-forms')->first()->handle());
30+
}
31+
32+
#[Test]
33+
public function saving_a_form_removes_the_blink_cache()
34+
{
35+
Facades\Form::make('test')->title('Test form')->save();
36+
37+
$form = Facades\Form::find('test');
38+
Facades\Form::all(); // to set up eloquent-forms blink
39+
40+
$this->assertSame(Facades\Blink::get('eloquent-forms-test'), $form);
41+
$this->assertCount(1, Facades\Blink::get('eloquent-forms'));
42+
43+
$form->save();
44+
45+
$this->assertNull(Facades\Blink::get('eloquent-forms-test'));
46+
$this->assertNull(Facades\Blink::get('eloquent-forms'));
47+
}
48+
49+
#[Test]
50+
public function deleting_a_form_removes_the_blink_cache()
51+
{
52+
Facades\Form::make('test')->title('Test form')->save();
53+
54+
$form = Facades\Form::find('test');
55+
Facades\Form::all(); // to set up eloquent-forms blink
56+
57+
$this->assertSame(Facades\Blink::get('eloquent-forms-test'), $form);
58+
$this->assertCount(1, Facades\Blink::get('eloquent-forms'));
59+
60+
$form->delete();
61+
62+
$this->assertNull(Facades\Blink::get('eloquent-forms-test'));
63+
$this->assertNull(Facades\Blink::get('eloquent-forms'));
64+
}
65+
}

0 commit comments

Comments
 (0)