Ошибка публикации 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

Может ли кто-нибудь объяснить, почему это не работает?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
941
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ошибка говорит 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

Спасибо за подробный обзор! Хотя это не помогло мне исправить ситуацию, это определенно дало мне лучшее понимание того, как это работает. Ответ от @webdevtr заставил его работать, но я очень ценю ваш обстоятельный ответ.

lawson 11.06.2018 16:04
Ответ принят как подходящий

Вы должны исправить свой маршрут, потому что вы используете метод put для обновления, но на маршрутах, которые вы определили как сообщение

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

Поэтому возникает ошибка.

Вы должны исправить свой маршрут вот так,

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

Надеюсь, это вам поможет.

Спасибо webdevtr - вот и все! Было еще несколько ошибок, которые я должен был устранить, отслеживая последующие проблемы, но эта была наиболее близкой.

lawson 11.06.2018 16:05

Очень ценю оба ответа здесь - спасибо @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>

Другие вопросы по теме