【问题标题】:Add a second action or a link to a Laravel Notification添加第二个动作或链接到 Laravel 通知
【发布时间】:2018-01-16 20:53:36
【问题描述】:

我正在使用 Laravel 发送通知,但无法弄清楚如何发送第二个操作。这是toMail 方法的代码:

public function toMail($notifiable)
    {
    return (new MailMessage)
        ->subject($this->options['subject'])
        ->greeting($this->options['greeting'])
        ->line($this->options['contentParagraph1'])
        ->line($this->options['contentParagraph2'])
        ->action('Facebook', 'https://www.facebook.com/')
        ->line($this->options['contentParagraph5'])
        ->action('LinkedIn', 'https://www.linkedin.com/')
        ->line($this->options['contentParagraph3'])
        ->line($this->options['contentParagraph4'])
        ->salutation($this->options['salutation']);
}

我得到的只是第二个动作。看起来第二个动作覆盖了第一个动作。有没有办法同时保留这两个操作或使用链接而不是按钮?

【问题讨论】:

    标签: php laravel notifications laravel-notification


    【解决方案1】:

    SimpleMessage 类旨在创建具有一个号召性用语按钮的简单消息,您可以在Illuminate/Notifications/Messages/SimpleMessage.php 中找到支持该功能的代码,并且可以在 Illuminate/Notifications/resources/views/email.blade.php 中找到 SimpleMessage 电子邮件的模板 —注意单个按钮。

    您可以使用Markdown Mail Notifications 功能创建更复杂的消息,这将允许您包含任意数量的按钮。你可以这样实现:

    1. 运行命令生成新通知并传入markdown选项,例如:php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
    2. 打开新创建的模板,例如:views/mail/invoice/paid.blade.php
    3. 添加任意数量的按钮,例如:

      @component('mail::message')
        # Introduction
      
        @component('mail::button', ['url' => $url1])
        Button 1 Text
        @endcomponent
      
        @component('mail::button', ['url' => $url2])
        Button 2 Text
        @endcomponent
      
        @component('mail::button', ['url' => $url3])
        Button 3 Text
        @endcomponent
      
        Thanks,<br>
        {{ config('app.name') }}
      @endcomponent
      
    4. 在构建电子邮件时,将您对 SimpleMessage 方法的调用替换为对您的降价模板的引用,例如:

      return (new MailMessage)
        ->subject($this->options['subject'])
        ->markdown('mail.invoice.paid', $this->options);
      

    markdown 方法中的第二个参数是要传递到视图中的数组,通过它您可以包含您希望包含在电子邮件中的各种值,例如 contentParagraph1greeting 和 @ 987654334@.

    【讨论】:

      【解决方案2】:

      我实现了这个解决方法来将按钮添加到标准SimpleMail 对象。由于MailMessage::line() 可以接受任何实现Htmlable 的对象,因此您可以在其中放入任何您想要的对象。

      您仍然必须重写通知类来创建MyMultiButtonVerifyEmail 的实例(而不是VerifyEmail),但这很容易完成(并且一旦提供了更新的电子邮件副本,您可能已经必须这样做)。

      Grrr,这些默认的 Laravel 通知类并不是真正可重用的,是吗?

      use Illuminate\Auth\Notifications\VerifyEmail;
      use Illuminate\Contracts\Support\Htmlable;
      use Illuminate\Notifications\Action;
      use Illuminate\Notifications\Messages\MailMessage;
      use Illuminate\Support\Facades\Lang;
      
      class MyMultiButtonVerifyEmail extends VerifyEmail {
      
          public function toMail($notifiable) {
              $verificationUrl = ...;
              $resendUrl = ...;
      
              return (new MailMessage)
                  ->line('some line')
                  ->action(Lang::getFromJson('Verify Email Address'), $verificationUrl)
                  ->line('another line')
                  ->line($this->makeActionIntoLine(new Action(Lang::getFromJson('Request New Activation'), $resendUrl)))
                  ->line(Lang::getFromJson('If you did not create an account, no further action is required.'));
          } // end toMail()
      
          private function makeActionIntoLine(Action $action): Htmlable {
              return new class($action) implements Htmlable {
                  private $action;
      
                  public function __construct(Action $action) {
                      $this->action = $action;
                  } // end __construct()
      
                  public function toHtml() {
                      return $this->strip($this->table());
                  } // end toHtml()
      
                  private function table() {
                      return sprintf(
                          '<table class="action">
                              <tr>
                              <td align="center">%s</td>
                          </tr></table>
                      ', $this->btn());
                  } // end table()
      
                  private function btn() {
                      return sprintf(
                          '<a
                              href="%s"
                              class="button button-primary"
                              target="_blank"
                              style="font-family: -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, Helvetica, Arial, sans-serif, \'Apple Color Emoji\', \'Segoe UI Emoji\', \'Segoe UI Symbol\'; box-sizing: border-box; border-radius: 3px; box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16); color: #fff; display: inline-block; text-decoration: none; -webkit-text-size-adjust: none; background-color: #3490dc; border-top: 10px solid #3490dc; border-right: 18px solid #3490dc; border-bottom: 10px solid #3490dc; border-left: 18px solid #3490dc;"
                          >%s</a>',
                          htmlspecialchars($this->action->url),
                          htmlspecialchars($this->action->text)
                      );
                  } // end btn()
      
                  private function strip($text) {
                      return str_replace("\n", ' ', $text);
                  } // end strip()
      
              };
          } // end makeActionIntoLine()
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2019-10-05
        相关资源
        最近更新 更多