За последние 24 часа нас посетили 22327 программистов и 1032 робота. Сейчас ищет 651 программист ...

Почему не хочет отправляться уведомление для подтверждения почты?

Тема в разделе "Laravel", создана пользователем Dimon2x, 1 июн 2019.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Кастомизирую регистрацию.

    выдаёт ошибку

    Код (Text):
    1. Declaration of App\User::sendEmailVerificationNotification($token)
    2. should be compatible with Illuminate\Foundation\Auth\User::sendEmailVerificationNotification()
    User.php

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Notifications\Notifiable;
    6. use Illuminate\Contracts\Auth\MustVerifyEmail;
    7. use Illuminate\Foundation\Auth\User as Authenticatable;
    8. use App\Notifications\ResetPassword as ResetPasswordNotification;
    9. use App\Notifications\CustomVerifyEmail as CustomVerifyEmailNotification;
    10.  
    11. class User extends Authenticatable implements MustVerifyEmail
    12. {
    13.         use Notifiable;
    14.  
    15.     public function sendPasswordResetNotification($token)
    16.     {
    17.      
    18.         $this->notify(new ResetPasswordNotification($token));
    19.     }
    20.  
    21.     public function sendEmailVerificationNotification($token)
    22.     {
    23.         $this->notify(new CustomVerifyEmailNotification($token));
    24.     }
    Что значит должно быть совместимо, я не понимаю?

    Метод sendPasswordResetNotification для сброса пароля работает
    а sendEmailVerificationNotification не работает

    Посмотрел кастомные классы ResetPassword и CustomVerifyEmail, в папке Notifications, они совершено одинаковые, токен приходит.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Перекрывающий метод должен иметь аналогичную сигнатуру. Это не Laravel, a PHP
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    RegisterController

    PHP:
    1.  protected function validator(array $data)
    2.     {
    3.        
    4.          $messages = [
    5.             'g-recaptcha-response.required' => 'Подтвердите, то что вы не робот.',
    6.             'email.unique' => 'Такой E-mail уже используется.',
    7.             'password' => 'Минимальная длина пароля 8 символов.'
    8.          ];
    9.  
    10.         return Validator::make($data, [
    11.             '_token' => 'required',
    12.             'name' => ['required', 'string', 'max:255'],
    13.             'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
    14.             'password' => ['required', 'string', 'min:8', 'confirmed'],
    15.             'g-recaptcha-response' => ['required', 'recaptcha']
    16.         ], $messages);
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    В общем решил в RegisterController дополнить метод create

    PHP:
    1. protected function create(array $data)
    2.     {
    3.          $newUser = User::create([
    4.             'name' => $data['name'],
    5.             'email' => $data['email'],
    6.             'password' => Hash::make($data['password']),
    7.         ]);
    8.        
    9.        
    10.          $newUser->notify(new CustomVerifyEmailNotification($data['_token']));
    11.        
    12.          return $newUser;
    13.     }
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Теперь приходит 2 уведомления на почту, для подтверждения, я думаю это моя и так которая по умолчанию, как её отключить?
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Я разобрался. Залез в вендор, посмотрел, как там устроен метод toMail и скопировал action, получилось вот это

    PHP:
    1. public function toMail($notifiable)
    2.     {
    3.         return (new MailMessage)
    4.                      ->subject('Уведомление для подтверждения регистрации')
    5.                      ->salutation('С уважением, администрация сайта.')
    6.                  ->line('Что бы использовать дополнительные возможности сайта, надо подтвердить регистацию')
    7.                     ->action(
    8.                 Lang::getFromJson('Verify Email Address'),
    9.                 $this->verificationUrl($notifiable)
    10.             )
    11.                      
    12.                     ->line('Срок действия ссылки для подтверждения пароля истекает через 60 минут.');
    13.     }
    14.    
    и скопировал ещё метод verificationUrl

    PHP:
    1.  protected function verificationUrl($notifiable)
    2.     {
    3.         return URL::temporarySignedRoute(
    4.             'verification.verify',
    5.             Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
    6.             ['id' => $notifiable->getKey()]
    7.         );
    8.     }
    ну и скопировал подключение классов.

    В общем получилось вот такое

    PHP:
    1. namespace App\Notifications;
    2.  
    3. use Illuminate\Bus\Queueable;
    4. use Illuminate\Notifications\Notification;
    5. use Illuminate\Support\Facades\Lang;
    6. use Illuminate\Support\Carbon;
    7. use Illuminate\Support\Facades\URL;
    8. use Illuminate\Support\Facades\Config;
    9. use Illuminate\Contracts\Queue\ShouldQueue;
    10. use Illuminate\Notifications\Messages\MailMessage;
    11.  
    12.  
    13. class CustomVerifyEmail extends Notification
    14. {
    15.     use Queueable;
    16.    
    17.  
    18.     public function via($notifiable)
    19.     {
    20.         return ['mail'];
    21.     }
    22.  
    23.     /**
    24.      * Get the mail representation of the notification.
    25.      *
    26.      * @param  mixed  $notifiable
    27.      * @return \Illuminate\Notifications\Messages\MailMessage
    28.      */
    29.     public function toMail($notifiable)
    30.     {
    31.         return (new MailMessage)
    32.                      ->subject('Уведомление для подтверждения регистрации')
    33.                      ->salutation('С уважением, администрация сайта.')
    34.                  ->line('Что бы использовать дополнительные возможности сайта, надо подтвердить регистацию')
    35.                     ->action(
    36.                 Lang::getFromJson('Verify Email Address'),
    37.                 $this->verificationUrl($notifiable)
    38.             )
    39.                      
    40.                     ->line('Срок действия ссылки для подтверждения пароля истекает через 60 минут.');
    41.     }
    42.    
    43.      protected function verificationUrl($notifiable)
    44.     {
    45.         return URL::temporarySignedRoute(
    46.             'verification.verify',
    47.             Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
    48.             ['id' => $notifiable->getKey()]
    49.         );
    50.     }
    51.  
    52.     /**
    53.      * Get the array representation of the notification.
    54.      *
    55.      * @param  mixed  $notifiable
    56.      * @return array
    57.      */
    58.     public function toArray($notifiable)
    59.     {
    60.         return [
    61.             //
    62.         ];
    63.     }
    64. }
    и для класса User

    PHP:
    1.  public function sendEmailVerificationNotification()
    2.    
    3.     {
    4.      
    5.         $this->notify(new CustomVerifyEmail);
    6.  
    7.     }