1. 程式人生 > >利用 Composer 完善自己的 PHP 框架(二)

利用 Composer 完善自己的 PHP 框架(二)

pass 簡易 cte 郵件接收 ces api cep home ase

回顧

上一篇文章中,我們手工建造了一個簡易的視圖加載器,順便引入了錯誤處理包,讓我們的 MFFC 框架在 M、V、C 三個方面都達到了“好用”的水平。View 是一個可插拔組件,在本篇文章中我們要創建另一個可插拔組件——郵件發送模塊。

正文

我們采用 ‘nette/mail‘ 包作為我們的郵件發送基礎模塊,在它的基礎上封裝一個 ‘Mail‘ 類,暴露出簡潔的 API 給控制器使用,下面我們正式開始。

引入 ‘nette/mail‘ 包,修改 ‘composer.json‘:

"require": {

  "codingbean/macaw": "dev-master",

  "illuminate/database": "*",

  "filp/whoops": "*",

  "nette/mail": "*"

},

運行 ‘composer update‘,等待安裝完成。‘nette/mail‘ 的文檔位於:http://doc.nette.org/en/2.2/mailing 讓我們閱讀它,然後設計 Mail 類:

新建 ‘services/Mail.php‘ 文件,內容如下:

<?php

use Nette\Mail\Message;

/**

* \Mail

*/

class Mail extends Message

{

  public $config;

  // [String] e-mail

  protected $from;

  // [Array] e-mail list

  protected $to;

  protected $title;

  protected $body;

  function __construct($to)

  {

    $this->config = require BASE_PATH.‘/config/mail.php‘;

    $this->setFrom($this->config[‘username‘]);

    if ( is_array($to) ) {

      foreach ($to as $email) {

        $this->addTo($email);

      }

    } else {

      $this->addTo($to);

    }

  }

  public function from($from=null)

  {

    if ( !$from ) {

      throw new InvalidArgumentException("郵件發送地址不能為空!");

    }

    $this->setFrom($from);

    return $this;

  }

  public static function to($to=null)

  {

    if ( !$to ) {

      throw new InvalidArgumentException("郵件接收地址不能為空!");

    }

    return new Mail($to);

  }

  public function title($title=null)

  {

    if ( !$title ) {

      throw new InvalidArgumentException("郵件標題不能為空!");

    }

    $this->setSubject($title);

    return $this;

  }

  public function content($content=null)

  {

    if ( !$content ) {

      throw new InvalidArgumentException("郵件內容不能為空!");

    }

    $this->setHTMLBody($content);

    return $this;

  }

}

Mail 類和 View 類工作的方式基本一致:

$this->mail = Mail::to([‘[email protected]‘, ‘[email protected]‘])

                    ->from(‘MotherFucker <[email protected]>‘)

                    ->title(‘Fuck Me!‘)

                    ->content(‘<h1>Hello~~</h1>‘);

上面這段代碼位於 HomeController 中, ‘View::make()‘ 那行代碼的下面。

新建 ‘MFFC/config/mail.php‘,請自行替換郵件地址和密碼:

<?php

return [

  ‘host‘ => ‘smtp.163.com‘,

  ‘username‘ => ‘[email protected]‘,

  ‘password‘ => ‘password‘,

  ‘secure‘ => ‘‘

];

Mail 和 View 一樣也在 BaseController 的析構函數 __destruct() 函數中處理,現在這個 function 長這樣:

public function __destruct()

{

  $view = $this->view;

  if ( $view instanceof View ) {

    extract($view->data);

    require $view->view;

  }

  $mail = $this->mail;

  if ( $mail instanceof Mail ) {

    $mailer = new Nette\Mail\SmtpMailer($mail->config);

    $mailer->send($mail);

  }

}

OK,準備的差不多了,運行 ‘composer dump-autoload‘ 把 Mail 類加入自動加載,刷新頁面!

技術分享圖片

如果你看到以上頁面,恭喜你!郵件發送成功了!

趕快去檢查一下收件箱有木有郵件!:-D 這次頁面加載可能會稍慢,因為郵件是同步發送的。異步的隊列系統我們會在以後講到。

分析

郵件發送的整體流程想必大家已經輕車熟路了,現在主要敘述一下 Mail 類的設計過程:

  1. 郵件發送的核心參數是 ‘目標地址‘,即郵件要發送到的 E-mail 地址,所以我們設計 Mail::to(‘[email protected]‘) 作為發送的 ‘觸發 API‘。
  2. 目前我們采用最簡單的 ‘SMTP‘ 方式發送郵件,文檔在 這裏。配置文件放置在 ‘MFFC/config/mail.php‘ 中,依舊返回一個數組。
  3. Mail 類繼承了 ‘Nette\Mail\Message‘ 類。‘Mail::to()‘ 的時候創建一個 Mail 類的實例(對象)並返回,這時候其實 ‘BaseController‘ 中的析構函數中的代碼已經會被觸發並處理這個對象了。默認的發送人是從配置文件中讀取的 ‘username‘。
  4. ‘Mail::to()‘ 支持 字符串 或者數組作為參數,可以一次發送一封或多封郵件。
  5. ‘from()‘、‘title()‘ 和 ‘content()‘ 方法用於豐富郵件內容。‘content()‘ 方法可以直接傳遞 HTML 代碼。
  6. ‘from()‘ 配置不一定都能夠成功,部分郵件服務商不支持修改發送人地址。
  7. 這個變量全部組裝完成後,被賦值給控制器的 ‘$mail‘ 成員變量,然後被析構函數處理,郵件被發送,成功後頁面代碼被發送回客戶端,流程結束。

原地址:https://lvwenhan.com/php/412.html

利用 Composer 完善自己的 PHP 框架(二)