”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > PHP 设计模式:外观

PHP 设计模式:外观

发布于2024-11-05
浏览:549

外观设计模式是一种结构模式,它为一组复杂的类、库或子系统提供简化的接口。它用于隐藏系统的复杂性,并为客户提供更加用户友好和易于使用的界面。

PHP Design Patterns: Facade

主要目标

    简化交互:通过创建一个简单的界面,外观模式可以更轻松地使用复杂的系统,而无需暴露其所有内部复杂性。
  • 子系统的封装:组成子系统的类可能很复杂,但外观充当抽象层,允许客户端仅使用简单且内聚的方法进行交互。
  • 解耦:该模式有助于使客户端与内部实现解耦,使系统将来更易于维护和扩展。
使用 PHPMailer 和 Facade 模式的示例

情况:

假设我们有一个应用程序需要以简单的方式发送电子邮件。发送电子邮件的过程可能涉及身份验证设置、SMTP 服务器、设置发件人、收件人、电子邮件正文、附件等。我们可以创建一个 Facade 来封装这些操作,而不是将这整个复杂的过程暴露给最终用户。 &&&]

通过 Composer 安装 PHPMailer


作曲家需要 phpmailer/phpmailer

composer require phpmailer/phpmailer
目录系统


?正面 ┣ ?src ┃ ┗ ?MailFacade.php ┣ ?供应商 ┣ ?composer.json ┗ ?index.php

composer require phpmailer/phpmailer
自动加载

首先,让我们确保

Composer

正确管理依赖项并自动加载类。 在composer.json文件中,我们可以包含从src文件夹自动加载的类,并添加PHPMailer依赖项:


{ “要求”: { "phpmailer/phpmailer": "^6.0" }, “自动加载”:{ “psr-4”:{ “应用程序\\”:“src /” } } }

composer require phpmailer/phpmailer
类 MailFacade

现在让我们创建一个 MailFacade 类,它将充当外观来简化用户发送电子邮件的过程。


命名空间应用程序; 使用 PHPMailer\PHPMailer\PHPMailer; 使用 PHPMailer\PHPMailer\Exception; // 门面类 类 MailFacade { 私人$邮件; 公共函数 __construct() { $this->mail = new PHPMailer(true); // 创建 PHPMailer 的新实例 $this->mail->isSMTP(); // 设置使用 SMTP $this->mail->Host = 'smtp.example.com'; // 设置SMTP服务器 $this->邮件->SMTPAuth = true; // 启用 SMTP 验证 $this->邮件->用户名 = '[email protected]'; // SMTP 用户名 $this->邮件->密码 = '秘密'; // SMTP 密码 $this->mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 启用 TLS 加密 $这个->邮件->端口 = 587; // SMTP服务器端口 } }

composer require phpmailer/phpmailer
方法发送电子邮件


//发送简单邮件的方法 公共函数 sendEmail($to, $subject, $body) { 尝试 { // 设置发送者 $this->mail->setFrom('[email protected]', '发件人姓名'); // 设置收件人 $this->mail->addAddress($to); // 您可以使用 $this->mail->addAddress('[email protected]'); 添加更多内容 // 设置邮件主题和正文 $这->邮件->主题 = $主题; $this->邮件->正文 = $body; $this->mail->isHTML(true); // 设置电子邮件正文以接受 HTML // 发送电子邮件 $this->邮件->send(); echo '邮件发送成功!'; } catch (异常$e) { echo "发送电子邮件时出错:{$this->mail->ErrorInfo}"; } }

composer require phpmailer/phpmailer
方法 sendEmailWithAttachment


//发送带有附件的邮件的方法 公共函数 sendEmailWithAttachment($to, $subject, $body, $attachmentPath) { 尝试 { // 基本配置与之前的方法相同 $this->mail->setFrom('[email protected]', '发件人姓名'); $this->mail->addAddress($to); // 设置主题和正文 $这->邮件->主题 = $主题; $this->邮件->正文 = $body; $this->mail->isHTML(true); // 添加附件 $this->mail->addAttachment($attachmentPath); // 发送电子邮件 $this->邮件->send(); echo '带有附件的电子邮件已成功发送!'; } catch (异常$e) { echo "发送电子邮件时出错:{$this->mail->ErrorInfo}"; } }

composer require phpmailer/phpmailer
测试


需要'vendor/autoload.php'; 使用App\MailFacade; // 使用外观 $mailFacade = new MailFacade(); // 发送一封简单的电子邮件 $mailFacade->sendEmail('[email protected]', '电子邮件主题', 'HTML 格式的电子邮件正文'); // 发送带有附件的电子邮件 $mailFacade->sendEmailWithAttachment('[email protected]', '带有附件的主题', '这是您的附件', '/path/to/attachment.pdf');

require 'vendor/autoload.php';

use App\MailFacade;

// Using the Facade
$mailFacade = new MailFacade();

// Sending a simple email
$mailFacade->sendEmail('[email protected]', 'Email Subject', 'Email body in HTML');

// Sending an email with an attachment
$mailFacade->sendEmailWithAttachment('[email protected]', 'Subject with Attachment', 'Here is your attachment', '/path/to/attachment.pdf');

MailFacade:此类封装了配置和发送电子邮件所需的所有逻辑,允许外观的用户只需调用方法即可发送电子邮件。
  • PHPMailer:PHPMailer 的复杂性(例如 SMTP 配置、身份验证等)隐藏在外观中。
  • 好处:

简单:客户端代码(使用 MailFacade)不需要了解服务器配置、PHPMailer 方法等细节
  • 可重用:外观可以在应用程序的不同部分使用,无需重复代码或逻辑。
  • 可维护:如果实现中的某些内容需要更改(例如,切换 SMTP 服务器),您只需在 MailFacade 类中更新它。
  • 这是 Facade 模式如何简化与 PHPMailer 等复杂库的交互的实际示例。

版本声明 本文转载于:https://dev.to/xxzeroxx/php-design-patterns-facade-4doo?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-04-12
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-04-12
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-12
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-12
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-12
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-04-12
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-12
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-04-12
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 ; $ date->修改('1个月'); //前进1个月 echo $ date->...
    编程 发布于2025-04-12
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-04-12
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-04-12
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-12
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-12
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-04-12
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-04-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3