如何从PUT方法传递数据

时间:2017-12-07 12:02:53

标签: php laravel laravel-5 laravel-5.3 laravel-5.4

我正在为Laravel创建一个API。我使用PUT方法更新数据。

我使用PUT方法向Postman发送数据。在我的控制器中,我得到一个空数组。如何访问传递的数据?

在我的路线中,我有:

Route::put('vehicletypes/{id}','API\VehicletypeController@update');

在我的控制器中:

public function update(Request $request, $id){

print_r($request->all()); exit;

}

enter image description here

如何以 PUT 方法传递数据?

7 个答案:

答案 0 :(得分:4)

您的响应为空,因为PHP对PUT有一些安全限制。但是Laravel有一个解决方法。
因此,要解决此问题,您必须使用POST参数POST发送__method来自Postman的请求,其值为PUT。它应该工作。

答案 1 :(得分:2)

Laravel作弊因为html表单只支持GET和POST,但它确实理解真正的PUT / PATCH请求。

问题看起来就像Symfony一样,如果它是multipart / form-data,它无法解析数据,因为使用x-www-form-urlencoded内容处理的替代尝试。

答案 2 :(得分:1)

expect "*(current) UNIX password: "
expect "*Enter new UNIX password: "
expect "*Retype new UNIX password: "

也改变路线,

public function putUpdate(Request $request, $id){

print_r($request->all()); exit;

}

答案 3 :(得分:1)

在邮递员的“正文”选项卡下选中了“ x-www-form-urlencoded”,而不是“ form-data”,放置方法也可以正常工作...

答案 4 :(得分:0)

为什么没人给出明确的解释

的第一个put方法字段
{{method_field('put')}}

您的路由器uri是使用命令显示的

php artisan router:list

更新方法被放置/修补,因此首先添加

{{method_field('put')}}

和您表单中的字段应该相同

<form action="{{route('posts.update',$post->id)}}" method="post">

添加csrf_toke表单后将正常工作。最终形状将如下所示。

<form action="{{route('posts.update',$post->id)}}" method="post" >
  {{method_field('put')}}
          <input type="hidden" name="_token" value="{{csrf_token()}}">
            <!-- Name input-->
            <div class="form-group">
              <label class="col-md-3 control-label" for="name">Title</label>
              <div class="col-md-9">
                <input id="name" name="title" type="text" value="{{$post->title}}" class="form-control">
              </div>
            </div>          


    <!-- Message body -->
    <div class="form-group">
      <label class="col-md-3 control-label" for="body">
      Body</label><br>
      <div class="col-md-9">
    <textarea class="form-control" id="message" name="body" rows="5">
    {{$post->body}}
    </textarea>
      </div>
    </div>    
    <!-- Form actions -->
    <div class="form-group">
      <div class="col-md-9 text-right col-md-offset-3">
        <button type="submit" class="btn btn-success btn-lg">Update</button>
        <a href="{{Route('posts.index')}}" type="button" class="btn btn-primary btn-lg">Cancel</a>
      </div>
    </div>         
  </form>

答案 5 :(得分:0)

下面的链接将解决问题,以获取请求表数据和图像。
如果您正在使用Laravel,则可以轻松地在\ Illuminate \ Http \ Request实例

中解析并绑定表单参数。

只需从下面的链接获取ParseInputStream类:
Class ParseInputStream.php

在Laravel中可选创建另一个验证规则类,但这不是必需的

class NoteUpdateRequest extends Request {

public function all($keys = null)
{
    if(strtolower($this->getMethod())=='put' && preg_match('/multipart\/form-data/', $this->headers->get('Content-Type')) or
        preg_match('/multipart\/form-data/', $this->headers->get('content-type')))
    {
        $result = [];
        new ParseInputStream($result);
        $result = array_merge($result, $this->route()->parameters());
        $this->request->add($result);
    }

    return parent::all($keys);
}

public function rules()
{
    dd($this->all());
    return [
        'noteId'        => 'required|integer|exists:notes,id',
        'title'         => 'required|string|max:200',
        'note'          => 'required|string|min:10|max:2000'
    ];
 }
}

enter image description here

我希望它可以使用PUT或PATCH方法以及Form Params来解决您要实现的目标

答案 6 :(得分:0)

如上所述,这不是laravel(或symfony或任何其他框架)问题,它是PHP的局限性。

也就是说,我设法找到了this PECL extension。我对pecl不太熟悉,并且似乎无法使它使用梨。但是我正在使用具有yum软件包的CentOS和Remi PHP。

我相信还有其他各种Linux风格的软件包,我相信任何对pear / pecl / general php扩展有更多了解的人都可以使其在Windows或Mac上正常运行。

我运行了yum install php-pecl-apfd并从字面上解决了这个问题(我不得不重启我的docker容器,但这是给定的。)

也就是说,request->all()files->get()开始使用multipart/form-data处理PATCH和PUT请求。

Ergo,我设法使我的api很好地与我的前端一起玩,而没有添加任何古怪的东西(这需要传达给开发前端解决方案的任何人)或破坏RESTful约定。