2012-05-31 18 views
10

Escenario: obtener una plantilla de correo electrónico de la base de datos y recorrer una lista de destinatarios, personalizando el correo electrónico para cada uno.Objeto PHP de clonación profunda

Mi plantilla de correo electrónico se devuelve como un objeto anidado. Puede parecer un poco como esto:

object(stdClass) { 
    ["title"] => "Event Notification" 
    ["sender"] => "[email protected]" 
    ["content"] => object(stdClass) { 
     ["salutation"] => "Dear %%firstname%%," 
     ["body"] => "Lorem ipsum %%recipient_email%% etc etc..." 
    } 
} 

Entonces bucle a través de los receptores, pasando este objeto de correo electrónico $ a un Personalizar función():

foreach($recipients as $recipient){ 
    $email_body = personalise($email, $recipient); 
    //send_email(); 
} 

El problema, por supuesto, es que tengo necesita pasar el objeto $ email por referencia para poder reemplazar las etiquetas de personalización, pero si lo hago, el objeto original cambia y ya no contiene las etiquetas de personalización.

Según entiendo, el clon no me ayudará aquí, porque solo creará una copia superficial: el objeto de contenido dentro del objeto de correo electrónico no se clonará.

He leído sobre cómo solucionar esto con unserialize (serialize ($ obj)) - pero todo lo que he leído dice que esto es un gran golpe de rendimiento.

Así, dos finalmente llegar a mis dos preguntas:

  1. Es unserialize (serializar ($ obj)) una solución razonable aquí?
  2. ¿O estoy haciendo todo esto mal? ¿Hay alguna forma diferente de que I pueda generar copias personalizadas de ese objeto de correo electrónico?
+0

Me parece que swiftmailer hace un gran trabajo al hacer lo que estás tratando de hacer con el plugin de decorador (http://swiftmailer.org/docs/plugins.html#decorator-plugin), además de que hace un buen trabajo con el encabezados; estamos obteniendo muy bajos resultados de spam con él. – scott

Respuesta

14

Puede agregar un método __clone() a su clase de correo electrónico. Que se llama automáticamente cuando se clona una instancia de esta clase a través de clone(). En este método, puede agregar manualmente la plantilla.

Ejemplo:

class email { 
    __clone() { 
     $this->template = new template(); 
    } 
} 

.

unserialize(serialize($object)); // would be another solution... 
8

Otra solución más genérica y de gran alcance: MyCLabs\DeepCopy.

Ayuda a crear copias profundas sin tener que sobrecargar __clone (lo que puede ser mucho trabajo si tiene muchos objetos diferentes).

+2

Ese es el camino a seguir, especialmente cuando se usa ORM (es decir, Doctrine2). –

+0

Solución excelente y elegante, gracias – Ryall