Permalink
Browse files

[Form] added a circular reference safeguard for form type

  • Loading branch information...
1 parent d044498 commit ea93e4cafaf048c88cce0af34c42f5e2da7b5793 @fabpot fabpot committed Jun 9, 2011
@@ -0,0 +1,22 @@
+<?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\Exception;
+
+use Symfony\Component\Form\FormTypeInterface;
+
+class CircularReferenceException extends FormException
+{
+ public function __construct(FormTypeInterface $type, $code = 0, $previous = null)
+ {
+ parent::__construct(sprintf('Circular reference detected in the "%s" type (defined in class "%s").', $type->getName(), get_class($type)), $code, $previous);
+ }
+}
@@ -13,6 +13,7 @@
use Symfony\Component\Form\Exception\FormException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
+use Symfony\Component\Form\Exception\CircularReferenceException;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -110,6 +111,8 @@ class FormBuilder
*/
private $emptyData = '';
+ private $currentLoadingType;
+
/**
* Constructor.
*
@@ -538,6 +541,10 @@ public function add($child, $type = null, array $options = array())
throw new UnexpectedTypeException($type, 'string or Symfony\Component\Form\FormTypeInterface');
}
+ if ($this->currentLoadingType && ($type instanceof FormTypeInterface ? $type->getName() : $type) == $this->currentLoadingType) {
+ throw new CircularReferenceException(is_string($type) ? $this->getFormFactory()->getType($type) : $type);
+ }
+
$this->children[$child] = array(
'type' => $type,
'options' => $options,
@@ -655,6 +662,11 @@ public function getForm()
return $instance;
}
+ public function setCurrentLoadingType($type)
+ {
+ $this->currentLoadingType = $type;
+ }
+
/**
* Returns the event dispatcher.
*
@@ -269,6 +269,7 @@ public function createNamedBuilder($type, $name, $data = null, array $options =
}
$builder->setTypes($types);
+ $builder->setCurrentLoadingType($type->getName());
foreach ($types as $type) {
$type->buildForm($builder, $options);
@@ -277,6 +278,7 @@ public function createNamedBuilder($type, $name, $data = null, array $options =
$typeExtension->buildForm($builder, $options);
}
}
+ $builder->setCurrentLoadingType(null);
return $builder;
}

0 comments on commit ea93e4c

Please sign in to comment.