首页 > 解决方案 > 使用带有降价的嵌套@components的Laravel Mail问题

问题描述

我遇到了代码工作的问题,但有时它无法在最外面显示正确的信息@component;它显示的徽标是错误的,例如它是否正在缓存最外层的布局并在下次调用时使用它,但信息已过时

发送在队列上运行的电子邮件时会出现此问题。

相关部分代码如下:

1:我要发送的邮件(100% 的时间)markdown.blade.php

@component('mail::message')
# @lang('emails.bookingRequestReceipt', ['user' => $association->person->account->first_name, 'school' => $bookingRequest->school->name])

{!! html_entity_decode($custom_intro) ?? '' !!}

@endcomponent

2:消息组件(100% 的时间有效)

@component('mail::layout')

<!-- THIS IS THE RELEVANT PART -->
{{-- Header --}}
@slot('header')
@component('mail::header', ['url' => $school['url'] ?? config('app.url')])
@if(!empty($school['logo']) && !$school['logo']['default'])
<img src="{{ $school['logo']['url'] }}" class="logo" alt="{{ $school['logo']['alt'] }}" />
@elseif(empty($school))
<img src="https://[redacted]/public/img/logo.png" class="logo" alt="{{ config('app.name') }}" />
@else
{{ $school->name }}
@endif
@endcomponent
@endslot
<!-- END OF RELEVANT PART -->

{{-- Body --}}
{{ $slot }}

@endcomponent

3:布局(失败)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

<table class="wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
<td align="center">
<table class="content" width="100%" cellpadding="0" cellspacing="0" role="presentation">

<!-- THIS IS THE RELEVANT PART -->
{{ $header ?? '' }}
<!-- END OF RELEVANT PART -->

<!-- Email Body -->
<tr>
<td class="body" width="100%" cellpadding="0" cellspacing="0">
<table class="inner-body" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
<!-- Body content -->
<tr>
<td class="content-cell">
{{ Illuminate\Mail\Markdown::parse($slot) }}

</td>
</tr>
</table>
</td>
</tr>

</table>
</td>
</tr>
</table>
</body>
</html>

知道我做错了什么吗?关于$school消息内部的信息总是正确的

是因为我没有习惯php artisan make:component创建布局吗?

编辑:删除剩余代码

标签: laravellaravel-8laravel-bladelaravel-mail

解决方案


我已经添加了您在本地提供的邮件文件,以测试导致问题的原因。在不知道您从 Mail 类(return $this->markdown(...)??)返回的方式和内容的情况下,我注意到有关代码示例的一些事情:

  1. 关于错误显示的徽标:您没有将$school变量传递给message刀片,因此您的徽标永远不会显示,并且@elseif(empty($school))永远是正确的。

    // message.blade.php
    @component('mail::message', ['school' => $school])
    
  2. message.blade.php包含的 @end 指令太多,最后两个 @ 指令会导致刀片出现错误,请删除这些:

        ...
        {{-- Body --}}
        {{ $slot }}
    
    @endcomponent
    {{-- @endslot -- }} // Causes problems
    {{-- @endcomponent -- }} // Causes problems
    

如果我按照上述步骤中的说明修复您提供的代码片段,则一切正常。如果这能解决您的问题,请告诉我。


推荐阅读