Laravel: MethodNotAllowedHttpException 错误尝试点赞 post
Laravel: MethodNotAllowedHttpException error Trying to like a post
在我的网站上,用户可以创建 post 和点赞 post。在此之前我有一个与类似系统相关的错误,我设法解决了这个问题。但是,由于这个错误,我无法弄清楚它是什么。当用户点击喜欢时,会出现以下错误:
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
这是我的 post 控制器方法,例如:
public function postLikePost($post_id){
$loggedin_user = Auth::user()->id;
$like_user = Like::where(['user_id' => $loggedin_user, 'post_id' => $post_id])->first();
if(empty($like_user->user_id)){
$user_id = Auth::user()->id;
$post_id = $post_id;
$like = new Like;
$like->user_id = $user_id;
$like->post_id = $post_id;
$like->save();
return redirect()->route('events');
}else{
return redirect()->route('events');
}
}
这是我的赞模特:
class Like extends Model
{
public function user(){
return $this->belongsTo('App\User');
}
public function post(){
return $this->belongsTo('App\Post');
}
}
这是我的点赞迁移:
Schema::create('likes', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id');
$table->integer('user_id');
$table->timestamps();
});
这是我的路线:
Route::post('/like/{post_id}', 'PostController@postLikePost')->name('like');
这是我对 post 的看法:
<section class="row posts">
@foreach($posts as $post)
<div class="col-md-2 col-md-offset-3">
<article class="post">
<p>{{ $post->body }}</p>
<div class="info">Posted by {{ $post->user->first_name }} {{ $post->user->last_name }} on {{ $post->created_at }}</div>
<p>This post has {{ $post->likes()->count() }} likes </p>
<a href="{{ route('like', ['post_id' => $post->id]) }}" class="post-item">Like</a>|
</article>
</div>
@endforeach
</section>
要么将点赞按钮转换为带有 POST 请求的表单,要么通过 Ajax 作为 POST 请求提交请求。
或者,将您的路由更新为 GET 请求(如果您想保持当前 blade 模板不变):
Route::get('/like/{post_id}', 'PostController@postLikePost')->name('like');
MethodNotAllowed 错误通常是路由中使用的方法,例如当您想通过 GET
访问方法时 POST
并且左右。
在这种情况下,错误是您正在使用方法 POST
但您正在重定向到带有标签 a
的路由,该标签使用方法 GET
,因此您必须像这样将路线从 POST
更改为 GET
:
路线:
Route::post('/like/{post_id}', 'PostController@postLikePost')->name('like');
到
Route::get('/like/{post_id}', 'PostController@postLikePost')->name('like');
这就是您需要更改的全部内容,问候!
此外,如果你想在一个路由上执行多个方法,那么你也可以使用Laravel框架指定的以下方法。
Route::any('/like/{post_id}', 'PostController@postLikePost')->name('like');
和
Route::match(['GET','POST'],'/like/{post_id}', 'PostController@postLikePost')->name('like');
在我的网站上,用户可以创建 post 和点赞 post。在此之前我有一个与类似系统相关的错误,我设法解决了这个问题。但是,由于这个错误,我无法弄清楚它是什么。当用户点击喜欢时,会出现以下错误:
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
这是我的 post 控制器方法,例如:
public function postLikePost($post_id){
$loggedin_user = Auth::user()->id;
$like_user = Like::where(['user_id' => $loggedin_user, 'post_id' => $post_id])->first();
if(empty($like_user->user_id)){
$user_id = Auth::user()->id;
$post_id = $post_id;
$like = new Like;
$like->user_id = $user_id;
$like->post_id = $post_id;
$like->save();
return redirect()->route('events');
}else{
return redirect()->route('events');
}
}
这是我的赞模特:
class Like extends Model
{
public function user(){
return $this->belongsTo('App\User');
}
public function post(){
return $this->belongsTo('App\Post');
}
}
这是我的点赞迁移:
Schema::create('likes', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id');
$table->integer('user_id');
$table->timestamps();
});
这是我的路线:
Route::post('/like/{post_id}', 'PostController@postLikePost')->name('like');
这是我对 post 的看法:
<section class="row posts">
@foreach($posts as $post)
<div class="col-md-2 col-md-offset-3">
<article class="post">
<p>{{ $post->body }}</p>
<div class="info">Posted by {{ $post->user->first_name }} {{ $post->user->last_name }} on {{ $post->created_at }}</div>
<p>This post has {{ $post->likes()->count() }} likes </p>
<a href="{{ route('like', ['post_id' => $post->id]) }}" class="post-item">Like</a>|
</article>
</div>
@endforeach
</section>
要么将点赞按钮转换为带有 POST 请求的表单,要么通过 Ajax 作为 POST 请求提交请求。
或者,将您的路由更新为 GET 请求(如果您想保持当前 blade 模板不变):
Route::get('/like/{post_id}', 'PostController@postLikePost')->name('like');
MethodNotAllowed 错误通常是路由中使用的方法,例如当您想通过 GET
访问方法时 POST
并且左右。
在这种情况下,错误是您正在使用方法 POST
但您正在重定向到带有标签 a
的路由,该标签使用方法 GET
,因此您必须像这样将路线从 POST
更改为 GET
:
路线:
Route::post('/like/{post_id}', 'PostController@postLikePost')->name('like');
到
Route::get('/like/{post_id}', 'PostController@postLikePost')->name('like');
这就是您需要更改的全部内容,问候!
此外,如果你想在一个路由上执行多个方法,那么你也可以使用Laravel框架指定的以下方法。
Route::any('/like/{post_id}', 'PostController@postLikePost')->name('like');
和
Route::match(['GET','POST'],'/like/{post_id}', 'PostController@postLikePost')->name('like');