2017-06-26 63 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>