Yêu cầu Trước
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt và cấu hình Symfony Mailer và HttpClient trong dự án của bạn. Bạn có thể thêm chúng vào dự án của bạn bằng các lệnh sau:
composer require symfony/mailer
composer require symfony/http-client
Tạo Lớp Truyền Thông
Điều đầu tiên cần làm là tạo một lớp mới thực hiện Symfony\Component\Mailer\Transport\TransportInterface
. Chúng ta sẽ gọi nó là PtTransport
. Dưới đây là một ví dụ về những gì có thể trông như thế nào:
// src/Mailer/Transport/PtTransport.php
namespace App\Mailer\Transport;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\Transport\TransportInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\RawMessage;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class PtTransport implements TransportInterface
{
private $httpClient;
private $username;
private $password;
private $endpointUrl;
public function __construct(HttpClientInterface $httpClient, string $username, string $password, string $endpointUrl)
{
$this->httpClient = $httpClient;
$this->username = $username;
$this->password = $password;
$this->endpointUrl = $endpointUrl;
}
public function send(RawMessage $message, ?Symfony\Component\Mailer\Envelope $envelope = null): ?Symfony\Component\Mailer\SentMessage
{
// Implémentez ici votre logique d'envoi d'e-mail
// Vous pouvez utiliser $this->httpClient pour faire une requête HTTP à $this->endpointUrl
}
public function __toString(): string
{
return sprintf('pt://%s@%s', $this->username, $this->endpointUrl);
}
}
Tạo Lớp Nhà Máy
Tiếp theo, chúng ta cần tạo một lớp nhà máy sẽ chịu trách nhiệm tạo ra các thể hiện của PtTransport
. Chúng ta sẽ gọi lớp này là PtTransportFactory
. Dưới đây là một ví dụ về những gì có thể trông như thế nào:
// src/Mailer/Transport/PtTransportFactory.php
namespace App\Mailer\Transport;
use Symfony\Component\Mailer\Exception\UnsupportedSchemeException;
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
use Symfony\Component\Mailer\Transport\Dsn;
use Symfony\Component\Mailer\Transport\TransportInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class PtTransportFactory extends AbstractTransportFactory
{
private $httpClient;
public function __construct(HttpClientInterface $httpClient)
{
$this->httpClient = $httpClient;
}
public function supports(Dsn $dsn): bool
{
return 'pt' === $dsn->getScheme();
}
public function create(Dsn $dsn): TransportInterface
{
return new PtTransport(
$this->httpClient,
$dsn->getUser(),
$dsn->getPassword(),
$dsn->getOption('endpoint_url')
);
}
}
Cấu Hình
Sau đó, chúng ta cần đăng ký PtTransportFactory
như một dịch vụ và gắn nó với mailer.transport_factory
. Dưới đây là cách làm điều này trong services.yaml
:
services:
App\Mailer\Transport\Pt
Tiếp theo, chúng ta cần đăng ký PtTransportFactory
như một dịch vụ và gắn nó với mailer.transport_factory
. Dưới đây là cách làm điều này trong services.yaml
:
services:
App\Mailer\Transport\PtTransportFactory:
tags: ['mailer.transport_factory']
arguments:
$httpClient: '@http_client'
Sử Dụng
Bây giờ, bạn có thể sử dụng phương thức truyền email tùy chỉnh mới của mình bằng cách cấu hình DSN mailer của bạn trong tệp .env
của bạn:
MAILER_DSN=pt://username:password@default?endpoint_url=https://your-endpoint-url
Và đó là nó! Bạn hiện đã có một phương thức truyền email tùy chỉnh với Symfony Mailer. Lần tiếp theo bạn gửi email, Symfony sẽ sử dụng phương thức truyền mới của bạn.
Kết Luận
Symfony Mailer là một công cụ mạnh mẽ và linh hoạt để quản lý việc gửi email trong các ứng dụng Symfony của bạn. Bằng cách tạo một phương thức truyền email tùy chỉnh, bạn có thể dễ dàng tích hợp bất kỳ dịch vụ gửi email nào vào ứng dụng của mình, ngay cả khi nó không được hỗ trợ trực tiếp bởi Symfony Mailer.
Tôi hy vọng bài viết này hữu ích và giờ đây bạn đã có hiểu biết tốt hơn về cách sử dụng Symfony Mailer để tạo một phương thức truyền email tùy chỉnh.