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

x

Xin chào! Hãy ủng hộ chúng tôi bằng cách nhấp vào quảng cáo trên trang web. Việc này giúp chúng tôi có kinh phí để duy trì và phát triển website ngày một tốt hơn. (Hello! Please support us by clicking on the ads on this site. Your clicks provide us with the funds needed to maintain and improve the website continuously.)

Ngoài ra, hãy đăng ký kênh YouTube của chúng tôi để không bỏ lỡ những nội dung hữu ích! (Also, subscribe to our YouTube channel to stay updated with valuable content!)

Đăng Ký