初めてのLaravel ⑧。データの保存、バリデーション
- Laravelでデータを保存する方法が知りたい
- 保存する時のバリデーションの設定方法も知りたい
- Laravelの基本について勉強したい
過去の記事でデータベースが使えるようになったので情報を入力する処理もできるようになりましょう。様々なアプリでユーザーが情報を入力することがあると思います。そうしたWebアプリではデータをバリデーションして保存する処理が必須になります。
この記事を読むことでLaravelでのデータの保存とバリデーションの方法が分かります。
初めてのLaravel ⑧。データの保存、バリデーション
データをバリデーションして保存しますが、まずは保存ができるようになりましょう。その後にバリデーションを設定していきます。
データの保存
ユーザー毎に入力したコメントを保存すると言う、機能を作っていきたいと思います。
ビューの確認
ユーザーの一覧が表示されるページが下記のようになっています。
aタグに各ユーザー名が表示され、クリックすると各ユーザーのコメントが見れるようになっています。
<h1>user一覧</h1>
<ul>
@forelse($users as $user)
<li>
<a href="{{ action('TrainingController@UserComment', $user->id) }}">{{ $user->name }}</a>
</li>
@empty
<p>コメントはありません</p>
@endforelse
</ul>
ブラウザで見た場合がこちらです
ユーザー名をクリックするとTrainingControllerのUserCommentを実行する、と書かれているのでコントローラーを確認します。
コントローラーの確認
public function UserComment($id){
$user = User::find($id);
return view('comment', [
'user' => $user
]);
}
$userにユーザーの情報を入れてcomment.blade.phpに渡しています。
では、comment.blade.phpを見て見ましょう。
@section('content')
<p>{{ $user->name }}</p>
@forelse($user->comments as $comment)
<li>
<a>{{$comment->comment}}</a>
</li>
@empty
<p>コメントはありません</p>
@endforelse
<a href="{{ action('TrainingController@CommentCreate', $user->id) }}">
@endsection
UserテーブルとCommentテーブルの紐付けを行なっているので$user->commentsでユーザーのコメントが取れるようになっています。
また、新しいコメントを入力するリンクを作っています。
ブラウザで確認してみましょう。
予想通りですね。
New Commentからユーザーのidを渡してTrainingControllerのCommentCreateを実行すると設定したのでコントローラーを確認してみます。
コントローラーの確認
public function CommentCreate($id){
$user = User::find($id);
return view('CommentCreate', [
'user' => $user
]);
}
$userにユーザー情報を入れてCommentCreate.blade.phpに渡しています。
CommentCreate.blade.phpがこちらです。
ここからが本題になります。
@section('content')
<h2>Comment Create</h2>
<form method="post" action="{{ url('/comment/save', $user->id) }}">
{{ csrf_field() }}
<p>
<input type="text" name="comment" placeholder="enter comment">
</p>
<p>
<input type="submit" value="Add">
</p>
</form>
@endsection
- データベースに渡すデータをformタグで囲います。
- methodはpost
- actionはurlを使いワイルドカードは第二引数に与えます。
- 悪意のあるアクセスを制限するためにCSRF対策を行います。
- inputタグはnameプロパティをカラムの名前にします(保存するときに分かりやすくするため)。
- submit用のinputタグも用意します。
では、このフォームが実行された時の処理を書いていきます。
まずはweb.phpの設定です。
Route::post('/comment/save/{id}', 'TrainingController@CommentSave');
CommandSaveメソッドを使うと言うことなのでコントローラーを設定します。
コントローラーの設定
//use App\Comment
public function CommentSave($id, Request $request){
$comment = new Comment();
$comment->comment = $request->comment;
$comment->user_id = $id;
$comment->save();
$user = User::find($id);
return view('comment', [
'user' => $user
]);
// return redirect()->route('comment', $user->id);
}
- formから渡って来たものはRequest型の$requestの中に入っています。
- use App\Commentを先に唱えているのでnew CommentでCommentモデルにアクセスします。
- それぞれのカラムに適切なデータを入れsaveします。
- 最後にreturnでどの画面に行くのか指定します。
データの保存のような処理をする場合はreturn viewではなく、redirectを使うことが多いようです。今回はTrainingControllerのUserCommentを使うルートにcommentと言う名前をつけて使用しています。
個人的にはどちらでも問題ないと思うので好きな方を使えばいいと思います。
バリデーション
データを保存するときに何のバリデーションもかかっていないのでどんなデータも入力できるようになっています。それでは困ることがあるのでこの辺を設定していきましょう。
CommentSaveメソッドにvalidationを追加します。
public function CommentSave($id, Request $request){
$this->validate($request, [ //追加
'comment' => 'required|min:3' //comment入力されていないと受け付けません、3文字以上は必要です、の意味。
]);
$comment = new Comment();
$comment->comment = $request->comment;
$comment->user_id = $id;
$comment->save();
$user = User::find($id);
return redirect()->route('comment', $user->id);
}
では、ビューを編集していきます。
<p>
<input type="text" name="comment" placeholder="enter comment" value="{{ old('comment') }}">
@if($errors->has('comment'))
<span>{{ $errors->first('comment') }}</span> //commentにエラーがあるなら最初のエラーを表示する、と言う意味
@endif
</p>
$errorsには複数のエラーが渡ってくることがあるのでfirstを使ってやります。
また、oldを使うとエラーがあったときに書いていた文字を保持してくれます。
では、ブラウザで確認します。
coとだけ入力して保存してみます。
コメントは3文字以上必要と言うエラーが表示されました。
予想通りですね。
バリデーションの設定ですが今回使ったもの以外にも日付を指定したり、メールアドレス、パスワードを確認するものがあります。詳しくは公式ページを参照してください。
まとめ
今回はデータの保存とバリデーションの設定の仕方について紹介しました。
データを編集したり削除する時の基本となるので覚えておきましょう。ユーザーに何か入力してもらうときには必須の機能です。エラーの原因にならないように適切なバリデーションを設定しましょう。