The Facade Design Pattern is a structural pattern that provides a simplified interface to a complex set of classes, libraries, or subsystems. It is used to hide the complexity of systems and offer a more user-friendly and easy-to-use interface for clients.
Situation:
Imagine we have an application that needs to send emails in a simple way. The process of sending emails can involve authentication settings, SMTP servers, setting the sender, recipient, email body, attachments, etc. Instead of exposing this entire complex process to the end-user, we can create a Facade to encapsulate these operations.
Install PHPMailer via Composer
composer require phpmailer/phpmailer
Directory System
?Facade ┣ ?src ┃ ┗ ?MailFacade.php ┣ ?vendor ┣ ?composer.json ┗ ?index.php
Autoload
First, let's make sure that Composer manages the dependencies and autoloads the classes correctly.
In the composer.json file, we can include the autoload of the classes from the src folder and also add the PHPMailer dependency:
{ "require": { "phpmailer/phpmailer": "^6.0" }, "autoload": { "psr-4": { "App\\": "src/" } } }
Class MailFacade
Now let's create a MailFacade class that will act as the facade to simplify the process of sending emails for the user.
namespace App; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // Facade class class MailFacade { private $mail; public function __construct() { $this->mail = new PHPMailer(true); // Create a new instance of PHPMailer $this->mail->isSMTP(); // Set up to use SMTP $this->mail->Host = 'smtp.example.com'; // Set the SMTP server $this->mail->SMTPAuth = true; // Enable SMTP authentication $this->mail->Username = '[email protected]'; // SMTP username $this->mail->Password = 'secret'; // SMTP password $this->mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption $this->mail->Port = 587; // SMTP server port } }
Method sendEmail
// Method to send a simple email public function sendEmail($to, $subject, $body) { try { // Set sender $this->mail->setFrom('[email protected]', 'Sender Name'); // Set recipient $this->mail->addAddress($to); // You can add more with $this->mail->addAddress('[email protected]'); // Set email subject and body $this->mail->Subject = $subject; $this->mail->Body = $body; $this->mail->isHTML(true); // Set email body to accept HTML // Send email $this->mail->send(); echo 'Email successfully sent!'; } catch (Exception $e) { echo "Error sending email: {$this->mail->ErrorInfo}"; } }
Method sendEmailWithAttachment
// Method to send an email with an attachment public function sendEmailWithAttachment($to, $subject, $body, $attachmentPath) { try { // Same basic configuration as in the previous method $this->mail->setFrom('[email protected]', 'Sender Name'); $this->mail->addAddress($to); // Set subject and body $this->mail->Subject = $subject; $this->mail->Body = $body; $this->mail->isHTML(true); // Add the attachment $this->mail->addAttachment($attachmentPath); // Send the email $this->mail->send(); echo 'Email with attachment successfully sent!'; } catch (Exception $e) { echo "Error sending email: {$this->mail->ErrorInfo}"; } }
Test
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');
This is a practical example of how the Facade pattern can simplify interactions with complex libraries like PHPMailer.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3