「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PHP デザイン パターン: アダプター

PHP デザイン パターン: アダプター

2024 年 11 月 6 日に公開
ブラウズ:779

アダプター デザイン パターンは、互換性のないインターフェイスを持つオブジェクトが連携できるようにする構造パターンです。これは 2 つのオブジェクト間の仲介者 (またはアダプター) として機能し、一方のオブジェクトのインターフェイスを、もう一方のオブジェクトが期待するインターフェイスに変換します。これにより、異なるインターフェイスを持つため互換性がなくなるクラスが、元のコードを変更することなく連携できるようになります。

アダプターの構造

アダプター パターンは通常、3 つの主要な要素で構成されます:

  • クライアント: 特定のインターフェイスのオブジェクトを操作することを期待するクラス。
  • Adapte: クライアントと互換性のないインターフェースを持つクラスですが、その機能は必要です。
  • アダプター: クライアントが予期するインターフェースを実装し、呼び出しを Adaptee インターフェースに変換するクラス。

PHP Design Pattern: Adapter

アダプターの種類

  1. オブジェクト アダプター: 構成ベース。アダプターには、適応しているクラスのインスタンスが含まれています。
  2. クラス アダプター: 継承ベース (通常は多重継承をサポートする言語)。

アダプターはいつ使用しますか?

  • 既存のクラスを使用したいが、そのインターフェイスがクライアントが期待するものと一致しない場合。
  • 古いコードを変更せずに、新しい機能をレガシー システムに統合するため。

このパターンは、外部ライブラリまたは API と連携する必要があるシステムで役立ち、これらのライブラリのコードを変更せずに機能を適応させることができます。

PHPMailer の使用例

ここでは、アダプター デザイン パターンを使用して PHPMailer をカスタム インターフェイスと統合する方法の例を示します。

状況:

システムは、メール送信クラスが IMailer と呼ばれるインターフェイスを実装することを期待していますが、PHPMailer はこのインターフェイスに直接従わないと仮定します。アダプターは、システムが期待するインターフェースに PHPMailer を適合させるために使用されます。

Composer 経由で PHPMailer をインストールする

composer require phpmailer/phpmailer

ディレクトリ システム

?Adapter
 ┣ ?src
 ┃ ┣ ?Interfaces
 ┃ ┃ ┗ ?IMailer.php
 ┃ ┣ ?Adapters
 ┃ ┃ ┗ ?PHPMailerAdapter.php
 ┃ ┗ ?Services
 ┃   ┗ ?ServicoDeEmail.php
 ┣ ?vendor
 ┣ ?composer.json
 ┗ ?index.php

自動ロード

composer.json ファイル (プロジェクトのルートにあります) に、クラスを自動的にロードするための App 名前空間を追加します。

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "require": {
        "phpmailer/phpmailer": "^6.5"
    }
}

インターフェイス IMailer

namespace App\Interfaces;

interface IMailer {
    public function send($to, $subject, $message);
}

クラス PHPMailerAdapter

namespace App\Adapters;

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use App\Interfaces\IMailer;

class PHPMailerAdapter implements IMailer {
    private $phpMailer;

    public function __construct() {
        $this->phpMailer = new PHPMailer(true);

        // Basic PHPMailer configuration
        $this->phpMailer->isSMTP();
        $this->phpMailer->Host = 'smtp.example.com';
        $this->phpMailer->SMTPAuth = true;
        $this->phpMailer->Username = '[email protected]';
        $this->phpMailer->Password = 'password';
        $this->phpMailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $this->phpMailer->Port = 587;
        $this->phpMailer->setFrom('[email protected]', 'Your Name');
    }
}
  • メソッド送信
public function send($to, $subject, $message) {
    try {
        $this->phpMailer->addAddress($to);
        $this->phpMailer->Subject = $subject;
        $this->phpMailer->Body = $message;
        $this->phpMailer->send();
        echo 'Email sent successfully!';
    } catch (Exception $e) {
        echo "Failed to send email: {$this->phpMailer->ErrorInfo}";
    }
}

クラスメールサービス

namespace App\Services;

use App\Interfaces\IMailer;

class EmailService {
    private $mailer;

    public function __construct(IMailer $mailer) {
        $this->mailer = $mailer;
    }
}
  • メソッド sendEmailToClient
public function sendEmailToClient($to, $subject, $message) {
    $this->mailer->send($to, $subject, $message);
}

ファイルindex.php

require 'vendor/autoload.php';

use App\Adapters\PHPMailerAdapter;
use App\Services\EmailService;

// Creating the PHPMailer Adapter
$mailer = new PHPMailerAdapter();

// Using the email service with the IMailer interface
$emailService = new EmailService($mailer);

// Sending an email
$emailService->sendEmailToClient('[email protected]', 'Email Subject', 'Message content.');

構造の説明

  • IMailer.php: 電子メール システムが実装する必要がある IMailer インターフェイスを定義します。
  • PHPMailerAdapter.php: PHPMailer を IMailer インターフェイスに適応させます。
  • EmailService.php: IMailer インターフェイスを使用して電子メールを送信する電子メール サービス。
  • Index.php: 電子メール サービスを使用してメッセージを送信するメイン ファイル。
リリースステートメント この記事は次の場所に転載されています: https://dev.to/xxzeroxx/php-design-pattern-adapter-3hi1?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3