2013-01-16 21 views
10

मैं एक सेवा है जो UserManager फैली है, इसलिए जब मैं कार्य करें:इंजेक्षन SwiftMailer

Fatal error: Call to undefined method My\MyBundle\Service\ServiceClass::get() 

मैं जानता हूँ कि यह क्योंकि मैं इंजेक्षन करने की जरूरत है:

$message = \Swift_Message::newInstance() 
      ->setSubject('~') 
      ->setFrom('~') 
      ->setTo('~') 
      ->setBody('~', 'text/html'); 
     $this->get('mailer')->send($message); 

मैं त्रुटि मिलती है यहां स्विफ्टमेलर, लेकिन कैसे? (आमतौर पर सेवा वर्ग 'जेनेरिक' बढ़ाता है इसलिए स्विफ्ट मेलर शामिल है।)

उत्तर

18

इस बात पर निर्भर करता है कि आप किस प्रकार की सेवा फ़ाइल का उपयोग कर रहे हैं, आपको अपनी सेवा में सीधे इंजेक्ट करने की आवश्यकता है जैसा आपने कहा था।

एक्सएमएल:

<services> 
     <service id="sample.service" class="%sample.service.class%"> 
      <argument type="service" id="mailer" /> 
     </service> 
</services> 

YAML:

services: 
    sample.service: 
     class:  %sample.service.class% 
     arguments: [@mailer] 

आप बस इस तरह अपने निर्माता में सेवा प्राप्त कर सकते हैं। या यदि आप वास्तव में चाहते हैं, तो आप service_container इंजेक्ट कर सकते हैं। लेकिन यह वास्तव में गंदा है, क्योंकि आप केवल अपनी आवश्यक सेवाओं को इंजेक्ट कर सकते हैं।

इंजेक्शन service_container केवल तभी आवश्यक है जब आपको गतिशील सेवा कॉल की आवश्यकता हो।

+0

मैंने .yml फ़ाइल में सेवा जोड़ दी है, लेकिन मुझे यकीन नहीं है कि कक्षा के निर्माता में इसे कैसे कॉल किया जाए? –

+2

बस कन्स्ट्रक्टर में पैरामीटर जोड़ें, जैसे 'सार्वजनिक फ़ंक्शन __construct ($ mailer)' और फिर उदा। इसे कन्स्ट्रक्टर बॉडी में एक निजी संपत्ति के लिए असाइन करें। –

+1

एक डमी गाइड: उपरोक्त उत्तर के रूप में सेवा जोड़ें। फिर उपरोक्त टिप्पणी के रूप में निर्माता को जोड़ें। फिर कन्स्ट्रक्टर में '$ this-> मेलर = $ मेलर' जोड़ें। फिर आप इसका उपयोग कर सकते हैं: '$ this-> मेलर-> भेजें ($ संदेश);' –