Laravel - 表单操作 url 未找到且 PUT 方法无效

Laravel - Form action url Not Found & PUT method not working

我在 Laravel 5.2 工作,使用 Eloquent ORM 处理数据库。我试图更新数据库中的用户数据,但是当我单击 UPDATE 按钮时,出现以下错误。我正在使用 PUT 方法根据 Laravel REST 规则更新数据库中的数据。

错误URL:

http://localhost/users?_token=wazgR1tQaznQwRdejXdx4g3jLgbtlfPLIeIiXdRy&name=warka&email=&password=

错误:

Object not found!

The requested URL was not found on this server. The link on the referring page seems to be wrong or outdated. Please inform the author of that page about the error.

If you think this is a server error, please contact the webmaster.

Error 404

localhost Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.6.8

用户控制器:

   <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use Illuminate\Support\Facades\Validator;

use Illuminate\Support\Facades\Input;

use Illuminate\Support\Facades\Redirect;

use Illuminate\Support\Facades\View;

use App\User;

class UsersController extends Controller
{
    public function create(){
        return view('create');
    }

    public function store(){
        $rules = array(
            'name' => 'required|unique:users',
            'email' => 'required|unique:users',
            'password' => 'required|min:5'

        );
        $validator = Validator::make(Input::all(),$rules);

        if($validator->fails()){
            return Redirect::to('http://localhost/laravelking/users/create')->withInput()->withErrors($validator);
         }else{
            User::create(array(
                'name' => Input::get('name'),
                'email' => Input::get('email'),
                'password' => Input::get('password')
            ));
            return Redirect::to('http://localhost/laravelking/users');
        }

    }

    public function index(){
        return view::make('users')->withUsers(User::all());
    }
    public function show($id){
        $user = User::find($id);

        if($user == null){
            return Redirect::to('http://localhost/laravelking/users');
        }else{
            return View::make('profile')->withUser($user);
        }
        return 'list '.$id;
    }
    public function update($id){
        $rules = array(
            'name' => 'required|unique:users',
            'email' => 'required|unique:users',
            'password' => 'required|min:5'

        );
        $validator = Validator::make(Input::all(),$rules);

        if($validator->fails()){
            return Redirect::to('http://localhost/laravelking/users/'.$id.'/edit')->withInput()->withErrors($validator);
         }else{
            $user = User::find($id);
            if(Input::has('name')) $user->name = Input::get('name');
            if(Input::has('email')) $user->email = Input::get('email');
            if(Input::has('password')) $user->password = Input::get('password');
            $user->save();
            return Redirect::to('http://localhost/laravelking/users/'.$id);
        }
    }
    public function edit($id){
        $user = User::find($id);
        if($user == null){
            return Redirect::to('http://localhost/laravelking/users');
        }else{
            return View::make('edit')->with('id',$id);
        }
    }

    public function delete($id){
        return 'list'.$id;
    }
}

查看更新表格:

<form role="form" method="PUT" action="users/".$id>
  <input type="hidden" name="_token" value="{{ csrf_token() }}">
  <div class="form-group">
    <label for="username">New Name:</label>
    <input type="username" class="form-control" name="name" id="name">
  </div>    
  <div class="form-group">
    <label for="email">New Email address:</label>
    <input type="email" name="email" class="form-control" id="email">
  </div>
  <div class="form-group">
    <label for="pwd">New Password:</label>
    <input type="password" name="password" class="form-control" id="pwd">
  </div>
  <div class="checkbox">
    <label><input type="checkbox"> Remember me</label>
  </div>
  <button type="submit" class="btn btn-default">Update</button>
</form>

个人资料视图 我进入更新视图的位置是:

<div class="container">
    <div class="col-md-8 col-lg-8 col-sm-12">
        <div class="jumbotron">
            <h1> Hello {!! $user->name !!}</h1>
            <h3> Your Email is {!! $user->email !!}</h3>
            <h3 style="color:red"> Your Password is {!! $user->password !!}</h3>
            <h1> {!! Html::link('users/'.$user->id.'/edit','Edit ') !!}</h1>
        </div>
    </div>
</div>

路线:

Route::group(['middleware' => ['web']], function () {
    //
    Route::resource('users','UsersController');
});

更新:

刚刚将表单方法更改为: <form role="form" action='http://localhost/laravelking/users/<?php echo $id; ?>' method="PUT">

I.e $id to PHP echo 并且它有效但数据库中的数据未更新!

新 URL 现在看起来像这样:

http://localhost/laravelking/users/1?_token=wazgR1tQaznQwRdejXdx4g3jLgbtlfPLIeIiXdRy&name=Lololololol&email=Lololololol%40gaic.com&password=Lololololol

但问题是数据库中的数据没有更新

您的应用程序位于 lavelking 目录中,但您的表单仅将请求发送到 http://localhost.

您最好将表单操作更改为如下内容:

 <form action="{{url('users/' . $id)}}" ... >

因为 HTML 表单不支持 PUT、PATCH 和 DELETE 方法,您需要添加一个额外的字段才能使其工作:

<input name="_method" type="hidden" value="PUT">

或者您可以为此使用一些 Laravel 助手:

// Plain PHP
echo method_field('PUT'); 

//Blade template engine
{{ method_field('PUT') }}

您可以在此处阅读更多相关信息:Laravel HTTP Routing - Method spoofing