symfony2 read data consume body php rest backbone.js silex

read - Backbone.js y REST api con Silex(PHP)



read json symfony2 (3)

La forma en que lo hice antes es la siguiente:

$app->post(''/api/todos'', function (Request $request) use ($app) { $data = json_decode($request->getContent()); $todo = $app[''paris'']->getModel(''Todo'')->create(); $todo->title = $data->title; $todo->save(); return new Response(json_encode($todo->as_array()), 200, array(''Content-Type'' => ''application/json'')); });

En su colección de red troncal, agregue lo siguiente:

window.TodoList = Backbone.Collection.extend({ model: Todo, url: "api/todos", ... });

He escrito un completo tutorial paso a paso aquí http://cambridgesoftware.co.uk/blog/item/59-backbonejs-%20-php-with-silex-microframework-%20-mysql

digamos que tengo un modelo llamado John con esos parámetros:

{ Language : { code : ''gr'', title : ''Greek'' }, Name : ''john'' }

Así que ahora cuando disparo John.save() POST al servidor:

post params http://o7.no/ypvWNp

con esos encabezados:

encabezados http://o7.no/x5DVw0

El código en Silex es realmente simple:

<?php require_once __DIR__.''/silex.phar''; $app = new Silex/Application(); use Symfony/Component/HttpFoundation/Request; use Symfony/Component/HttpFoundation/Response; // definitions $app[''debug''] = true; $app->post(''/api/user'', function (Request $request) { var_dump($request->get(''Name'')); $params = json_decode(file_get_contents(''php://input'')); var_dump($params->Name); }); $app->run();

pero primero var_dump return null second var_dump funciona, por supuesto, ya que recibo la solicitud directamente desde php://input resource. Me pregunto cómo podría obtener los parámetros usando el objeto Request de Silex

Gracias


Es bastante fácil en realidad.

use Symfony/Component/HttpFoundation/Request; use Symfony/Component/HttpFoundation/ParameterBag; $app->before(function (Request $request) { if (0 === strpos($request->headers->get(''Content-Type''), ''application/json'')) { $data = json_decode($request->getContent(), true); $request->request = new ParameterBag(is_array($data) ? $data : array()); } });

Y luego una ruta de ejemplo:

$app->match(''/'', function (Request $request) { return $request->get(''foo''); });

Y probando con curl:

$ curl http://localhost/foobarbazapp/app.php -d ''{"foo": "bar"}'' -H ''Content-Type: application/json'' bar $

Alternativamente, mire el RestServiceProvider (ligeramente desactualizado).

EDITAR: He convertido esta respuesta en una receta de libro de cocina en la documentación de silex .


Lo he solucionado yo mismo configurando una propiedad adicional $payload en el objeto Request

$app->before(function(Request $request) { if (stristr($request->getContentType(), ''json'')) { $data = json_decode($request->getContent()); $request->payload = $data; } else { $request->payload = null; } });