Skip to content

Commit

Permalink
basic support for x-vendor data
Browse files Browse the repository at this point in the history
  • Loading branch information
mpoiriert committed Mar 29, 2015
1 parent e8601eb commit 07b722d
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 6 deletions.
67 changes: 64 additions & 3 deletions JMSSerializerListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,22 @@

namespace Draw\Swagger;

use Draw\Swagger\Schema\VendorExtensionSupportInterface;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\Events;
use JMS\Serializer\EventDispatcher\ObjectEvent;
use JMS\Serializer\EventDispatcher\PreDeserializeEvent;
use JMS\Serializer\EventDispatcher\PreSerializeEvent;

class JMSSerializerListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
['event' => Events::PRE_SERIALIZE, 'method' => 'onPreSerialize']
];
return array(
array('event' => Events::PRE_SERIALIZE, 'method' => 'onPreSerialize'),
array('event' => Events::PRE_DESERIALIZE, 'method' => 'onPreDeserialize'),
array('event' => Events::POST_SERIALIZE, 'method' => 'onPostSerialize')
);
}

/**
Expand All @@ -28,4 +33,60 @@ public function onPreSerialize(PreSerializeEvent $event)
$event->setType(get_class($event->getObject()));
}
}

public function onPreDeserialize(PreDeserializeEvent $event)
{
$data = $event->getData();

$type = $event->getType();

if(!class_exists($type['name'])) {
return;
}

if(!is_array($data)) {
return;
}

$vendorData = array();

foreach($data as $key => $value) {
if(!is_string($key)) {
continue;
}

if(strpos($key,'x-') !== 0) {
continue;
}

unset($data[$key]);
$vendorData[$key] = $value;
}

if(!$vendorData) {
return;
}

$reflectionClass = new \ReflectionClass($type['name']);
if(!$reflectionClass->implementsInterface('Draw\Swagger\Schema\VendorExtensionSupportInterface')) {
return;
}

$data['vendor'] = $vendorData;
$event->setData($data);
}

public function onPostSerialize(ObjectEvent $event)
{
$object = $event->getObject();

$visitor = $event->getVisitor();
/* @var $visitor \JMS\Serializer\JsonSerializationVisitor */

if($object instanceof VendorExtensionSupportInterface) {
foreach($object->getVendorData() as $key => $value) {
$visitor->addData($key, $value->data);
}
}
}
}
2 changes: 1 addition & 1 deletion Schema/Mixed.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

class Mixed
{
private $data;
public $data;

/**
* @JMS\HandlerCallback("json", direction="serialization")
Expand Down
23 changes: 22 additions & 1 deletion Schema/Swagger.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*
* @Annotation
*/
class Swagger
class Swagger implements VendorExtensionSupportInterface
{
/**
* Specifies the Swagger Specification version being used.
Expand Down Expand Up @@ -174,6 +174,27 @@ class Swagger
*/
public $externalDocs;

/**
* @var Mixed[]
* @JMS\Type("array<string,Draw\Swagger\Schema\Mixed>")
* @JMS\Accessor(getter="getFakeVendor")
*/
public $vendor;

public function getFakeVendor()
{
return null;
}

public function getVendorData()
{
if(!$this->vendor) {
return array();
}

return $this->vendor;
}

/**
* @return Operation[]
*/
Expand Down
11 changes: 11 additions & 0 deletions Schema/VendorExtensionSupportInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Draw\Swagger\Schema;

/**
* @author Martin Poirier Theoret <[email protected]>
*/
interface VendorExtensionSupportInterface
{
public function getVendorData();
}
3 changes: 2 additions & 1 deletion tests/fixture/schema/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@
"url": "http://opensource.org/licenses/MIT"
},
"version": "1.0"
}
},
"x-test": "test"
}

0 comments on commit 07b722d

Please sign in to comment.