2012-10-18 9 views
9

मैं सफलता के साथ followig कोड नियंत्रक से ईमेल भेजने के लिए उपयोग कर सकते हैं:मैं सिम्फनी 2 सेवा कक्षा से ईमेल कैसे भेज सकता हूं?

$message = \Swift_Message::newInstance() 
    ->setSubject('Hello Email') 
    ->setFrom('[email protected]') 
    ->setTo('[email protected]') 
    ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name))) 
; 
$this->get('mailer')->send($message); 

कैसे मैं एक सेवा वर्ग से इसका इस्तेमाल करने के कोड संशोधित करना होगा?

उत्तर

11

आपकी सेवा में बाहरी निर्भरता है, विशेष रूप से मेलर सेवा। आप या तो सेवा कंटेनर को इंजेक्ट कर सकते हैं, या मेलर सेवा इंजेक्ट कर सकते हैं।

यदि आपकी सेवा केवल मेलर सेवा की आवश्यकता है और कुछ भी नहीं, तो मैं केवल मेलर सेवा इंजेक्शन देने का सुझाव दूंगा। , अपने वर्ग के भीतर

<service id="my.service" class="Acme\DemoBundle\Service\Hello"> 
    <call method="setMailer"> 
     <argument type="service" id="mailer" /> 
    </call> 
</service> 

अपने सेटर बारे में:

class Hello 
{ 
    protected $mailer; 

    public function setMailer($mailer) 
    { 
     $this->mailer = $mailer; 
    } 

    public function sendEmail() 
    { 
     $message = \Swift_Message::newInstance() 
      ->setSubject('Hello Email') 
      ->setFrom('[email protected]') 
      ->setTo('[email protected]') 
      ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name))) 
     ; 
     $this->mailer->send($message); 
    } 
} 

नोट: प्रस्तुत करने के लिए आप होगा

यहाँ कैसे आप एक सेटर का उपयोग कर मेलर सेवा सुई डीआईसी कॉन्फ़िगर होता है अपने टेम्पलेट को अपने कंट्रोलर के भीतर पास करें और इस ईमेल फ़ंक्शन को पास करें, या टेम्पलेटिंग सेवा इंजेक्ट करें और अपनी सेवा में प्रस्तुत करें।

+3

कन्स्ट्रक्टर इंजेक्शन क्यों नहीं? – igorw

+0

वास्तव में व्यक्तिगत वरीयता। यदि यह वर्ग केवल एक चीज करने जा रहा है तो सुनिश्चित करें, इसे एक कन्स्ट्रक्टर बनाएं। यद्यपि सेवा अधिक कर रही थी, कहें कि कन्स्ट्रक्टर तर्क, प्रारंभिकरण और कई बाहरी निर्भरताएं थीं, यह बहुत तेज़ी से गन्दा हो सकती है। – Alex

+2

'रेंडरव्यू' कहां से आता है? : पी – RedactedProfile

2

यह निर्भर करता है कि आपने सेवा कैसे घोषित की है। यदि आप इसे पूरा सेवा कंटेनर पास कर रहे हैं तो आपको कुछ भी बदलने की आवश्यकता नहीं होगी, अन्यथा आपको कम से कम मेलर और टेम्पलेटिंग सेवा की आवश्यकता होगी और अधिक सीधे कहा जाएगा ($this->get('service') परिणामस्वरूप घातक त्रुटि sinc होगा container पर निर्भर करता है)

यह भी देखें https://stackoverflow.com/a/12905319/258674