always_populate_raw_post_data - 从 Backbone 创建访问请求负载时遇到问题
always_populate_raw_post_data - Trouble accessing request payload from Backbone create
我正在尝试使用 Backbone.js 和服务器上的 SLIM php 框架 运行 RESTfully 将 collection 保存到我的数据库。
这是我的 collection:
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();
在我的 collection 上调用 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
});
您可以通过来自 Slim 的请求对象请求 POST 数据。
$api->post('/users', function() use ($api) {
var_dump($api->request()->post());
var_dump($api->request()->post('specificKey'));
});
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
PHP 内部的相关 discussion。
基本上您可以通过几种方式解决 Automatically populating $HTTP_RAW_POST_DATA is deprecated...
错误,
- PHP 设置
将 always_populate_raw_post_data 更改为 -1 php.ini 文件将解决此问题。但是,如果您对 php.ini 文件没有足够的控制权,就会出现问题。可以考虑共享主机。
- 阿帕奇设置
正在将内部的 .htaccess 文件更改为您的应用程序目录。这将仅对您的应用程序进行隔离控制。它既不会影响 APACHE,也不会影响其他应用程序的执行 PHP。
<IfModule mod_php5.c>
php_value always_populate_raw_post_data -1
</IfModule>
我推荐第二种方法。因为它允许您将应用程序放置在共享主机和专用服务器主机中。
我正在尝试使用 Backbone.js 和服务器上的 SLIM php 框架 运行 RESTfully 将 collection 保存到我的数据库。
这是我的 collection:
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();
在我的 collection 上调用 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
});
您可以通过来自 Slim 的请求对象请求 POST 数据。
$api->post('/users', function() use ($api) {
var_dump($api->request()->post());
var_dump($api->request()->post('specificKey'));
});
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
PHP 内部的相关 discussion。
基本上您可以通过几种方式解决 Automatically populating $HTTP_RAW_POST_DATA is deprecated...
错误,
- PHP 设置
将 always_populate_raw_post_data 更改为 -1 php.ini 文件将解决此问题。但是,如果您对 php.ini 文件没有足够的控制权,就会出现问题。可以考虑共享主机。
- 阿帕奇设置
正在将内部的 .htaccess 文件更改为您的应用程序目录。这将仅对您的应用程序进行隔离控制。它既不会影响 APACHE,也不会影响其他应用程序的执行 PHP。
<IfModule mod_php5.c>
php_value always_populate_raw_post_data -1
</IfModule>
我推荐第二种方法。因为它允许您将应用程序放置在共享主机和专用服务器主机中。