У меня проблема с моей страницей редактирования. Когда я отправляю, я получаю эту ошибку:
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');
}
спасибо за комментарий Petay, но когда я заменяю put сообщением и получаю новую ошибку: Создание объекта по умолчанию из пустого значения
Когда вы найдете проект, вы также должны проверить, что find() возвращает действительный объект проекта, а не нуль.
Рассматривали ли вы возможность использования маршрута/контроллера resource? Вы можете просто использовать Route::resource('projects', 'ProjectController');, чтобы настроить все необходимые маршруты. laravel.com/docs/5.8/controllers#ресурс-контроллеры






Я видел ваш код в 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.
пожалуйста, заполните сообщение об ошибке или, по крайней мере, дайте мне скриншот вашей формы и сообщения об ошибке
Я до сих пор не вижу коды вашего "представления", содержащего форму
я не могу отредактировать его, он говорит, что у меня слишком много кода для количества текста, которое я получил
пришлите мне скриншот вашего контроллера и просмотрите его на мою электронную почту [email protected], чтобы я мог вам помочь, спасибо :)
Я видел вашу ошибку, у вас есть маршрут /edit для запроса POST, ваш код «Route::post('/edit/{id}','ProjectController@update');»
что мне нужно изменить именно?
я использовал второй шаг, подобный этому $project = Project::find($request->$id); $project->project_name = $request->input('project_name'); $project->client = $request->input('client'); $project->description = $request->input('description');
Я отредактировал его, в ответе были некоторые обрезанные коды, сейчас исправил
неплохо, тоже подойдет
Есть несколько способов справиться с этим:
Если вы настаиваете на использовании PUT, вы можете изменить действие формы на POST и добавить скрытый method_field со значением PUTи скрытое поле csrf (если вы используете лезвие, вам просто нужно добавить @csrf_field и {{ method_field('PUT') }}). Таким образом, форма примет запрос.
Вы можете просто изменить маршрут и метод формы на POST. Это будет работать нормально, поскольку именно вы определяете маршрут, а не используете группу ресурсов.
я сделал оба этих метода и возвращает Создание объекта по умолчанию из пустого значения
@ JohnSmith2521 попробуйте передать идентификатор проекта так же, как вы это сделали для редактирования как такового Route::put('/edit/{id}','ProjectController@update'); Проблема в том, что он не находит проект с предоставленным идентификатором. Сам маршрут сейчас работает хорошо. Это означает, что вы не отправляете идентификатор или запрос отсутствует. Вы можете проверить запрос в сетевых заголовках элементов проверки.
я добавил идентификатор в маршрут, и он возвращает страницу 404, которая не найдена
@ JohnSmith2521 Как вы перенаправили на маршрут? URL правильный?
@JohnSmith2521 JohnSmith2521 также вы изменили действие маршрута?
Route::post('/edit/{id}','ProjectController@update'); это мой маршрут.
Давайте продолжить обсуждение в чате.
У меня работает с laravel v8.
Привет, вам не нужно писать все маршруты, просто следуйте соглашениям 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 Я не уверен, помогло ли это вам или нет, но я благодарен за ваш комментарий. Сегодня у меня снова возникла эта проблема, и ваш комментарий был как раз вовремя, чтобы освежить мою память.
@ stoi2m1 У меня была похожая проблема, и единственным решением была перезагрузка vagrant. Ни одна команда ремесленников и композиторов не помогла.
@ darko99 Круто, ты нашел решение этой проблемы. Я сделаю это ответом, чтобы помочь другим увидеть это лучше. Я думаю, что ваше решение может потеряться в комментариях.
Если вы php artisan route:cache, запрос будет перенаправлен из кэшированных маршрутов правильно, а если вы php artisan route:clear, запрос будет перенаправлен из web.php. Кэширование маршрутов предназначено для оптимизации производительности при работе. Во время разработки вы не должны кэшировать маршруты, иначе вам придется route:clear и route:cache при каждом изменении, что нежелательно.
в основном этот тип ошибки генерирует, 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.
У меня была похожая проблема, и единственным решением была перезагрузка бродяги, которую я использую в качестве среды разработки. Кроме того, ни одна команда ремесленника и композитора не помогла.
Я просто удалил косую черту в конце URL-адреса, и он начал работать...
/managers/games/id/push/ в:
$http({
method: 'POST',
url: "/managers/games/id/push",
Это может быть связано с обновлением до laravel 5.8?
В моем случае, я думаю, где-то было какое-то перенаправление, которое применяло отсутствие завершающей косой черты - к сожалению, это перенаправление также преобразовывало мой запрос POST в запросы GET, поэтому выдавало ошибку «метод GET не поддерживается» и сбивало меня с толку. .. Удаление завершающей косой черты устранило проблему
добавить @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-доступ -.
В настоящее время у вас есть метод контроллера обновления, вызываемый методом PUT. Либо измените форму, чтобы использовать PUT, либо измените строку Route::put('/edit','ProjectController@update'); to Route::post('/edit','ProjectController@update');