/
Atlantic18BehaviorExtension.php
118 lines (103 loc) · 3.98 KB
/
Atlantic18BehaviorExtension.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
<?php declare(strict_types = 1);
namespace Nettrine\Extensions\Atlantic18\DI;
use Doctrine\Common\Annotations\Reader;
use Gedmo\Blameable\BlameableListener;
use Gedmo\IpTraceable\IpTraceableListener;
use Gedmo\Loggable\LoggableListener;
use Gedmo\Sluggable\SluggableListener;
use Gedmo\SoftDeleteable\SoftDeleteableListener;
use Gedmo\Sortable\SortableListener;
use Gedmo\Timestampable\TimestampableListener;
use Gedmo\Translatable\TranslatableListener;
use Gedmo\Tree\TreeListener;
use Nette\DI\CompilerExtension;
use Nette\DI\Definitions\Statement;
use Nette\Schema\Expect;
use Nette\Schema\Schema;
use stdClass;
/**
* @property-read stdClass $config
*/
class Atlantic18BehaviorExtension extends CompilerExtension
{
public function getConfigSchema(): Schema
{
return Expect::structure([
'loggable' => Expect::bool(false),
'sluggable' => Expect::bool(false),
'softDeleteable' => Expect::bool(false),
'treeable' => Expect::bool(false),
'blameable' => Expect::bool(false),
'timestampable' => Expect::bool(false),
'translatable' => Expect::anyOf(false, Expect::structure([
'translatable' => Expect::string()->required(),
'default' => Expect::string()->required(),
'translationFallback' => Expect::bool(false),
'persistDefaultTranslation' => Expect::bool(false),
'skipOnLoad' => Expect::bool(false),
]))->default(false),
'uploadable' => Expect::bool(false),
'sortable' => Expect::bool(false),
'ipTraceable' => Expect::anyOf(false, Expect::structure([
'ipValue' => Expect::anyOf(Expect::string(), Expect::array(), Expect::type(Statement::class))->required(),
]))->default(false),
]);
}
public function loadConfiguration(): void
{
$builder = $this->getContainerBuilder();
$config = $this->config;
if ($config->loggable) {
$builder->addDefinition($this->prefix('loggable'))
->setFactory(LoggableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class]);
}
if ($config->sluggable) {
$builder->addDefinition($this->prefix('sluggable'))
->setFactory(SluggableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class]);
}
if ($config->softDeleteable) {
$builder->addDefinition($this->prefix('softDeleteable'))
->setFactory(SoftDeleteableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class]);
}
if ($config->treeable) {
$builder->addDefinition($this->prefix('treeable'))
->setFactory(TreeListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class]);
}
if ($config->blameable) {
$builder->addDefinition($this->prefix('blameable'))
->setFactory(BlameableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class]);
}
if ($config->timestampable) {
$builder->addDefinition($this->prefix('timestampable'))
->setFactory(TimestampableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class]);
}
if ($config->translatable !== false) {
$translatableConfig = $config->translatable;
$builder->addDefinition($this->prefix('translatable'))
->setFactory(TranslatableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class])
->addSetup('setDefaultLocale', [$translatableConfig->default])
->addSetup('setTranslatableLocale', [$translatableConfig->translatable])
->addSetup('setPersistDefaultLocaleTranslation', [$translatableConfig->translationFallback])
->addSetup('setTranslationFallback', [$translatableConfig->persistDefaultTranslation])
->addSetup('setSkipOnLoad', [$translatableConfig->skipOnLoad]);
}
if ($config->sortable) {
$builder->addDefinition($this->prefix('sortable'))
->setFactory(SortableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class]);
}
if ($config->ipTraceable !== false) {
$builder->addDefinition($this->prefix('ipTraceable'))
->setFactory(IpTraceableListener::class)
->addSetup('setAnnotationReader', ['@' . Reader::class])
->addSetup('setIpValue', [$config->ipTraceable->ipValue]);
}
}
}