/
DefaultInvalidator.php
126 lines (107 loc) · 3.64 KB
/
DefaultInvalidator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
namespace Statamic\StaticCaching;
use Statamic\Contracts\Assets\Asset;
use Statamic\Contracts\Entries\Collection;
use Statamic\Contracts\Entries\Entry;
use Statamic\Contracts\Forms\Form;
use Statamic\Contracts\Globals\GlobalSet;
use Statamic\Contracts\Structures\Nav;
use Statamic\Contracts\Taxonomies\Term;
use Statamic\Support\Arr;
class DefaultInvalidator implements Invalidator
{
protected $cacher;
protected $rules;
public function __construct(Cacher $cacher, $rules = [])
{
$this->cacher = $cacher;
$this->rules = $rules;
}
public function invalidate($item)
{
if ($this->rules === 'all') {
return $this->cacher->flush();
}
if ($item instanceof Entry) {
$this->invalidateEntryUrls($item);
} elseif ($item instanceof Term) {
$this->invalidateTermUrls($item);
} elseif ($item instanceof Nav) {
$this->invalidateNavUrls($item);
} elseif ($item instanceof GlobalSet) {
$this->invalidateGlobalUrls($item);
} elseif ($item instanceof Collection) {
$this->invalidateCollectionUrls($item);
} elseif ($item instanceof Asset) {
$this->invalidateAssetUrls($item);
} elseif ($item instanceof Form) {
$this->invalidateFormUrls($item);
}
}
protected function invalidateFormUrls($form)
{
$this->cacher->invalidateUrls(
Arr::get($this->rules, "forms.{$form->handle()}.urls")
);
}
protected function invalidateAssetUrls($asset)
{
$this->cacher->invalidateUrls(
Arr::get($this->rules, "assets.{$asset->container()->handle()}.urls")
);
}
protected function invalidateEntryUrls($entry)
{
$entry->descendants()->merge([$entry])->each(function ($entry) {
if (! $entry->isRedirect() && $url = $entry->absoluteUrl()) {
$this->cacher->invalidateUrl(...$this->splitUrlAndDomain($url));
}
});
$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);
}
protected function invalidateTermUrls($term)
{
if ($url = $term->absoluteUrl()) {
$this->cacher->invalidateUrl(...$this->splitUrlAndDomain($url));
$term->taxonomy()->collections()->each(function ($collection) use ($term) {
if ($url = $term->collection($collection)->absoluteUrl()) {
$this->cacher->invalidateUrl(...$this->splitUrlAndDomain($url));
}
});
}
$this->cacher->invalidateUrls(
Arr::get($this->rules, "taxonomies.{$term->taxonomyHandle()}.urls")
);
}
protected function invalidateNavUrls($nav)
{
$this->cacher->invalidateUrls(
Arr::get($this->rules, "navigation.{$nav->handle()}.urls")
);
}
protected function invalidateGlobalUrls($set)
{
$this->cacher->invalidateUrls(
Arr::get($this->rules, "globals.{$set->handle()}.urls")
);
}
protected function invalidateCollectionUrls($collection)
{
if ($url = $collection->absoluteUrl()) {
$this->cacher->invalidateUrl(...$this->splitUrlAndDomain($url));
}
$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$collection->handle()}.urls")
);
}
private function splitUrlAndDomain(string $url)
{
$parsed = parse_url($url);
return [
Arr::get($parsed, 'path', '/'),
$parsed['scheme'].'://'.$parsed['host'],
];
}
}