无法使用字符串键解压缩数组-将多个非模型数据传递到邮件视图

时间:2020-06-23 04:44:38

标签: php laravel email

我正在尝试将非模型数据传递到我的电子邮件刀片。但是,我仍然收到此错误。

Cannot unpack array with string keys

我尝试使用以下post,但无法解决我遇到的问题。

这是我的控制者:

$data = ['email'=> $email, 'token'=> $token, 'name'=> $name];
        sendMailWithMailerClass($email, '\App\Mail\ApplicantSetPasswordMail', $data);
        
...



function sendMailWithMailerClass($mailTo, $mailerClass, $mailerClassParams)
{
  
    try{
        Mail::to($mailTo)->send(new $mailerClass(...$mailerClassParams));
    } catch (Exception $e) {
       
    }
}
电子邮件类别在下面

<?php

namespace App\Mail;

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

class ApplicantSetPasswordMail extends Mailable
{
    use Queueable, SerializesModels;
    public $data;

    
    public function __construct($data)
    {
        $this->data = $data;
    }

    
    public function build()
    {
        return $this->markdown('emails.applicant_set_password', compact('data'));
    }
}

这是我的电子邮件视图:

<!DOCTYPE html>
<html lang="en" >
<head>
</head>

<body >
<center>
    
    <p>Dear {{ $data['name'] }},</p>
    <p style="margin-bottom: 25px;">Text</p>
    <a href="{{ URL::to('/').'/url/?email='.$data['email'].'&token='.$data['token'] }}" >Set Password</a>
                     
</center>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

您尝试在行...上使用的splat运算符new $mailerClass(...$mailerClassParams)无法与$data这样的关联数组一起使用

我可以看到,您用于可邮寄类的构造函数是public function __construct($data),因此您应该可以只使用new $mailerClass($mailerClassParams)

如果在构造函数中确实有一个带有多个参数的可邮寄类,例如public function __construct($email, $token, $name),则仍可以将其作为1个数组参数传递并检查传递的数组的内容。或使用new $mailerClass(...array_values($mailerClassParams))。但是,请注意,如果最终使用array_values(),则数组的顺序实际上很重要,因为这将映射参数,因此$mailerClassParams数组的第一个条目将始终是第一个参数,因此不建议这样做。

function sendMailWithMailerClass($mailTo, $mailerClass, $mailerClassParams)
{
    try{
        // Remove ... splat operator here
        Mail::to($mailTo)->send(new $mailerClass($mailerClassParams));
    } catch (Exception $e) {
       
    }
}

// make sure all your $mailClass constructors take 1 parameter
public function __construct($data)
{
    $this->data = $data;
}

OR

function sendMailWithMailerClass($mailTo, $mailerClass, $mailerClassParams)
{
    try{
        // Remove keys of the associative array with array_values
        Mail::to($mailTo)->send(new $mailerClass(...array_values($mailerClassParams)));
    } catch (Exception $e) {
       
    }
}

// make sure all constructor takes correct parameters in the correct order
public function __construct($email, $token, $name)
{
    $this->data = [
        'email' => $email,
        'token' => $token,
        'name' => $name,
    ];
}