私はLaravelフレームワークに慣れていないので、単純なブログを作成しています。ブログを作成したり、ブログを表示したり、すべてのブログの概要を表示したりできます。削除したいと思います。ブログ。そこで、記事のIDも渡すルートリンクを使用してビューに削除ボタンを作成しました。次に、ルートファイルで削除リクエストとコントローラーメソッドを指定します。メソッドで、 idを入力し、ルート/ビューで指定したIDの行を削除してみてください。
これは機能しません。 destroy/deleteメソッドをアクティブ化する代わりに、記事を削除する代わりに表示し、deleteメソッドの代わりにshowメソッドをアクティブ化します。誰かが私を助けることができます、私は何が間違っていますか?
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'));
}
delete()
ルートでは、データをPOSTする必要があります。
HTMLフォームはGETとPOSTのみをサポートし、DELETE、PUTなどの他のメソッドはサポートされていません。そのため、Laravelは_method
を使用してHTMLフォームでサポートされていないメソッドをスプーフィングします。
あなたはこれらの場合にGETを使用したくないのです。誰かがユーザーにURLを送信できるからです( http://yoursite.com/blog/delete/1 )IMまたは電子メール経由。ユーザーがクリックすると、ブログは消えます。
リソースコントローラーを使用する場合と同じようにルートを定義します。
Route::delete('/nieuws/{id}', 'blogController@destroy')->name('nieuws.destroy');
また、deleteメソッドを使用してフォームを使用します。
// 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>
または、リンクSR_がOPへのコメントに投稿したようにJavaScriptの魔法を実行します。
もう1つ、破棄アクションに何らかの検証を追加します。現在、存在しないIDなどを指定すると、500エラーが発生しますが、代わりに404が必要です。
public function destroy($id)
{
$blog = Blog::findOrFail($id);
$blog->delete();
return redirect('/nieuws');
}
次のようにdestroy関数を更新する必要があると思います。
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>
この仕事があなたのためになることを願っています!
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');
ただし、問題はデータベースのモデル名のデフォルト定義にあると思います。 Laravelは、「blog」という名前のモデルがあるため、blogsという名前のデータベースがあると想定します。データベースの名前は正しいですか?
DELETE
HTTP動詞を使用するには、フォームがPOST
メソッドと設定method_field('DELETE')
で構成されている必要があります。
例:
<form method="POST" action="{{ route('xxx.destroy', $xxx->id) }}">
{{ csrf_field }}
{{ method_field('DELETE') }}
</form>