我是Laravel框架的新手,我正在构建一个简单的博客。我可以创建博客,显示博客并显示所有博客的概述。现在我想删除一个博客。因此,我在视图中创建了一个删除按钮,其中包含一个路径链接,该链接也会传递文章的ID。然后,在我的路径文件中,我指定了删除请求和控制器方法。在方法中,我找到了id,并尝试删除路径/视图中指定的id的行。
这不起作用。它不是激活销毁/删除方法,而是显示文章而不是删除它,并激活show方法而不是delete方法。有人可以帮帮我,我错了什么?
View.blade.php
<a href="{{route('nieuws.destroy', ['id' => $blog->id])}}" onclick="return confirm('Weet je dit zeker?')">
<i class="fa fa-trash"></i>
</a>
路线
Route::group(['middleware' => 'auth'], function () {
Route::get('/aanvragen', 'aanvragenController@index')->name('aanvragen.index');
Route::get('/logout' , 'Auth\LoginController@logout')->name('logout');
Route::get('/nieuws/toevoegen', 'blogController@create')->name('blogs.add');
Route::post('/nieuws/store', 'blogController@store')->name('nieuws.store');
Route::delete('/nieuws/{id}', 'blogController@destroy')->name('nieuws.destroy');
});
Route::get('/nieuws', 'blogController@index')->name('blogs.index');
Route::get('/nieuws/{blog}', 'blogController@show')->name('blogs.show');
控制器方法
删除/销毁
public function destroy($id) {
$blog = Blog::find($id);
$blog->delete();
return redirect('/nieuws');
}
显示
public function show(Blog $blog) {
dd('show');
return view('blogs.show', compact('blog'));
}
答案 0 :(得分:2)
delete()
路线要求您发布数据。
HTML表单仅支持GET和POST,不支持其他方法,如DELETE,PUT等,这就是为什么Laravel使用_method
来欺骗HTML表单不支持的方法。
您不希望在这些情况下使用GET,因为有人可以通过IM或电子邮件向用户发送网址(http://yoursite.com/blog/delete/1)。用户点击,博客就不见了。
定义您使用资源控制器时的路线,所以:
Route::delete('/nieuws/{id}', 'blogController@destroy')->name('nieuws.destroy');
使用带删除方法的表单:
// apply some inline form styles
<form method="POST" action="{{ route('nieuws.destroy', [$blog->id]) }}">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<button type="submit">Delete</button>
</form>
或者做一些javascript魔术作为他的OP评论中发布的链接SR_。
还有一件事,在你的销毁行动中添加某种验证。现在,当您提供不存在的ID或其他内容时,您将收到500错误,而您希望获得404错误。
public function destroy($id)
{
$blog = Blog::findOrFail($id);
$blog->delete();
return redirect('/nieuws');
}
答案 1 :(得分:0)
我认为您需要更新您的销毁功能,如:
public function destroy($id) {
$blog = DB::table('blog')->where('id',$id)->delete();
return redirect('/nieuws');
}
并更新您的观看代码,如:
<a href="{{route('nieuws.destroy', [$blog->id])}}" onclick="return confirm('Weet je dit zeker?')">
<i class="fa fa-trash"></i>
</a>
希望这对你有用!
答案 2 :(得分:0)
我也是Laravel的新手,但我通过这种方式让它成功:
(我使用&#39;文章&#39;作为模型的名称和resource
&#34;方法&#34;在路线中代表一堆有用的路线,包括你写的路线)
控制器:
public function destroy($id){
Article::find($id)->delete();
//$article = Article::find($id);
return redirect()->back()->withErrors('Successfully deleted!');
}
路线:
Route::resource('article','ArticleController');
但是,我认为问题在于数据库名称的默认定义。 Laravel将假设您有一个名为blogs的数据库,因为您有一个名为&#34; blog&#34;的模型。你有这个数据库的名字吗?
答案 3 :(得分:0)
要使用DELETE
HTTP动词,您的表单应包含POST
方法并设置method_field('DELETE')
示例:
<form method="POST" action="{{ route('xxx.destroy', $xxx->id) }}">
{{ csrf_field }}
{{ method_field('DELETE') }}
</form>