/**
  * @param Field $field
  * @throws ConfigException
  */
 protected function setDefaultOptions(Field $field)
 {
     $options = $field->getOptions();
     $defaultOptions = $this->provideDefaultOptions();
     $requiredOptions = $this->provideRequiredOptions();
     $requiredOptions = array_combine($requiredOptions, $requiredOptions);
     $resultOptions = array_merge($defaultOptions, $options);
     $unexistedOptions = array_diff_key($requiredOptions, $resultOptions);
     if (count($unexistedOptions)) {
         throw new ConfigException(sprintf('Field \'%s\' (with type \'%s\') must contain required options: \'%s\'.', $field->getName(), $field->getType(), implode('\', \'', $unexistedOptions)));
     }
     $field->setOptions($resultOptions);
 }
 /**
  * @param Field $field
  * @param DataObjectInterface $object
  * @throws ConfigException
  */
 public function handleField(Field $field, DataObjectInterface $object)
 {
     if (!$field->getValue()) {
         return;
     }
     $this->setDefaultOptions($field);
     $options = $field->getOptions();
     /** @var ObjectManager $objectManager */
     $objectManager = $options['em'];
     $class = $options['class'];
     if (!($repo = $objectManager->getRepository($class))) {
         throw new ConfigException(sprintf('Repository for class \'%s\' doesn\'t exist.', $class));
     }
     $property = $options['property'];
     $criteria = array($property => $field->getValue());
     $entity = $repo->findOneBy($criteria);
     $field->setValue($entity);
 }