Laravel DBの値と一致するか?バリデーションの実装方法

POSTされた値がDBの値と一致しているかバリデーションの作り方です。

例として「現在のパスワードと一致するか?」を作ってみますが
単純に「現在のパスワードと一致するか?」はシンプルに作れます。
↓参照
https://halfpower.work/2020/05/21/laravel-%e7%8f%be%e5%9c%a8%e3%81%ae%e3%83%91%e3%82%b9%e3%83%af%e3%83%bc%e3%83%89%e3%81%a8%e4%b8%80%e8%87%b4%e3%83%81%e3%82%a7%e3%83%83%e3%82%af/

■必要なもの

コントローラー
UserController.php

リクエストクラス
UserPasswordRequest.php

ルール
UserPasswordRule.php

●コントローラー:
UserController.php

public function updatePassword($id, UserPasswordRequest $request){

     ・
     ・
     ・

}

・第2引数でリクエストクラスを指定

●リクエストクラス:
UserPasswordRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\UserPasswordRule;
use Auth;

class UserPasswordRequest extends FormRequest
{
    private $user_id;

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    public function all($keys = null)
    {
        $results = parent::all($keys);

        $this->user_id = Auth::user()->id;

        return $results;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'old_password'    => ['required',
                new UserPasswordRule(
                    $this->user_id
                )
            ],
            'password'    => ['required', 'confirmed'],
        ];
    }
}

・all()
 ・ルールにuser_idを渡す必要があるのでuser_idを抽出しprivate変数に格納

・rules()
 ・バリデーションルールを設定
 ・自作したUserPasswordRuleクラスにuser_idを渡しnewする

●ルール:
UserPasswordRule.php

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\Models\User;
use Hash;

class UserPasswordRule implements Rule
{
    private $user_id;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct($user_id)
    {
        $this->user_id = $user_id;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {

        // 現在のパスワードを取得
        $current_password = User::find($this->user_id)->password;

        if(Hash::check($value, $current_password)){
            return true;
        }

        return false;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return '現在のパスワードと一致しません';
    }
}

・コンストラクタ
 user_idをprivate変数に格納

・passes()
 ・バリデーションロジックの部分
 ・パラメータは、$attribute(項目名)と$value(値)
 ・trueを返せば正常、falseでエラー

・message()
 returnにエラーだった場合のエラーメッセージを格納

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です