Laravel put 如何接收值?

laravel put 如何接收值?
$request->all(); 接收到空值

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 12
chongyi

这个问题是 Symfony 的锅,我以最新代码为例 https://github.com/symfony/symfony/blob/ma...

这是 Laravel 的 Illuminate\Http\Request 对象继承方法最终的根源(继承方法在 public/index.php 中被调用,可以寻根溯源),我们可以看到代码如下:

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 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。

5年前 评论
Jorry 3年前

看看你的$request是不是弄错了 是Illuminate\Http\Request的对象吗?

5年前 评论

@feivorid 是use Illuminate\Http\Request;的 资源控制器自动生成的

5年前 评论

你的表单里面有设置隐藏域 _method = put,看看你设置没有

5年前 评论

@Prince 我用的postman测试的

5年前 评论

@blingbin apiaaz? 那还是post请求,要在参数加上_method 值put

5年前 评论

@Prince 这个比较麻烦了,能不能直接用put方式呢

5年前 评论

@blingbin 如果你用的是postman,请求方法我记得好像应该用PATCH,如果你用的是apizza,要用post请求,然后添加隐藏域

5年前 评论

@Prince postman 试了patch不行 收不到request参数 laravel5.6

5年前 评论

PUT 方式可用 “$request->getContent()” 获取

5年前 评论
chongyi

这个问题是 Symfony 的锅,我以最新代码为例 https://github.com/symfony/symfony/blob/ma...

这是 Laravel 的 Illuminate\Http\Request 对象继承方法最终的根源(继承方法在 public/index.php 中被调用,可以寻根溯源),我们可以看到代码如下:

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 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。

5年前 评论
Jorry 3年前

PUT 发送类型为 application/json 可用下面方法获取 id

public function test(Request $request)
{
    $id = $request->get('id');
    echo $id;
}
5年前 评论

Body 中类型选择 Content-Type application/x-www-form-urlencoded

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!