optimeconsulting/sf-emails

There is no license information available for the latest version (dev-master) of this package.

Installs: 1 986

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 2

Language:JavaScript

dev-master / 4.1.x-dev 2024-05-03 18:35 UTC

This package is auto-updated.

Last update: 2024-05-03 18:35:45 UTC


README

Bundle para manejo de envio y contenido de correos.

Instalación

composer require "optimeconsulting/sf-emails" "^4.1@dev"

Configuración

Agregar como un bundle en el config/bundles.php:

<?php

return [
    ...
    Optime\Email\Bundle\OptimeEmailBundle::class => ['all' => true],
];

Configuración de opciones:

Crear/Ajustar el archivo config/packages/optime_emails.yaml:

# Por ahora sin nada que agregar, no se necesita crea el archivo

Crear el archivo config/routes/optime_emails.yaml:

optime_emails:
  resource: "@OptimeEmailBundle/Controller/"
  prefix:   /{_locale}/admin/emails
  type:     attribute

Crear entidad EmailApp

La clase EmailApp debe implementar Optime\Email\Bundle\Entity\EmailAppInterface:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Optime\Email\Bundle\Entity\EmailAppInterface;

#[ORM\Entity]
class EmailApp implements EmailAppInterface
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private ?int $id;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function __toString(): string
    {
        return (string)$this->getId();
    }

    public function getFromEmail(): string
    {
        return 'from@from.com';
    }

    public function getFromName(): string
    {
        return 'From Name';
    }
}

Tener en cuenta que si se están usando anotaciones para el proyecto, la entidad EmailApp tambien debe usar anotaciones en vez de atributos de php.

Agregar configuracion de la entidad EmailApp en el config/packages/doctrine.yaml:

doctrine:
    ...
    orm:
        ...
        resolve_target_entities:
            Optime\Email\Bundle\Entity\EmailAppInterface: App\Entity\EmailApp

Correr comando de doctrine:

symfony console doctrine:schema:update -f

Importante

Este bundle requiere del bundle de sfutils, el se va a instalar automáticamente. De todas formas será necesario configurar dicho bundle siguiendo su documentación.

Tambien será necesario instalar y configurar las extensiones de doctrine, especificamente la de traducciones, para ello seguir la documentación del bundle StofDoctrineExtensionsBundle

Uso

Ejemplo básico:

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory
    ) {
    }

    public function send(User $user): void
    {
        $intent = $this->factory->create('template_code_xxx');
        
        $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
        $variables = [
            'first_name' => $user->firstName(),
            'last_name' => $user->lastName(),
        ];

        $intent->send($variables, $recipient);
    }
}

Custom EmailApp:

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;
use App\Repository\EmailAppRepository;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory,
        private EmailAppRepository $appRepository,
    ) {
    }

    public function send(User $user): void
    {
        $app = $this->appRepository->find(3);
        $intent = $this->factory->create('template_code_xxx', $app);
        
        $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
        $variables = [
            'first_name' => $user->firstName(),
            'last_name' => $user->lastName(),
        ];

        $intent->send($variables, $recipient);
    }
}

Varios usuarios:

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;
use App\Repository\EmailAppRepository;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory,
        private EmailAppRepository $appRepository,
    ) {
    }

    public function send(User $userA, User $userB, User $userC): void
    {
        $app = $this->appRepository->find(3);
        $intent = $this->factory->create('template_code_xxx', $app);
        
        foreach([$userA, $userB, $userC] as $user) {
                    
            $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
            
            $variables = [
                'first_name' => $user->firstName(),
                'last_name' => $user->lastName(),
                '_locale' => $user->getLocale(), // opcional, si se pasa se usa ese valor para los textos, y si no, se usa el locale de la petición actual.
            ];

            $intent->send($variables, $recipient);
        }
    }
}

App Resolver:

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;
use App\Repository\EmailAppRepository;
use Optime\Email\Bundle\Service\Email\App\EmailAppResolver;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory,
        private EmailAppRepository $appRepository,
    ) {
    }

    public function send(Event $event, User $user): void
    {
        $appResolver = new EmailAppResolver(function() use ($event) {
            return $this->appRepository->findByEvent($event)
        });
    
        $intent = $this->factory->create('template_code_xxx', $appResolver);
        
        $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
        $variables = [
            'first_name' => $user->firstName(),
            'last_name' => $user->lastName(),
        ];

        $intent->send($variables, $recipient);
    }
}

Variable _email_id:

Todos los templates tienen disponible una variable especial llamada _email_id la cual contiene el uuid del log del correo para poder con dicho valor generar una url y que los usuarios puedan ver el contenido del correo en el navegador.