如何将Laravel邮件发送封装为Trait及解决$emailData未定义报错
问题根因
报错来自Laravel邮件类的视图传参规则理解偏差:Mail::send() 第二个参数传入关联数组时,框架会自动将数组的每个键名提取为视图内的独立变量,不会把传入的整个数组作为同名变量注入视图。
你当前传入的$emailData是带operatorName、operatorUser、operatorPwd三个键的关联数组,所以邮件视图里能直接调用的变量是这三个键对应的变量,不存在$emailData变量,自然触发未定义报错。
修复方案
两种方案选其一即可:
方案一:调整邮件模板,直接使用框架提取后的独立变量
不需要修改发送逻辑,直接把Blade模板里的变量调用改成对应键名即可,示例:<p>注册成功,您的账号信息如下:</p> <p>操作员名称:{{$operatorName}}</p> <p>登录账号:{{$operatorUser}}</p> <p>登录密码:{{$operatorPwd}}</p>这是Laravel官方推荐的传参写法,性能和可读性更好。
方案二:调整传参结构,保留
$emailData变量调用
如果你确实需要在视图中直接通过$emailData读取整个数组,只需要修改Trait中Mail::send的传参格式,把传入的视图数据包一层键名为emailData的数组即可,修改后的Trait代码片段:public function sendMail ($emailTemplate,$emailData, $emailSubject, $emailTo) { // 第二个参数调整为['emailData' => $emailData],同时闭包内没用到$emailData可以从use里移除 Mail::send($emailTemplate, ['emailData' => $emailData], function($message) use ($emailSubject, $emailTo) { $message->to($emailTo) ->subject($emailSubject); }); return !count(Mail::failures()); }改完后视图里就可以正常调用
$emailData了,注意:直接输出数组会触发Blade报错,要读取具体内容需要写{{$emailData['operatorName']}}这类指定键名的格式。
小提示
你原来的闭包中use了$emailData,但闭包内部根本没有用到这个变量,属于冗余传参,上面的优化代码里已经移除了这部分无用逻辑。
内容的提问来源于stack exchange,提问作者Hafid Maulana
相关产品推荐
相关产品推荐

