Uygulamaya gelen istek verilerini, model classlara bağlamak için ismi bilinen girdilere ihtiyacımız vardır. Bazen ismini beklemediğimiz girdiler gelebilir ve de biz bunlarıda kullanmak isteyebiliriz. Bu zor bir durumdur çünkü girdi isimlerini hiçbir zaman kestiremeyebiliriz. Örneğimiz bu sorunu çözmek için JMSSerializerBundle paketini kullanıyor. Bir tek şartımız var, o da beklenmedik girdiler belirli bir girdinin içinde gelmesi gerekli.


Kurulum


Paketi $ composer require jms/serializer-bundle komutu ile kurun ve new JMS\SerializerBundle\JMSSerializerBundle(), satırını AppKernel.php içine ekleyin.


İstek


İstediğiniz anahtar-veri girdisini random girdisine ekleyebilirsiniz.


JSON


POST /customers
Content-Type: application/json

{
"name": "inanzzz",
"dob": "01/01/2001",
"random": {
"car": "Aston Martin",
"type": "DB9",
"team": "Arsenal"
}
}

XML


POST /customers
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
<name>inanzzz</name>
<dob>01/01/2001</dob>
<random>
<car>Aston Martin</car>
<model>DB9</model>
<team>Arsenal</team>
</random>
</customer>

CustomerController


namespace CustomerBundle\Controller;

use CustomerBundle\Model\Customer\Create;
use JMS\Serializer\SerializerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;

/**
* @Route("", service="customer.controller.customer")
*/
class CustomerController
{
private $serializer;

public function __construct(
SerializerInterface $serializer
) {
$this->serializer = $serializer;
}

/**
* @param Request $request
*
* @Method({"POST"})
* @Route("")
*/
public function createAction(Request $request)
{
// You should validate the $request first

$create = $this->serializer->deserialize(
$request->getContent(),
Create::class,
$this->getFormat($request->headers->get('content_type'))
);

print_r($create);
}

private function getFormat($contentType)
{
// You should validate the $contentType first

return array_search($contentType, ['json' => 'application/json', 'xml' => 'application/xml']);
}
}

services:
customer.controller.customer:
class: CustomerBundle\Controller\CustomerController
arguments:
- "@jms_serializer"

Model


namespace CustomerBundle\Model\Customer;

use JMS\Serializer\Annotation as Serializer;

/**
* @Serializer\XmlRoot("customer")
*/
class Create
{
/**
* @Serializer\Type("string")
*/
public $name;

/**
* @Serializer\Type("string")
*/
public $dob;

/**
* @Serializer\Type("array<string, string>")
* @Serializer\XmlKeyValuePairs
*/
public $random;
}

Sonuç


CustomerBundle\Model\Customer\Create Object
(
[name] => inanzzz
[dob] => 01/01/2001
[random] => Array
(
[car] => Aston Martin
[type] => DB9
[team] => Arsenal
)
)