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;
}
});