আমি কীভাবে 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পরামিতিগুলি নেওয়া দরকার ।
ওয়াটার জে

আমি যখন চেষ্টা $this->getContainer()->getParameter('api_user');করি তখন মারাত্মক ত্রুটি হয়: অপরিজ্ঞাত পদ্ধতিতে কল করুন ..লংপাথ .. \ নিয়ামক :: getContainer ()।
বোহর

1
@ বোহর দুঃখিত, সাইমফনি 2 এর বিভিন্ন সংস্করণ। আমি আমার উত্তর সম্পাদনা করেছি - এখনই এটি পরীক্ষা করে দেখুন;)
ভিটালি জুরিয়ান

2
ডকুমেন্টেশনের জন্য ইউআরএল এখন symfony.com/doc/2.7/components/d
dependency_inication/…

সিমফনি ২.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 ...) আপডেট রাখি।


এই বিষয়ে নিউ minimalistic উপায়: 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
পুরো পরামিতি ব্যাগ পাস করা পুরো পাত্রে পাস করার মতো। এটি কেবল "যদি কিছু নির্দিষ্ট পরিষেবার জন্য প্রচুর ধারক প্যারামিটারগুলির প্রয়োজন হয়" (পোস্টটি থেকে উদ্ধৃত)
টোম ভোটারুবা

সুতরাং, আপনি কি পুরো পরামিতিটি পারফরম্যান্সে সমস্যার কারণ হিসাবে বোঝাচ্ছেন?
গজলেঃ জাভেরি

এটি অন্যতম কারণ তবে বেশিরভাগই পঠনযোগ্যতার জন্য। আমি যদি প্যারামিটারের নামটি দেখতে পাই তবে আমি $meetupApiKeyকী চেয়ে কিছুটা ভাল আশা করতে পারি$parameterBag
টোম ভোটারুবা


0

সিমফোনিতে ৪.৩.১ এ আমি এটি ব্যবহার করেছি:

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
দুঃখিত, আচার্ফ আমি জানি না, তবে আমার কন্ট্রোলারে কাজ করিনি। আপনার নিয়ামকের ভিতরে আপনি কোনও ডিআই ছাড়াই সরাসরি গেটপ্যারামিটার কল করতে পারেন। অর্থাৎ, $this->getParameter('foo')। এটিকে আমি এসএফ ৪.৮-এ কাজ করার জন্য করেছি।
রিকার্ডো মার্টিনস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.