Как отправить данные, собранные с помощью Laravel Livewire, в Fortify?

#laravel #fortify #laravel-livewire #custom-authentication

#laravel #укрепить #laravel-livewire #пользовательская аутентификация

Вопрос:

Я не знаком с Vue.js вообще, так что нашел хорошую замену, используя Livewire.

Задача, которую я должен решить, — это пройти удобную регистрацию на моем веб-сайте с помощью Fortify Livewire. Процесс регистрации является многоступенчатым и зависит от выбора, который делает пользователь, он загружает относительные поля.

До сих пор я настраивал представления Fortify, добавляя в FortifyServiceProvider.php файл следующий код:

 Fortify::loginView(function () {
    return view('auth.login');
});

Fortify::registerView(function () {
    return view('auth.register');
});
  

auth/login.blade.php Представление, загружающее компонент livewire, который в основном представляет собой форму:

 <form action="{{ route('register') }}" method="POST" wire:submit.prevent="submit">
    /**
    * Here would go the inputs that must be shown depends on what users choice 
    * (is it an ordinar user or a company)
    */
    <button type="submit">Save<button/>
</form>
  

Проблема множественности была бы решена путем добавления $step свойства в Register.php класс:

 class RegisterForm extends Component
{
    public $step;

    public function mount()
    {
        $this->step = 0;
    }

    public function submit()
    {
        if ($this->step < 3) {
            $this->step  ;           
        } else {
            // pass all the data to the fortify register method
            // <-- Here is my trouble!
        }
    }
}
  

которые будут увеличиваться при прохождении каждого из этапов регистрации ($this->step ) .

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

Ответ №1:

Посмотрите на контроллер fortify для регистрации

 public function store(Request $request, CreatesNewUsers $creator): RegisterResponse
    {
        event(new Registered($user = $creator->create($request->all())));
        $this->guard->login($user);
        return app(RegisterResponse::class);
    }
  

T

 use IlluminateAuthEventsRegistered;
use IlluminateSupportFacadesAuth;
use LaravelFortifyContractsCreatesNewUsers;
use LivewireComponent;

class Register extends Component
{
    public $name;
    public $email;
    public $password;
    public $password_confirmation;

    public function submit(CreatesNewUsers $creator)
    {
        event(new Registered($user = $creator->create([
            'name' => $this->name,
            'email' => $this->email,
            'password' => $this->password,
            'password_confirmation' => $this->password_confirmation,
        ])));

        Auth::guard()->login($user);

        $this->redirect('home');
    }

    public function render()
    {
        return view('livewire.register');
    }
}
  

Что-то подобное будет работать для вашего варианта использования.

Вы все еще используете действие fortify и все еще запускаете событие

Комментарии:

1. Если в процессе регистрации возникают ошибки или исключения (например, неверно указан адрес электронной почты или пароль не соответствует требованиям сложности), как мы фиксируем эти ошибки? Кажется, что этот код просто позволил бы отбрасывать исключения. Между тем, конечный пользователь, взаимодействующий с веб-браузером, вообще не увидит никакого ответа.

Ответ №2:

Ответ заключается в использовании контейнера приложения

 <?php

use IlluminateAuthEventsRegistered;
use IlluminateSupportFacadesAuth;
use AppActionsFortifyCreateNewUser;
use LivewireComponent;

class Register extends Component
{
    public $name;
    public $email;
    public $password;
    public $password_confirmation;
    


    public function submit()
    {
        event(new Registered($user = app(CreateNewUser::class)->create([
            'name' => $this->name,
            'email' => $this->email,
            'password' => $this->password,
            'password_confirmation' => $this->password_confirmation,
        ])));

        Auth::guard()->login($user);

        $this->redirect('home');
    }

    public function render()
    {
        return view('livewire.register');
    }
}
  

Ответ №3:

Ответ заключается в использовании внедрения зависимостей путем введения действия Fortify CreateNewUser в метод монтирования компонента Livewire.

 use IlluminateAuthEventsRegistered;
use IlluminateSupportFacadesAuth;
use AppActionsFortifyCreateNewUser;
use LivewireComponent;

class Register extends Component
{
    public $name;
    public $email;
    public $password;
    public $password_confirmation;
    
    protected $creator;

    public function mount(CreateNewUser $creator)
    {
        $this->creator = $creator;
    }

    public function submit()
    {
        event(new Registered($user = $this->creator->create([
            'name' => $this->name,
            'email' => $this->email,
            'password' => $this->password,
            'password_confirmation' => $this->password_confirmation,
        ])));

        Auth::guard()->login($user);

        $this->redirect('home');
    }

    public function render()
    {
        return view('livewire.register');
    }
}
  

Ответ №4:

вы можете использовать пример блейда

 @if($step > 3)
     <input name="name" type="text">
@endif
  

Комментарии:

1. спасибо за ваш ответ. Но это не то, что я искал. Я на самом деле смотрел, как я могу отправить эти данные в процесс регистрации fortify?