From be130a2d108269ab0cbc39ee885164293e257f1a Mon Sep 17 00:00:00 2001 From: William DURAND Date: Thu, 14 Nov 2013 10:59:37 +0100 Subject: [PATCH] Fix incompatibility with Symfony2 2.1 All credits go to @restyler See: https://github.com/nelmio/NelmioApiDocBundle/pull/237 Closes: #231 Replaces: #237 --- DependencyInjection/NelmioApiDocExtension.php | 5 ++ Parser/ValidationParserLegacy.php | 88 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 Parser/ValidationParserLegacy.php diff --git a/DependencyInjection/NelmioApiDocExtension.php b/DependencyInjection/NelmioApiDocExtension.php index 9decfec..be2e5b8 100644 --- a/DependencyInjection/NelmioApiDocExtension.php +++ b/DependencyInjection/NelmioApiDocExtension.php @@ -49,6 +49,11 @@ class NelmioApiDocExtension extends Extension if (isset($config['sandbox']['authentication'])) { $container->setParameter('nelmio_api_doc.sandbox.authentication', $config['sandbox']['authentication']); } + + // backwards compatibility for Symfony2.1 https://github.com/nelmio/NelmioApiDocBundle/issues/231 + if (!interface_exists('\Symfony\Component\Validator\MetadataFactoryInterface')) { + $container->setParameter('nelmio_api_doc.parser.validation_parser.class', 'Nelmio\ApiDocBundle\Parser\ValidationParserLegacy'); + } } /** diff --git a/Parser/ValidationParserLegacy.php b/Parser/ValidationParserLegacy.php new file mode 100644 index 0000000..27d67a3 --- /dev/null +++ b/Parser/ValidationParserLegacy.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Nelmio\ApiDocBundle\Parser; + +use Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface; +use Symfony\Component\Validator\Constraint; + +/** + * Uses the Symfony Validation component to extract information about API objects. This is a backwards-compatible Validation component for Symfony2.1 + */ +class ValidationParserLegacy extends ValidationParser +{ + /** + * @var \Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface + */ + protected $factory; + + /** + * Requires a validation MetadataFactory. + * + * @param MetadataFactoryInterface $factory + */ + public function __construct(ClassMetadataFactoryInterface $factory) + { + $this->factory = $factory; + } + + /** + * {@inheritdoc} + */ + public function supports(array $input) + { + $className = $input['class']; + + return null !== $this->factory->getClassMetadata($className); + } + + /** + * {@inheritdoc} + */ + public function parse(array $input) + { + $params = array(); + $className = $input['class']; + + $classdata = $this->factory->getClassMetadata($className); + + $properties = $classdata->getConstrainedProperties(); + + foreach ($properties as $property) { + $vparams = array(); + + $pds = $classdata->getMemberMetadatas($property); + + foreach ($pds as $propdata) { + $constraints = $propdata->getConstraints(); + + foreach ($constraints as $constraint) { + $vparams = $this->parseConstraint($constraint, $vparams); + } + } + + if (isset($vparams['format'])) { + $vparams['format'] = join(', ', $vparams['format']); + } + + foreach (array('dataType', 'readonly', 'required') as $reqprop) { + if (!isset($vparams[$reqprop])) { + $vparams[$reqprop] = null; + } + } + + $params[$property] = $vparams; + } + + return $params; + } + +}