-
-
Notifications
You must be signed in to change notification settings - Fork 113
/
SettingsContainer.php
83 lines (65 loc) · 2.55 KB
/
SettingsContainer.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
<?php
namespace Spatie\LaravelSettings;
use Illuminate\Container\Container;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Spatie\LaravelSettings\Exceptions\CouldNotUnserializeSettings;
use Spatie\LaravelSettings\Support\Composer;
use Spatie\LaravelSettings\Support\DiscoverSettings;
use Spatie\LaravelSettings\Support\SettingsCacheFactory;
class SettingsContainer
{
protected Container $container;
protected static ?Collection $settingsClasses = null;
public function __construct(Container $container)
{
$this->container = $container;
}
public function registerBindings(): void
{
$cacheFactory = $this->container->make(SettingsCacheFactory::class);
$this->getSettingClasses()->each(function (string $settingClass) use ($cacheFactory) {
$this->container->scoped($settingClass, function () use ($cacheFactory, $settingClass) {
$cache = $cacheFactory->build($settingClass::repository());
if ($cache->isEnabled() && $cache->has($settingClass)) {
try {
return $cache->get($settingClass);
} catch (CouldNotUnserializeSettings $exception) {
Log::error("Could not unserialize settings class: `{$settingClass}` from cache");
}
}
return new $settingClass();
});
});
}
public function getSettingClasses(): Collection
{
if (self::$settingsClasses !== null) {
return self::$settingsClasses;
}
$cachedDiscoveredSettings = config('settings.discovered_settings_cache_path') . '/settings.php';
if (file_exists($cachedDiscoveredSettings)) {
$classes = require $cachedDiscoveredSettings;
return self::$settingsClasses = collect($classes);
}
/** @var \Spatie\LaravelSettings\Settings[] $settings */
$settings = array_merge(
$this->discoverSettings(),
config('settings.settings', [])
);
return self::$settingsClasses = collect($settings)->unique();
}
public function clearCache(): self
{
self::$settingsClasses = null;
return $this;
}
protected function discoverSettings(): array
{
return (new DiscoverSettings())
->within(config('settings.auto_discover_settings', []))
->useBasePath(base_path())
->ignoringFiles(Composer::getAutoloadedFiles(base_path('composer.json')))
->discover();
}
}