Метод POST не поддерживается для этого маршрута. Поддерживаемые методы: GET, HEAD. Ларавель

У меня проблема с моей страницей редактирования. Когда я отправляю, я получаю эту ошибку:

The POST method is not supported for this route. Supported methods: GET, HEAD.

Я понятия не имею, откуда это взялось, так как я новичок в Laravel.

маршруты (веб.php):

Route::group(['middleware' => 'auth'], function () {
Route::get('/', 'ProjectController@index');

Route::get('/projects/{id}', 'ProjectController@show');
Route::post('/create','ProjectController@store');
Route::get('/create', 'ProjectController@create');
Route::get('/projects/{id}/delete', 'ProjectController@destroy');
Route::put('/edit','ProjectController@update');
Route::get('/projects/{id}/edit', 'ProjectController@edit');

});

Контроллер:

 public function edit($id)
    {
        return view('project.edit',[

            'project' => Project::find($id)
        ]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request)
    {
        $project = Project::find($request->id);
        $project->project_name = $request->input('project_name');
        $project->client = $request->input('client');
        $project->description = $request->input('description');
        $project->time_span = $request->input('time_span');
        $project->text_report = $request->input('text_report');
        $project->created_by = $request->input('created_by');

        $project->save();

        return  redirect('/')->with('success', 'Project aangepast');
    }

Метод POST не поддерживается для этого маршрута. Поддерживаемые методы: GET, HEAD. Ларавель

В настоящее время у вас есть метод контроллера обновления, вызываемый методом PUT. Либо измените форму, чтобы использовать PUT, либо измените строку Route::put('/edit','ProjectController@update'); to Route::post('/edit','ProjectController@update');

Petay87 15.03.2019 09:49

спасибо за комментарий Petay, но когда я заменяю put сообщением и получаю новую ошибку: Создание объекта по умолчанию из пустого значения

JohnSmith2521 15.03.2019 09:59

Когда вы найдете проект, вы также должны проверить, что find() возвращает действительный объект проекта, а не нуль.

user1334621 15.03.2019 10:06

Рассматривали ли вы возможность использования маршрута/контроллера resource? Вы можете просто использовать Route::resource('projects', 'ProjectController');, чтобы настроить все необходимые маршруты. laravel.com/docs/5.8/controllers#ресурс-контроллеры

brombeer 15.03.2019 10:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
41
4
377 946
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Я видел ваш код в web.php следующим образом:

Route::post('/edit/{id}','ProjectController@update');

Шаг 1: удалите случайный параметр {id}, чтобы он выглядел так:

Route::post('/edit','ProjectController@update');

Шаг 2: Затем удалите @method('PUT') в вашей форме, поэтому, скажем, мы просто будем использовать метод СООБЩЕНИЕ.

Тогда как я могу передать идентификатор моему методу?

Шаг 1: создайте поле ввода в форме со скрытым атрибутом Например

<input type = "hidden" value = "{{$project->id}}" name = "id">

Шаг 2: в вашем методе Обновить в вашем контроллере извлеките этот идентификатор Например:

$id = $request->input('id');

то вы не можете использовать его, чтобы найти, какой проект редактировать

$project = Project::find($id)
//OR
$project = Project::where('id',$id);

он по-прежнему возвращает: метод PUT не поддерживается для этого маршрута. Поддерживаемые методы: POST.

JohnSmith2521 15.03.2019 10:02

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

user6940918 15.03.2019 10:04

Я до сих пор не вижу коды вашего "представления", содержащего форму

user6940918 15.03.2019 10:12

я не могу отредактировать его, он говорит, что у меня слишком много кода для количества текста, которое я получил

JohnSmith2521 15.03.2019 10:15

пришлите мне скриншот вашего контроллера и просмотрите его на мою электронную почту [email protected], чтобы я мог вам помочь, спасибо :)

user6940918 15.03.2019 10:18

Я видел вашу ошибку, у вас есть маршрут /edit для запроса POST, ваш код «Route::post('/edit/{id}','ProjectController@update');»

user6940918 15.03.2019 10:22

что мне нужно изменить именно?

JohnSmith2521 15.03.2019 10:31

я использовал второй шаг, подобный этому $project = Project::find($request->$id); $project->project_name = $request->input('project_name'); $project->client = $request->input('client'); $project->description = $request->input('description');

JohnSmith2521 15.03.2019 10:45

Я отредактировал его, в ответе были некоторые обрезанные коды, сейчас исправил

user6940918 15.03.2019 10:46

