2012-05-31 8 views
10

Scenariusz: pobierz szablon wiadomości e-mail z bazy danych i zapętlić listę odbiorców, personalizując wiadomość e-mail dla każdej z nich.Obiekt PHP do klonowania głębokiego

Mój szablon e-mail jest zwracany jako obiekt zagnieżdżony. To może wyglądać trochę tak:

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

Potem pętla przez odbiorców, przekazując tę ​​$ email obiektu do personalizacji() Funkcja:

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

Problem, oczywiście, jest to, że musisz przekazać obiekt $ email przez odniesienie, aby zastąpił on znaczniki personalizacji - ale jeśli to zrobię, oryginalny obiekt zostanie zmieniony i nie będzie zawierał tagów personalizacji.

Jak rozumiem, klon nie pomoże mi tutaj, ponieważ utworzy tylko płytką kopię: obiekt zawartości wewnątrz obiektu wiadomości e-mail nie zostanie sklonowany.

Przeczytałem o tym, jak to obejść z niezidentyfikowaniem (serializacja ($ obj)) - ale wszystko, co przeczytałem, mówi, że jest to duży hit wydajnościowy.

Tak, dwa w końcu dostać się do moich dwóch pytań:

  1. Czy unserialize (serializacji ($ obj)) rozsądnym rozwiązaniem tutaj?
  2. Czy wszystko w porządku? Czy istnieje inny sposób, w jaki mogę generować spersonalizowane kopie tego obiektu poczty elektronicznej?
+0

Uważam, że swiftmailer wykonuje świetną robotę, robiąc to, co próbujesz zrobić z wtyczką dekoratora (http://swiftmailer.org/docs/plugins.html#decorator-plugin), a także wykonuje dobrą robotę z nagłówki; otrzymujemy z tego bardzo niski wynik spamu. – scott

Odpowiedz

14

Możesz dodać metodę __clone() do swojej klasy poczty e-mail. Który jest wywoływany automatycznie, gdy instancja tej klasy jest klonowana przez clone(). W tej metodzie możesz ręcznie dodać szablon.

przykład:

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

.

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

Innym bardziej ogólne i wydajne rozwiązanie: MyCLabs\DeepCopy.

Pomaga utworzyć głęboką kopię bez konieczności przeciążania __clone (co może być dużo pracy, jeśli masz wiele różnych obiektów).

+2

To jest droga, szczególnie podczas korzystania z ORM (to znaczy Doctrine2). –

+0

Doskonałe i eleganckie rozwiązanie, dzięki – Ryall

Powiązane problemy