1 | <?php |
||
34 | class LifecycleEventManager |
||
35 | { |
||
36 | /** |
||
37 | * @var DocumentManager |
||
38 | */ |
||
39 | private $dm; |
||
40 | |||
41 | /** |
||
42 | * @var EventManager |
||
43 | */ |
||
44 | private $evm; |
||
45 | |||
46 | /** |
||
47 | * @var UnitOfWork |
||
48 | */ |
||
49 | private $uow; |
||
50 | |||
51 | /** |
||
52 | * @param DocumentManager $dm |
||
53 | * @param UnitOfWork $uow |
||
54 | * @param EventManager $evm |
||
55 | */ |
||
56 | 932 | public function __construct(DocumentManager $dm, UnitOfWork $uow, EventManager $evm) |
|
62 | |||
63 | /** |
||
64 | * Invokes postPersist callbacks and events for given document cascading them to embedded documents as well. |
||
65 | * |
||
66 | * @param ClassMetadata $class |
||
67 | * @param object $document |
||
68 | */ |
||
69 | 553 | public function postPersist(ClassMetadata $class, $document) |
|
75 | |||
76 | /** |
||
77 | * Invokes postRemove callbacks and events for given document. |
||
78 | * |
||
79 | * @param ClassMetadata $class |
||
80 | * @param object $document |
||
81 | */ |
||
82 | 61 | public function postRemove(ClassMetadata $class, $document) |
|
87 | |||
88 | /** |
||
89 | * Invokes postUpdate callbacks and events for given document. The same will be done for embedded documents owned |
||
90 | * by given document unless they were new in which case postPersist callbacks and events will be dispatched. |
||
91 | * |
||
92 | * @param ClassMetadata $class |
||
93 | * @param object $document |
||
94 | */ |
||
95 | 215 | public function postUpdate(ClassMetadata $class, $document) |
|
96 | { |
||
97 | 215 | $class->invokeLifecycleCallbacks(Events::postUpdate, $document, array(new LifecycleEventArgs($document, $this->dm))); |
|
98 | 215 | $this->evm->dispatchEvent(Events::postUpdate, new LifecycleEventArgs($document, $this->dm)); |
|
99 | 215 | $this->cascadePostUpdate($class, $document); |
|
100 | 215 | } |
|
101 | |||
102 | /** |
||
103 | * Invokes prePersist callbacks and events for given document. |
||
104 | * |
||
105 | * @param ClassMetadata $class |
||
106 | * @param object $document |
||
107 | */ |
||
108 | 577 | public function prePersist(ClassMetadata $class, $document) |
|
113 | |||
114 | /** |
||
115 | * Invokes prePersist callbacks and events for given document. |
||
116 | * |
||
117 | * @param ClassMetadata $class |
||
118 | * @param object $document |
||
119 | */ |
||
120 | 67 | public function preRemove(ClassMetadata $class, $document) |
|
125 | |||
126 | /** |
||
127 | * Invokes preUpdate callbacks and events for given document cascading them to embedded documents as well. |
||
128 | * |
||
129 | * @param ClassMetadata $class |
||
130 | * @param object $document |
||
131 | */ |
||
132 | 219 | public function preUpdate(ClassMetadata $class, $document) |
|
133 | { |
||
134 | 219 | if ( ! empty($class->lifecycleCallbacks[Events::preUpdate])) { |
|
135 | 12 | $class->invokeLifecycleCallbacks(Events::preUpdate, $document, array( |
|
136 | 12 | new PreUpdateEventArgs($document, $this->dm, $this->uow->getDocumentChangeSet($document)) |
|
137 | 12 | )); |
|
138 | 12 | $this->uow->recomputeSingleDocumentChangeSet($class, $document); |
|
139 | 12 | } |
|
140 | 219 | $this->evm->dispatchEvent(Events::preUpdate, new PreUpdateEventArgs($document, $this->dm, $this->uow->getDocumentChangeSet($document))); |
|
141 | 219 | $this->cascadePreUpdate($class, $document); |
|
142 | 219 | } |
|
143 | |||
144 | /** |
||
145 | * Cascades the preUpdate event to embedded documents. |
||
146 | * |
||
147 | * @param ClassMetadata $class |
||
148 | * @param object $document |
||
149 | */ |
||
150 | 219 | private function cascadePreUpdate(ClassMetadata $class, $document) |
|
151 | { |
||
152 | 219 | foreach ($class->getEmbeddedFieldsMappings() as $mapping) { |
|
153 | 134 | $value = $class->reflFields[$mapping['fieldName']]->getValue($document); |
|
154 | 134 | if ($value === null) { |
|
155 | 49 | continue; |
|
156 | } |
||
157 | 132 | $values = $mapping['type'] === ClassMetadata::ONE ? array($value) : $value; |
|
158 | |||
159 | 132 | foreach ($values as $entry) { |
|
160 | 85 | if ($this->uow->isScheduledForInsert($entry) || empty($this->uow->getDocumentChangeSet($entry))) { |
|
161 | 71 | continue; |
|
162 | } |
||
163 | 45 | $this->preUpdate($this->dm->getClassMetadata(get_class($entry)), $entry); |
|
164 | 132 | } |
|
165 | 219 | } |
|
166 | 219 | } |
|
167 | |||
168 | /** |
||
169 | * Cascades the postUpdate and postPersist events to embedded documents. |
||
170 | * |
||
171 | * @param ClassMetadata $class |
||
172 | * @param object $document |
||
173 | */ |
||
174 | 215 | private function cascadePostUpdate(ClassMetadata $class, $document) |
|
175 | { |
||
176 | 215 | foreach ($class->getEmbeddedFieldsMappings() as $mapping) { |
|
177 | 130 | $value = $class->reflFields[$mapping['fieldName']]->getValue($document); |
|
178 | 130 | if ($value === null) { |
|
179 | 52 | continue; |
|
180 | } |
||
181 | 128 | $values = $mapping['type'] === ClassMetadata::ONE ? array($value) : $value; |
|
182 | |||
183 | 128 | foreach ($values as $entry) { |
|
184 | 85 | if (empty($this->uow->getDocumentChangeSet($entry)) && ! $this->uow->hasScheduledCollections($entry)) { |
|
185 | 48 | continue; |
|
186 | } |
||
187 | 67 | $entryClass = $this->dm->getClassMetadata(get_class($entry)); |
|
188 | 67 | $event = $this->uow->isScheduledForInsert($entry) ? Events::postPersist : Events::postUpdate; |
|
189 | 67 | $entryClass->invokeLifecycleCallbacks($event, $entry, array(new LifecycleEventArgs($entry, $this->dm))); |
|
190 | 67 | $this->evm->dispatchEvent($event, new LifecycleEventArgs($entry, $this->dm)); |
|
191 | |||
192 | 67 | $this->cascadePostUpdate($entryClass, $entry); |
|
193 | 128 | } |
|
194 | 215 | } |
|
195 | 215 | } |
|
196 | |||
197 | /** |
||
198 | * Cascades the postPersist events to embedded documents. |
||
199 | * |
||
200 | * @param ClassMetadata $class |
||
201 | * @param object $document |
||
202 | */ |
||
203 | 553 | private function cascadePostPersist(ClassMetadata $class, $document) |
|
216 | } |
||
217 |