我正在努力理解为什么我在提交表单时会出现此错误。我已经找到了解决方法,但我不一定理解为什么需要该解决方法,以及它是否会在以后引起问题。我发布此消息是为了了解错误,同时也为了帮助遇到类似问题的其他人。
下面粗体的变通方法文本是我为使此功能发挥作用所做的,添加了"/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');