Отправка ссылки активации (подтверждения) по электронной почте, когда пользователь ОБНОВЛЯЕТ электронный адрес в Laravel - PullRequest
0 голосов
/ 01 апреля 2020

Как я могу повторно отправить электронное письмо с учетной записью активации моему пользователю, когда пользователь обновит адрес электронной почты.

Адрес электронной почты не должен изменяться в БД до тех пор, пока пользователь не нажмет ссылку подтверждения

Ниже приведена моя функция обновления для пользователя в моем контроллере пользователя (только тело функции включено)

if($request->hasFile('propic'))
           {
                $this->validate($request, [
                    'name' => ['required', 'alpha','min:2', 'max:255'],
                    'last_name' => ['required', 'alpha','min:5', 'max:255'],
                    'mobile' => ['required', 'numeric','min:9','regex:/\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|3[70]|7|1)\d{1,14}$/'],
                    'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,'.$setting->id.''],
                    'propic' => ['required','image','mimes:jpeg,png,jpg,gif,svg','max:2048'],
                ],$request->all());

                $imageName = time().'.'.$request->propic->extension();  
                $request->propic->move(public_path('propics'), $imageName);
                $setting->propic=$imageName;
                $setting->name=$request->input('name');
                $setting->last_name=$request->input('last_name');
                $setting->mobile=$request->input('mobile');
                $setting->email=$request->input('email');
                $setting->update();
                return Redirect::back()->with('success',__('sentence.User updated successfully'));  
           }

и ниже - моя пользовательская форма обновления

<form action="{{ route('settings.update',$user->id) }}" method="POST" enctype="multipart/form-data">
            <div class="row mt-5">
                <div class="col-sm-3">
                @if($user->propic != 'user-pic.png')
    <button type="submit" name="resetphoto" class="btn btn-warning  pull-right">{{ __('sentence.Remove Profile Pic') }}</button>
@endif
                    <img src="/propics/{{$user->propic}}" alt="Profile Pic" id="profile_pic_display" class="mb-3">
                    <input type="file" name="propic" class="form-control">

                    @error('propic')
                    <span class="help-block" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                    @enderror
                </div>
                <div class="col-sm-9">
                <!-- <form action="{{ route('settings.update',$user->id) }}" method="POST"> -->
                    @csrf
                    @method('PUT')
                    <div class="row">
                        <div class="col-md-6">

                            <div class="form-group field-user-firstname required">
                                <label class="control-label"
                                       for="user-firstname">{{ __('sentence.First Name') }}</label>
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror"
                                       name="name" value="{{$user->name}}" autocomplete="name" autofocus>

                                @error('name')
                                <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror

                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form-group field-user-lastname required">
                                <label class="control-label" for="user-lastname">{{ __('sentence.Last Name') }}</label>
                                <input id="last_name" type="text"
                                       class="form-control @error('name') is-invalid @enderror" name="last_name"
                                       value="{{$user->last_name}}" autocomplete="last_name" autofocus>

                                @error('name')
                                <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-6">
                            <div class="form-group field-user-mobile required">
                                <label class="control-label" for="user-mobile">{{ __('sentence.Mobile') }}</label><br/>
                                <input id="mobile_1" type="tel"
                                       class="form-control @error('mobile') is-invalid @enderror" name="mobile"
                                       value="{{$user->mobile}}" style="min-width:398px;" autocomplete="mobile"
                                       autofocus>

                                @error('mobile')
                                <span class="help-block" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="col-md-6">
                            <div class="form-group field-user-email required">
                                <label class="control-label" for="user-email">{{ __('sentence.Email') }}</label>
                                <input id="email_" type="email"
                                       class="form-control @error('email') is-invalid @enderror" name="email"
                                       value="{{$user->email}}" autocomplete="email" >

                                @error('email')
                                <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                    </div>
                    <div class="row">
                        <div class="col-sm">
                            <div class="form-group pull-right">
                                <button type="submit"
                                        class="btn btn-default">{{ __('sentence.Cancel') }}</button>
                                <button type="submit"
                                        class="btn btn-default subscribe px-5">{{ __('sentence.Update') }}</button>
                            </div>
                        </div>
                    </div>
                </div>

        </form>

В настоящее время я отправляю ссылку активации на электронную почту пользователя, когда пользователь регистрируется, но я пытаюсь сделать это, когда существующий пользователь пытается обновить адрес электронной почты ..

1 Ответ

0 голосов
/ 01 апреля 2020

Ваш вопрос не совсем ясен, потому что вы работаете в коробке здесь и не дали нам полную картину. Если вы хотите убедиться, что электронное письмо не может , если оно не активировало , повторно отправьте ему электронное письмо для активации и подтвердите новый адрес после активации, тогда вы пропустите некоторые Логи c здесь.

В любом случае, вы должны сохранить ссылку на то, что электронное письмо должно быть где-то. Либо столбец, такой как pending_email в таблице, либо его собственная таблица, например, например, pending_changes.

В вашем методе boot вашей модели User вы можете наблюдать за updating событие и отправьте оттуда задание, чтобы повторно отправить электронное письмо активации и остановить изменение адреса электронной почты:

public static function boot() 
{
    parent::boot();

    static::updating(function ($model) {
        if ($model->isDirty('email') && $model->activated_at === null) {
            $model->email = $model->getOriginal('email');
            dispatch (new SendActivationEmail($model));
        }
    });
}

Теперь вы можете присоединиться к этому событию updating, чтобы увидеть, если они активировать и иметь pending_email:

static::updating(function ($model) {
    if ($model->isDirty('activated_at') && $model->pending_email) {
        $model->email = $model->pending_email;
        $model->pending_email = null;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...