博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用 Composer 完善自己的 PHP 框架(二)
阅读量:5342 次
发布时间:2019-06-15

本文共 2928 字,大约阅读时间需要 9 分钟。

回顾

上一篇文章中,我们手工建造了一个简易的视图加载器,顺便引入了错误处理包,让我们的 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' 的文档位于: 让我们阅读它,然后设计 Mail 类:

新建 'services/Mail.php' 文件,内容如下:

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(['ooxx@gmail.com', 'ooxx@qq.com'])                    ->from('MotherFucker 
') ->title('Fuck Me!') ->content('

Hello~~

');

上面这段代码位于 HomeController 中, 'View::make()' 那行代码的下面。

新建 'MFFC/config/mail.php',请自行替换邮件地址和密码:

'smtp.163.com', 'username' => 'ooxx@163.com', '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('oo@xx.me') 作为发送的 '触发 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

转载于:https://www.cnblogs.com/gan-wenjun/p/8206449.html

你可能感兴趣的文章
阿里云Zabbix安装实践过程
查看>>
Scrapy框架详解
查看>>
跟着彭亮一起学人工智能之深度学习--零基础学人工智能
查看>>
.netCore+Vue 搭建的简捷开发框架 (2)--仓储层实现和EFCore 的使用
查看>>
.netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础
查看>>
.netCore+Vue 搭建的简捷开发框架--目录
查看>>
cad.net 复制图元的时候按下多次esc导致复制中断的bug,令REGEN,REGENALL更新图元无效....
查看>>
cad.net 图元延迟显示,动画效果,编辑器延迟发送提示.
查看>>
cad.net 定义lisp
查看>>
cad 一个小技巧--复制视口带冻结信息
查看>>
局部加载样式
查看>>
str字符串 center( ) 方法
查看>>
Swift学习笔记(7)--控制流
查看>>
Web Service简介 内部资料 请勿转载 谢谢合作
查看>>
BZOJ2038[2009国家集训队]小Z的袜子(hose)——莫队
查看>>
测试百度地图输入GPS经纬度显示位置API
查看>>
HDFS执行getDatanodeReport输出信息
查看>>
重建道路
查看>>
OC中NSLog函数输出格式罗列
查看>>
牛客练习赛36
查看>>