10/02/2018 - SYMFONY
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.
Paketi $ composer require jms/serializer-bundle
komutu ile kurun ve new JMS\SerializerBundle\JMSSerializerBundle(),
satırını AppKernel.php içine ekleyin.
İstediğiniz anahtar-veri girdisini random
girdisine ekleyebilirsiniz.
POST /customers
Content-Type: application/json
{
"name": "inanzzz",
"dob": "01/01/2001",
"random": {
"car": "Aston Martin",
"type": "DB9",
"team": "Arsenal"
}
}
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>
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"
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;
}
CustomerBundle\Model\Customer\Create Object
(
[name] => inanzzz
[dob] => 01/01/2001
[random] => Array
(
[car] => Aston Martin
[type] => DB9
[team] => Arsenal
)
)