2014-06-10 5 views
5

मैंने टेम्पलेटिंग सेवा इंजेक्ट करने की कोशिश की और यही मुझे मिलता है।सर्कुलर संदर्भ सेवा "security.context" के लिए पता चला

<service id="myproject_notification.service.mail" class="%myproject_notification.service.mail.class%"> 
    <argument type="service" id="mailer" /> 
    <argument type="service" id="templating" /> 
</service> 

2014-06-10 12-37-10

अगर मैं टिप्पणी करने या निकालने के लिए, निर्भरता से templating सेवा, सब कुछ अच्छी तरह से काम कर रहा है। मैंने इसके बारे में पुराने मुद्दों को देखा, लेकिन ऐसा लगता है कि इस समय मैं अकेला हूं। क्या मुझसे कुछ गलत हो रही है?

Composer.json

"symfony/symfony": "~2.4", 
"twig/extensions": "~1.0", 
"symfony/assetic-bundle": "~2.3", 
"symfony/swiftmailer-bundle": "~2.3", 
"symfony/monolog-bundle": "~2.4", 
"sensio/distribution-bundle": "~2.3", 
"sensio/framework-extra-bundle": "~3.0", 
"sensio/generator-bundle": "~2.3", 
"incenteev/composer-parameter-handler": "~2.0", 

Composer.lock

"name": "symfony/symfony", 
"version": "v2.5.0", 
... 
"name": "twig/twig", 
"version": "v1.15.1", 
+0

आपका '% myproject_notification.service.mail.class%' कैसा दिखता है? अर्थात् यह किस वर्ग का विस्तार करता है? हो सकता है कि आप पहले से ही उस वर्ग में templating उपलब्ध है। –

+0

यह एक साधारण वर्ग है जिसे मैंने स्वयं लिखा है, बिना किसी विस्तार के, केवल कन्स्ट्रक्टर (स्विफ्टमेलर, टेम्पलेटिंगइंजिन) और एक फ़ंक्शन sendMailToUser (उपयोगकर्ता) भेजता है। हो और मेरे कैश को php ऐप/कंसोल और आरएम-आरएफ के साथ साफ़ कर दिया गया है, इसलिए यह समस्या नहीं है :( – AlixB

+0

आप अपने सेवाओं के डिजाइन पर पुनर्विचार करने पर विचार कर सकते हैं। परिपत्र निर्भरता से बचने का सबसे अच्छा अभ्यास है। अगर आपको वास्तव में इसकी आवश्यकता है, तो इसके बारे में क्या [आलसी सेवाएं] (http: // symfony।कॉम/डॉक्टर/वर्तमान/घटक/निर्भरता_इनजेक्शन/lazy_services.html)? – Touki

उत्तर

7

यह समाधान एक त्वरित तरीका है इस समस्या को ठीक करने के लिए है। इससे बचा जा सकता है, कृपया टिप्पणियां पढ़ें।

इस विशेष मामले के लिए ServiceContainer आपकी सेवा में इंजेक्ट करना सर्वोत्तम हो सकता है। ऐसा लगता है कि आप एक एज केस का अनुभव कर रहे हैं, जहां security.context पहले से ही templating सेवाओं (जैसे सहायक) में इंजेक्शन दिया गया है, जो आपके उदाहरण में security.context पर वापस इंजेक्शन दिया गया है।

इस प्रयास करें:

<service id="myproject_notification.service.mail" class="%myproject_notification.service.mail.class%"> 
    <argument type="service" id="service_container" /> 
</service> 

और अपने वर्ग के निर्माता में, इसका इस्तेमाल इस प्रकार है: https://github.com/symfony/symfony/issues/2347

:

class YourMailerClass 
{ 
    protected $container; 

    public function __construct(ContainerInterface $container) 
    { 
    $this->container = $container; 
    } 

    public function sendMail() 
    { 
     $mailer = $this->container->get('mailer'); 
     $templating = $this->container->get('templating'); 
    } 

} 

एक ही समस्या के बारे में Symfony कोर डेवलपर्स के बीच इस बातचीत देखें

सेवा कंटेनर इंजेक्शन देने वाले ज्यादातर मामलों के लिए सलाह नहीं दी गई हैseveral reasons के लिए।

+0

मैंने कोशिश की। मैं काम करने के लिए इस त्वरित गंदे समाधान की उम्मीद कर रहा था, लेकिन नहीं: /। मुझे एक ही त्रुटि मिलती है -> प्राप्त करें ('templating'); फिर भी धन्यवाद! – AlixB

+0

ठीक है, मेरा बुरा। मैं कन्स्ट्रक्टर में -> get() कर रहा था (जिसका मतलब पैरामीटर में इंजेक्शन के समान ही करना है)। यह समाधान काम करता है। :)। मैं इसे अधिकतम एक दिन में मान्य कर दूंगा! – AlixB

+6

असल में, सेवा कंटेनर इंजेक्शन देने की सलाह नहीं दी जाती है क्योंकि यह एक भयानक अभ्यास है। यह आपकी वस्तु की वास्तविक निर्भरताओं को छुपाता है और [डेमेटर का कानून] (http://en.wikipedia.org/wiki/Law_of_Demeter) को तोड़ता है जो कठिन/गलत इकाई परीक्षण – Touki

7

आपको हमेशा अपनी सेवाओं पर सीधे कंटेनर इंजेक्शन से बचने की कोशिश करनी चाहिए।

मुझे लगता है कि «परिपत्र संदर्भ» समस्या के साथ-साथ संभावित प्रदर्शन समस्याओं के लिए सबसे अच्छा संभव समाधान, सिम्फनी 2.3 से शुरू होने वाली सुविधा «Lazy Services» सुविधा का उपयोग करना होगा।

बस अपनी सेवा कंटेनर कॉन्फ़िगरेशन में lazy के रूप में निर्भरता को चिह्नित करें और प्रॉक्सी मैनेजर ब्रिज इंस्टॉल करें (ऊपर आलसी सेवा प्रलेखन में विवरण देखें)।

मुझे उम्मीद है कि मदद करता है, चीयर्स।

+0

जहां तक ​​मुझे पता है, आलसी सेवा परिपत्र संदर्भ अपवाद को रोक नहीं पाएगी क्योंकि परिपत्र निर्भरता अभी भी मौजूद है। –

+2

दरअसल, यह इसे रोक देगा, क्योंकि निर्भर सेवाओं को दो अलग-अलग चरणों में शुरू किया जाएगा। –

+0

लेकिन परिपत्र संदर्भ सेवाओं को शुरू करते समय अपवाद नहीं फेंक दिया जाता है। जब निर्भरता ग्राफ की गणना की जाती है तो इसे कैश गर्म करने पर फेंक दिया जाता है? कम से कम ऐसा लगता है कि पिछली बार मुझे इसके साथ समस्याएं थीं। –

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