Laravel发布错误

时间:2018-06-11 12:45:58

标签: laravel laravel-5

尝试更新用户数据时收到以下错误消息:

 protected function methodNotAllowed(array $others)
    {
    throw new MethodNotAllowedHttpException($others);
    }

我正在记录用户,然后想让他们选择更改他们的偏好。表单在视图中显示正常,但不会发布。

以下是我的路线:

Route::prefix('admin')->group(function(){
Route::get('/login', 'Auth\AdminLoginController@showLoginForm')->name('admin.login');
Route::post('/login', 'Auth\AdminLoginController@login')->name('admin.login.submit');
Route::get('/', 'AdminsController@index')->name('admin.dashboard');
Route::post('/', 'AdminsController@update')->name('admin.dashboard.update');
Route::get('/logout', 'Auth\AdminLoginController@logout')->name('admin.logout');

这是控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Admin;
use Auth;

class AdminsController extends Controller
{
/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('auth:admin');
}

/**
 * Show the application dashboard.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    $id = Auth::user()->id;
    $admin = Admin::find($id);
    return view('admin')->with('admin',$admin);
}

public function update(Request $request, $id)
{
  $this-> validate($request, [
      'target_sector' => 'required|max:255',
      'target_skillsets' => 'required|max:255',
      'target_companies'=> 'required|max:255',
      'target_locations'=> 'required|max:255',

  ]);
  //Create Post
  $id = Auth::user()->id;
  $admin = Admin::find($id);
  $admin->target_sector = $request->input('target_sector');
  $admin->target_skillsets = $request->input('target_skillsets');
  $admin->target_companies = $request->input('target_companies');
  $admin->target_locations = $request->input('target_locations');

  $admin->save();

  return redirect('/admin')->with('success', 'Preferences Updated', 'admin',$admin);
}

}

以下是观点:

@include('includes.nav_login')
@extends('layouts.app')

@section('content')

<div class="container">
    <div class="row mt-4">
        <div class="col-md-10 offset-md-1">
            <div class="card">
                <div class="card-header">Admin Dashboard</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success">
                            {{ session('status') }}
                        </div>
                    @endif

                    You are logged in as ADMIN!
                </div>
                <div class="card-header">Update Vacancy Preferences</div>
                <div class="card-body">
                   {!! Form::open(['action' => ['AdminsController@update', $admin], 'method' => 'POST']) !!}

                    <div class="form-group">
                      {{Form::label('companies', 'Companies')}}
                      {{Form::text('companies', $admin->target_companies,['class'=>'form-control', 'placeholder'=>'Target Companies'])}}
                    </div>

                    <div class="form-group">
                      {{Form::label('skillsets', 'Skillsets')}}
                      {{Form::text('skillsets', $admin->target_skillsets,['class'=>'form-control', 'placeholder'=>'Skillsets'])}}
                    </div>

                    <div class="form-group">
                      {{Form::label('sector', 'Sector')}}
                      {{Form::text('sector', $admin->target_sector,['class'=>'form-control', 'placeholder'=>'Sector'])}}
                    </div>

                    <div class="form-group">
                      {{Form::label('locations', 'Locations')}}
                      {{Form::text('locations', $admin->target_locations,['class'=>'form-control', 'placeholder'=>'Locations'])}}
                    </div>

                      {{Form::hidden('_method', 'PUT')}}
                      {{Form::submit('Update',['class'=>'btn btn-primary'])}}

                    {!! Form::close() !!}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

有谁可以解释为什么这不起作用?

3 个答案:

答案 0 :(得分:0)

错误显示MethodNotAllowed意味着您使用与接受的请求方法不同的方式命中路径

你打开这样的表格

 {!! Form::open(['action' => ['AdminsController@update', $admin], 'method' => 'POST']) !!}

所以到目前为止,表单方法是POST

然后你将方法欺骗为put

{{Form::hidden('_method', 'PUT')}}

所以现在这个方法变成了put not post

但是你的路线希望该方法发布

Route::post('/', 'AdminsController@update')->name('admin.dashboard.update');

这就是为什么你得到方法不允许异常

你要么改变控制器上的方法而不是发布或从你的表单中删除方法欺骗的东西

我的意思是这一行

//remove this
{{Form::hidden('_method', 'PUT')}}

一旦你修复它,你将有另一个错误,因为你的表单中没有csrf字段所以只需在表单内添加

@csrf

答案 1 :(得分:0)

您应该修复路由,因为您使用put方法进行更新,但在路由上,您定义为post

Route::post('/', 'AdminsController@update')->name('admin.dashboard.update');

因此发生错误。

你应该像这样修复你的路线,

Route::put('/{id}', 'AdminsController@update')->name('admin.dashboard.update');

我希望这对你有所帮助。

答案 2 :(得分:0)

真的很欣赏这里的两个答案 - 感谢@Mohammad Instanboli和@webdevtr。

Webdevtr建议这是正确的:

Route::put('/{id}', 'AdminsController@update')->name('admin.dashboard.update');

我还必须回过头来修复以下内容,我认为如果有其他人用类似的问题来看这个问题会有用:

首先,我的AdminsController @ update方法需要进行以下更改:

我更改了公共函数更新以减少一个变量 - ($ id)

    public function update(Request $request)
{
  $this-> validate($request, [
      'target_sector' => 'required|max:255',
      'target_skillsets' => 'required|max:255',
      'target_companies'=> 'required|max:255',
      'target_locations'=> 'required|max:255',

  ]);
  //Create Post
  $id = Auth::user()->id;
  $admin = Admin::find($id);
  $admin->target_sector = $request->input('target_sector');
  $admin->target_skillsets = $request->input('target_skillsets');
  $admin->target_companies = $request->input('target_companies');
  $admin->target_locations = $request->input('target_locations');

  $admin->save();

  return redirect('/admin')->with('success', 'Preferences Updated', 'admin',$admin);
}

然后我需要确保$ request-&gt;输入('x')匹配我视图中表单中的输入名称 - 即:

<div class="form-group">
                  {{Form::label('target_sector', 'target_sector')}}
                  {{Form::text('target_sector', $admin->target_sector,['class'=>'form-control', 'placeholder'=>'Sector'])}}
                </div>