2012-02-03 14 views
5

मैं निर्भरता इंजेक्शन के साथ एक इकाई भंडार में एक सेवा कैसे इंजेक्ट कर सकता हूं?मैं एक इकाई भंडार Symfony2 सिद्धांत में एक सेवा इंजेक्षन कैसे कर सकते हैं?

मैं इस तरह का प्रयास करें:

<service id="rp.repository.user" class="RP\CoreBundle\Repository\UserRepository" 
factory-service="doctrine.orm.entity_manager" factory-method="getRepository"> 
    <call method="setSecurityContext"> 
    <argument type="service" id="security.context"/> 
    </call> 
</service> 

लेकिन setSecurityContext यह कहा जाता है कभी नहीं है Plz मदद

+0

मुझे नहीं पता कि मैं क्या करना चाहता हूं यह अच्छी बात है या नहीं। मैं सुरक्षा संदर्भ में भंडार में प्रवेश करना चाहता हूं यह जांचने के लिए कि वर्तमान उपयोगकर्ता में role_user है या सभी dql अनुरोध में कुछ फ़िल्टर नहीं जोड़ना है। DI i चीज़ के साथ यह संभव नहीं है क्योंकि इकाई प्रबंधक getRepository फ़ंक्शन को कॉल करता है और अनुरोधित भंडार को तुरंत चालू करता है, इसे कंटेनर से नहीं मिलता है, किसी को इस समस्या का कोई विचार है? thx बहुत – EAdel

उत्तर

8

भंडार में एक सेवा इंजेक्शन अनुशंसित नहीं है, क्योंकि यह चिंताएं का पृथक्करण टूट जाता है। इसके बजाय, आपको एक सेवा वर्ग का उपयोग करना चाहिए जो भंडार को कॉल करता है। आपकी टिप्पणी के आधार पर, एक साधारण काम प्रवाह इस तरह दिखेगा:

  • UserService कक्षा को परिभाषित करें, और इसे एक सेवा के रूप में पंजीकृत करें।
  • इंजेक्षन security.contextUserService
  • में परिभाषित UserService::getUsers() (या जो भी आप विधि होना चाहते हैं)। यह विधि में है कि आप क्वेरी के मानदंड निर्धारित करने के लिए security.context का उपयोग करेंगे। आप या तो सीधे UserRepository::getUsers() विधि पर मानदंड पास कर सकते हैं, या UserService ऑब्जेक्ट में DQL बना सकते हैं और इसे UserRepository पर पास कर सकते हैं।
  • UserService::getUsers() जो भी UserRepository::getUsers() रिटर्न देता है।

इस तरह की स्थितियों को मैं संभालना पसंद करता हूं, लेकिन पूर्णता के लिए, आप अपने भंडार पर सरल सेटर इंजेक्शन का भी उपयोग कर सकते हैं। आप इकाई प्रबंधक के माध्यम से भंडार प्राप्त करेंगे (और सेवा कंटेनर से आपके प्रश्न में नहीं), और बस $userRepository->setSecurityContext($this->get('security.context')) पर कॉल करें।

+0

और यदि आवश्यक हो तो एक अपवाद संभवतः? – GorillaApe

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