| Viewing file:  FormRegistry.php (4.64 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?php
 /*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
 
 namespace Symfony\Component\Form;
 
 use Symfony\Component\Form\Exception\ExceptionInterface;
 use Symfony\Component\Form\Exception\UnexpectedTypeException;
 use Symfony\Component\Form\Exception\InvalidArgumentException;
 
 /**
 * The central registry of the Form component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
 class FormRegistry implements FormRegistryInterface
 {
 /**
 * Extensions
 *
 * @var FormExtensionInterface[] An array of FormExtensionInterface
 */
 private $extensions = array();
 
 /**
 * @var array
 */
 private $types = array();
 
 /**
 * @var FormTypeGuesserInterface|false|null
 */
 private $guesser = false;
 
 /**
 * @var ResolvedFormTypeFactoryInterface
 */
 private $resolvedTypeFactory;
 
 /**
 * Constructor.
 *
 * @param FormExtensionInterface[]         $extensions          An array of FormExtensionInterface
 * @param ResolvedFormTypeFactoryInterface $resolvedTypeFactory The factory for resolved form types.
 *
 * @throws UnexpectedTypeException if any extension does not implement FormExtensionInterface
 */
 public function __construct(array $extensions, ResolvedFormTypeFactoryInterface $resolvedTypeFactory)
 {
 foreach ($extensions as $extension) {
 if (!$extension instanceof FormExtensionInterface) {
 throw new UnexpectedTypeException($extension, 'Symfony\Component\Form\FormExtensionInterface');
 }
 }
 
 $this->extensions = $extensions;
 $this->resolvedTypeFactory = $resolvedTypeFactory;
 }
 
 /**
 * {@inheritdoc}
 */
 public function getType($name)
 {
 if (!is_string($name)) {
 throw new UnexpectedTypeException($name, 'string');
 }
 
 if (!isset($this->types[$name])) {
 /** @var FormTypeInterface $type */
 $type = null;
 
 foreach ($this->extensions as $extension) {
 /* @var FormExtensionInterface $extension */
 if ($extension->hasType($name)) {
 $type = $extension->getType($name);
 break;
 }
 }
 
 if (!$type) {
 throw new InvalidArgumentException(sprintf('Could not load type "%s"', $name));
 }
 
 $this->resolveAndAddType($type);
 }
 
 return $this->types[$name];
 }
 
 /**
 * Wraps a type into a ResolvedFormTypeInterface implementation and connects
 * it with its parent type.
 *
 * @param FormTypeInterface $type The type to resolve.
 *
 * @return ResolvedFormTypeInterface The resolved type.
 */
 private function resolveAndAddType(FormTypeInterface $type)
 {
 $parentType = $type->getParent();
 
 if ($parentType instanceof FormTypeInterface) {
 $this->resolveAndAddType($parentType);
 $parentType = $parentType->getName();
 }
 
 $typeExtensions = array();
 
 foreach ($this->extensions as $extension) {
 /* @var FormExtensionInterface $extension */
 $typeExtensions = array_merge(
 $typeExtensions,
 $extension->getTypeExtensions($type->getName())
 );
 }
 
 $this->types[$type->getName()] = $this->resolvedTypeFactory->createResolvedType(
 $type,
 $typeExtensions,
 $parentType ? $this->getType($parentType) : null
 );
 }
 
 /**
 * {@inheritdoc}
 */
 public function hasType($name)
 {
 if (isset($this->types[$name])) {
 return true;
 }
 
 try {
 $this->getType($name);
 } catch (ExceptionInterface $e) {
 return false;
 }
 
 return true;
 }
 
 /**
 * {@inheritdoc}
 */
 public function getTypeGuesser()
 {
 if (false === $this->guesser) {
 $guessers = array();
 
 foreach ($this->extensions as $extension) {
 /* @var FormExtensionInterface $extension */
 $guesser = $extension->getTypeGuesser();
 
 if ($guesser) {
 $guessers[] = $guesser;
 }
 }
 
 $this->guesser = !empty($guessers) ? new FormTypeGuesserChain($guessers) : null;
 }
 
 return $this->guesser;
 }
 
 /**
 * {@inheritdoc}
 */
 public function getExtensions()
 {
 return $this->extensions;
 }
 }
 
 |