尝试在 Laravel 中发送电子邮件时出错

Error when try to sending email in Laravel

我试图制作一些电子邮件,以便在有人注册时发送电子邮件激活码。所以我将其设为一个名为 UserRegistered 的事件。这是调用事件的我的 RegisterController

public函数存储(请求$request){

    $this->validate( $request,
        [
            'name' => 'required|min:3',
            'username' => 'required|unique:users|min:3',
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed|min:12'
        ]
    );

    $user = User::create([
        'name' => request('name'),
        'email' => request('email'),
        'username' => request('username'),
        'password' => bcrypt(request('password')),
        'token' => random(30),
    ]);

    event(new UserRegistered($user));

    return back()->with('success','Please check your email to active your account.');
}

在 UserRegistered 上,我像这样传递用户数据:

 class UserRegistered
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    public $user;



       /**
         * Create a new event instance.
         *
         * @return void
         */
        public function __construct(User $user)
        {
            $this->user = $user;
        }

        /**
         * Get the channels the event should broadcast on.
         *
         * @return \Illuminate\Broadcasting\Channel|array
         */
        public function broadcastOn()
        {
            return new PrivateChannel('channel-name');
        }

这是我的听众:

class SendActivationCode
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  UserRegistered  $event
     * @return void
     */
    public function handle(UserRegistered $event)
    {
        Mail::to($event)->send(new SendActivationMail($event));
    }
}

这里是 SendActivationMail class:

class SendActivationMail extends Mailable
{
    use Queueable, SerializesModels;
    protected $user;
        /**
         * Create a new message instance.
         *
         * @return void
         */
        public function __construct(User $user)
        {
            $this->user = $user;
        }

        /**
         * Build the message.
         *
         * @return $this
         */
        public function build()
        {
            return $this->markdown('mails.user.activation')->with([
                'name' => $this->user->name,
                'token' => $this->user->token,
            ]);
         }
}

但我得到了这个错误:

"Type error: Argument 1 passed to App\Mail\SendActivationMail::__construct() must be an instance of App\User, instance of App\Events\UserRegistered given, called in E:\laragon\www\blog\app\Listeners\SendActivationCode.php on line 33 ◀"

我的activation.blade.php:

@component('mail::message')
# Activation Code for {{ config('app.name') }}

Hi {{ $user->name }} You are recieved this because you are registered at our site. To active your account please click the link bellow.

@component('mail::button', ['url' => route('verify').$user->token])
Active Account
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

那么是什么导致我出现此错误以及如何修复它?

看起来你的 SendActivatiionMail class 没有扩展 Illuminate\Mail\Mailable。在 SendActivatiionMail.php 试试这个:

    namespace App\Mail;

    use Illuminate\Bus\Queueable;
    use Illuminate\Mail\Mailable;
    use Illuminate\Queue\SerializesModels;

    class SendActivatiionMail extends Mailable
    {
        use Queueable, SerializesModels;
    ...

然后在您的事件侦听器中:

use App\Mail\SendActivationMail;

public function handle(UserRegistered $event)
{
    Mail::to($event->user->email)->send(new SendActivationMail($event->user));
}

您的 SendActivatiionCode 必须扩展可邮寄 Class。

<?php

use Illuminate\Mail\Mailable;

class SendActivatiionCode extends Mailable {
    ...
}