2012-04-07 10 views
18

मैं सेवा से लिंक कैसे उत्पन्न कर सकता हूं? मैंने अपनी सेवा के अंदर "राउटर" इंजेक्शन दिया है, हालांकि /app_dev.php/view/42 के बजाय जेनरेट किए गए लिंक /view/42 हैं। इसे कैसे हल किया जा सकता है?किसी सेवा से एक लिंक उत्पन्न करें

services.yml

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: [ @router ] 

MyService.php

<?php 

namespace My\MyBundle; 

class MyService { 

    public function __construct($router) { 

     // of course, the die is an example 
     die($router->generate('BackoffUserBundle.Profile.edit')); 
    } 
} 
+0

क्या आप कोड को पेस्ट कर सकते हैं जहां आप यूआरएल उत्पन्न करते हैं? –

+0

यदि आप अपनी साइट को http: // test/app_dev.php' के माध्यम से एक्सेस करते हैं, तो लिंक app_dev.php के साथ होंगे। 'Http: // test' के लिए वे app_dev.php के बिना होंगे ... – meze

+0

@ क्यूबा: मैंने अपना प्रश्न संपादित कर लिया है। –

उत्तर

28

तो: आप दो चीजों की आवश्यकता होगी

मेरे कोड कुछ इस तरह है।

सबसे पहले, आप @router पर निर्भरता के लिए होगा (उत्पन्न प्राप्त करने के लिए())।

दूसरे, आप अपनी सेवा "अनुरोध" करने के लिए के दायरे सेट करना होगा (मुझे लगता है कि नहीं छूटा है)। http://symfony.com/doc/current/cookbook/service_container/scopes.html

आपका services.yml हो जाता है:

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: [ @router ] 
     scope: request 

अब आप @router सेवा के जनरेटर समारोह का उपयोग कर सकते हैं!


महत्वपूर्ण Symfony 3.x के बारे में ध्यान दें: doc कहते हैं,

"कंटेनर स्कोप" की अवधारणा इस लेख में विस्तार से बताया Symfony 2.8 में पदावनत और उसे निकाल दिया जाएगा किया गया है सिम्फनी 3.0 में।

request_stack सेवा (Symfony 2.4 में शुरू की गई) के बजाय request सेवा/गुंजाइश का प्रयोग करें और prototype गुंजाइश (साझा सेवाओं के बारे में और अधिक पढ़ें) के बजाय shared सेटिंग (Symfony 2.8 में प्रस्तुत) का उपयोग करें।

+0

मुझे यह नहीं मिला। यह कैसे मदद करता है? स्कोप के पास 'app_dev.php' से कोई लेना देना नहीं है। – meze

+0

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

+0

"आपको @router (जेनरेट() प्राप्त करने के लिए) पर निर्भरता होगी।" मैं समझ नहीं पा रहा हूं, आपके प्रश्न से आपका उत्तर क्या है? – Toskan

2

मैं एक similar issue था, लेकिन Symfony 3. का उपयोग कर जबकि पिछले जवाब में करने के लिए नहीं मिल पाया, यह थोड़ा पता लगाने के लिए वास्तव में एक request_stack का प्रयोग करेंगे scope: request के रूप में एक ही बात को प्राप्त करने के मुश्किल था।

इस सवाल के मामले में, यह कुछ इस तरह दिखेगा:

services.yml config

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: 
      - '@request_stack' 
      - '@router' 

और MyService कक्षा

<?php 

    namespace My\MyBundle; 

    use Symfony\Component\Routing\RequestContext; 

    class MyService { 

     private $requestStack; 
     private $router; 

     public function __construct($requestStack, $router) { 
      $this->requestStack = $requestStack; 
      $this->router = $router; 
     } 

     public doThing() { 
      $context = new RequestContext(); 
      $context->fromRequest($this->requestStack->getCurrentRequest()); 
      $this->router->setContext($context); 
      // of course, the die is an example 
      die($this->router->generate('BackoffUserBundle.Profile.edit')); 
     } 
    } 

नोट: प्रवेश RequestStack में कन्स्ट्रक्टर advised against है क्योंकि अनुरोध को संभालने से पहले संभावित रूप से इसे एक्सेस करने का प्रयास किया जा सकता है कर्नेल द्वारा। इसलिए अनुरोध ऑब्जेक्ट से अनुरोध ऑब्जेक्ट लाने का प्रयास करते समय यह शून्य हो सकता है।

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