问答 / 6 / 12 / 创建于 7年前
laravel put 如何接收值? $request->all(); 接收到空值
这个问题是 Symfony 的锅,我以最新代码为例 https://github.com/symfony/symfony/blob/ma...
这是 Laravel 的 Illuminate\Http\Request 对象继承方法最终的根源(继承方法在 public/index.php 中被调用,可以寻根溯源),我们可以看到代码如下:
Illuminate\Http\Request
public static function createFromGlobals() { $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER); if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH')) ) { parse_str($request->getContent(), $data); $request->request = new ParameterBag($data); } return $request; }
问题就在这里,如果你的 Content-Type 不是 application/x-www-form-urlencode ,且请求方法又是 PUT、DELET 或 PATCH,就会无法解析(POST 正常是因为 PHP 原生支持解析为 $_POST 变量,而 PUT 只能走 php://input 输入流获取),如果这里不是这个 Content-Type 就会悲剧。
解决办法有三个,一个是继承 Request 对象或通过其他扩展手段重写或补充这部分(这个是最佳实践),还有就是通过 $request->getContent 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。
看看你的$request是不是弄错了 是Illuminate\Http\Request的对象吗?
$request
@feivorid 是use Illuminate\Http\Request;的 资源控制器自动生成的
你的表单里面有设置隐藏域 _method = put,看看你设置没有
@Prince 我用的postman测试的
@blingbin apiaaz? 那还是post请求,要在参数加上_method 值put
@Prince 这个比较麻烦了,能不能直接用put方式呢
@blingbin 如果你用的是postman,请求方法我记得好像应该用PATCH,如果你用的是apizza,要用post请求,然后添加隐藏域
@Prince postman 试了patch不行 收不到request参数 laravel5.6
PUT 方式可用 “$request->getContent()” 获取
PUT 发送类型为 application/json 可用下面方法获取 id
application/json
id
public function test(Request $request) { $id = $request->get('id'); echo $id; }
Body 中类型选择 Content-Type application/x-www-form-urlencoded
我要举报该,理由是:
高认可度评论:
这个问题是 Symfony 的锅,我以最新代码为例 https://github.com/symfony/symfony/blob/ma...
这是 Laravel 的
Illuminate\Http\Request对象继承方法最终的根源(继承方法在 public/index.php 中被调用,可以寻根溯源),我们可以看到代码如下:问题就在这里,如果你的 Content-Type 不是 application/x-www-form-urlencode ,且请求方法又是 PUT、DELET 或 PATCH,就会无法解析(POST 正常是因为 PHP 原生支持解析为 $_POST 变量,而 PUT 只能走 php://input 输入流获取),如果这里不是这个 Content-Type 就会悲剧。
解决办法有三个,一个是继承 Request 对象或通过其他扩展手段重写或补充这部分(这个是最佳实践),还有就是通过 $request->getContent 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。
看看你的
$request是不是弄错了 是Illuminate\Http\Request的对象吗?@feivorid 是use Illuminate\Http\Request;的 资源控制器自动生成的
你的表单里面有设置隐藏域 _method = put,看看你设置没有
@Prince 我用的postman测试的
@blingbin apiaaz? 那还是post请求,要在参数加上_method 值put
@Prince 这个比较麻烦了,能不能直接用put方式呢
@blingbin 如果你用的是postman,请求方法我记得好像应该用PATCH,如果你用的是apizza,要用post请求,然后添加隐藏域
@Prince postman 试了patch不行 收不到request参数 laravel5.6
PUT 方式可用 “$request->getContent()” 获取
这个问题是 Symfony 的锅,我以最新代码为例 https://github.com/symfony/symfony/blob/ma...
这是 Laravel 的
Illuminate\Http\Request对象继承方法最终的根源(继承方法在 public/index.php 中被调用,可以寻根溯源),我们可以看到代码如下:问题就在这里,如果你的 Content-Type 不是 application/x-www-form-urlencode ,且请求方法又是 PUT、DELET 或 PATCH,就会无法解析(POST 正常是因为 PHP 原生支持解析为 $_POST 变量,而 PUT 只能走 php://input 输入流获取),如果这里不是这个 Content-Type 就会悲剧。
解决办法有三个,一个是继承 Request 对象或通过其他扩展手段重写或补充这部分(这个是最佳实践),还有就是通过 $request->getContent 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。
PUT 发送类型为
application/json可用下面方法获取idBody 中类型选择 Content-Type application/x-www-form-urlencoded