2012-05-31 26 views
10

Senaryo: Veritabanından bir e-posta şablonu getirin ve her biri için e-postayı kişiselleştirerek alıcıların bir listesini kullanın.PHP derin klon nesnesi

E-posta şablonum yuvalanmış bir nesne olarak döndürülüyor. Biraz şöyle görünebilir: Alıcıların aracılığıyla

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

ben döngü, bir kişiselleştirmek için bu $ eposta nesnesini geçirerek() fonksiyonu:

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

mesele, tabii ki, yani ben Kişiselleştirme etiketlerini değiştirmesi için $ email nesnesini referans olarak iletmesi gerekir - ancak bunu yaparsam, orijinal nesne değiştirilir ve artık kişiselleştirme etiketleri içermez.

Anladığım gibi, klon burada bana yardımcı olmayacaktır, çünkü yalnızca sığ bir kopya oluşturacaktır: e-posta nesnesindeki içerik nesnesi klonlanmayacaktır.

Bunu unserialize (serialize ($ obj)) ile halletmeyi okudum - ama okuduğum her şey bunun büyük bir performans hit olduğunu söylüyor.

Yani, iki nihayet benim iki sorulara olsun:

  1. unserialize (serialize ($ obj)) makul bir çözüm burada mı? Yoksa bu şeyleri yanlış mı anlatabilirim? 'un bu e-posta nesnesinin kişiselleştirilmiş kopyalarını üretebilmesinin farklı bir yolu var mı?
+0

Ben swiftmailer dekoratör eklentisi (http://swiftmailer.org/docs/plugins.html#decorator-plugin) ile yapmaya çalıştığınız şeyi yapmaya büyük bir iş yapar, artı iyi bir iş yapar başlıkları; onunla çok düşük spam sonuçları alıyoruz. – scott

cevap

14

E-posta sınıfınıza __clone() yöntemini ekleyebilirsiniz. Bu sınıfın bir örneği, clone() aracılığıyla klonlandığında otomatik olarak çağrılır. Bu yöntemde, daha sonra şablonu el ile ekleyebilirsiniz.

Örnek:

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

.

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

başka daha genel ve güçlü bir çözüm: MyCLabs\DeepCopy.

__clone (çok fazla farklı nesneye sahipseniz çok fazla iş olabilir) yüklemenize gerek kalmadan derin kopya oluşturmaya yardımcı olur.

+2

Bu özellikle, ORM (yani Doctrine2) kullanırken kullanmanın yolu. –

+0

Mükemmel ve zarif bir çözüm, teşekkürler – Ryall