【问题标题】:Error when try to sending email in Laravel尝试在 Laravel 中发送电子邮件时出错
【发布时间】:2018-05-16 22:39:03
【问题描述】:

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

公共函数存储(请求 $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 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

那么什么可以让我得到这个错误以及如何修复它?

【问题讨论】:

    标签: laravel laravel-5 laravel-mail laravel-events


    【解决方案1】:

    看起来您的 SendActivatiionMail 类没有扩展 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));
    }
    

    【讨论】:

    • 现在我得到了这个错误“未定义的属性:App\Events\UserRegistered::$email”。我确定我在注册时已经通过了用户,为什么我不能使用 $event->email?
    • 您的事件处理程序和电子邮件类具有相同的名称SendActivatiionCode 对吗?
    • 是的,我的笨蛋,然后我将它重命名为 SendActivationMail 用于邮件。
    • 对不起,我修改了这个问题,因为我更改了类名。 sendactivatiion 邮件已扩展可邮寄。
    • 它给了我这样的错误:“未定义的变量:用户(视图:E:\laragon\www\blog\resources\views\mails\user\activation.blade.php)”跨度>
    【解决方案2】:

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

    <?php
    
    use Illuminate\Mail\Mailable;
    
    class SendActivatiionCode extends Mailable {
        ...
    }
    

    【讨论】:

    • 现在我得到了这个错误“未定义的属性:App\Events\UserRegistered::$email”。我确定我在注册时已经通过了用户,为什么我不能使用 $event->email?
    • 您的活动有一个用户。你可以尝试做$event-&gt;user-&gt;email;
    • 它仍然给我一个错误,也许是因为我的愚蠢因为我在事件和邮件上都给出了 SendActivationCode。另一个已经有可邮寄的扩展。
    • 对不起,我修改了这个问题,因为我更改了类名。 sendactivatiion 邮件已扩展可邮寄。
    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2020-06-25
    • 2018-07-26
    • 2021-09-01
    • 2012-08-23
    相关资源
    最近更新 更多