Browse Source

optimizations and property abstraction

gediminasm 14 years ago
parent
commit
4099ecace9

+ 2 - 5
README.markdown

@@ -14,6 +14,7 @@ To include the DoctrineExtensions should fire up an autoloader, for example:
 
 ### Recent Updates
 
+- Implemented more abstracted functionality for getting and setting field properties.
 - Added support for string primary keys, now translations can use integer and string foreign keys.
 - Added support for multiple updates and inserts during single flush.
 - Implemented the default locale functionality. Now you can set the default locale to be used then translation
@@ -198,6 +199,7 @@ want and on flush everything magicaly will be created and updated..
 
 ### Recent Updates
 
+- Implemented more abstracted functionality for getting and setting field properties.
 - Implemented slug type case and separator configuration. Example camel cased and underscored
 slug: Example_Slug, default: example-slug.
 - Added support for a limited unique slug generation.
@@ -290,11 +292,6 @@ before the creation of it`s translation.
         {
             return $this->slug;
         }
-        
-        public function setSlug($slug)
-        {
-            $this->slug = $slug;
-        }
     }
 
 To save **Article** and generate slug simply use:

+ 9 - 13
lib/DoctrineExtensions/Sluggable/SluggableListener.php

@@ -182,9 +182,7 @@ class SluggableListener implements EventSubscriber
         	if (isset($changeSet[$sluggableField])) {
         		$needToChangeSlug = true;
         	}
-        	$getter = 'get' . ucfirst($sluggableField);
-        	$slug .= $entity->{$getter}() . ' ';
-        	
+        	$slug .= $entityClassMetadata->getReflectionProperty($sluggableField)->getValue($entity) . ' ';
         }
         // if slug is not changed, no need further processing
         if (!$needToChangeSlug) {
@@ -216,15 +214,14 @@ class SluggableListener implements EventSubscriber
         }
         
         // set the slug
-        $setter = 'set' . ucfirst($slugField);
-        $entity->{$setter}($slug);
+        $entityClassMetadata->getReflectionProperty($slugField)->setValue($entity, $slug);
         if ($config->isUnique() && ($isInsert || $uow->hasPendingInsertions())) {
         	// leave for further processing after insertion
             $this->_pendingEntities[spl_object_hash($entity)] = $entity;
         } elseif ($config->isUnique()) {
         	// make slug unique
             $slug = $this->_makeUniqueSlug($em, $entity);
-        	$entity->{$setter}($slug);
+        	$entityClassMetadata->getReflectionProperty($slugField)->setValue($entity, $slug);
         }
         // update the changset
         $uow->recomputeSingleEntityChangeSet($entityClassMetadata, $entity);
@@ -245,12 +242,13 @@ class SluggableListener implements EventSubscriber
         	throw Exception::pendingInserts();
         }
     	
+        $entityClass = get_class($entity);
+        $entityClassMetadata = $em->getClassMetadata($entityClass);
+        
     	$config = $this->getConfiguration($entity);
     	$slugField = $config->getSlugField();
-    	
-    	$getter = 'get' . ucfirst($slugField);
-        $preferedSlug = $entity->{$getter}();
-        $entityClass = get_class($entity);
+        $preferedSlug = $entityClassMetadata->getReflectionProperty($slugField)->getValue($entity);
+        
         // @todo: optimize
         // search for similar slug
         $qb = $em->createQueryBuilder();
@@ -261,7 +259,6 @@ class SluggableListener implements EventSubscriber
                 $qb->expr()->literal($preferedSlug . '%'))
             );
         // include identifiers
-        $entityClassMetadata = $em->getClassMetadata($entityClass);
         $entityIdentifiers = $entityClassMetadata->getIdentifierValues($entity);
         foreach ($entityIdentifiers as $field => $value) {
         	$qb->where('rec.' . $field . ' <> ' . $value);
@@ -298,8 +295,7 @@ class SluggableListener implements EventSubscriber
                 $generatedSlug .= $separator . $i;
             }
             
-            $setter = 'set' . ucfirst($slugField);
-            $entity->{$setter}($generatedSlug);
+            $entityClassMetadata->getReflectionProperty($slugField)->setValue($entity, $generatedSlug);
             if ($needRecursion) {
             	$generatedSlug = $this->_makeUniqueSlug($em, $entity);
             }

+ 16 - 20
lib/DoctrineExtensions/Translatable/TranslationListener.php

@@ -163,12 +163,13 @@ class TranslationListener implements EventSubscriber
             $entityClassMetadata = $em->getClassMetadata($entityClass);
             // there should be single identifier
             $identifierField = $entityClassMetadata->getSingleIdentifierFieldName();
-            $identifierGetter = 'get' . ucfirst($identifierField);
         	if (array_key_exists($oid, $this->_pendingTranslationInserts)) {
                 // load the pending translations without key
         		$translations = $this->_pendingTranslationInserts[$oid];
         		foreach ($translations as $translation) {
-	                $translation->setForeignKey($entity->{$identifierGetter}());
+	                $translation->setForeignKey(
+                        $entityClassMetadata->getReflectionProperty($identifierField)->getValue($entity)
+                    );
 	                $this->_insertTranslationRecord($em, $translation);
         		}
             }
@@ -216,12 +217,11 @@ class TranslationListener implements EventSubscriber
 	    	$entityClassMetadata = $em->getClassMetadata($entityClass);
 	    	// there should be single identifier
 	    	$identifierField = $entityClassMetadata->getSingleIdentifierFieldName();
-	    	$identifierGetter = 'get' . ucfirst($identifierField);
 	    	// load translated content for all translatable fields
             foreach ($entity->getTranslatableFields() as $field) {
             	$content = $this->_findTranslation(
             	    $em,
-            	    $entity->{$identifierGetter}(),
+            	    $entityClassMetadata->getReflectionProperty($identifierField)->getValue($entity),
             	    get_class($entity),
                     $locale,
             	    $field,
@@ -229,8 +229,7 @@ class TranslationListener implements EventSubscriber
             	);
             	// update translation only if it has it
             	if (strlen($content)) {
-            		$setter = 'set' . ucfirst($field);
-            		$entity->{$setter}($content);
+            		$entityClassMetadata->getReflectionProperty($field)->setValue($entity, $content);
             	}
             }	
     	}
@@ -292,9 +291,8 @@ class TranslationListener implements EventSubscriber
 	            $scheduleUpdate = !$isInsert;
             }
             
-            // set the translated field, take value using getter
-            $getter = 'get' . ucfirst($field);
-            $translation->setContent($entity->{$getter}());
+            // set the translated field, take value using reflection
+            $translation->setContent($entityClassMetadata->getReflectionProperty($field)->getValue($entity));
             if ($scheduleUpdate && $uow->hasPendingInsertions()) {
                 // need to shedule new Translation insert to avoid query on pending insert
                 $this->_pendingTranslationUpdates[] = $translation;
@@ -316,8 +314,7 @@ class TranslationListener implements EventSubscriber
         	foreach ($changeSet as $field => $changes) {
         		if (in_array($field, $translatableFields)) {
         			if ($locale != $this->_defaultLocale && strlen($changes[0])) {
-        				$setter = 'set' . ucfirst($field);
-        				$entity->{$setter}($changes[0]);
+        				$entityClassMetadata->getReflectionProperty($field)->setValue($entity, $changes[0]);
         				$needsUpdate = true;
         			}
         		}
@@ -398,15 +395,14 @@ class TranslationListener implements EventSubscriber
      */
     private function _insertTranslationRecord(EntityManager $em, $translation)
     {
-        $translationMetadata = $em->getClassMetadata(self::TRANSLATION_ENTITY_CLASS);
-        
-        $data = array(
-            'locale' => $translation->getLocale(),
-            'foreign_key' => $translation->getForeignKey(),
-            'entity' => $translation->getEntity(),
-            'field' => $translation->getField(),
-            'content' => $translation->getContent()
-        );
+        $translationMetadata = $em->getClassMetadata(self::TRANSLATION_ENTITY_CLASS);        
+        $data = array();
+
+        foreach ($translationMetadata->getReflectionProperties() as $fieldName => $reflProp) {
+            if (!$translationMetadata->isIdentifier($fieldName)) {
+                $data[$translationMetadata->getColumnName($fieldName)] = $reflProp->getValue($translation);
+            }
+        }
         
         $table = $translationMetadata->getTableName();
         if (!$em->getConnection()->insert($table, $data)) {

+ 0 - 5
tests/DoctrineExtensions/Sluggable/SluggableTest.php

@@ -185,9 +185,4 @@ class Article implements Sluggable
     {
     	return $this->slug;
     }
-    
-    public function setSlug($slug)
-    {
-    	$this->slug = $slug;
-    }
 }

+ 0 - 10
tests/DoctrineExtensions/Sluggable/TranslatableSlugTest.php

@@ -256,11 +256,6 @@ class TranslatableArticle implements Sluggable, Translatable
         return $this->slug;
     }
     
-    public function setSlug($slug)
-    {
-        $this->slug = $slug;
-    }
-    
     public function getTranslatableFields()
     {
         return array('title', 'code', 'slug');
@@ -379,9 +374,4 @@ class Page implements Sluggable
     {
         return $this->slug;
     }
-    
-    public function setSlug($slug)
-    {
-        $this->slug = $slug;
-    }
 }