как написать валидацию в модели в laravel? - PullRequest
0 голосов
/ 16 июня 2020

Когда я проверяю номер телефона i контроллер, тогда он работает, но увеличивает количество строк кода, и мне также нужно писать функции обратного вызова, но я не хочу писать обратные вызовы, вместо этого я хочу сделать это в модели, есть ли способ сделать это ??

'phone' =>['required',"regex:/^\(?[\d]{3}\)?[\s-]?[\d]{3}[\s-]?[\d]{4}$/",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.');
                        }
                    }
                },],

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Я думаю, вы должны иметь возможность определить функцию в своей модели как функцию 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)]
0 голосов
/ 16 июня 2020

Всегда хорошее решение для проверки - это сделать индивидуальный запрос, который является отдельным и простым в обработке, следуя этому =>

php artisan make:request CustomRequest

Запрос:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\User;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [

            'phone'        => [
                                    'required',

                                    'min:10', 
                                    'max':10',             
                                    'regex:/^\(?[\d]{3}\)?[\s-]?[\d]{3}[\s-]?[\d]{4}$/',     

                                 ],

        ];
    }
}

Он предоставит вам сообщение проверки по умолчанию, но если вы хотите создать собственное сообщение, вы можете сделать это, сделав message()

https://laravel.com/docs/7.x/validation

Надеюсь, это поможет вам!

...