/** * Flush the current state of the repository into the file system. */ public function flush() { if (\Env::get('cx')->getMode() == \Cx\Core\Core\Controller\Cx::MODE_MINIMAL) { \DBG::msg('WARNING: ' . __METHOD__ . '() initialized in Cx mode "' . \Cx\Core\Core\Controller\Cx::MODE_MINIMAL . '". EventListeners have not yet been registered. This might break the system! Flushing a repository at this point is highly unadvisable!'); } $entitiesToPersist = array(); foreach ($this->entities as $entity) { // Validation must be done before checking for virtual entities. // As even virtual entities must comply with the unique-key restrictions. $this->validate($entity); if ($entity->isVirtual()) { if (!isset($this->originalEntitiesFromRepository[$this->getIdentifierOfEntity($entity)])) { continue; } } if (isset($this->originalEntitiesFromRepository[$this->getIdentifierOfEntity($entity)])) { if ($this->originalEntitiesFromRepository[$this->getIdentifierOfEntity($entity)] != $entity) { $this->updatedEntities[] = $entity; } } $entitiesToPersist[$this->getIdentifierOfEntity($entity)] = $entity; } foreach ($this->updatedEntities as $entity) { \Env::get('cx')->getEvents()->triggerEvent('model/preUpdate', array(new \Doctrine\ORM\Event\LifecycleEventArgs($entity, \Env::get('em')))); } $this->prepareFile($this->repositoryPath, $this->entityUniqueKeys, $this->entityIdentifier); $dataSet = new \Cx\Core_Modules\Listing\Model\Entity\DataSet(); $dataSet->add('data', $entitiesToPersist); $dataSet->add('meta', $this->getMetaDefinition()); $dataSet->save($this->repositoryPath); // triger post-events // apply the same order of event-triggers as doctrine does: // 1. postPersist // 2. postUpdate // 3. postRemove foreach ($this->addedEntities as $entity) { \Env::get('cx')->getEvents()->triggerEvent('model/postPersist', array(new \Doctrine\ORM\Event\LifecycleEventArgs($entity, \Env::get('em')))); } foreach ($this->updatedEntities as $entity) { \Env::get('cx')->getEvents()->triggerEvent('model/postUpdate', array(new \Doctrine\ORM\Event\LifecycleEventArgs($entity, \Env::get('em')))); } foreach ($this->removedEntities as $entity) { \Env::get('cx')->getEvents()->triggerEvent('model/postRemove', array(new \Doctrine\ORM\Event\LifecycleEventArgs($entity, \Env::get('em')))); } //truncate the variables $this->addedEntities = array(); $this->updatedEntities = array(); $this->removedEntities = array(); \Env::get('cx')->getEvents()->triggerEvent('model/postFlush', array(new \Doctrine\ORM\Event\OnFlushEventArgs(\Env::get('em')), $this->repositoryPath)); }