2017-06-26 62 views
1

我对Laravel框架很陌生,我只是在构建一个简单的博客。我可以创建一个博客,显示博客并显示所有博客的概述。现在我想删除一个博客。因此,我在视图中创建了一个删除按钮,其中的路由链接也会传递文章的ID。然后,在我的路由文件中,我指定了一个删除请求和一个控制器方法。在该方法中,我找到了id并尝试删除具有在route/view中指定的id的行。从Laravel 5.4的数据库中删除数据

这不起作用。它不是激活销毁/删除方法,而是显示文章而不是删除它,并激活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', '[email protected]')->name('aanvragen.index'); 

    Route::get('/logout' , 'Auth\[email protected]')->name('logout'); 

    Route::get('/nieuws/toevoegen', '[email protected]')->name('blogs.add'); 

    Route::post('/nieuws/store', '[email protected]')->name('nieuws.store'); 

    Route::delete('/nieuws/{id}', '[email protected]')->name('nieuws.destroy'); 

}); 

Route::get('/nieuws', '[email protected]')->name('blogs.index'); 

Route::get('/nieuws/{blog}', '[email protected]')->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')); 

} 
+1

@Gijsberts你可能要重新检查KUNAL的答案。允许GET请求以任何方式更改数据是不好的做法和安全风险。 – Robert

回答

1

A delete() route要求您发布您的数据。

HTML表单只支持GET和POST,不支持DELETE,PUT等其他方法,这就是为什么Laravel使用_method来欺骗HTML表单不支持的方法。

不要想在这些情况下使用GET,因为有人可以通过IM或通过电子邮件向用户发送URL(http://yoursite.com/blog/delete/1)。用户点击并且博客消失。

定义你的路线,因为它会使用资源控制器时是这样:

Route::delete('/nieuws/{id}', '[email protected]')->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魔术为纽带SR_发表在他对OP的评论中。


还有一件事,在您的销毁行为中添加某种验证。现在,当你提供了一个不存在的ID或别的东西,你会得到一个500错误,而不是你想有一个404

public function destroy($id) 
{ 
    $blog = Blog::findOrFail($id); 

    $blog->delete(); 

    return redirect('/nieuws'); 
} 
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> 

希望这对你的工作!

+0

不幸的是,因为那不是我想的问题。问题是我的控制器显示'@ show'方法而不是'@ destroy'方法 – Gijsberts

+0

@Gijsberts show方法中的博客的结果是什么? –

+0

只是从数据库中获取数据的博客细节。为了测试目的,我现在使用datadump函数来查看它是否激活show方法。 – Gijsberts

0

我也是新来的Laravel,但我通过这种方式工作: (我使用'Article'作为模型的名称和resource“方法”在路径代表一堆有用的路线,包括路线你写)

控制器:

public function destroy($id){ 
     Article::find($id)->delete(); 
     //$article = Article::find($id); 
     return redirect()->back()->withErrors('Successfully deleted!'); 
    } 

路线:

Route::resource('article','ArticleController'); 

不过,我认为问题出在默认德定义你的模型的数据库名称。因为你有一个名为“blog”的模型,所以Laravel会假设你有一个名为blogs的数据库。你有没有正确的数据库名称?

+0

是的。那不是问题,因为我也可以添加博客并显示它们。问题是销毁路线与展示路线冲突。它不是激活销毁方法,而是激活show方法。 – Gijsberts

+0

如何将视图更改为: '

id)}}”method =“POST”style =“display:inline;”> {{method_field('DELETE')}} {{csrf_field()}}
' –

0

要使用DELETE HTTP动词,你的表格应包含的POST方法和设置method_field('DELETE')

例子:

<form method="POST" action="{{ route('xxx.destroy', $xxx->id) }}"> 
    {{ csrf_field }} 
    {{ method_field('DELETE') }} 
</form>