laravel - Laravel 发布错误
问题描述
尝试更新用户数据时收到以下错误消息:
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
谁能解释为什么这不起作用?
解决方案
错误显示 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
推荐阅读
- rest - 使用带有 APIKey 的 REST API 更改单元格值
- python - tkinter window.iconbitmap 函数使应用程序崩溃(由 pyinstaller 编译)
- python - Python - 我如何记忆部分对象?
- java - java中的自定义线程池实现
- reactjs - 应该如何从功能组件中分派 reducer 的操作以使状态立即更改?
- vue.js - 我有一个使用 VUE CLI 创建的项目,并且我已经安装了 vue-electron-builder 插件
- python - 用python从谷歌解析html
- html - 我的网站的背景没有显示
- vue.js - 使用 CLI 创建 vue 项目时出错
- javascript - babel 预设 @babel/preset-react 不喜欢我的返回 JS.X 元素的 javascript 函数