सिम्फनी का सत्र इंटरफेस अभी भी मेरे लिए थोड़ा अस्पष्ट/जादू है। तो अगर कोई मुझे प्रबुद्ध कर सकता है, कृपया।

स्वाभाविक रूप से, अनुरोध में एक सत्र वस्तु होती है और इसे नियंत्रक के भीतर उपयोग किया जा सकता है।

class SimpleController extends AbstractController
{
    public function index(Request $request): Response
    {
        $request->getSession()->set('session-var', 10);
    }
}

हालांकि, एक सेवा के भीतर आप सत्र इंटरफेस को एक सेवा के रूप में भी शामिल कर सकते हैं और संभवतः उसी पैरामीटरबैग के साथ काम कर सकते हैं।

class SimpleService
{
    public function __construct(SessionInterface $session)
    {
        $session->set('session-var', 10);
    }
}

मेरे सहयोगी ने बताया कि एक सत्र अनुरोध का हिस्सा है (और हमेशा होना चाहिए)। यह मेरे लिए समझ में आता है, लेकिन मुझे यह भी सोच रहा है: जब आप अनुरोध की वस्तु/संपत्ति है तो आप सत्र इंटरफेस को सेवा के रूप में क्यों सक्षम कर सकते हैं।


मैं अंत में जो हासिल करना चाहता हूं वह मेरे नियंत्रक में एक सेवा शामिल करना है और इस सेवा में वर्तमान सत्र के साथ काम करना है।

मेरे उपयोग के मामले का कोड उदाहरण कुछ इस तरह दिखेगा।

class SimpleController extends AbstractController
{
    private $simpleService;

    public function __construct(SimpleService $simpleService)
    {
        $this->simpleService = $simpleService;
    }

    public function index(Request $request): Response
    {
        $this->simpleService->doSomething();
    }
}

class SimpleService
{
    private $session;

    public function __construct(SessionInterface $session)
    {
        $this->session = $session;
    }

    public function doSomething()
    {
        // Do some things..... and save the result in the session.
        $this->session->set('just_a_preference', 50);
    }
}

इसलिए:

  1. क्या यह सिम्फनी में सत्रों के साथ काम करने का सही तरीका है?
  2. क्या 'just_a_preference' उसी सत्र पैरामीटर बैग में मेरे $request->getSession() के रूप में सहेजा गया है?
  3. यदि नहीं, तो नियंत्रक के बाहर वर्तमान अनुरोध सत्र के साथ कार्य करने का सही तरीका क्या है?

अगर सिम्फनी 4.4 के साथ काम करते हैं।

2
Sebastien Hoek 27 मार्च 2020, 16:30

1 उत्तर

सबसे बढ़िया उत्तर
  1. दोनों तरीके ठीक हैं। वे दोनों एक ही वस्तु का संदर्भ देते हैं। हालांकि इंटरफ़ेस के माध्यम से सत्र तक पहुंचना पसंद किया जाता है। मैं कम से कम तीन कारणों के साथ आ सकता हूं:

    1. कार्यक्षमता का विस्तार करें: इंटरफ़ेस के पीछे की सेवा को आसानी से सजाया जा सकता है - जैसे। LoggingSessionDecorator जो सत्र गतिविधि को लॉग करेगा
    2. उचित OOP कोड: $request->getSession()->set(…) के साथ आप लॉ ऑफ़ डेमेटर सिद्धांत का उल्लंघन करते हैं , उसने कहा:
    3. आपके यूनिट परीक्षणों में सत्र का मजाक उड़ाना आसान है
  2. अंत में - हाँ, इससे कोई फर्क नहीं पड़ता। दोनों विधियां एक ही वस्तु का संदर्भ देती हैं

  3. जैसा कि 1 में कहा गया है, इंटरफ़ेस का उपयोग करना बेहतर है। कम से कम मेरे विचार में।
1
emix 15 मई 2020, 18:46