我正在尝试将非模型数据传递到我的电子邮件刀片。但是,我仍然收到此错误。
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>
答案 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,
];
}