/** * @param LifecycleEventArgs $args * @param string $event */ protected function handleEvent(LifecycleEventArgs $args, $event) { $object = $args->getObject(); $om = $args->getObjectManager(); $class = get_class($object); $classMetadata = $this->metadataFactory->getMetadataForClass($class); $classMetadataInfo = $om->getClassMetadata($class); $identifierFields = $classMetadataInfo->getIdentifierFieldNames(); foreach ($classMetadata->propertyMetadata as $propertyMetadata) { if ($propertyMetadata instanceof PropertyMetadata && count($propertyMetadata->slugFields)) { $hasIdentifierFields = count(array_intersect($identifierFields, $propertyMetadata->slugFields)) > 0; if ($event == 'prePersist' && $hasIdentifierFields || $event == 'postPersist' && !$hasIdentifierFields) { continue; // generate slug in another event } $slug = null; if ($event == 'preUpdate') { if ($args->hasChangedField($propertyMetadata->name)) { // generate custom slug $slug = $this->slugger->slugify($args->getNewValue($propertyMetadata->name), $propertyMetadata->slugSeparator); } elseif (null !== $propertyMetadata->getValue($object)) { continue; // no changes } } else { // generate custom slug $slug = $this->slugger->slugify($propertyMetadata->getValue($object), $propertyMetadata->slugSeparator); } if (!trim($slug)) { // generate slug from the sluggable fields $slug = $this->generateSlugFromMetadata($object, $propertyMetadata->slugFields, $propertyMetadata->slugSeparator); } $id = $event == 'preUpdate' && method_exists($object, 'getId') ? $object->getId() : null; // generate unique slug $slug = $this->generateUniqueSlug($om, $object, $propertyMetadata->name, $slug, $propertyMetadata->slugSeparator, $id); $propertyMetadata->setValue($object, $slug); $this->recomputeSingleObjectChangeSet($om, $object); } } }