我必须从表单中获取数据,用这些数据生成一个csv文件,然后像邮件上的附件一样发送这个文件。
我创建一个服务来生成我的csvfile:
<?php
namespace App\Services;
class GenerateCsvService {
/**
* Create a csv file with the given datas
*/
public function generateCsvFile($id, $data) {
$array = [];
$array[] = ['NOM', 'PRENOM', 'EMAIL', 'NB_EX'];
$array[] =
[$data->nom,
$data->prenom,
$data->email,
$data->nb_exemp
];
$file = fopen('/var/www/example-app/storage/app/csv/file' . $id . '.csv', 'w+');
foreach ($array as $fields) {
fputcsv($file, $fields);
}
fclose($file);
return $file;
}
}然后我在我的控制器上使用这个服务:
// Generate the csv file
$generateService = new GenerateCsvService();
$csvFile = $generateService->generateCsvFile($commandeId, $request);然后,我从laravel配置MailerService:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class CommandMail extends Mailable
{
use Queueable, SerializesModels;
public $datas = [];
public $filename = '';
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($id, $nom, $prenom, $email, $nb_exemplaires)
{
$this->datas['Nom'] = $nom;
$this->datas['Prénom'] = $prenom;
$this->datas['Email'] = $email;
$this->datas["Nombre d'exemplaires"] = $nb_exemplaires;
$this->filename = 'file' . $id . '.csv';
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('devtest@g.com')
->subject('Commande de catalogue')
->view('emails.command')
->attachFromStorage('csv', $this->filename);
}
}并在我的控制器上调用此服务(就在generateCsvFile服务之后):
// Send it with the mailerservice
$mailer = new MailerService();
$mailer->sendEmail($commandeId, $nom, $prenom, $email, $nb_exemplaires);此时,表单的每个提交都在/storage/app上生成一个csv文件,并发送一封带有数据和文件的电子邮件。附加的文件有正确的名称,但为空(0KO)。在服务器上,文件是ok (1KO),具有正确的名称和正确的内容。我想这是一个异步问题。我认为邮件发送得太早了,所以文件还没有完全创建。我该怎么做才能防止这种情况发生?
也许可以设置一个定时器,以便在发送电子邮件之前有必要的时间生成文件?是不是太武断了?
或者检查一下文件的大小?
如果有人帮我,我会非常感谢的!
发布于 2022-03-31 09:12:32
是的,你发现这是个异步问题。您可以定义两个作业类:一个基于表单数据生成csv文件,另一个发送电子邮件。在表单提交时,将两个类的作业链分配给Laravel Queue。这可以确保在生成csv文件之后发送电子邮件,或者换句话说,它们是按顺序执行的。
https://stackoverflow.com/questions/71689675
复制相似问题