2016年10月6日 星期四

[Laravel 5.3 新功能] 12. Mail 操作类 Laravel Mailable

此文章是 [Laravel 5.3 新功能] 系列的第十二篇文章,Mail 操作类 Laravel Mailable。
[Laravel 5.3 新功能] 系列完整文章列表请见:https://laravel-china.org/topics/2638

5.3 以前的发邮件方式#

      在很长的一段时间里,Laravel 发邮件的实现代码比较繁琐,比如在 5.2 里是这样发邮件的:
      Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
          $m->from('hello@app.com', 'Your Application');
      
          $m->to($user->email, $user->name)->subject('Your Reminder!');
      });
      我并不是说这种方式不好,但是比起其他的发邮件框架,它比较容易让人迷惑。

      什么是 Mailables#

          在 Laravel 5.3 里,所有的发邮件逻辑都将单独使用一个 PHP 类实现,如 “NewUserWelcome” 或者 “PaymentReceipt”。它的使用机制类似于事件 (event),每个发邮件事件对应一个类,并且对外只有提供一个简单的 send 语法,你只要将对应的 email 实例传入即可实现发邮件功能。
          举个例子,我们给用户发提醒邮件将这样调用:
          Mail::to($user)->send(new Reminder);
          在此之前,我们需通过 Artisan 命令创建 Reminder:
          php artisan make:mail Reminder
          命令运行成功后,程序会自动生成 app/Mail/Remider.php 文件,我们打开此文件可以看到如下内容:
          
          
          namespace App\Mail;
          
          use Illuminate\Bus\Queueable;
          use Illuminate\Mail\Mailable;
          use Illuminate\Queue\SerializesModels;
          
          class Reminder extends Mailable
          {
              use Queueable, SerializesModels;
          
              /**
               * Create a new message instance.
               *
               * @return void
               */
              public function __construct()
              {
                  //
              }
          
              /**
               * Build the message.
               *
               * @return $this
               */
              public function build()
              {
                  return $this->view('view.name');
              }
          }
          注意,在这个文件,所有的邮件操作逻辑要在 build() 方法里写,我们现在就在此方法里给用户发邮件:
          public function build()
          {
              return $this->from('hello@app.com', 'Your Application')
                  ->subject('Your Reminder!')
                  ->view('emails.reminder');
          }
          注意:你可以不填写邮件的标题,Laravel 会根据你的类名自动填写标题。如你的类名为 MonkeyReminder,则默认的标题为 Monkey Reminder

          传输数据#

              如果我们想传入一些数据给标题或者是邮件模板呢?我们可以这样写:
              Mail::to($user)->send(new Reminder($event));
              class Reminder extends Mailable
              {
                  public $event;
              
                  public function __construct($event)
                  {
                      $this->event = $event;
                  }
              
                  public function build()
                  {
                      return $this->from('hello@app.com', 'Your Application')
                          ->subject('Event Reminder: ' . $this->event->name)
                          ->view('emails.reminder');
                  }
              }
              在 mailable 类里的所有属性都能在 view 里调用:
              // resources/views/emails/reminder.blade.php
              <h1>{{ $event->name }} is coming up soon!</h1>
              <p>Lorem ipsum.</p>
              但如果想在模板里定义指定的数据呢?你可以通过使用 with() 方法来完成:
              public function build()
              {
                  return $this->from('hello@app.com', 'Your Application')
                      ->subject('Event Reminder: ' . $this->event->name)
                      ->view('emails.reminder')
                      ->with(['title' => $this->event->name]);
              }

              配置邮件发送对象#

                  我们可以使用下面的方法将邮件 cc 和 bcc 给其他人:
                  Mail::to(User::find(1))
                      ->cc(User::find(2))
                      ->bcc(User::find(3))
                      ->send(new Reminder);
                  
                  // These methods also accept collections
                  Mail::to(Users::all())
                      ->send(new Reminder);

                  Plaintext 视图#

                      现在有一个新的方法 text() 可以在 view() 方法后使用,调用此方法可以发送 Plaintext 类型的邮件。
                      public function build()
                      {
                          return $this->view('emails.reminder')
                              ->text('emails.reminder_plain');
                      }

                      队列#

                          调用下面的代码可以将发邮件的逻辑放入队列:
                          Mail::to($user)->queue(new Reminder);
                          你还可以使用 later() 设置邮件延时发送
                          $when = Carbon\Carbon::now()->addMinutes(15);
                          
                          Mail::to($user)->later($when, new Reminder);

                          添加附件#

                              你可以在上述的 build() 方法里使用 attach() 添加附件:
                              public function build()
                              {
                                  $this->view('emails.reminders')
                                      ->attach('/path/to/file', [
                                          'as' => 'name.pdf',
                                          'mime' => 'application/pdf',
                                      ]);
                              }
                              你也可以使用 attachRaw 添加 raw data:
                              public function build()
                              {
                                  $this->view('emails.reminders')
                                      ->attachRaw($this->pdf, 'name.pdf', [
                                          'mime' => 'application/pdf',
                                      ]);
                              }
                              全文完。

                              from : https://laravel-china.org/topics/2676

                              沒有留言:

                              wibiya widget