web-dev-qa-db-ja.com

always_populate_raw_post_data-Backbonecreateからのリクエストペイロードへのアクセスの問題

サーバーで実行されているSLIMphpフレームワークでBackbone.jsを使用して、コレクションをデータベースにRESTfulに保存しようとしています。

これが私のコレクションです:

_var newUser = this.collection.create(
    formData,
    {
        wait: true,
        success: $.proxy(function() {
            this.collection.currentUser = newUser;
            App.Router.navigate('', { trigger: true });
        }, this)
    }
);
_

これが私のSLIMルートです:

_$api->post('/users', function() use($api, $db) {

    $request = $api->request()->post();

    $api->response()->header('Content-Type', 'application/json');

    $result = $db->users()->insert($user);

    if( $result ) {
        echo json_encode(array(
            'id' => $result['id']
        ));
    }
    else {
        echo json_encode(array(
            'status' => false,
            'message' => 'error_creating_user'
        ));
    }

});

$api->run();
_

コレクションでcreate()を呼び出すと、サーバーの応答で非推奨の警告が表示されます。

_Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0_

私はこれらの指示に従い、次のことを行いました。

ルートの前にこれを追加しました:

_ini_set('always_populate_raw_post_data', '-1');
_

そして私のPOSTルート内から私は次のようにリクエストペイロードを受信しようとしました:

_$request = file_get_contents('php://input');
_

このコードの変更後、私が得ている応答は同じままです...

[〜#〜]編集[〜#〜]

空のコールバックでもエラーが発生します。

_$api->post('/users', function() use($api, $db) {

    // nothing

});
_
7
loxyboi

PHP 5.6。デフォルト値の_always_populate_raw_post_data_は_0_です。これにより、コードがコードであってもPHPは、警告をスローします。 _$HTTP_RAW_POST_DATA_を使用しません。テキストが出力された後にheader()を呼び出すと発生すると主張する人もいます。ini_set()を使用しようとしても役に立ちません。

代わりに、php.iniで直接構成を変更する必要があります。

_always_populate_raw_post_data = -1
_

関連 ディスカッション in PHP内部。

24
Mika Tuupola

基本的に、Automatically populating $HTTP_RAW_POST_DATA is deprecated...エラーはいくつかの方法で解決できます。

  1. PHP設定

Always_populate_raw_post_dataを-1php.iniファイルに変更すると、問題が解決します。ただし、php.iniファイルを十分に制御できない場合は問題になります。あなたは共有ホスティングについて考えることができます。

  1. Apacheの設定

内部の.htaccessファイルをアプリケーションディレクトリに変更します。これにより、アプリケーションのみを個別に制御できます。 Apacheにも他のアプリケーション実行のPHP)にも影響しません。

<IfModule mod_php5.c> php_value always_populate_raw_post_data -1 </IfModule>

そして、私は2番目のアプローチをお勧めします。アプリケーションを共有ホスティングと専用サーバーホスティングの両方に配置できるためです。

Slimからのリクエストオブジェクトを介してPOSTデータをリクエストできます。

$api->post('/users', function() use ($api) {
    var_dump($api->request()->post());
    var_dump($api->request()->post('specificKey'));
});

ドキュメントは次のとおりです。 http://docs.slimframework.com/#Request-Variables

0
Tuim