* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Form; use Pimple\Container; use Symfony\Component\Form\Exception\InvalidArgumentException; use Symfony\Component\Form\FormExtensionInterface; use Symfony\Component\Form\FormTypeGuesserChain; class SilexFormExtension implements FormExtensionInterface { private $app; private $types; private $typeExtensions; private $guessers; private $guesserLoaded = false; private $guesser; public function __construct(Container $app, array $types, array $typeExtensions, array $guessers) { $this->app = $app; $this->setTypes($types); $this->setTypeExtensions($typeExtensions); $this->setGuessers($guessers); } public function getType($name) { if (!isset($this->types[$name])) { throw new InvalidArgumentException(sprintf('The type "%s" is not the name of a registered form type.', $name)); } if (!is_object($this->types[$name])) { $this->types[$name] = $this->app[$this->types[$name]]; } return $this->types[$name]; } public function hasType($name) { return isset($this->types[$name]); } public function getTypeExtensions($name) { return isset($this->typeExtensions[$name]) ? $this->typeExtensions[$name] : []; } public function hasTypeExtensions($name) { return isset($this->typeExtensions[$name]); } public function getTypeGuesser() { if (!$this->guesserLoaded) { $this->guesserLoaded = true; if ($this->guessers) { $guessers = []; foreach ($this->guessers as $guesser) { if (!is_object($guesser)) { $guesser = $this->app[$guesser]; } $guessers[] = $guesser; } $this->guesser = new FormTypeGuesserChain($guessers); } } return $this->guesser; } private function setTypes(array $types) { $this->types = []; foreach ($types as $type) { if (!is_object($type)) { if (!isset($this->app[$type])) { throw new InvalidArgumentException(sprintf('Invalid form type. The silex service "%s" does not exist.', $type)); } $this->types[$type] = $type; } else { $this->types[get_class($type)] = $type; } } } private function setTypeExtensions(array $typeExtensions) { $this->typeExtensions = []; foreach ($typeExtensions as $extension) { if (!is_object($extension)) { if (!isset($this->app[$extension])) { throw new InvalidArgumentException(sprintf('Invalid form type extension. The silex service "%s" does not exist.', $extension)); } $extension = $this->app[$extension]; } $this->typeExtensions[$extension->getExtendedType()][] = $extension; } } private function setGuessers(array $guessers) { $this->guessers = []; foreach ($guessers as $guesser) { if (!is_object($guesser) && !isset($this->app[$guesser])) { throw new InvalidArgumentException(sprintf('Invalid form type guesser. The silex service "%s" does not exist.', $guesser)); } $this->guessers[] = $guesser; } } }