最後はCRUDのDelete(削除)だ。投稿された記事を削除できるようにする。
コントローラ追記
public function delete(Request $request)
{
$article = Article::find($request->id);
return view('article.delete', ['article' => $article]);
}
public function remove(Request $request)
{
$article = Article::find($request->id);
$article->delete();
return redirect('/');
}
今回実装する機能はCRUDのDelete(削除)
つまりarticleの削除機能
だ。ダイレクトに削除しても良いのだが、まず削除したい記事を表示してから削除ボタンを押せるようにしたい。そのため、今回もdelete
とremove
の2つのアクションに分けた。これを説明していく。
deleteアクション
editアクションの記述と全く同じだ。idを基準に削除したいarticleを指定し、表示させている。
- deleteアクションは
articleの削除前に確認用画面を表示
させる。 - 確認用画面には、
削除対象であるarticleの内容が表示される
ようにしたい。そのためのデータを得るアクションなので、HTTPメソッド
はGET
となる。 -
Requestクラス
により作成されたHTTPリクエストインスタンス
が$request
に代入される。 - $requestには
GETで受け取った情報(ユーザーが削除したい記事のidプロパティ)
が入っている。 -
Articleクラス
のfindメソッド
で、指定されたid($requestのidプロパティ)に該当するレコードを取得
し、$articleへ代入する。 - 確認用画面
'article.delete'ビュー
で'article'をキー
としてデータが使用できるように、$articleを渡す。
removeアクション
- removeアクションは、
articleの内容を確認後、削除ボタンをクリックしその内容を送信した後
にarticlesテーブルに格納されたデータを削除する
ために行われる。そのためHTTPメソッド
はPOST
となる。 - 引数に
Request $request
を指定しているので、HTTPリクエストインスタンス
が$request
に代入される。 -
$request
にはPOSTで受け取った情報(ユーザーが削除したい記事のidプロパティ)
が入っている。 -
findメソッド
で指定されたid($requestのidプロパティ)に該当するレコードを取得
し、$articleへ代入する。 - モデルの
deleteメソッド
を実行し、データベースから該当レコードを削除する。 - 上記の作業が終わったら、
'/(トップページ)'ビュー
へリダイレクトする。
removeアクションは、->(アロー演算子)
でメソッドをつなぐ書き方もできる。
$article = Article::find($request->id)->delete();
return redirect('/');
ルーティング設定
HTTPメソッドの違いでアクションを振り分けている。
Route::get('/article/delete', 'ArticleController@delete')->name('article_delete');
Route::post('/article/remove', 'ArticleController@remove')->name('article_remove');
ビュー表示
resources/views/articleディレクトリ
にdelete.blade.php
を作成し、編集する。
今回removeアクションへPOST
しているのは、articleのidだけ
だ。編集作業ではないのでid以外の情報をやり取りする必要はないし、もちろん編集用のフォームも存在しない。確認用画面では、単純にメソッドから引き出した各プロパティが表示されているだけだ。
idプロパティについてはtype属性をhiddenに指定
してあるためビューには表示されていないが、削除ボタンをクリックした後に行われるremoveアクションで、idプロパティの値を基準に削除対象のデータを探すために使用されている。
@extends('...layouts.layout')
@section('article_delete')
投稿削除<br>
<form action='{{ route('article_remove') }}' method='post'>
{{ csrf_field() }}
<input type='hidden' name='id' value='{{ $article->id }}'><br>
ユーザーID:{{ $article->user_id }}<br>
タイトル:{{ $article->title }}<br>
内容:{{ $article->content }}<br>
<input type='submit' value='削除'>
</form>
@endsection
こちらの記述も忘れずに。
@yield('article_delete')
それぞれの記事へのアクセスは、前回の記事を参考にして欲しい。
【Laravel入門】CRUD実装〜編集〜どこでidを指定するのか
今回は、下記内容をindex.blade.php
に記述すれば良い。
<a href="{{ route('article_delete') }}?id={{ $article->id }}">削除</a>
これでCRUD実装が一通り終わった。showアクションについては・・・忘れていた。
プログラミングの上達にはコードを書くのが一番だが、こうやって記事にしてみると自分の理解の浅さが露呈する。自分の立ち位置やレベルを確認するためにも、拙い記事であってもエンジニアの皆様の目に晒されるのは良い経験になる。
今回はここまで。