আমি কীভাবে 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.