速習Larave3(その6)、削除処理
タグ: Laravel3
記事の削除を実装しましょう。なにせ、最初はバリデーションを入れていませんでしたから、でたらめな記事がわんさか出来たことでしょう。見苦しい記事は無かったことにしなくてはなりません。
- ソース:github
最初に削除のためのルートを定義しましょう。post/delete/ポスト番号です。routes.phpに付け加えてください。
// 記事削除
// フォーム表示
Route::get('/post/delete/(:num)', array('as' => 'post-delete', 'uses' => 'post@delete'));
// フォーム処理
Route::post('/post/delete/(:num)', array('as' => 'post-delete', 'before' => 'csrf', 'uses' => 'post@delete'));
続いてPostコントローラーに削除処理を付け加えます。
/**
* 記事削除確認表示
*/
public function get_delete($id)
{
$post = Post::find($id);
if ( $post === null )
{
return Redirect::error('404');
}
return view('post.delete')
->with('post', $post);
}
/**
* 記事削除確認処理および削除
*/
public function post_delete($id)
{
$post = Post::find($id);
if ( $post === null )
{
return Redirect::error('404');
}
$rules = array(
'delete-confirm' => 'accepted',
);
$input = Input::only(array('delete-confirm'));
$val = Validator::make($input, $rules);
if ( $val->passes() )
{
$post->delete();
return Redirect::to_route('post-index')
->with('message', '記事を削除しました。');
}
else
{
return Redirect::to_route('post-delete', array( $post->id ))
->with_errors($val->errors)
->with_input();
}
}
なんだか入力項目名が長いですね。それには秘密があります。その秘密とは…CM2の後で!
削除の確認フォームを作成します。なにせ、いきなり削除は危ないですからね。application/views/post/delete.blade.phpです。
@layout('template')
@section('title')
記事削除
@endsection
@section('content')
<h2>記事削除の確認</h2>
<p>下記のレコードを削除します。確認してください。</p>
<p>タイトル:{{ e($post->title) }}</p>
<p>内容:{{ e($post->body) }}</p>
<p>作成日時:{{ $post->created_at }}</p>
{{ Form::open() }}
<div>
{{ Form::checkbox('delete-confirm', '1', Input::old('delete-confirm', '')) }}
この記事を削除する
</div>
@if ($errors->has('delete-confirm'))
<p style="color: red;">{{ $errors->first('delete-confirm') }}</p>
@endif
<div>
{{ Form::submit('削除実行') }}
</div>
{{ Form::token() }}
{{ Form::close() }}
@endsection
削除の確認をチェックボックで行います。
削除のようにデータ破壊的なアクションを取らせる前に、慎重に考えさせるため、わざと手間を取らせるのはUIデザインの基本です。間違って削除したら、戻せませんからね。(自身がある方は、戻せるようにコーディングしてください。それもデザインの一手です。いつでも戻せるというのはユーザーに安心感を与えます。)
さて、削除はこれで出来ますが、いちいちURLを叩くのは面倒です。一覧ページからワンクリックで行えるようにしましょう。ビューの変更だけで済みますからね。index.blade.viewです。
@layout('template')
@section('title')
一覧表示
@endsection
@section('content')
<table>
<tr>
<th>タイトル</th>
<th>作成日</th>
<th>削除</th>
</tr>
@foreach($posts as $post)
<tr>
<td>{{ HTML::link_to_route('post-show', $post->title ,array($post->id)) }}</td>
<td>{{ $post->created_at }}</td>
<td>{{ HTML::link_to_route('post-delete', '✖', array($post->id)) }}</td>
</tr>
@endforeach
</table>
@endsection
ようし、できました。早速動かしてみましょう。
動作には問題が無いですが、エラーメッセージには問題があります。「delete-confirmを承認してください。」ですか、そうそう、前にやりましたね。language/ja/validation.phpの中で設定するんでしたね。
- 参照:カスタムエラーメッセージ
'attributes' => array(
'title' => 'タイトル',
'body' => '本文',
'delete-confirm' => '削除',
),
これで、「削除を承認してください。」になりました。よしよし。
しかしです…もしかしたらユーザーは間違って削除実行ボタンを押しちゃったのかも知れません。Enterを叩いちゃったのかも知れません。それなのに、承認しろというメッセージはやや不親切です。ここは、オリジナルメッセージを表示しましょう。同じPHPファイルのちょっと上に、customという項目があります。
このcustomには、フィールド名、続いて下線、最後にバリデーションルール名でキーを指定すると、その組み合わせのオリジナルメッセージを定義できるのです。そのために下線を使用しない、やや長い名前を付けました。短すぎる名前ですと、他のビューでも使用され、かぶってしまう可能性があります。
では、これをセットしましょう。
'custom' => array(
'delete-confirm_accepted' => '削除する場合は、チェックを入れてください。',
),
こうした文言もセンスが問われます。もちろん、あなたが良いと思うメッセージを選んでください。