неплохо, тоже подойдет

user6940918 15.03.2019 10:46
Ответ принят как подходящий

Есть несколько способов справиться с этим:

  1. Если вы настаиваете на использовании PUT, вы можете изменить действие формы на POST и добавить скрытый method_field со значением PUTи скрытое поле csrf (если вы используете лезвие, вам просто нужно добавить @csrf_field и {{ method_field('PUT') }}). Таким образом, форма примет запрос.

  2. Вы можете просто изменить маршрут и метод формы на POST. Это будет работать нормально, поскольку именно вы определяете маршрут, а не используете группу ресурсов.

я сделал оба этих метода и возвращает Создание объекта по умолчанию из пустого значения

JohnSmith2521 15.03.2019 10:03

@ JohnSmith2521 попробуйте передать идентификатор проекта так же, как вы это сделали для редактирования как такового Route::put('/edit/{id}','ProjectController@update'); Проблема в том, что он не находит проект с предоставленным идентификатором. Сам маршрут сейчас работает хорошо. Это означает, что вы не отправляете идентификатор или запрос отсутствует. Вы можете проверить запрос в сетевых заголовках элементов проверки.

Khaldoun Nd 15.03.2019 10:11

я добавил идентификатор в маршрут, и он возвращает страницу 404, которая не найдена

JohnSmith2521 15.03.2019 10:17

@ JohnSmith2521 Как вы перенаправили на маршрут? URL правильный?

Khaldoun Nd 15.03.2019 10:17

@JohnSmith2521 JohnSmith2521 также вы изменили действие маршрута?

Khaldoun Nd 15.03.2019 10:18

Route::post('/edit/{id}','ProjectController@update'); это мой маршрут.

JohnSmith2521 15.03.2019 10:21

Давайте продолжить обсуждение в чате.

Khaldoun Nd 15.03.2019 10:22

У меня работает с laravel v8.

Jie 24.09.2020 18:27

Привет, вам не нужно писать все маршруты, просто следуйте соглашениям https://laravel.com/docs/5.8/контроллеры проверить: раздел Действия, выполняемые контроллером ресурсов

Поскольку HTML-формы не могут выполнять запросы PUT, PATCH или DELETE, вам потребуется добавить скрытый _method. При публикации данных из n laravel вы должны использовать

<form action = "/foo/bar" method = "POST">
@method('PUT')
</form>

Я знаю, что это не решение для поста ОП. Тем не менее, этот пост является первым, проиндексированным Google, когда я искал ответы на эту ошибку. По этой причине я чувствую, что это принесет пользу другим.

Следующая ошибка...

The POST method is not supported for this route. Supported methods: GET, HEAD.

было вызвано тем, что не был очищен кеш маршрутизации

php artisan route:cache

Это не было вызванный, если не очистить кеш. При некоторых обстоятельствах это может решить проблему.

liamvictor 03.09.2019 19:50

@liamvictor Я не уверен, помогло ли это вам или нет, но я благодарен за ваш комментарий. Сегодня у меня снова возникла эта проблема, и ваш комментарий был как раз вовремя, чтобы освежить мою память.

stoi2m1 05.09.2019 02:26

@ stoi2m1 У меня была похожая проблема, и единственным решением была перезагрузка vagrant. Ни одна команда ремесленников и композиторов не помогла.

darko99 06.09.2019 19:53

@ darko99 Круто, ты нашел решение этой проблемы. Я сделаю это ответом, чтобы помочь другим увидеть это лучше. Я думаю, что ваше решение может потеряться в комментариях.

stoi2m1 06.09.2019 22:16

Если вы php artisan route:cache, запрос будет перенаправлен из кэшированных маршрутов правильно, а если вы php artisan route:clear, запрос будет перенаправлен из web.php. Кэширование маршрутов предназначено для оптимизации производительности при работе. Во время разработки вы не должны кэшировать маршруты, иначе вам придется route:clear и route:cache при каждом изменении, что нежелательно.

Marinario Agalliu 11.12.2020 16:56

в основном этот тип ошибки генерирует, 1. сначала проверяем код, в коде определяем @csrf

