Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Slim JSON Outputs

I am using the Slim framework with PHP to create a RESTful API for my app. However, I assumed that the framework would have some way of creating easier JSON outputs rather than just exit($jsonEncodedVariable);.

Am I missing something in the framework, or do I need to use json_encode()... exit($json)... for every method?

All of the data is taken out of the my MySQL database and would then be put into a JSON array depending on what REST request was called.

For example, if /api/posts/all was requested, I would exit() a JSON array of all the posts which each value for its own key, "value" : key.

My question is, is there an easy way, using the slim framework, for exit()'ing JSON code instead of exiting it as plain text?

like image 583
max_ Avatar asked Jul 24 '11 14:07

max_


3 Answers

Why not just use Slim's Response Object? (also... why exit?)

$dataAry = // Some data array

$response = $app->response();
$response['Content-Type'] = 'application/json';
$response['X-Powered-By'] = 'Potato Energy';
$response->status(200);
// etc.

$response->body(json_encode($dataAry));
// Or echo json_encode($dataAry)

Let me preface by saying I still consider myself a noob so if I'm making errors please correct me so I can learn. But, I was playing with a similar problem/question and I thought I might chime in with 2 cents and archive a little more discussion on the matter. The more information there is about Slim on Stack the better.

I was basically toying with the same thing and I noticed that you were using exit; At first, I was using exit also because echo was including a bunch of HTML and mucking up what was being returned to my AJAX call. When I used exit, it cleanly cut the HTML out but then the Slim response object wasn't changing the response headers as I defined (see above code.)

What I realized was that this isn't how Slim was designed to work. Use echo, not exit. NOTE - Slim Doc:

Whenever you echo() content from within a route callback, the echo()’d content is captured >in an output buffer and later appended to the Response body before the HTTP response is >returned to the client.

That's convenient, but I was not able to echo. What I was messing up on was a bigger problem. Separation of content from behavior. If you're like me, you're setting up a single page application where this code basically sits on index.php. There is initial html that I needed to load up so I included it on that page. What I needed to do was create a cleaner separation. My routing was properly set up and so when people GET '/' the Slim_Views (see Develop Rel.) returns a rendered template of html and js for me. Brilliant!

Now I have all of Slim's tools at disposal and my code is much much cleaner, separate, manageable, and more compliant with http protocols. I guess this is what frameworks are for. :-)

NOTE: I'm not saying all this is what went down on your end, but I thought the question and your setup seemed very similar. It might help another new guy who wanders down this same path.

UPDATE: As @alttag mentions, this answer is getting out of date (Slim 2)

For Slim3, see an answer below or see this page in the documentation

like image 197
jmk2142 Avatar answered Nov 08 '22 06:11

jmk2142


header("Content-Type: application/json");
echo json_encode($result);
exit;

Hint: Using The Slim PHP Framework for Developing REST APIs

like image 34
hakre Avatar answered Nov 08 '22 07:11

hakre


Using Slim 3, I'm using this format:

<?php

$app = new \Slim\App();

$app->get('/{id}', function ($request, $response, $args) {
    $id = $request->getAttribute('id');

    return $response->withJSON(
        ['id' => $id],
        200,
        JSON_UNESCAPED_UNICODE
    );
});

On request "/123", result JSON with:

{
  id: "123"
}

More infos read here.

[UPDATE] Added second and third param to withJSON. Second is The HTTP status code, and third is Json encoding options (best for especial chars and others, for example: print "ã" correctly)

like image 28
jeff_drumgod Avatar answered Nov 08 '22 07:11

jeff_drumgod