Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #81 from docteurklein/fix-supports-formtype-parser

Fix supports formtype parser
  • Loading branch information...
commit bd625aebed21c6abc494490ed7965cd4ea21caee 2 parents 4cb7151 + df29283
@willdurand willdurand authored
Showing with 40 additions and 9 deletions.
  1. +39 −9 Parser/FormTypeParser.php
  2. +1 −0  Resources/config/formatters.xml
View
48 Parser/FormTypeParser.php
@@ -11,6 +11,8 @@
namespace Nelmio\ApiDocBundle\Parser;
+use Symfony\Component\OptionsResolver\Exception\MissingOptionsException;
+use Symfony\Component\Form\FormRegistry;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\Exception\FormException;
@@ -36,9 +38,10 @@ class FormTypeParser implements ParserInterface
'country' => 'string',
);
- public function __construct(FormFactoryInterface $formFactory)
+ public function __construct(FormFactoryInterface $formFactory, FormRegistry $formRegistry)
{
- $this->formFactory = $formFactory;
+ $this->formFactory = $formFactory;
+ $this->formRegistry = $formRegistry;
}
/**
@@ -47,16 +50,16 @@ public function __construct(FormFactoryInterface $formFactory)
public function supports($item)
{
try {
- if (is_string($item) && class_exists($item)) {
- $item = new $item();
+ if ($this->createForm($item)) {
+ return true;
}
-
- $form = $this->formFactory->create($item);
} catch (FormException $e) {
return false;
+ } catch (MissingOptionsException $e) {
+ return false;
}
- return true;
+ return false;
}
/**
@@ -64,8 +67,8 @@ public function supports($item)
*/
public function parse($type)
{
- if (is_string($type) && class_exists($type)) {
- $type = new $type();
+ if ($this->implementsType($type)) {
+ $type = $this->getTypeInstance($type);
}
$form = $this->formFactory->create($type);
@@ -111,4 +114,31 @@ private function parseForm($form, $prefix = null)
return $parameters;
}
+
+ private function implementsType($item)
+ {
+ if (!class_exists($item)) {
+ return false;
+ }
+ $refl = new \ReflectionClass($item);
+
+ return $refl->implementsInterface('Symfony\Component\Form\FormTypeInterface');
+ }
+
+ private function getTypeInstance($type)
+ {
+ return unserialize(sprintf('O:%d:"%s":0:{}', strlen($type), $type));
+ }
+
+ private function createForm($item)
+ {
+ if ($this->implementsType($item)) {
+ $type = $this->getTypeInstance($item);
+
+ return $this->formFactory->create($type);
+ }
+ if ($this->formRegistry->hasType($item)) {
+ return $this->formFactory->create($item);
+ }
+ }
}
View
1  Resources/config/formatters.xml
@@ -15,6 +15,7 @@
<services>
<service id="nelmio_api_doc.parser.form_type_parser" class="%nelmio_api_doc.parser.form_type_parser.class%">
<argument type="service" id="form.factory" />
+ <argument type="service" id="form.registry" />
<tag name="nelmio_api_doc.extractor.parser" />
</service>
<service id="nelmio_api_doc.formatter.abstract_formatter" class="%nelmio_api_doc.formatter.abstract_formatter.class%" />
Please sign in to comment.
Something went wrong with that request. Please try again.