在控制器操作中使用Laravel 5.6发送电子邮件时出错

时间:2018-06-29 03:22:12

标签: php laravel

我遇到错误Undefined property: stdClass::$email error

我的控制器操作中的代码:

...
use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;

public function approve($id){
    $mail = DB::select('select pic_email from vendors where id = :id', ['id' => $id]);
    $user = DB::select('select roc_no from vendors where id = :id', ['id' => $id]);
    Mail::to($mail)->send(new WelcomeMail($user));
    return redirect('/account/pending')->with('success', 'Account approved!');
}

在app \ Mail \ WelcomeMail.php中:

class WelcomeMail extends Mailable
{
    use Queueable, SerializesModels;

    public $user;

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

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.welcome');
    }
}

我根据https://www.5balloons.info/send-email-registration-laravel-authentication/

的教程编写了代码

我使用Mailtrap。 Laravel内置密码重置功能正在运行时,.env中的所有凭据/配置均正确。那我的代码怎么了?

更新:我将跟踪错误,可能是由于控制器操作$mail = DB::select('select pic_email from vendors where id = :id', ['id' => $id]); 我正在使用SQL返回值。然后,我尝试使用修补程序,将值$mail作为数组返回。我认为是导致无法获得$mail的问题。

如何纠正?使用extract()也无济于事。

3 个答案:

答案 0 :(得分:1)

DB::select函数返回一个对象数组。 DB::selectOne将返回一个按列名索引的单个对象。

您还可以将两个查询合并为一个查询,然后按以下方式访问列名:

public function approve($id)
{
    $vendor = DB::selectOne('select pic_email, roc_no from vendors where id = :id', compact('id'));

    Mail::to($vendor->pic_email)->send(new WelcomeMail($vendor->roc_no));

    return redirect('/account/pending')->with('success', 'Account approved!');
}

答案 1 :(得分:0)

不需要两个不同的查询,您可以在一个查询中完成

controllers.Default.redirect(to = "http://www.google.com")

答案 2 :(得分:0)

如果需要,您可以进行测试!通过tinker如下代码。

做测试,如果有错误,它会给你。

# SSH into droplet
# go to project
$ php artisan tinker
$ Mail::send('errors.401', [], function ($message) { $message->to('emmanuelbarturen@gmail.com')->subject('this works!'); });
# check your mailbox