youmixx
@youmixx
PHP Developer

Laravel авторизация/регистрация только по телефону. Как починить валидацию и вывод ошибок?

Решил сделать авторизацию и регистрацию только по телефону.

Сделал вот такую форму авторизации:
6231976f2ae10241083005.png

Вот такую регистрации:
623197b071133434864420.png

Вот такой контроллер LoginController:
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function login(Request $request) {    
        $phone = $request->phone;    
        $user = User::where('phone', $phone)->first();    
        if ($user) {    
            Auth::login($user);    
            return redirect()->route('catalog.index');    
        }
        else {    
            return redirect()->back();    
        }    
      }

    public function username() {
        return 'phone';
    }
}

Вот такой RegisterController:
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class RegisterController extends Controller
{
    use RegistersUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

    public function __construct()
    {
        $this->middleware('guest');
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            // 'name' => ['required', 'string', 'max:255'],
            'phone' => ['required', 'numeric', 'min:11']
            // 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            // 'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    protected function create(array $data)
    {
        return User::create([
            'phone' => $data['phone'],
            // 'name' => $data['name'],
            // 'email' => $data['email'],
            // 'password' => Hash::make($data['password']),
        ]);
    }
}

Как видите, в RegisterController есть валидация, в которой указано, что минимум 11 символов.
Но суть в том, что в форме я могу указать хоть 1 символ и юзер успешно создасться.

А на авторизации попросту не выходит никаких ошибок. Т.е. если укажу номер телефона, которого не сущесвует в БД (т.е.нет такого юзера), он меня не авторизует, но и не выведет никаких ошибок. Обновится страница и все.

В коде вы могли заметить моменты связанные с FireBase. Я просто делаю потверждение номера по нему, но сейчас это не так важно. Я пока-что её убрал и просто сделал грубо говоря регистрацию и авторизацию по одному полю - чисто номер телефона.
  • Вопрос задан
  • 278 просмотров
Решения вопроса 1
youmixx
@youmixx Автор вопроса
PHP Developer
Нашел решение:

Я думал что валидация вообще не выполняется (т.к. min:10 не срабатывал), а оказывается он выполняется, но просто саму валидацию надо было изменить. Нашел какое-то решение проверки русс номеров, вот как-то так собственно работает.

'phone' => ['required', 'regex:/((8|\+7)-?)?\(?\d{3,5}\)?-?\d{1}-?\d{1}-?\d{1}-?\d{1}-?\d{1}((-?\d{1})?-?\d{1})?/', 'unique:users']
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы