protected function addProvidersNode(ArrayNodeDefinition $rootNode)
 {
     $rootNode->ignoreExtraKeys()->fixXmlConfig('factory', 'factories')->children();
     foreach ($this->providers as $provider) {
         $factory = isset($this->factories[$provider]) ? $this->factories[$provider] : null;
         if ($factory === null) {
             throw new \LogicException(sprintf('No factory found for the provider "%s"', $provider));
         }
         $factoryNode = $rootNode->children()->arrayNode($provider)->isRequired();
         $factory->addConfiguration($factoryNode);
     }
     $rootNode->end();
     return $rootNode;
 }
 private function buildEntitiesPropertiesNode()
 {
     $entitiesPropertiesNode = new ArrayNodeDefinition('properties');
     $prototype = $entitiesPropertiesNode->info('List of properties of entity')->prototype('array');
     foreach ($this->treeConfigurators as $configurator) {
         foreach ((array) $configurator->appendEntitiesPropertiesNode() as $node) {
             $prototype->append($node);
         }
     }
     $prototype->children()->scalarNode('type')->info('type of data, standard type of other entity name')->example('DateTime')->cannotBeEmpty()->beforeNormalization()->always(function ($v) {
         return strtolower($v);
     })->end()->validate()->ifTrue(function ($v) {
         return !$this->typeFactory->isValidType($v);
     })->thenInvalid('Invalid Type %s')->end()->end()->scalarNode('cardinality')->info('type of cardinality OneToMany, ManyToMany')->example('(0..1)')->cannotBeEmpty()->end()->scalarNode('accessorPrefix')->info('Prefix used has accessor method : prefixPropertieName')->example('is, has, get')->defaultValue('get')->end()->scalarNode('enum')->info('Name of target enum')->cannotBeEmpty()->end()->scalarNode('entity')->info('name of target entity')->example('DateTime')->cannotBeEmpty()->end()->scalarNode('inverse')->info('define oposite property in cas of relation')->example('MyEntity::propertieName')->cannotBeEmpty()->end()->booleanNode('nullable')->info('Is this propertie is nullable?')->defaultFalse()->end()->booleanNode('primary')->info('Is this propertie is primary key ?')->defaultFalse()->end()->booleanNode('autoincrement')->info('Is this propertie is auto incremented ?')->defaultFalse()->end()->booleanNode('unique')->info('Is this propertie is unique?')->defaultFalse()->end()->variableNode('default')->info('Default value of propertie')->end()->integerNode('length')->info('Max length for string type')->min(0)->end()->integerNode('precision')->info('Number of decimal for float type')->min(1)->max(15)->end();
     $entitiesPropertiesNode->end();
     return $entitiesPropertiesNode;
 }
 /**
  * {@inheritdoc}
  */
 public function configure(ArrayNodeDefinition $builder)
 {
     $builder->end();
 }