"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Patrón de diseño PHP: Adaptador

Patrón de diseño PHP: Adaptador

Publicado el 2024-11-06
Navegar:397

El Patrón de diseño del adaptador es un patrón estructural que permite que objetos con interfaces incompatibles trabajen juntos. Actúa como intermediario (o adaptador) entre dos objetos, convirtiendo la interfaz de un objeto en la interfaz esperada por el otro. Esto permite que clases que de otro modo serían incompatibles porque tienen diferentes interfaces cooperen sin modificaciones en su código original.

Estructura del adaptador

El patrón Adaptador generalmente se compone de tres elementos principales:

  • Cliente: La clase que espera trabajar con objetos de una interfaz específica.
  • Adaptee: La clase que tiene una interfaz que es incompatible con el cliente, pero cuyas funcionalidades son necesarias.
  • Adaptador: la clase que implementa la interfaz esperada por el cliente y convierte las llamadas a la interfaz Adaptee.

PHP Design Pattern: Adapter

Tipos de adaptadores

  1. Adaptador de objetos: Basado en composición. El Adaptador contiene una instancia de la clase que está adaptando.
  2. Adaptador de clase: Basado en herencia (generalmente en lenguajes que admiten herencia múltiple).

¿Cuándo utilizar el adaptador?

  • Cuando deseas utilizar una clase existente, pero su interfaz no coincide con lo que el cliente espera.
  • Para integrar nuevas funciones en un sistema heredado, sin tener que modificar el código antiguo.

Este patrón es útil en sistemas que necesitan trabajar con bibliotecas o API externas, permitiéndole adaptar su funcionalidad sin cambiar el código de estas bibliotecas.

Ejemplo de uso de PHPMailer

Aquí hay un ejemplo de cómo utilizar el patrón de diseño del adaptador para integrar PHPMailer con una interfaz personalizada.

Situación:

Supongamos que su sistema espera que cualquier clase de envío de correo electrónico implemente una interfaz llamada IMailer, pero PHPMailer no sigue esta interfaz directamente. El Adaptador se utilizará para adaptar PHPMailer a la interfaz esperada por el sistema.

Instalar PHPMailer a través de Composer

composer require phpmailer/phpmailer

Sistema de directorio

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

Carga automática

En el archivo compositor.json (ubicado en la raíz del proyecto), agregue el espacio de nombres de la aplicación para cargar automáticamente las clases:

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

Interfaz de correo electrónico

namespace App\Interfaces;

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

Clase 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');
    }
}
  • Método de envío
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}";
    }
}

Servicio de correo electrónico de clase

namespace App\Services;

use App\Interfaces\IMailer;

class EmailService {
    private $mailer;

    public function __construct(IMailer $mailer) {
        $this->mailer = $mailer;
    }
}
  • Método enviarEmailToClient
public function sendEmailToClient($to, $subject, $message) {
    $this->mailer->send($to, $subject, $message);
}

Archivo 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.');

Explicación de la Estructura

  • IMailer.php: Define la interfaz IMailer que cualquier sistema de correo electrónico debe implementar.
  • PHPMailerAdapter.php: Adapta PHPMailer a la interfaz IMailer.
  • EmailService.php: Servicio de correo electrónico que utiliza la interfaz IMailer para enviar correos electrónicos.
  • index.php: Archivo principal que utiliza el servicio de correo electrónico para enviar un mensaje.
Declaración de liberación Este artículo se reproduce en: https://dev.to/xxzeroxx/php-design-pattern-adapter-3hi1?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3