Skip to content

Commit 62df18a

Browse files
Add section default events & invalidate static cache (#603)
1 parent 3aff760 commit 62df18a

5 files changed

Lines changed: 162 additions & 3 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Statamic\SeoPro\Events;
4+
5+
use Statamic\Contracts\Entries\Collection;
6+
use Statamic\Events\Event;
7+
8+
class CollectionDefaultsSaved extends Event
9+
{
10+
public function __construct(public Collection $collection) {}
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Statamic\SeoPro\Events;
4+
5+
use Statamic\Contracts\Taxonomies\Taxonomy;
6+
use Statamic\Events\Event;
7+
8+
class TaxonomyDefaultsSaved extends Event
9+
{
10+
public function __construct(public Taxonomy $taxonomy) {}
11+
}

src/Http/Controllers/CP/BaseSectionDefaultsController.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use Statamic\CP\PublishForm;
99
use Statamic\Facades\Blueprint;
1010
use Statamic\Http\Controllers\CP\CpController;
11+
use Statamic\SeoPro\Events\CollectionDefaultsSaved;
12+
use Statamic\SeoPro\Events\TaxonomyDefaultsSaved;
1113
use Statamic\SeoPro\Fields;
1214
use Statamic\Support\Arr;
1315

@@ -78,6 +80,12 @@ protected function saveSectionItem($item, $values)
7880

7981
$item->cascade($cascade->all())->save();
8082

83+
if ($item instanceof Collection) {
84+
CollectionDefaultsSaved::dispatch($item);
85+
} elseif ($item instanceof Taxonomy) {
86+
TaxonomyDefaultsSaved::dispatch($item);
87+
}
88+
8189
if ($disabled) {
8290
$this->removeChildSeo($item);
8391
}

src/Listeners/InvalidateStaticCache.php

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,25 @@
44

55
use Illuminate\Contracts\Queue\ShouldQueue;
66
use Statamic\Facades\URL;
7+
use Statamic\SeoPro\Events\CollectionDefaultsSaved;
78
use Statamic\SeoPro\Events\SiteDefaultsSaved;
9+
use Statamic\SeoPro\Events\TaxonomyDefaultsSaved;
810
use Statamic\StaticCaching\Cacher;
11+
use Statamic\StaticCaching\Invalidator;
912
use Statamic\Support\Arr;
1013

1114
class InvalidateStaticCache implements ShouldQueue
1215
{
1316
private string|array $rules;
1417

15-
public function __construct(private Cacher $cacher)
16-
{
18+
public function __construct(
19+
private Cacher $cacher,
20+
private Invalidator $invalidator
21+
) {
1722
$this->rules = config('statamic.static_caching.invalidation.rules', []);
1823
}
1924

20-
public function handle(SiteDefaultsSaved $event): void
25+
public function handleSiteDefaultsSaved(SiteDefaultsSaved $event): void
2126
{
2227
if (! config('statamic.static_caching.strategy')) {
2328
return;
@@ -42,4 +47,36 @@ public function handle(SiteDefaultsSaved $event): void
4247
...$prefixedRelativeUrls,
4348
]);
4449
}
50+
51+
public function handleCollectionDefaultsSaved(CollectionDefaultsSaved $event): void
52+
{
53+
if (! config('statamic.static_caching.strategy')) {
54+
return;
55+
}
56+
57+
if ($this->rules === 'all') {
58+
$this->cacher->flush();
59+
60+
return;
61+
}
62+
63+
$this->invalidator->invalidate($event->collection);
64+
}
65+
66+
public function handleTaxonomyDefaultsSaved(TaxonomyDefaultsSaved $event): void
67+
{
68+
if (! config('statamic.static_caching.strategy')) {
69+
return;
70+
}
71+
72+
if ($this->rules === 'all') {
73+
$this->cacher->flush();
74+
75+
return;
76+
}
77+
78+
$event->taxonomy->queryTerms()->get()->each(function ($term) {
79+
$this->invalidator->invalidate($term);
80+
});
81+
}
4582
}

tests/StaticCachingInvalidationTest.php

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44

55
use Mockery;
66
use PHPUnit\Framework\Attributes\Test;
7+
use Statamic\Facades\Collection;
78
use Statamic\Facades\Site;
9+
use Statamic\Facades\Taxonomy;
10+
use Statamic\SeoPro\Events\CollectionDefaultsSaved;
11+
use Statamic\SeoPro\Events\TaxonomyDefaultsSaved;
812
use Statamic\SeoPro\SiteDefaults\SiteDefaults;
913
use Statamic\StaticCaching\Cacher;
14+
use Statamic\StaticCaching\Invalidator;
1015

1116
class StaticCachingInvalidationTest extends TestCase
1217
{
@@ -96,4 +101,91 @@ public function invalidates_urls_when_site_defaults_are_saved_in_a_multisite()
96101

97102
SiteDefaults::in('fr')->save();
98103
}
104+
105+
#[Test]
106+
public function does_nothing_for_collection_defaults_when_static_caching_is_disabled()
107+
{
108+
$invalidator = Mockery::mock(Invalidator::class);
109+
$invalidator->shouldReceive('invalidate')->never();
110+
111+
$this->app->bind(Invalidator::class, fn () => $invalidator);
112+
113+
config()->set('statamic.static_caching.strategy', null);
114+
115+
$collection = Collection::find('pages');
116+
117+
CollectionDefaultsSaved::dispatch($collection);
118+
}
119+
120+
#[Test]
121+
public function flushes_static_cache_when_collection_defaults_are_saved_with_all_rules()
122+
{
123+
$invalidator = Mockery::mock(Invalidator::class);
124+
$invalidator->shouldReceive('invalidate')->never();
125+
126+
$this->app->bind(Invalidator::class, fn () => $invalidator);
127+
128+
config()->set('statamic.static_caching.invalidation.rules', 'all');
129+
130+
$collection = Collection::find('pages');
131+
132+
CollectionDefaultsSaved::dispatch($collection);
133+
}
134+
135+
#[Test]
136+
public function invalidates_collection_when_collection_defaults_are_saved()
137+
{
138+
$collection = Collection::find('pages');
139+
140+
$invalidator = Mockery::mock(Invalidator::class);
141+
$invalidator->shouldReceive('invalidate')->withArgs(function ($item) use ($collection) {
142+
return $item->handle() === $collection->handle();
143+
})->once();
144+
145+
$this->app->bind(Invalidator::class, fn () => $invalidator);
146+
147+
CollectionDefaultsSaved::dispatch($collection);
148+
}
149+
150+
#[Test]
151+
public function does_nothing_for_taxonomy_defaults_when_static_caching_is_disabled()
152+
{
153+
$invalidator = Mockery::mock(Invalidator::class);
154+
$invalidator->shouldReceive('invalidate')->never();
155+
156+
$this->app->bind(Invalidator::class, fn () => $invalidator);
157+
158+
config()->set('statamic.static_caching.strategy', null);
159+
160+
$taxonomy = Taxonomy::find('topics');
161+
162+
TaxonomyDefaultsSaved::dispatch($taxonomy);
163+
}
164+
165+
#[Test]
166+
public function flushes_static_cache_when_taxonomy_defaults_are_saved_with_all_rules()
167+
{
168+
$cacher = Mockery::mock(Cacher::class)->shouldReceive('flush')->once()->getMock();
169+
170+
$this->app->bind(Cacher::class, fn () => $cacher);
171+
172+
config()->set('statamic.static_caching.invalidation.rules', 'all');
173+
174+
$taxonomy = Taxonomy::find('topics');
175+
176+
TaxonomyDefaultsSaved::dispatch($taxonomy);
177+
}
178+
179+
#[Test]
180+
public function invalidates_terms_when_taxonomy_defaults_are_saved()
181+
{
182+
$taxonomy = Taxonomy::find('topics');
183+
184+
$invalidator = Mockery::mock(Invalidator::class);
185+
$invalidator->shouldReceive('invalidate')->times($taxonomy->queryTerms()->count());
186+
187+
$this->app->bind(Invalidator::class, fn () => $invalidator);
188+
189+
TaxonomyDefaultsSaved::dispatch($taxonomy);
190+
}
99191
}

0 commit comments

Comments
 (0)