Create Mail Service using Singleton Design Patterns + Symfony+PHP

Tiếp tục với các hướng dẫn về Singleton Design Patterns trong PHP. Mình nhận thấy, khi chúng ta viết website bán hàng, có chức năng gửi mail cho khách hàng, khi họ đã bấm thanh toán. Mà mỗi lần như vậy, chúng ta lại connect lại Mail Service.

Ở đây do mình làm với gửi mail đến bằng Gmail, sử dụng smtp. Chính vì do gửi mail liên tục và connect nhiều lần, nên mình viết mẫu Singleton trong mô hình Design Patterns, để tạo một kết nối duy nhất và sử dụng trong ứng dụng, tránh việc connect nhiều lần

Githubhttps://github.com/skipperhoa/Design-Patterns

Ah mình sử dụng thư viện của Symfony, để cài đặt gửi mail : 

composer require symfony/mailer

Các bạn có thể xem thêm tại đây: https://symfony.com/doc/current/mailer.html

Okay và đây là kiểu kết nối Mail Service Singleton Design Patterns của mình

<?php 
    // Chúng ta có thể cấu hình namespace cho ok hơn, vì mình test nên để require_once đến thư viện
    require_once "../../../vendor/autoload.php";
    use Symfony\Component\Mailer\Transport;
    use Symfony\Component\Mailer\Mailer;
    use Symfony\Component\Mime\Email;
    use Twig\Environment;
    use Twig\Loader\FilesystemLoader;
    class MailService{
        private static $instance = null;
        private $transport = null;
        private $mail_from = ""; // nhập mail parent
        private $pass = ""; // password mail parent
        private $mailer = null;
        private function __construct(){
            try { 
                $this->transport =Transport::fromDsn("smtp://{$this->mail_from}:{$this->pass}@smtp.gmail.com:587?encryption=tls");
            
                $this->mailer = new Mailer($this->transport);
            } catch (\PDOException $e) {
                throw new Exception($e->getMessage());
            }
        }

        public static function getInstance(){   
            if(self::$instance === null){
                // Đang khởi tạo instance duy nhất
                self::$instance = new MailService();
            }
            // Đối tượng đã được tạo
            return self::$instance;

        }
        
        public function sendEmail(Array $data) : Array{
            try {
                $email = new Email();
                $email->from($this->mail_from);
                $email->to($data['email']);
                $email->subject($data['subject']);
                $email->text($data['message']);
                if($data['file'] != null){
                    $email->attachFromPath($data['file']);
                }
                $this->mailer->send($email);
                $data['status'] = 'success';
                return json_decode(json_encode($data), true, 512, JSON_THROW_ON_ERROR);
            }
            catch (\Exception $e) {
                $data['status'] = 'error';
                $data['message'] = $e->getMessage();
                return json_decode(json_encode($data), true, 512, JSON_THROW_ON_ERROR);
            }
           
        }

    }

$mail = MailService::getInstance();
$mail2 = MailService::getInstance();

var_dump($mail === $mail2); //true

$mail->sendEmail([
    'subject' => 'LẬP TRÌNH WEBSITE | HOANGUYENIT',
    'email' => 'nguyen.thanh.hoa.ctec@gmail.com',
    'message' => 'Chuyên trang chia sẻ các kiến thức liên quan đến. Lập Trình Website và Phát triển Website',
    'file' => null
])

?>

 

Bài Viết Liên Quan

Messsage

Nếu bạn thích chia sẻ của tôi, đừng quên nhấn nút !ĐĂNG KÝ