0

私のCakePHPアプリでは、beforeFilterでいくつかのことを行い、ユーザーまたは認証などに関する応答とともに追加のJSONデータを渡します.

例えば:

public function beforeFilter()
{
    $this->Auth->allow(array('index'));

    // If the request is either JSON or XML
    if ( $this->params['ext'] == 'json' || $this->params['ext'] == 'xml' )
    {
        if( $this->Auth->user() )
        {
            // User is logged in so send userdata and usual response will also be passed
            $response = array('meta' => 
                array(
                    'auth' => true,
                    'user_id' => $this->Auth->user('id')
                )
            );
            echo json_encode($response);
        }
        else
        {
            $requiresAuth = !in_array($this->params['action'], $this->Auth->allowedActions);
            if ($requiresAuth)
            {
                $response = array('meta' => 
                    array(
                        'auth' => false
                    )
                );
                echo json_encode($response);
                exit; // exit so no other responses go through
            }
            else
            {
                // Send JSON usual response
                $response = array('meta' => 
                    array(
                        'auth' => false
                    )
                );
                echo json_encode($response);
            }
        }
    }

    parent::beforeFilter();

}

これは、モバイル アプリ用の RESTful API を構築するために使用されます。ここでの問題は、返される完全な JSON が次のようになることです。

{
    "meta": {
        "auth": false,
    }
} {
    "posts": [{
        "Post": {
            "id": "136",
            "user_id": "8",
            "datetime": "2012-09-11 15:49:52",
            "modified": "2012-09-16 15:31:38",
            "title": "Where is good to eat in New York?",
            "slug": "Where_is_good_to_eat_in_New_York",
            "content": "Preferably italian or mexican and with a good atmosphere.\r\n\r\nAlso within the **Manhattan** area!",
            "status": "1",
            "promoted": "0",
            "latitude": "53.6570794",
            "longitude": "-1.8277604"
        },...

ご覧のとおり、2 つの JSON オブジェクトが正しく結合されていません... どうすれば修正できますか?

CakePHP 2.3 の使用

4

2 に答える 2

0

解決策は次のとおりです。

1) beforeFilter() 関数から何もエコーしないでください。単体テストが中断されます。

2) app_controller に $extra_data という保護変数を作成します。

3) echo ステートメントがある場合は、$extra_data を $response に設定するだけです。

4) メイン json をエコーするコントローラー アクションで、! empty($this->extra_data) であり、それが true の場合は、メイン アクションの応答を追加のデータとマージし、それをビューに設定して、そこで json としてエコーします。

于 2013-01-21T01:39:16.230 に答える
0

json_encode(array_merge($response)); を試してください。

于 2013-01-21T22:09:34.033 に答える