此路由不支持POST方法.支持的方法:GET、HEAD、PATCH、DELETE



我正在努力理解为什么我在提交表单时会出现此错误。我已经找到了解决方法,但我不一定理解为什么需要该解决方法,以及它是否会在以后引起问题。我发布此消息是为了了解错误,同时也为了帮助遇到类似问题的其他人。

下面粗体的变通方法文本是我为使此功能发挥作用所做的,添加了"/posts/create"。然而,在Laravel文档中,存储路径显示为"/post"PostController@store"。提前

Web.php

<?php
use IlluminateSupportFacadesRoute;
use AppMailWelcomeMail;
Route::get('/', function () {
return view('welcome');
}); 
Route::get('/email', function () {
return new WelcomeMail();
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::get('/contact/create', 'ContactController@create');
Route::post('/contact', 'ContactController@store');
Route::get('/posts', 'PostController@index');
Route::get('/posts/create', 'PostController@create');
Route::post('/posts/create', 'PostController@store'); **<-workaround**
Route::get('/posts/{post}', 'PostController@show');
Route::get('/posts/{post}/edit', 'PostController@edit');
Route::patch('/posts/{post}', 'PostController@update');
Route::delete('/posts/{post}', 'PostController@destroy');

表单

<div class="container">
<div class="row justify-content-cemter">
<div class="col-md-8">
<div class="card">
<div class="card-header">Create New Post</div>

<div class="card-body">
<form action="/posts/create" method="post">
@csrf
<div class="form-group">
<label for="title">Title</label>
<input name="title" type="text" class="form-control" id="title" aria-describedby="titleHelp" placeholder="Enter Title" autocomplete="off" value="{{ old('title') ?? $post->title }}">
<small id="titleHelp" class="form-text text-muted">Give your post a title that will describe your post easily</small>
@error ('title') <p style="color:red;">{{ $message }}</p> 
@enderror
</div>
<div class="form-group">
<label for="body">Body</label>
<input name="body" type="text" class="form-control" id="body" aria-describedby="bodyHelp" placeholder="Enter Post Body" autocomplete="off" value="{{ old('body') ?? $post->body }}">
<small id="bodyHelp" class="form-text text-muted">Enter as much detail you'd like!</small>
@error ('body') <p style="color:red;">{{ $message }}</p> 
@enderror
</div>
<button type="submit" class="btn btn-primary">Create Post</button>
</form>
</div>
</div>
</div>
</div>
</div>

PostContourler

<?php
namespace AppHttpControllers;
use AppPost;
use IlluminateHttpRequest;
class PostController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
$posts = Post::all();
return view('post.index', compact('posts'));
}
public function create()
{
$post = new Post();
return view('post.create', compact ('post'));
}
public function store()
{
Post::create($this->validatedData());
return redirect('/posts');
}
public function show(Post $post)
{
return view('post.show', compact('post'));
}
public function edit(Post $post)
{
return view('post.edit', compact('post'));
}
public function update(Post $post)
{
$post->update($this->validatedData());
return redirect('/posts');
}
public function destroy(Post $post)
{
$post->delete();
return redirect('/posts');
}
protected function validatedData()
{
return request()->validate([
'title' => 'required',
'body' => 'required'
//'photograph'=> nullable
//'gif'=> nullable
]);
}
}

路线:列出

| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware   |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | GET|HEAD | /                      |                  | Closure                                                                | web          |
|        | GET|HEAD | about                  |                  | Closure                                                                | web          |
|        | GET|HEAD | api/user               |                  | Closure                                                                | api,auth:api |
|        | POST     | contact                |                  | AppHttpControllersContactController@store                           | web          |
|        | GET|HEAD | contact/create         |                  | AppHttpControllersContactController@create                          | web          |
|        | GET|HEAD | email                  |                  | Closure                                                                | web          |
|        | GET|HEAD | home                   | home             | AppHttpControllersHomeController@index                              | web,auth     |
|        | GET|HEAD | login                  | login            | AppHttpControllersAuthLoginController@showLoginForm                | web,guest    |
|        | POST     | login                  |                  | AppHttpControllersAuthLoginController@login                        | web,guest    |
|        | POST     | logout                 | logout           | AppHttpControllersAuthLoginController@logout                       | web          |
|        | GET|HEAD | password/confirm       | password.confirm | AppHttpControllersAuthConfirmPasswordController@showConfirmForm    | web,auth     |
|        | POST     | password/confirm       |                  | AppHttpControllersAuthConfirmPasswordController@confirm            | web,auth     |
|        | POST     | password/email         | password.email   | AppHttpControllersAuthForgotPasswordController@sendResetLinkEmail  | web          |
|        | POST     | password/reset         | password.update  | AppHttpControllersAuthResetPasswordController@reset                | web          |
|        | GET|HEAD | password/reset         | password.request | AppHttpControllersAuthForgotPasswordController@showLinkRequestForm | web          |
|        | GET|HEAD | password/reset/{token} | password.reset   | AppHttpControllersAuthResetPasswordController@showResetForm        | web          |
|        | GET|HEAD | posts                  |                  | AppHttpControllersPostController@index                              | web,auth     |
|        | GET|HEAD | posts/create           |                  | AppHttpControllersPostController@create                             | web,auth     |
|        | POST     | posts/create           |                  | AppHttpControllersPostController@store                              | web,auth     |
|        | GET|HEAD | posts/{post}           |                  | AppHttpControllersPostController@show                               | web,auth     |
|        | PATCH    | posts/{post}           |                  | AppHttpControllersPostController@update                             | web,auth     |
|        | DELETE   | posts/{post}           |                  | AppHttpControllersPostController@destroy                            | web,auth     |
|        | GET|HEAD | posts/{post}/edit      |                  | AppHttpControllersPostController@edit                               | web,auth     |
|        | POST     | register               |                  | AppHttpControllersAuthRegisterController@register                  | web,guest    |
|        | GET|HEAD | register               | register         | AppHttpControllersAuthRegisterController@showRegistrationForm      | web,guest    |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+

我怀疑您在某个地方发生了路由冲突,这就是您出现错误的原因。你发布的代码只显示了你的解决方法,这使得你很难知道导致错误的原始代码中发生了什么。我不认为您的变通方法会导致任何问题。

在刀片服务器视图中添加以下内容:@method('PUT')用于商店调用

<div class="card-body">
<form action="/posts/create" method="post">
@csrf 
@method('PUT')

附带说明一下,如果您感到困惑,您可以运行以下artisan命令来查看每条路由所需的方法:php artisan route:list

在表单视图中使用@method('PUT')。HTML不支持PUT操作,使用@method('PUT'(欺骗它来存储必要的信息。请查看:Laravel的路由以获得更多澄清。

注意:您面临此问题的原因也是因为您使用了两次相同的路径,即

Route::get('/posts/create', 'PostController@create');
Route::post('/posts/create', 'PostController@store'); **<-workaround**

在这两种情况下使用"/posts/create"都会给您带来错误。请将其更改为Route::post('/posts', 'PostController@store');

最新更新