2017-06-26 8 views
1

Ich bin etwas neu in der Laravel-Framework und ich baue nur ein einfaches Blog. Ich kann einen Blog erstellen, einen Blog zeigen und einen Überblick über alle Blogs anzeigen. Jetzt möchte ich einen Blog löschen. Also, ich habe einen Lösch-Button in meiner Ansicht mit einem Routen-Link erstellt, der auch die ID des Artikels passieren wird. Dann gebe ich in meiner routes-Datei eine Löschanforderung und eine Controller-Methode an. In der Methode finde ich die ID und versuche, die Zeile mit der in der Route/View angegebenen ID zu löschen.Löschen von Daten aus der Datenbank mit Laravel 5.4

Dies funktioniert nicht. Anstatt die Methode destroy/delete zu aktivieren, wird der Artikel angezeigt, anstatt ihn zu löschen, und statt der Methode delete wird die Methode show aktiviert. Kann mir jemand helfen? Was mache ich falsch?

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> 

Strecke

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'); 

Controller-Methoden

Löschen/Zerstören

public function destroy($id) { 

    $blog = Blog::find($id); 

    $blog->delete(); 

    return redirect('/nieuws'); 

} 

anzeigen

public function show(Blog $blog) { 

    dd('show'); 


    return view('blogs.show', compact('blog')); 

} 
+1

@Gijsberts Sie vielleicht erneut überprüfen kunal Antwort. GET-Anfragen zu erlauben, Daten in irgendeiner Weise zu ändern, ist eine schlechte Übung und ein Sicherheitsrisiko. – Robert

Antwort

1

Eine delete() Route erfordert, dass Sie Ihre Daten POST.

HTML-Formulare unterstützt nur GET und POST, andere Methoden wie DELETE, PUT, etc. werden nicht unterstützt, deshalb verwendet Laravel die _method zum Spoof Methoden, die nicht von HTML-Formularen unterstützt werden.

Sie nicht wollen GET in diesen Fällen verwenden, da jemand einen Benutzer die URL (http://yoursite.com/blog/delete/1) in einer IM oder per E-Mail senden kann. Der Nutzer klickt und der Blog ist weg.

Definieren Sie Ihre Route, wie es wäre, wenn Ressource-Controller verwenden, so:

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

Und entweder ein Formular mit der Löschmethode verwenden:

// 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> 

Oder einige Javascript Magie als Link zu tun SR_ hat in seinem Kommentar zu Ihrem OP gepostet.


Noch eine Sache, fügen Sie eine Art von Validierung in Ihre Aktion zu zerstören. Gerade jetzt, wenn Sie bieten eine nicht vorhandene ID oder etwas anderes, erhalten Sie einen 500-Fehler, anstatt Sie ein 404.

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

    $blog->delete(); 

    return redirect('/nieuws'); 
} 
0

Ich glaube, Sie zerstören aktualisieren müssen funktionieren wie:

public function destroy($id) { 

    $blog = DB::table('blog')->where('id',$id)->delete(); 

    return redirect('/nieuws'); 

} 

Und Ihre Ansicht Code aktualisieren, wie:

<a href="{{route('nieuws.destroy', [$blog->id])}}" onclick="return confirm('Weet je dit zeker?')"> 
    <i class="fa fa-trash"></i> 
</a> 

Hoffnung diese Arbeit für Sie !

+0

leider nicht, denn das ist nicht das Problem, denke ich. Das Problem ist, dass mein Controller die '@ show' Methode anstelle der' @ destroy' Methode zeigt. – Gijsberts

+0

@Gijsberts Was ist das Ergebnis von Blog in show Methode? –

+0

Nur die Details des Blogs mit Daten aus der Datenbank. Zu Testzwecken benutze ich jetzt die datadump-Funktion, um zu sehen, ob sie die show-Methode aktiviert. – Gijsberts

0

Ich bin auch neu zu Laravel aber ich habe es durch diese Art und Weise zu arbeiten: (ich benutze ‚Artikel‘, wie der Name des Modells und die resource „Methode“ in der Strecke steht für eine Reihe von nützlichen Routen einschließlich der Route Sie schrieb)

Controller:

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

Route:

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

aber ich denke, das Problem in der Standard-de liegt Endung des Datenbanknamens Ihres Modells. Laravel wird davon ausgehen, dass Sie eine Datenbank namens blogs haben, da Sie ein Modell namens "blog" haben. Haben Sie den richtigen Namen der Datenbank?

+0

Ja. Das ist nicht das Problem, weil ich auch Blogs hinzufügen und zeigen kann. Das Problem ist, dass die Destroy Route mit der Showroute kollidiert. Anstatt die Methode destroy zu aktivieren, wird die show-Methode aktiviert. – Gijsberts

+0

Wie ändert sich die Ansicht in diese: '

{{method_field ('DELETE')}} {{ csrf_field()}}
' –

0

verwenden DELETE HTTP Verben haben will, Ihre Form sollte besteht aus dem POST Verfahren und Einstellungen der method_field('DELETE')

Beispiel:

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