kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

laravelのvalidateサンプル part3

kazu22002.hatenablog.com

一意のアドレスを判定(データベース)

アカウントを新規登録する際に、一意な内容である必要がある場合

$request->validate([
    'email' => 'unique:users,email_address',
]);

ただこのままのvalidateの場合、更新の際にvalidateでエラーになるためIDを指定する

$idについては、ユーザーの入力を介在させないように注意する必要がある。ドキュメントに書いてあるが、SQLインジェクションの可能性に繋がってしまう

そうしなければ、アプリケーションがSQLインジェクション攻撃に対し、脆弱になります。

$request->validate([
    'email' => 'unique:users,email_address,' .$id.', id',
]);

さらに複雑に行う場合、eloquentを使用することが可能らしいけどここまで使用したことはないので、必要になったら書いてみる

ログイン

ドキュメントのサンプルをそのまま引用しているが、ログイン時に書いている処理

readouble.com

    $credentials = $request->validate([
        'email' => ['required', 'email'],
        'password' => ['required'],
    ]);

    if (\Auth::attempt($credentials)) {
        $request->session()->regenerate();
        return redirect()->intended('dashboard');
    }

    return back()->withErrors([
        'email' => 'The provided credentials do not match our records.',
    ]);

現在のパスワード

ログインしていることを前提に現在のパスワードのvalidateで使用できるらしい

apiの部分がauthの種類の指定

$request->validate([
    'password' => 'current_password:api'
]);

ソースコードを読んでみたが、hashの一致までちゃんとやっている

radioで選んだ内容によりvalidateが変わる場合

$request->validate([
    'type' => 'required',
    'price' => 'required_if:type,1',
    'discount' => 'required_if:type,2',
    'point' => 'required_if:type:3',
]);

意外と便利だった

まとめ

今回テストをしていないので、間違ってる可能性はありますが、使用しているvalidateを書いているつもりです。

現在のパスワードだけfunctionを利用した判定を使っていましたが、ドキュメントに掲載されていたのとコードを読んでみて大丈夫そうだと思ったのでサンプルとして書いてみました。

個人的に使用しているvalidateは書けたの、今回で終わろうと思います。