31

PHPでSlimフレームワークを使用して、アプリのRESTfulAPIを作成しています。ただし、フレームワークには、単なるではなく、より簡単なJSON出力を作成する方法があると思いましたexit($jsonEncodedVariable);

フレームワークに何かが足りないのですか、それともすべてのメソッドに......json_encode()を使用する必要がありますか?exit($json)

すべてのデータはMySQLデータベースから取り出され、呼び出されたRESTリクエストに応じてJSON配列に配置されます。

たとえば、/api/posts/allリクエストされた場合、exit()それぞれが独自のキーの値を持つすべての投稿のJSON配列になります"value" : key

私の質問は、スリムなフレームワークを使用して、exit()JSONコードをプレーンテキストとして終了する代わりに'ingする簡単な方法はありますか?

4

17 に答える 17

62

なぜ Slim の Response Object を使わないのでしょうか? (また...なぜ終了するのですか?)

$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)

私はまだ自分自身を初心者だと考えているので、間違いを犯している場合は、私が学ぶことができるように私を修正してください. しかし、私は同様の問題/質問で遊んでいたので、2セントでチャイムを鳴らして、この問題に関するもう少しの議論をアーカイブするかもしれないと思いました. Slim on Stack に関する情報が多ければ多いほどよいでしょう。

私は基本的に同じことをいじっていましたが、 exitを使用していることに気付きました。最初は、exit も使用していました。これは、echo が大量の HTML を含み、AJAX 呼び出しに返されたものを台無しにしていたためです。exit を使用すると、HTML がきれいに切り取られましたが、Slim 応答オブジェクトは、定義したとおりに応答ヘッダーを変更していませんでした (上記のコードを参照してください)。

私が気付いたのは、これは Slim が機能するように設計された方法ではないということです。exit ではなく、echo を使用します。注 - スリム ドキュメント:

ルート コールバック内からコンテンツを echo() するたびに、echo() されたコンテンツが出力バッファにキャプチャされ、HTTP 応答がクライアントに返される前に応答本文に追加されます。

便利なのですが、エコーできませんでした。私が台無しにしていたのは、より大きな問題でした。行動からのコンテンツの分離。あなたが私のような人なら、このコードが基本的に index.php にある単一ページのアプリケーションをセットアップしていることになります。ロードする必要がある最初の html があるので、そのページに含めました。私がしなければならなかったのは、より明確な分離を作成することでした。私のルーティングは適切に設定されていたので、人々が GET '/' を実行すると、Slim_Views (Develop Rel. を参照) はレンダリングされた html と js のテンプレートを返します。素晴らしい!

これで、Slim のツールをすべて自由に使用できるようになり、私のコードははるかにクリーンで、分離され、管理しやすくなり、http プロトコルにより準拠したものになりました。これがフレームワークの目的だと思います。:-)

注:これがすべてあなたの側でダウンしたと言っているわけではありませんが、質問とあなたの設定は非常に似ていると思いました. この同じ道をさまよっている別の新しい男を助けるかもしれません.

更新: @alttag が言及しているように、この回答は古くなっています (Slim 2)

Slim3 については、以下の回答を参照するか、ドキュメントのこのページを参照してください

于 2012-01-31T08:02:53.417 に答える
34
header("Content-Type: application/json");
echo json_encode($result);
exit;

ヒント: REST API の開発に Slim PHP フレームワークを使用する

于 2011-07-24T14:46:26.640 に答える
28

Slim 3 を使用して、次の形式を使用しています。

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

リクエスト "/123" で、JSON の結果は次のようになります。

{
  id: "123"
}

詳細はこちらをご覧ください。

[更新] に 2 番目と 3 番目のパラメーターを追加しましたwithJSON。2 番目は HTTP ステータス コード、3 番目は Json エンコーディング オプションです (特殊な文字などに最適です。たとえば、「ã」を正しく出力します)。

于 2016-02-28T18:51:04.287 に答える
11

出力関数を使用してスリムに拡張できます。この出力は、REST 要求が呼び出されたことに応じて異なります。

class mySlim extends Slim\Slim {
    function outputArray($data) {
        switch($this->request->headers->get('Accept')) {
            case 'application/json':
            default:
                $this->response->headers->set('Content-Type', 'application/json');
                echo json_encode($data);        
        }       
    } 
}

$app = new mySlim();

次のように使用します。

$app->get('/test/', function() use ($app) {
    $data = array(1,2,3,4);
    $app->outputArray($data);
});
于 2013-08-23T08:49:30.863 に答える
5

Slim は、これを自動的に行うミドルウェア オブジェクトも提供していると思います。そのため、そのフレームワークのユーザーは、オブジェクトと呼ばれるすべてのリクエストで json_decode とエンコードを記述する必要がありません Slim_Middleware_ContentType

$app->response()->('application/json');
$app->add(new Slim_Middleware_ContentType());

それはあなたのためにデコードを行います。デコードはうまく機能しますが、エンコードについては、最後の投稿は素晴らしいです。

ありがとう、ダラニ

于 2012-06-21T04:41:20.933 に答える
2
function _die($array){
   echo json_encode($array);
   exit;
}


$result = mysql_query("SELECT * FROM table");
while($row = mysql_fetch_assoc($result)){
    $array[] = $row;
}

_die($array);
于 2011-07-24T14:42:32.740 に答える
2

なぜ$response->write(json_encode($dataAry));代わりにecho json_encode($dataAry);

于 2012-06-01T05:32:17.403 に答える
1

私の修正は「exit;」を追加することでした。json の出力の最後に、開発サーバーは気にしませんでしたが、ライブ サーバーは json 終了イベントをトリガーしませんでした。ヘッダーを追加したり、json_encode を使用したりする必要はありませんでした。

于 2012-10-04T09:43:49.057 に答える
0

Slim3 で使用できる、Slim の Response オブジェクトのカスタム メソッド withJson($data, $status, $encodingOptions)

$app->get('/hello/{name}', function ($request, $response, $args) {
    $data['msg']='Hello '.$request->getAttribute('name');
    $newResponse = $response->withJson($data);
});

詳細については、こちらをご覧ください。

于 2016-07-22T11:09:07.423 に答える