cakephp组件:
概述:
组件(Components)是在控制器之间共享的封装了的逻辑。CakePHP 附带一套非常棒的核心 组件,可帮你完成各种常见任务。你也可以创建自己的组件。如果你发现自己要在控制器间 复制粘贴代码,就应当考虑创建自己的组件,封装这些功能。创建组件可以保持控制器代码 简洁,并且让你可以在不同的项目中重用代码。
上面是官方手册对于组件的解释,在我目前博客系统写的功能中就有几个可以定义成组件,可以供所有控制器使用,比如密码加密函数、发送邮箱函数等等都是可以定义成组件,下面介绍组件的具体使用方法。
1、组件的定义
这里定义的是PublicFunctionComponent组件类:类名为PublicFunctionComponent.php
//引入Component类
App::uses('Component', 'Controller');
//继承Component类
class PublicFunctionComponent extends Component
{
/*
* 密码加密函数
*/
function encrypt($data)
{
$salt = "123123asdasdasd";
$psw = md5($salt . md5($data));
return $psw;
}
}
这里定义的是EmailComponent组件类:类名为EmailComponent.php
<?php
/**
* Created by PhpStorm.
* User:
* Date: 2021/7/14
* Time: 16:23
*/
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '../../vendors/phpmailer/phpmailer/src/Exception.php';
require '../../vendors/phpmailer/phpmailer/src/PHPMailer.php';
require '../../vendors/phpmailer/phpmailer/src/SMTP.php';
App::uses('Component', 'Controller');
class EmailComponent extends Component
{
/*
* 传递参数
* $params $email 接收邮箱地址
* $params $content 邮箱内容
*/
function sendmail($email,$content){
//初始化参数
$mail = new PHPMailer(true);
try{
//服务器配置
$mail->CharSet ="UTF-8"; //设定邮件编码
$mail->SMTPDebug = 0; // 调试模式输出
$mail->isSMTP(); // 使用SMTP
$mail->Host = 'smtp.qq.com'; // SMTP服务器
$mail->SMTPAuth = true; // 允许 SMTP 认证
$mail->Username = '2717719404@qq.com'; // SMTP 用户名 即邮箱的用户名
$mail->Password = 'tcviesfxvxymdhbh'; // SMTP 密码 部分邮箱是授权码
$mail->SMTPSecure = 'ssl'; // 允许 TLS 或者ssl协议
$mail->Port = 465; // 服务器端口 25 或者465 具体要看邮箱服务器支持
$mail->setFrom('2717719404@qq.com', 'wyqgg'); //发件人
$mail->addAddress($email, 'wyq'); // 收件人
//$mail->addAddress('ellen@example.com'); // 可添加多个收件人
$mail->addReplyTo('2717719404@qq.com', 'info'); //回复的时候回复给哪个邮箱 建议和发件人一致
//Content
$mail->isHTML(true); // 是否以HTML文档格式发送 发送后客户端可直接显示对应HTML内容
//标题
$mail->Subject = '登录提示' . time();
//主体部分
$mail->Body = $content . date('Y-m-d H:i:s');
$mail->AltBody = '如果邮件客户端不支持HTML则显示此内容';
$mail->send();
return 1;
}catch (Exception $e){
return 0;
}
}
}
2、控制器中的声明以及使用
class LoginController extends AppController
{
public $components = array('Session','email','publicFunction');//这里就是在控制器中调用你定义、或系统的组件,这里email、publicFunction就是我自定义的组件,这里的命名需要保持小驼峰命名
/*
* 点击忘记密码生成验证码
*/
public function findPsw(){
$email = $_POST['email'];
$username = $_POST['username'];
$login = ClassRegistry::init('Login');
$data = $login->find_admin($username);
if ($data && $data['Login']['email'] == $email){
$code = rand(1000,9999);
$name = 'emailCode'.$username;
setcookie($name,$code,time()+60);
$content ="<h1>您的验证码为:".$code."</h1>";
//调用组件类的方法
$res = $this->email->sendmail($email,$content);
if ($res == 1){
exit(json_encode(200));
}else{
exit(json_encode(400));
}
}
exit(json_encode(401));
}
/*
* 验证验证码与邮箱
*/
public function submitPsw(){
$post = $_POST;
$name = 'emailCode'.$post['username'];
$code = $_COOKIE[$name];
$login = ClassRegistry::init('Login');
$data = $login->find_admin($post['username']);
if ($data['Login']['email'] == $post['email'] && $data['Login']['username'] == $post['username'] && $code = $post['code']){
$password = substr($post['email'],'0','6');
//调用组件方法
$password = $this->publicFunction->encrypt($password);
$data['Login']['password'] = $password;
$admin = ClassRegistry::init('Admin');
$data = $admin->dellAdmin($data['Login']);
exit(json_encode(200));
}else{
exit(json_encode(400));
}
}
}
总结
这里需要注意的就是关于组件类的声明需要小驼峰式,这里只要注意了就不会有什么问题了