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にエラーだった場合のエラーメッセージを格納