При попытке обновить данные пользователя появляется следующее сообщение об ошибке:
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')}}
так что теперь метод становится типа положить, а не отправлять
однако ваш маршрут ожидает, что метод будет опубликован
Route::post('/', 'AdminsController@update')->name('admin.dashboard.update');
Вот почему вы получаете исключение, запрещенное для метода
вы либо изменяете метод на вашем контроллере, чтобы он был помещен вместо публикации, либо удаляете объект подмены метода изнутри вашей формы
Я имею в виду эту строку
//remove this
{{Form::hidden('_method', 'PUT')}}
как только вы его исправите, у вас будет еще одна ошибка, потому что у вас нет поля csrf в вашей форме, поэтому просто добавьте это внутри своей формы
@csrf
Вы должны исправить свой маршрут, потому что вы используете метод put для обновления, но на маршрутах, которые вы определили как сообщение
Route::post('/', 'AdminsController@update')->name('admin.dashboard.update');
Поэтому возникает ошибка.
Вы должны исправить свой маршрут вот так,
Route::put('/{id}', 'AdminsController@update')->name('admin.dashboard.update');
Надеюсь, это вам поможет.
Спасибо webdevtr - вот и все! Было еще несколько ошибок, которые я должен был устранить, отслеживая последующие проблемы, но эта была наиболее близкой.
Очень ценю оба ответа здесь - спасибо @Mohammad Instanboli и @webdevtr.
Webdevtr был прав, посоветовав это:
Route::put('/{id}', 'AdminsController@update')->name('admin.dashboard.update');
Мне также пришлось вернуться и исправить следующее, что, как я подумал, было бы полезно отметить, если кто-то еще увидит это с аналогичной проблемой:
Во-первых, моему методу обновления AdminsController @ потребовались следующие изменения:
Я изменил обновление публичной функции, чтобы на одну переменную меньше - ($ 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-> input ('x') соответствует именам входов в форме, на мой взгляд, то есть:
<div class = "form-group">
{{Form::label('target_sector', 'target_sector')}}
{{Form::text('target_sector', $admin->target_sector,['class'=>'form-control', 'placeholder'=>'Sector'])}}
</div>
Спасибо за подробный обзор! Хотя это не помогло мне исправить ситуацию, это определенно дало мне лучшее понимание того, как это работает. Ответ от @webdevtr заставил его работать, но я очень ценю ваш обстоятельный ответ.