* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Form\Console\Descriptor; use Symfony\Component\Console\Descriptor\DescriptorInterface; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\OutputStyle; use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Form\ResolvedFormTypeInterface; use Symfony\Component\Form\Util\OptionsResolverWrapper; use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; use Symfony\Component\OptionsResolver\Exception\NoConfigurationException; use Symfony\Component\OptionsResolver\OptionsResolver; /** * @author Yonel Ceruto * * @internal */ abstract class Descriptor implements DescriptorInterface { /** @var OutputStyle */ protected $output; protected $type; protected $ownOptions = array(); protected $overriddenOptions = array(); protected $parentOptions = array(); protected $extensionOptions = array(); protected $requiredOptions = array(); protected $parents = array(); protected $extensions = array(); /** * {@inheritdoc} */ public function describe(OutputInterface $output, $object, array $options = array()) { $this->output = $output instanceof OutputStyle ? $output : new SymfonyStyle(new ArrayInput(array()), $output); switch (true) { case null === $object: $this->describeDefaults($options); break; case $object instanceof ResolvedFormTypeInterface: $this->describeResolvedFormType($object, $options); break; case $object instanceof OptionsResolver: $this->describeOption($object, $options); break; default: throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object))); } } abstract protected function describeDefaults(array $options); abstract protected function describeResolvedFormType(ResolvedFormTypeInterface $resolvedFormType, array $options = array()); abstract protected function describeOption(OptionsResolver $optionsResolver, array $options); protected function collectOptions(ResolvedFormTypeInterface $type) { $this->parents = array(); $this->extensions = array(); if (null !== $type->getParent()) { $optionsResolver = clone $this->getParentOptionsResolver($type->getParent()); } else { $optionsResolver = new OptionsResolver(); } $type->getInnerType()->configureOptions($ownOptionsResolver = new OptionsResolverWrapper()); $this->ownOptions = array_diff($ownOptionsResolver->getDefinedOptions(), $optionsResolver->getDefinedOptions()); $overriddenOptions = array_intersect(array_merge($ownOptionsResolver->getDefinedOptions(), $ownOptionsResolver->getUndefinedOptions()), $optionsResolver->getDefinedOptions()); $this->parentOptions = array(); foreach ($this->parents as $class => $parentOptions) { $this->overriddenOptions[$class] = array_intersect($overriddenOptions, $parentOptions); $this->parentOptions[$class] = array_diff($parentOptions, $overriddenOptions); } $type->getInnerType()->configureOptions($optionsResolver); $this->collectTypeExtensionsOptions($type, $optionsResolver); $this->extensionOptions = array(); foreach ($this->extensions as $class => $extensionOptions) { $this->overriddenOptions[$class] = array_intersect($overriddenOptions, $extensionOptions); $this->extensionOptions[$class] = array_diff($extensionOptions, $overriddenOptions); } $this->overriddenOptions = array_filter($this->overriddenOptions); $this->parentOptions = array_filter($this->parentOptions); $this->extensionOptions = array_filter($this->extensionOptions); $this->requiredOptions = $optionsResolver->getRequiredOptions(); $this->parents = array_keys($this->parents); $this->extensions = array_keys($this->extensions); } protected function getOptionDefinition(OptionsResolver $optionsResolver, $option) { $definition = array('required' => $optionsResolver->isRequired($option)); $introspector = new OptionsResolverIntrospector($optionsResolver); $map = array( 'default' => 'getDefault', 'lazy' => 'getLazyClosures', 'allowedTypes' => 'getAllowedTypes', 'allowedValues' => 'getAllowedValues', 'normalizer' => 'getNormalizer', ); foreach ($map as $key => $method) { try { $definition[$key] = $introspector->{$method}($option); } catch (NoConfigurationException $e) { // noop } } return $definition; } private function getParentOptionsResolver(ResolvedFormTypeInterface $type) { $this->parents[$class = get_class($type->getInnerType())] = array(); if (null !== $type->getParent()) { $optionsResolver = clone $this->getParentOptionsResolver($type->getParent()); } else { $optionsResolver = new OptionsResolver(); } $inheritedOptions = $optionsResolver->getDefinedOptions(); $type->getInnerType()->configureOptions($optionsResolver); $this->parents[$class] = array_diff($optionsResolver->getDefinedOptions(), $inheritedOptions); $this->collectTypeExtensionsOptions($type, $optionsResolver); return $optionsResolver; } private function collectTypeExtensionsOptions(ResolvedFormTypeInterface $type, OptionsResolver $optionsResolver) { foreach ($type->getTypeExtensions() as $extension) { $inheritedOptions = $optionsResolver->getDefinedOptions(); $extension->configureOptions($optionsResolver); $this->extensions[get_class($extension)] = array_diff($optionsResolver->getDefinedOptions(), $inheritedOptions); } } } __halt_compiler();----SIGNATURE:----pS6FC9xw9kHP6TVw6fRkvlyt2vWh0IMlzoo2bnZaeziKdEwnerPVSGyq+kkuu08VAnEqdfHdy7qR6BurZIAw2Wcj6mTJuRK1dqBh7CmFP5fCWjJoASKO2N6YOt++LyogrlMVDNitrfNx7Jo4zLgaVPDj/etb0pJfnakxx8d4GtVfI6VkSIA7hqorgznHXtkKEBiY2gVpYYAVnFJJ1MLIP9WfTSJZiuY6TchcAlZwoBKqHyvoib47SOCnld3sgTt3Bm6DiKyPwuxcZkbctgMYktRgNNjGq4Glh/EEG5+/qrSgDwteRnrp7Nt+YgxauuxLS6a29gKwiHJHxt6dhdOUTjvIRO1YMkSwIgXq0l86haKPyV8YqMiPX2S9bEfNflFFEJk3fluSCjgJS0ApyZfmHfGn5RkHzjRalXEbzVkxeYwohtXUShqvyY8+02hna1gEk2RxIGiF0jjy2RP1jlwZ7EN5wd0aLmbe/IUk6bZrC0Kv48ZFRuyAaZYB8VlbuOgJdrDXGWyzZNtzV5Ab8baJZQWrzVfMEJ76KkcaHNyOaZciBMmkkyG8aGAF0lzCtLhXvJoQEuili/fsPCHwkGBEzkwr8tXgoO3Mc4ESAKr/ul8sGz7g6iUYCDX4M4P+WFZ/v7m6fmMWNjY4L+ONWyThy8tMSe005bWbg41PKtWP9oc=----ATTACHMENT:----ODM5MTM3NTYwNDA1Nzk4NSAxMTUxNzcwODU2MTg2NjUgMzQ2OTE5MTAyMjk5Nzk0OA==