Laravel 5.7中Twilio通知Locale设置失效问题求助
解决Laravel Twilio通知Locale不生效的问题
我帮你分析下问题所在,以及对应的解决方案:
问题根源
你的邮件测试能正常工作,是因为你使用了真实邮件发送,Laravel在发送通知的流程中会自动临时切换到通知实例上设置的locale,所以视图渲染时__()函数能正确获取对应语言的翻译。
但Twilio测试用了Notification::fake(),这种模式下Laravel并不会执行完整的通知发送流程——它只会把通知实例存储起来,直到你调用assertSentTo时才会执行toTwilio方法。此时的执行环境还是测试的默认locale,并没有切换到你设置的fr,所以翻译用了默认文案。
解决方案
方案1:在测试回调中手动切换Locale
在assertSentTo的回调里,先切换到通知设置的locale,生成消息后再恢复原locale:
public function test_sms_notifications_use_localisation() { Notification::fake(); $user = factory(User::class)->create(); $user->notify( (new WelcomeSmsNotificationStub)->locale('fr') ); Notification::assertSentTo( $user, WelcomeSmsNotificationStub::class, function ($notification, $channels) use ($user) { // 保存当前默认Locale $originalLocale = app()->getLocale(); // 切换到通知指定的Locale app()->setLocale($notification->locale); // 生成Twilio消息 $message = $notification->toTwilio($user); // 恢复原Locale app()->setLocale($originalLocale); return $message->content === 'Bonjour Le Monde'; } ); }
方案2:在通知类中主动处理Locale
修改你的WelcomeSmsNotificationStub类,让toTwilio方法生成内容时强制使用通知设置的locale,这样不管是真实发送还是fake测试都能生效:
class WelcomeSmsNotificationStub extends \Illuminate\Notifications\Notification { public function via($notifiable) { return [TwilioChannel::class]; } public function toTwilio($notifiable) { // 保存当前Locale $originalLocale = app()->getLocale(); // 切换到通知的Locale(如果没设置则用默认) app()->setLocale($this->locale ?? $originalLocale); // 获取翻译内容 $content = __('welcome_notification.opening_text'); // 恢复原Locale app()->setLocale($originalLocale); return (new TwilioSmsMessage())->content($content); } }
验证测试
修改后再运行测试,__('welcome_notification.opening_text')就会正确读取法语的翻译文案,断言就能通过了。
内容的提问来源于stack exchange,提问作者haakym
相关产品推荐
相关产品推荐

