* * 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\LogicException; use Symfony\Component\Form\Exception\UnexpectedTypeException; use Symfony\Component\Form\Exception\InvalidArgumentException; /** * The central registry of the Form component. * * @author Bernhard Schussek */ class FormRegistry implements FormRegistryInterface { /** * Extensions. * * @var FormExtensionInterface[] An array of FormExtensionInterface */ private $extensions = array(); /** * @var ResolvedFormTypeInterface[] */ private $types = array(); /** * @var FormTypeGuesserInterface|false|null */ private $guesser = false; /** * @var ResolvedFormTypeFactoryInterface */ private $resolvedTypeFactory; private $checkedTypes = array(); /** * @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 (!isset($this->types[$name])) { $type = null; foreach ($this->extensions as $extension) { if ($extension->hasType($name)) { $type = $extension->getType($name); break; } } if (!$type) { // Support fully-qualified class names if (!class_exists($name)) { throw new InvalidArgumentException(sprintf('Could not load type "%s": class does not exist.', $name)); } if (!is_subclass_of($name, 'Symfony\Component\Form\FormTypeInterface')) { throw new InvalidArgumentException(sprintf('Could not load type "%s": class does not implement "Symfony\Component\Form\FormTypeInterface".', $name)); } $type = new $name(); } $this->types[$name] = $this->resolveType($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 resolveType(FormTypeInterface $type) { $typeExtensions = array(); $parentType = $type->getParent(); $fqcn = get_class($type); if (isset($this->checkedTypes[$fqcn])) { $types = implode(' > ', array_merge(array_keys($this->checkedTypes), array($fqcn))); throw new LogicException(sprintf('Circular reference detected for form type "%s" (%s).', $fqcn, $types)); } $this->checkedTypes[$fqcn] = true; try { foreach ($this->extensions as $extension) { $typeExtensions = array_merge( $typeExtensions, $extension->getTypeExtensions($fqcn) ); } return $this->resolvedTypeFactory->createResolvedType( $type, $typeExtensions, $parentType ? $this->getType($parentType) : null ); } finally { unset($this->checkedTypes[$fqcn]); } } /** * {@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) { $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; } } __halt_compiler();----SIGNATURE:----m9kIOa5kauuQU8iSvON/H35HsOHRqykfwrTnQik13zHNDJWfQK/p81dUNoTn6S/UgQc6Lh/C7BVwM6avV1BK+/5fBHh1YzqGY+VsRnKrnJkl+pqC+r/m8Fj4Pm1ShZMRAjaECr2lvlLxayu+Wy4K2E/E1jGc7WFex862CUJAR+SK1LXsuvUEjOyjurqCcZyZuNGZPcXw6HrytGp/W8Z1RgT5k2gsdjQl/tAynHUKYuMUTJhlhmX+42vSktJaS02fmPVPOBVISUhbQVZClKEHKvDYyzb13uoWyA31UERgGRTVBdOI6cwsSYLb2vzjx4lz7/961AC/FvK5qT/UvV7fTCQkIegA1yOUS5rj1dUsBPU5lV40qCaHSsuL8nu3m55PiZOQip8PvaV4va53GC8BCOWjIqF39P2Ggq4h4gL2R/HI8HhetUyx3fZjoZhs049Hw3CIPmgLxpWH5v/lXTbmI9Tawls/KMD2xMyhIJIG/lP8tVh8yrmAVeWwEVhykeYxVf0+eKPJB8HEEakbpSTm8G3Yl5BnnJBU2H4le74x/4GQHYsVuAWdurAXx5BCvpDlTR6eNW3aXVwG/vtdKO8o16N5RLSAjS7m9SGjXKPGn+ay3UzHe1C0QypHfcfn38P58LtrsCXH2Hk8LjB4HdUPELLD8/WbgQ6B5oTfMF/vqvo=----ATTACHMENT:----MzQ1ODc3NDI3NjU0MjgxOSA4NjU3NTQ3NTE0NTI1ODU2IDQ0NzQ4OTE0MDg2MzczODQ=