<form method  = "post" action = {{url('project'')}}
   @csrf
   ...... 

2. Когда мы определяем неправильное имя переменной, в этот раз также возникала проблема такого типа.

бывший. если ваше имя поля базы данных "xyz" и вы используете "wxyz"

3. Если наш метод неверен по форме, пожалуйста, проверьте наш метод. бывший. <form method = "post">

Простой способ исправить это — добавить это в форму.

{{ csrf_field() }}
<input type = "hidden" name = "_method" value = "PUT">

тогда метод обновления будет таким:

public function update(Request $request, $id)
{
    $project = Project::findOrFail($id);
    $project->name = $request->name;
    $project->description = $request->description;

    $post->save();
}

Вы также можете использовать синтаксис блейда, например {{ method_field('PUT') }} вместо тега ввода HTML.

TheLastCodeBender 22.04.2020 15:58

У меня была похожая проблема, и единственным решением была перезагрузка бродяги, которую я использую в качестве среды разработки. Кроме того, ни одна команда ремесленника и композитора не помогла.

Я просто удалил косую черту в конце URL-адреса, и он начал работать... /managers/games/id/push/ в:

$http({
  method: 'POST',
  url: "/managers/games/id/push",

Это может быть связано с обновлением до laravel 5.8?

В моем случае, я думаю, где-то было какое-то перенаправление, которое применяло отсутствие завершающей косой черты - к сожалению, это перенаправление также преобразовывало мой запрос POST в запросы GET, поэтому выдавало ошибку «метод GET не поддерживается» и сбивало меня с толку. .. Удаление завершающей косой черты устранило проблему

Matt Rabe 24.07.2021 00:16

добавить @method('PUT') в форму

эксп:

<form action = "..." method = "POST">

@csrf  

@method('PUT')



</form>

Если вы используете Route::group с плагином поставщика, таким как LaravelLocalization (от MCAMARA), вам нужно поместить маршруты POST вне этой группы. У меня возникли проблемы с маршрутами POST с использованием этого плагина, и я решил их прямо сейчас, поместив эти маршруты вне Route::group..

В моем случае просто запустите команду и сработает как шарм.

php artisan route:clear

Возникла проблема с вашими маршрутами, используйте следующий код:

В Ларавеле 8: веб.php:

Route::middleware(['auth:sanctum', 'verified'])->group(function () {
    Route::prefix('projects')->group(function () {
        Route::get('', 'Projects\ProjectController@index');
        Route::get('create','Projects\ProjectController@create');
        Route::post('create','Projects\ProjectController@store');
        Route::get('show/{id}', 'Projects\ProjectController@show');
        Route::get('delete/{id}', 'Projects\ProjectController@destroy');
        Route::get('edit/{id}', 'Projects\ProjectController@edit');
        Route::put('edit/{id}','Projects\ProjectController@update');
    });
});

приложение/http/контроллеры:

<?php
namespace App\Http\Controllers\Projects;

use App\Http\Requests\Project\ProjectRequest;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class ProjectController extends Controller {
    //---Constructor Function
    public function __construct() {
        $this->middleware('auth:sanctum');
    }//---End of Function Constructor

    //---List Product
    public function index() {
    }//---End of Function index

    //---Create
    public function Create() {
    }//---End of Function Create

    //---Store
    public function Store(ProjectRequest $request) {
    }//---End of Function Store

    //---Show
    public function Show($project) {
    }//---End of Function Show

    //---Destroy
    public function Destroy($project) {
    }//---End of Function Destroy

    //---Edit
    public function Edit($project) {
    }//---End of Function Edit

    //---Update
    public function Update(ProjectRequest $request, $project) {
    }//---End of Function Update
}
?>

Да, моя проблема была идентична. Но по-другому. Ваша ошибка вызвана вашим запросом. Если вы хотите просмотреть ошибку, вам нужно использовать методы GET для этого маршрута. В вашем и моем случае мы используем POST. Таким образом, мы не можем увидеть настоящее сообщение об ошибке...

Просто назовите свои маршруты.

Route::post('/{page}/articles', AddArticle::class)->name('addArticle');

в моем случае проблема была не в токене csrf или метод

вся проблема была в шапке Content-Length в запросе

если я превышу - что и произошло - ограничение размера содержимого тела, отправляемого на запрос с использованием METHOD ПЛАСТЫРЬ, он отправит запрос как СООБЩЕНИЕ

Вы можете изменить размер вашего content-length через php.ini в вашей папке php локально или в редакторе MultiPHP INI в моем случае (cpanel), установив

post_max_size=500m
upload_max_filesize=500m

500 м относятся к 500 Мега (вы можете уменьшить или увеличить его по своему усмотрению)

то вы должны перезапустить сервер Apache в локальном sudo service apache2 restart или перезапустите его через WHM на сервере - у вас должен быть root-доступ -.

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