За последние 24 часа нас посетили 22900 программистов и 1269 роботов. Сейчас ищет 831 программист ...

Errors или кастомный валидатор

Тема в разделе "Laravel", создана пользователем Exort, 24 фев 2019.

  1. Exort

    Exort Активный пользователь

    С нами с:
    30 апр 2016
    Сообщения:
    100
    Симпатии:
    2
    Доброго времени суток. За ранее спасибо за потраченное время.

    Решил реализовать собственную авторизацию, всё шло отлично, но! Каким образом я могу установить собственную ошибку?
    Вот FormRequest валидации:

    PHP:
    1. <?php
    2.  
    3. namespace App\Http\Requests;
    4.  
    5. use Illuminate\Contracts\Validation\Validator;
    6. use Illuminate\Foundation\Http\FormRequest;
    7.  
    8. class AuthRequest extends FormRequest
    9. {
    10.  
    11.     protected $errorBag = 'login';
    12.  
    13.     public function rules()
    14.     {
    15.         return [
    16.             'login' => 'required|min:6|max:16|exists:users',
    17.             'password' => 'required|min:6|max:32'
    18.         ];
    19.     }
    20.  
    21.     public function messages()
    22.     {
    23.         return [
    24.  
    25.             'login.required' => 'Логин не может быть пустым!',
    26.             'login.min' => 'Логин не может быть менее 6 символов!',
    27.             'login.max' => 'Логин не может быть более 16 символов!',
    28.             'login.exists' => 'Логин / Пароль введены неверно',
    29.  
    30.             'password.required' => 'Пароль не может быть пустым!',
    31.             'password.min' => 'Пароль не может быть менее 6 символов!',
    32.             'password.max' => 'Пароль не может быть более 32 символов!'
    33.         ];
    34.     }
    35.  
    36. }
    Вот код модели:
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class User extends Model
    8. {
    9.  
    10.     protected $guarded = [
    11.         'register_ip', 'last_ip'
    12.     ];
    13.  
    14.     public static function login($request)
    15.     {
    16.         $user = self::where('login', $request->login)->first();
    17.  
    18.         if($user->password != hash('sha256', $request->password))
    19.             return redirect('/');
    20.         print 1;die;
    21.     }
    22.  
    23.     public function getPasswordAttribute($value)
    24.     {
    25.         return hash('sha256', $value);
    26.     }
    27.  
    28. }
    т.е. если пароль не совпадает, нужно как-то создать ошибку и вывести её на фронте. Подскажите пожалуйста, как можно это сделать.

    Вот так работает вывод ошибок на клиенте:
    HTML:
    1.                 <div class="mdl-textfield mdl-js-textfield">
    2.                     <label for = "login" class = "mdl-textfield__label">
    3.                         Логин
    4.                     </label>
    5.                     <input
    6.                            type = "text"
    7.                            name = "login"
    8.                            id = "login"
    9.                            placeholder = "Введите логин аккаунта"
    10.                            value = "{{ old('login') }}"
    11.                            class = "mdl-textfield__input"
    12.                            required
    13.                            autofocus
    14.                    >
    15.                     @if ($errors->login->has('login'))
    16.                         <span class="mdl-textfield__error" style = "visibility: visible">{{ $errors->login->first('login') }}</span>
    17.                     @endif
    18.                 </div>
    Контроллер, если вдруг вопросы почему там модель
    PHP:
    1. namespace App\Http\Controllers;
    2.  
    3. use Illuminate\Http\Request;
    4.  
    5. use App\User;
    6. use App\Http\Requests\AuthRequest;
    7.  
    8. class UserController extends Controller
    9. {
    10.  
    11.     public function actionLogin(AuthRequest $request)
    12.     {
    13.         return User::login($request);
    14.     }
    15.  
    16. }
    Если можно как-то легко реализовать собственный валидатор на совпадение пароля из бд как в yii2, было бы неплохо сделать это прямо в formrequest, а не в модели, спасибо.
     
  2. Exort

    Exort Активный пользователь

    С нами с:
    30 апр 2016
    Сообщения:
    100
    Симпатии:
    2
    Разобрался. Спасибо за внимание.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Разобрался - опубликуй решение, чтоб быть полезным сообществу
     
  4. Exort

    Exort Активный пользователь

    С нами с:
    30 апр 2016
    Сообщения:
    100
    Симпатии:
    2
    Для решения проблемы я создал отдельный валидатор.
    PHP:
    1. class IsPasswordRegistered implements Rule
    2. {
    3.     /**
    4.      * Create a new rule instance.
    5.      *
    6.      * @return void
    7.      */
    8.     public function __construct()
    9.     {
    10.         //
    11.     }
    12.  
    13.     /**
    14.      * Determine if the validation rule passes.
    15.      *
    16.      * @param  string $attribute
    17.      * @param  mixed $value
    18.      * @return bool
    19.      */
    20.     public function passes($attribute, $value)
    21.     {
    22.         $password = User::where('password', hash('sha256', $value))->first();
    23.         return $password !== null ? true : false;
    24.     }
    25.  
    26.     /**
    27.      * Get the validation error message.
    28.      *
    29.      * @return string
    30.      */
    31.     public function message()
    32.     {
    33.         return 'Логин / Пароль введены неверно';
    34.     }
    35. }
    Вот метод с правилами валидации.
    PHP:
    1.     public function rules()
    2.     {
    3.         return [
    4.             'login' => [
    5.                 'required', 'min:6', 'max:16', 'exists:users'
    6.             ],
    7.             'password' => [
    8.                 'required', 'min:6', 'max:32', new IsPasswordRegistered
    9.             ]
    10.         ];
    11.     }
     
    mkramer нравится это.