2012-05-31 16 views
10

परिदृश्य: डेटाबेस से एक ईमेल टेम्पलेट लाएं, और प्राप्तकर्ताओं की एक सूची के माध्यम से लूप, प्रत्येक के लिए ईमेल वैयक्तिकृत करें।PHP गहरी क्लोन ऑब्जेक्ट

मेरा ईमेल टेम्पलेट एक नेस्टेड ऑब्जेक्ट के रूप में वापस कर दिया गया है। यह थोड़ा इस प्रकार दिखाई देंगे:

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

तब मैं प्राप्तकर्ताओं के माध्यम से लूप, एक निजीकृत करने के लिए इस $ ईमेल वस्तु गुजर() फ़ंक्शन:

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

मुद्दा, ज़ाहिर है, वह यह है कि मैं व्यक्तिगतकरण टैग को प्रतिस्थापित करने के लिए संदर्भ द्वारा $ ईमेल ऑब्जेक्ट को पास करने की आवश्यकता है - लेकिन यदि मैं ऐसा करता हूं, तो मूल ऑब्जेक्ट बदल जाता है और इसमें वैयक्तिकरण टैग नहीं होते हैं।

जैसा कि मैं समझता हूं, क्लोन यहां मेरी सहायता नहीं करेगा, क्योंकि यह केवल एक उथली प्रतिलिपि बनाएगा: ईमेल ऑब्जेक्ट के अंदर सामग्री ऑब्जेक्ट को क्लोन नहीं किया जाएगा।

मैंने इसे अनसुलझा (serialize ($ obj)) के साथ गोल करने के बारे में पढ़ा है - लेकिन मैंने जो कुछ भी पढ़ा है, वह कहता है कि यह एक बड़ा प्रदर्शन हिट है।

तो, दो अंत में मेरे दो सवालों पर कैसे पहुंचेंगे:

  1. unserialize (क्रमानुसार ($ obj)) एक उचित समाधान यहाँ है?
  2. या क्या मैं इस पूरी चीज़ के बारे में गलत हूं? क्या कोई अलग तरीका है कि मैं उस ईमेल ऑब्जेक्ट की वैयक्तिकृत प्रतियां उत्पन्न कर सकता हूं?
+0

मुझे लगता है कि स्विफ्टमेलर क्या कर रहा है जो आप सजावटी प्लगइन (http://swiftmailer.org/docs/plugins.html#decorator-plugin) के साथ करने का प्रयास कर रहे हैं, इसके साथ ही यह अच्छा काम करता है हेडर; हम इसके साथ बहुत कम स्पैम परिणाम प्राप्त कर रहे हैं। – scott

उत्तर

14

आप अपनी ईमेल कक्षा में __clone() विधि जोड़ सकते हैं। जिसे क्लोन() के माध्यम से इस वर्ग का एक उदाहरण क्लोन किया जाता है, जिसे स्वचालित रूप से बुलाया जाता है। इस विधि में आप मैन्युअल रूप से टेम्पलेट जोड़ सकते हैं।

उदाहरण:

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

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

एक और अधिक सामान्य और शक्तिशाली समाधान: MyCLabs\DeepCopy

यह __clone अधिभारित किए बिना गहरी प्रति बनाने में मदद करता है (यदि आपके पास बहुत सारी ऑब्जेक्ट्स हैं तो बहुत सारे काम हो सकते हैं)।

+2

यह तरीका है, खासकर जब ओआरएम (यानी डॉक्टर 2) का उपयोग करते समय। –

+0

उत्कृष्ट और सुरुचिपूर्ण समाधान, धन्यवाद – Ryall

संबंधित मुद्दे