मैं symfony2 में एक नियंत्रक में पैरामीटर्स से कैसे पढ़ता हूं?


146

मैंने अपने ऐप / कॉन्फ़िग / पैरामीटर्स में कुछ कस्टम चर जोड़े हैं।

parameters:
    api_pass: apipass
    api_user: apiuser

मुझे अपने नियंत्रक से इन तक पहुंचने की आवश्यकता है, और उनके साथ लाने की कोशिश की है

$this->get('api_user');

मेरी नियंत्रक फ़ाइल के भीतर से। जब मैं यह कोशिश करता हूं, मुझे यह त्रुटि संदेश मिलता है:

You have requested a non-existent service "api_user".

ऐसा करने का सही तरीका क्या है?

जवाबों:


296

में Symfony 2.6 और पुराने संस्करणों , एक नियंत्रक में एक पैरामीटर प्राप्त करने के लिए - आप पहली कंटेनर मिलना चाहिए, और फिर - आवश्यक पैरामीटर।

$this->container->getParameter('api_user');

यह प्रलेखन अध्याय इसे समझाता है।

जबकि $this->get()नियंत्रक में विधि एक सेवा को लोड करेगी ( डॉक्टर )

में Symfony 2.7 और नए संस्करणों , एक नियंत्रक आप निम्नलिखित का उपयोग कर सकते में एक पैरामीटर प्राप्त करने के लिए:

$this->getParameter('api_user');

3
ध्यान दें कि getनियंत्रक में विधि कंटेनर का भी उपयोग करती है, लेकिन यह केवल एक कंटेनर से सेवाएं प्राप्त कर सकती है, पैरामीटर नहीं। आपको getParameterपैरामीटर प्राप्त करने की आवश्यकता है।
राउटर J

जब मैं कोशिश करता $this->getContainer()->getParameter('api_user');हूं तो मुझे घातक त्रुटि मिलती है: अपरिभाषित विधि से कॉल करें .. लॉन्गपैथ .. \ नियंत्रक :: getContainer ()।
बोह्र

1
@ बोह्र सॉरी, सिम्फनी 2 का अलग संस्करण। मैंने अपना उत्तर संपादित कर लिया है - अब इसे जांचें;)
विटाली ज़्यूरियन

2
प्रलेखन के लिए URL अब symfony.com/doc/2.7/compenders/d dependency_injection/…
SilvioQ

सिम्फनी 2.7 और नया: $this->hasParameter()अभी तक काम नहीं कर रहा है।
समन मोहम्मदी

23

द क्लीन वे - 2018+, सिम्फनी 3.4+

2017 और सिम्फनी 3.3 + 3.4 के बाद से बहुत क्लीनर तरीका है - सेटअप और उपयोग में आसान।

कंटेनर और सेवा / पैरामीटर लोकेटर विरोधी पैटर्न का उपयोग करने के बजाय, आप मापदंडों को कक्षा के माध्यम से पास कर सकते हैं । चिंता मत करो, यह समय की मांग का काम नहीं है, बल्कि एक बार सेटअप करें और दृष्टिकोण को भूल जाएं

इसे 2 चरणों में कैसे सेट करें?

1। app/config/services.yml

# config.yml

# config.yml
parameters:
    api_pass: 'secret_password'
    api_user: 'my_name'

services:
    _defaults:
        autowire: true
        bind:
            $apiPass: '%api_pass%'
            $apiUser: '%api_user%'

    App\:
        resource: ..

2. कोई भी Controller

<?php declare(strict_types=1);

final class ApiController extends SymfonyController
{
    /**
     * @var string 
     */
    private $apiPass;

    /**
     * @var string
     */
    private $apiUser;

    public function __construct(string $apiPass, string $apiUser)
    {
        $this->apiPass = $apiPass;
        $this->apiUser = $apiUser;
    }

    public function registerAction(): void
    {
        var_dump($this->apiPass); // "secret_password"
        var_dump($this->apiUser); // "my_name"
    }
}

झटपट अपग्रेड तैयार!

यदि आप पुराने दृष्टिकोण का उपयोग करते हैं, तो आप इसे रेक्टर के साथ स्वचालित कर सकते हैं ।

अधिक पढ़ें

इसे सर्विसेज लोकेटर पर कंस्ट्रक्टर इंजेक्शन कहा जाता है एप्रोच के ।

इसके बारे में अधिक पढ़ने के लिए, मेरी पोस्ट की जाँच करें कि सिम्फनी कंट्रोलर द क्लीन वे में पैरामीटर कैसे प्राप्त करें

(यह परीक्षण किया गया है और मैं इसे नए सिम्फनी प्रमुख संस्करण (5, 6 ...) के लिए अद्यतन रखता हूं)।


इस विषय पर नया न्यूनतम तरीका: tomasvotruba.cz/blog/2018/11/05/…
Tomáš Votruba

10

मैं आपको स्विफ्टमेलर के साथ एक उदाहरण भेजता हूं:

parameters.yml

recipients: [email1, email2, email3]

सेवाएं:

your_service_name:
        class: your_namespace
        arguments: ["%recipients%"]

सेवा का वर्ग:

protected $recipients;

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

8

सिम्फनी 4 में, आप निम्न का उपयोग कर सकते हैं ParameterBagInterface:

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class MessageGenerator
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        $parameterValue = $this->params->get('parameter_name');
        // ...
    }
}

और इसमें app/config/services.yaml:

parameters:
    locale: 'en'
    dir: '%kernel.project_dir%'

यह मेरे लिए कंट्रोलर और फॉर्म क्लास दोनों में काम करता है। अधिक विवरण सिम्फनी ब्लॉग में पाया जा सकता है


1
पूरे मापदंडों के बैग को पार करना एक पूरे कंटेनर को पारित करने की तरह है। यह केवल तभी समझ में आता है जब "कुछ विशेष सेवा को बहुत सारे कंटेनर मापदंडों की आवश्यकता होती है" (पोस्ट से उद्धृत)
टॉमहॉट वोटरुबा

तो, क्या आप मतलब है कि पूरे पैरामीटर के कारण प्रदर्शन में समस्या आ रही है?
ग़ज़लेह जवेहरी 12

यह एक कारण है, लेकिन ज्यादातर पठनीयता के लिए। अगर मुझे पैरामीटर नाम दिखाई देता है, तो मुझे $meetupApiKeyपता है कि क्या अपेक्षा से बेहतर है$parameterBag
टॉम वोटरुबा


0

सिम्फनी में 4.3.1 मैं इसका उपयोग करता हूं:

services.yaml

HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'

FrontController.php

$username = $this->container->getParameter('HTTP_USERNAME');
$password = $this->container->getParameter('HTTP_PASSWORD');

4.8 में काम नहीं करता है। क्या आपको यकीन है कि यह किसी दिन काम आया था?
रिकार्डो मार्टिन्स

मैं वास्तव में इस बारे में भूल गया था, लेकिन हाँ यह शायद काम किया क्योंकि मैंने केवल परीक्षण किया सामान पोस्ट किया!
अचराफ जेडे

1
क्षमा करें, अचरफ। मुझे नहीं पता, लेकिन मेरे नियंत्रक में काम नहीं किया। अपने नियंत्रक के अंदर आप बिना किसी DI के सीधे getParameter कह सकते हैं। अर्थात्: $this->getParameter('foo')। यही मैंने इसे एसएफ 4.8 में काम करने के लिए किया।
रिकार्डो मार्टिन्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.