예제 #1
0
 /**
  * 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));
 }