Я думаю, вы должны иметь возможность определить функцию в своей модели как функцию c stati, которая возвращает закрытие, поэтому вы можете вызвать ее, чтобы получить закрытие и передать его как обратный вызов.
// In the model
public static function myValidationClosure($id){
return function($attribute, $value, $fail)use($id) {
if (strpos($value, "-") !== false) {
$exist = User::where([["phone", $value],["id","!=",$id]])->count();
if($exist){
$fail(ucwords($attribute).' is already taken.');
}else{
$result = User::where([["phone", str_replace("-","",$value)],["id","!=",$id]])->count();
($result) ? $fail(ucwords($attribute).' is already taken.') : "";
}
}else{
$exist = User::where([["phone", $value],["id","!=",$id]])->count();
if($exist){
$fail(ucwords($attribute).' is already taken.');
}
}
};
}
Затем вы можете использовать его при проверке как
'phone' =>['required',"regex:/^\(?[\d]{3}\)?[\s-]?[\d]{3}[\s-]?[\d]{4}$/", MyModelClass::myValidationClosure($id)]