向laravel通知类的email模板传递自定义数据

rryofs0p  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(135)

我们使用laravel通知和可邮寄类发送电子邮件通知。
我们有以下流程:我们正在使用laravel 7
1.我们派遣工作dispatch(new JobEntitiesEmail($arr,$email));

  1. JobEntitiesEmail是我们专门编写的用于发送NOTIFICATIONS的作业
    `]
class JobEntitiesEmail implements ShouldQueue 
{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

/**
 * Create a new job instance.
 *
 * @return void
 */
public $tries = 3;
public $arr;
public $email;

public function __construct($arr,$email)
{
    $this->arr = $arr;
    $this->email = $email;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{

    Notification::route('mail',$this->email)->notify((new EntitiesEmail($this->arr))->locale($this->arr['user_lang']));

}
}

1.我们有app\Notifications\Entities电子邮件。在php中创建一个MailMessage对象。
$mailmessage= (new MailMessage)->subject("subject of mail")
->line( __('messages.hello'))
->line(new HtmlString(__('messages.email_message')))
->action(__('titles.click'), url("google.com"));
1.我们在Resources\View\Vendors\mail中有一个电子邮件模板

  • Email和Markdown我们希望将logo传递给邮件的头文件,该头文件位于resources\views\vendor\mail\html\header。blade.php

就像这样:

$mailmessage= (new MailMessage)
      ->subject("email_template")
      ->line( __('messages.hello')..',')
      ->line(new HtmlString(__('messages.email_message')))
      ->action(__('titles.link'), url($link));
    }

还希望访问文件resources\views\vendor\mail\html\message中传递的变量$logoUrl。blade.php
喜欢

@component('mail::layout') 
    {{-- Header --}}
    @slot('header') 
            @component('mail::header', ['url' => config('app.url'), 'logoUrl' => $logoUrl ]) {{ config('app.name') }} 
        @endcomponent 
    @endslot

{{-- Body --}}

{{ $slot }}

{{-- Subcopy --}}
@isset($subcopy)
    @slot('subcopy')
        @component('mail::subcopy')
            {{ $subcopy }}
        @endcomponent
    @endslot
@endisset

{{-- Footer --}}
@slot('footer')
    @component('mail::footer')
        © {{ date('Y') }} <a href="https://google.com">{{ config('app.name') }}</a>. @lang(__('messages.copyright'))
    @endcomponent
@endslot
@endcomponent `

我们试过了
1.使用with方法
$mailmessage= (new MailMessage)
->subject('New order')
->with(['logoUrl' => $logoUrl ])
它给予数据作为一个outrolines。
1.使用Markdown
$mailmessage= (new MailMessage)
->subject('New order')
->markdown('Notification::email', ['logoUrl' => $logoUrl ]);
我们在viewData中获取此数据,但无法在模板文件中访问此数据。

b5lpy0ml

b5lpy0ml1#

好吧,我希望这不是太晚,但我两周前就遇到了这个问题,很难找到解决方法。最后,进行了一些调试,并使用了大量的dd()方法。我可以这样解决
1.将$notifiable变量直接传递给with()方法

public function toMail(object $notifiable): MailMessage
    {
        $mail = (new MailMessage)
            ->subject('Hello World')
            ->line('Go to our website')
            ->with($notifiable);
    }

1.然后,在使用

php artisan vendor:publish --tag=laravel-notifications
php artisan vendor:publish --tag=laravel-mail

1.然后转到resources/views/vendor/mail/html/message.blade.php

  1. slot变量将包含一个Illuminate\Support\HtmlString,它将包含以下信息:
Illuminate\Support\HtmlString {#1856 // resources/views/vendor/mail/html/message.blade.php
  #html: """
    # Hello!
    
    Go to our website
    
    {&quot;first_names&quot;:&quot;John&quot;,&quot;last_names&quot;:&quot;Doe&quot;,&quot;email&quot;:&quot;john@example.com&quot;,&quot;age&quot;:0}
    """
}

注意:Illuminate\Support\HtmlString对象末尾的信息是我们包含的$notifiable内容,此变量是User的示例。

User::make([
  'first_names' => 'John',
  'last_names' => 'Doe',
  'email' => 'john@example.com'
]);

1.最后,你只需要使用正则表达式和PHP内置的html_entity_decodejson_decode来获取数据,就像这样:

<x-mail::layout>
    {{-- Header --}}
    <x-slot:header>
        <x-mail::header :url="config('app.url')">
        </x-mail::header>
    </x-slot:header>
 
    @php
        $htmlString = $slot->toHtml();
        $startIndex = strpos($htmlString, '{');
        $userJson = substr($htmlString, $startIndex);
        $htmlStringWithoutJson = str_replace($userJson, '', $htmlString);
        $bodySlot = new Illuminate\Support\HtmlString($htmlStringWithoutJson);
    @endphp

    {{-- Body --}}
    {{ $bodySlot }}

    {{-- Footer --}}
    <x-slot:footer>
        <x-mail::footer>
            @php
                $htmlString = $slot->toHtml();
                $startIndex = strpos($htmlString, '{');
                $userJson = substr($htmlString, $startIndex);
                $userJson = html_entity_decode($userJson);
                $user = json_decode($userJson);
            @endphp

            <p>
                <div class="footer-primary">
                    This email was sent to <span class="email">{{$user->email ?? 'user@example.com' }}</span>. 
                </div>
            </p>

{{-- YOUR CODE ... --}}

注意:如果你仔细观察,我在视图中使用了两个PHP代码块
1.在第一个例子中,我只是删除了来自$notifiable变量的所有数据,因为这是一个Illuminate\Support\HtmlString,它将显示在电子邮件结构中,这是我们不想要的。
1.在第二个例子中,我只是通过删除html实体来提取数据,并将其解码为JSON格式,这样我就可以轻松访问它。
希望有帮助,谢谢阅读!
如果有更好的方法,请让我知道,我会很高兴地阅读它

相关问题