*この記事は初心者エンジニア(実務経験あり)が書いている記事です。
こんにちは @bas_chan(qiita) です。
今年度は、たくさんアウトプット出そうと思ってqiitaを始めてみました!!
つよつよな人が周りにそんないなくて試行錯誤でやってます
結論
バリデーションしてないWebサービスは危ない!
今はCMSを主に開発していますがもちろんテストはしてないしバリデーションすらしてないっていう悲しい現状だったので、自分が担当するところから積極的に書いていこうということでチョロチョロっと学んでみました!
バリデーションのすすめ
まずバリデーションはアプリケーションのフォームからデータベースに入れる処理の際に入力され送られてきたデータをチェックして、そのデータが本当にデータベースに入れていいのか判断することです!
これがないと本来メールアドレスが入って欲しいカラムに"間抜けなアプリ"のような文字列が簡単に入ってしまうためやるべき処理なのです!
ではlaravelではどうやってやるの!という話ですね。
validateメソッドを使う!
validateメソッドは連想配列にしたルールを引数に入れるだけで簡単にバリデーションしてくれます。
/**
* 新記事データの保存
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
}
今回の場合は$requestで受け取ったデータのtitle, bodyが空じゃないかつtitleが255文字以下でデータベースにそのtitleが存在しないことが確認できたらそのまま通ってくれるのです!
unique:posts
これだけで既存のデータまでも見れるという超便利で優しいlaravelって最高ですね。
フォームリクエストバリデーションを使う
これが今回のタイトルにもあるイチオシのばばばバリデーションです!
このやり方だとファイルで分かれているので使い回しもできるしコントローラが簡潔に済むのでおすすめです
まず以下のコマンドを叩きます。
php artisan make:request StoreArticlePost
このコマンドを叩くとHttp/Requestディレクトリ配下にStoreArticlePost.phpというファイルが完成します!
それがこちら↓
/**
* ユーザーがこのリクエストの権限を持っているかを判断する
*
* @return bool
*/
public function authorize() *1
{
// 認証系が必要な場合はfalseにしましょう
return true;
}
/**
* リクエストに適用するバリデーションルールを取得
*
* @return array
*/
public function rules() *2
{
return [
// titleが存在する、データベースにそのtitleが存在しない、255文字以下
'title' => 'required|unique:posts|max:255',
// bodyが存在する
'body' => 'required',
];
}
/**
* 新記事データの保存
*
* @param StoreArticlePost $request
* @return Response
*/
public function store(StoreArticlePost $request)
{
// validateメソッドを書かなくても↑だけでok
return $response;
}
ここでは*1に認証についてのロジックがかけます。ただ他のところに書いていたり、そもそも認証する部分ではない場合が多かったりするので基本trueにしておきます。例えば特定のuserしか入力できないデータなのであればパスワードチェックするロジックなどをかけたりします。もしその認証に通っていない場合(falseを返す)は自動的に403を返してくれます!
*2では上のvalidationメソッドと同じく既存のルールを用いて各リクエストの中身をチェックして問題なかったら通り、ダメだったら何がダメだったのかを教えてくれるのです。
といった感じでバリデーションがなくても動くアプリケーションはできるんです。
けどやっぱり安全かつどんなデータを入れる場所なのかをバリデーションでわかっちゃうって結構初心者にも優しいと思うんですよね。
ぜひ使ってみてください!