সিমফনি 2 কনফিগারেশন থেকে কীভাবে কনফিগারেশন সেটিংস পড়তে পারি?


191

আমি আমার কনফিগারেশন.মিল ফাইলটিতে একটি সেটিং যুক্ত করেছি:

app.config:
    contact_email: somebody@gmail.com
    ...

আমার জীবনের জন্য, আমি কীভাবে এটি ভেরিয়েবলের মধ্যে পড়তে পারি তা বুঝতে পারি না। আমি আমার কন্ট্রোলারগুলির মধ্যে একটিতে এরকম কিছু চেষ্টা করেছি:

$recipient =
$this->container->getParameter('contact_email');

তবে আমি এই বলে একটি ত্রুটি পেয়েছি:

"কন্টাক্ট_ইমেল" পরামিতিটি অবশ্যই সংজ্ঞায়িত করা উচিত।

আমি আমার ক্যাশে সাফ করে দিয়েছি, আমি সিম্ফনি 2 পুনরায় লোড হওয়া সাইটের ডকুমেন্টেশনগুলিতেও সর্বত্র দেখেছি, তবে কীভাবে এটি করব তা আমি খুঁজে পাচ্ছি না।

সম্ভবত এখন এটি নির্ণয় করতে খুব ক্লান্ত। যে কেউ এই ব্যাপারে সাহায্য করতে পারেন?

উত্তর:


194

এর contact_emailমধ্যে সংজ্ঞা দেওয়ার পরিবর্তে এন্ট্রিতে app.configএটি সংজ্ঞায়িত করুন parameters:

parameters:
    contact_email: somebody@gmail.com

আপনার কন্ট্রোলারের মধ্যে আপনি যে কলটি করছেন সেটি এখন কাজ করছে।


4
এটি কীভাবে ডেভ / প্রোড পরিবেশের সাথে কাজ করবে? সুতরাং পরীক্ষার জন্য আমি ইমেলগুলি একটি পরীক্ষার ইমেলটিতে প্রেরণ করতে চাই এবং উত্পাদনটি আরও একটি ইমেল পেতে পারে
ফিল প্যাফোর্ড

2
@Phill: যদি আপনি আপনার symfony2 আদর্শ swiftmailer ব্যবহার করে থাকেন, আপনি নিম্নলিখিত সেটিংটি আপনার config_dev.yml মধ্যে ব্যবহার করতে পারেন: swiftmailer: delivery_address: dev@example.com আপনি আরও তথ্য পেতে পারেন Symfony2 পাকপ্রণালীর
পিয়ের

4
আমি যখন এই বিবৃতিটি $ এই-> ধারক-> গেটপ্যারামিটার ('যোগাযোগ_মিল') ব্যবহার করি তখন আমি কি সর্বত্র (নিয়ন্ত্রক, সত্তা, শ্রেণি) কনটেইনার ক্লাসটি ইনজেক্ট করা উচিত ; ? বা কনটেইনার ক্লাস না করেই কী এর থেকে সহজ উপায় আছে?
ওয়েবলবার

1
এই সমাধান অনুসারে আমি কীভাবে নেস্টেড সম্পত্তিগুলিতে অ্যাক্সেস করতে পারি?
ওসমান

1
@ ওয়েলব্লুভার কেবল %parameter_name%স্বরলিপিটি ব্যবহার করে প্যারামিটারটি সন্নিবেশ করুন (
ইয়ামএলএ

173

চলন্ত সমাধান যদিও contact_emailকরতে parameters.yml, সহজ হিসাবে অন্যান্য উত্তর প্রস্তাব সহজেই আপনার পরামিতি ফাইল বিশৃঙ্খল পারেন যদি আপনি অনেক থোকায় থোকায় সাথে মোকাবিলা অথবা আপনি কনফিগারেশন নেস্টেড ব্লক সাথে মোকাবিলা পারেন।

  • প্রথমত, আমি কঠোরভাবে প্রশ্নের উত্তর দেব।
  • পরবর্তীতে, আমি পরামিতি হিসাবে কখনও কোনও সাধারণ স্থানের মধ্য দিয়ে না গিয়ে পরিষেবাগুলি থেকে সেগুলি কনফিগার করার জন্য একটি দৃষ্টিভঙ্গি দেব।

প্রথম পদ্ধতি: পৃথক পৃথক কনফিগারেশন ব্লক, এটি প্যারামিটার হিসাবে পেয়েছে

একটি এক্সটেনশনের সাহায্যে ( এখানে আরও এক্সটেনশনের উপরে ) আপনি সহজেই এটিকে "আলাদা" করতে বিভিন্ন ব্লকের মধ্যে রাখতে পারেন config.ymlএবং তারপরে নিয়ামক থেকে প্যারামিটার গেটেবল হিসাবে ইনজেকশন করতে পারেন।

DependencyInjectionডিরেক্টরিতে আপনার এক্সটেনশন ক্লাসের ভিতরে এটি লিখুন:

class MyNiceProjectExtension extends Extension
{
    public function load( array $configs, ContainerBuilder $container )
    {
        // The next 2 lines are pretty common to all Extension templates.
        $configuration = new Configuration();
        $processedConfig = $this->processConfiguration( $configuration, $configs );

        // This is the KEY TO YOUR ANSWER
        $container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ] );

        // Other stuff like loading services.yml
    }

তারপরে আপনার কনফিগার.আইএমএল, কনফিগার_দেহ.আইএমএল এবং যাতে আপনি সেট করতে পারেন

my_nice_project:
    contact_email: someone@example.com

config.ymlআপনার অভ্যন্তরে এটি প্রক্রিয়া করতে সক্ষম হতে আপনার একই নামের জায়গাতেও MyNiceBundleExtensionএকটি Configurationশ্রেণি প্রয়োজন :

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root( 'my_nice_project' );

        $rootNode->children()->scalarNode( 'contact_email' )->end();

        return $treeBuilder;
    }
}

তারপরে আপনি নিজের আসল প্রশ্নের মতো আপনি নিজের কন্ট্রোলারের কাছ থেকে কনফিগারেশনটি পেতে পারেন তবে parameters.ymlপরিষ্কার রাখছেন config.ymlএবং আলাদা আলাদা বিভাগে সেট করুন:

$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );

দ্বিতীয় যোগাযোগ: পৃথক করা কনফিগারেশন ব্লক, কোনও পরিষেবাতে কনফিগারেশন ইনজেক্ট করে

পাঠকদের জন্য অনুরূপ কিছু সন্ধান করা কিন্তু পরিষেবা থেকে কনফিগারেশন পাওয়ার জন্য, এমনকি একটি দুর্দান্ত উপায় আছে যা "পরামিতি" সাধারণ স্থানকে কখনও বিশৃঙ্খলা করে না এবং এমনকি containerপরিষেবাটিতে যাওয়ার প্রয়োজনও হয় না (পুরো ধারকটি পাস করা অনুশীলন হয়) এড়াতে).

এই কৌশলটি আপনার কনফিগার প্যারামিটারের জায়গাগুলিতে এখনও "ইনজেকশন" দেয়।

তবুও, আপনার পরিষেবার সংজ্ঞা লোড করার পরে, আপনি কোনও পদ্ধতি-কল যুক্ত করতে পারেন উদাহরণস্বরূপ setConfig()যা কেবলমাত্র পরিষেবাটিতে এই ব্লকটিকে ইনজেক্ট করে।

উদাহরণস্বরূপ, এক্সটেনশন শ্রেণিতে:

class MyNiceProjectExtension extends Extension
{
    public function load( array $configs, ContainerBuilder $container )
    {
        $configuration = new Configuration();
        $processedConfig = $this->processConfiguration( $configuration, $configs );

        // Do not add a paramater now, just continue reading the services.
        $loader = new YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) );
        $loader->load( 'services.yml' );

        // Once the services definition are read, get your service and add a method call to setConfig()
        $sillyServiceDefintion = $container->getDefinition( 'my.niceproject.sillymanager' );
        $sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'contact_email' ] ) );
    }
}

তারপরে আপনি services.ymlকোনও নিখুঁত পরিবর্তন ছাড়াই আপনার পরিষেবাটিকে যথারীতি সংজ্ঞায়িত করেন:

services:
    my.niceproject.sillymanager:
        class: My\NiceProjectBundle\Model\SillyManager
        arguments: []

এবং তারপরে আপনার SillyManagerক্লাসে, কেবল পদ্ধতিটি যুক্ত করুন:

class SillyManager
{
    private $contact_email;

    public function setConfig( $newConfigContactEmail )
    {
        $this->contact_email = $newConfigContactEmail;
    }
}

নোট করুন যে এটি স্কেলারের মানগুলির পরিবর্তে অ্যারেগুলির জন্যও কাজ করে! কল্পনা করুন যে আপনি একটি খরগোশের সারিটি কনফিগার করেছেন এবং হোস্ট, ব্যবহারকারী এবং পাসওয়ার্ডের প্রয়োজন:

my_nice_project:
    amqp:
        host: 192.168.33.55
        user: guest
        password: guest

অবশ্যই আপনার গাছটি পরিবর্তন করা দরকার তবে আপনি এটি করতে পারেন:

$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );

এবং তারপরে পরিষেবাটি করুন:

class SillyManager
{
    private $host;
    private $user;
    private $password;

    public function setConfig( $config )
    {
        $this->host = $config[ 'host' ];
        $this->user = $config[ 'user' ];
        $this->password = $config[ 'password' ];
    }
}

আশাকরি এটা সাহায্য করবে!


যদি আপনি হতাশ করছি কি প্রথম পদ্ধতির এবং ডকুমেন্টেশন মধ্যে আলাদা, এটা যে কনফিগ মানের মধ্যে পরামিতি রূপান্তরিত হয় MyNiceProjectExtension->load()এই লাইন দিয়ে পদ্ধতি: $container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ]);। ধন্যবাদ জাভি!
jxmallett

নিখুঁত উত্তর, লজ্জা সিমফনি আপনাকে প্যারামিটারগুলির মতো একইভাবে কনফিগার করতে দেয় না।
মার্টিন লেন

এটি একটি ভাল উত্তর, তবে এটি কোনও অ্যাপ্লিকেশনকে "কনফিগার করার" পদ্ধতিতে সিমফোনির অবচেতন উপায়টি প্রকাশ করে ose আপনি যখন সুনির্দিষ্ট পরিষেবাগুলি অ্যাক্সেসের জন্য লিখতে এবং অনুরোধ করতে চান তখন নির্বিচার পরিবেশের কনফিগারেশন ফাইলগুলি কী। সিমফোনির কেউ সেখানে বসে বুঝতে পারেন নি, 'সম্ভবত ডেভেলপাররা তাদের অ্যাপ্লিকেশনগুলিতে পরিবেশের নির্দিষ্ট মান প্রদান করতে চাইবে যা তারা অ্যাক্সেস করতে পারে' কনফিগারেশন ফাইলের বিন্দু কি না? তারা "STKTFANREO" ডিজাইনের ধরণটি অনুসরণ করছে: "এফ'ডগুলিতে গাঁটছাঁট সেট করুন এবং 'তাদের ছিঁড়ে
ফেলুন

এটিতে বেশ কয়েকটি অ্যাপ্লিকেশন রয়েছে, বিশেষত সমান্তরাল স্বয়ংক্রিয়-পরীক্ষার স্থাপনের ক্ষেত্রে এবং বিশেষত যখন কোনও দল এমন একটি বান্ডিল বিকাশ করে যা মূলত মডেল বা যুক্তি যা বিভিন্ন অ্যাপ্লিকেশনে বেশ কয়েকটি দল ব্যবহার করে, উদাহরণস্বরূপ এমন একটি অ্যাপ্লিকেশন যা ব্যবহারকারীর ফ্রন্ট-এন্ড, অন্যটি হ'ল অ্যাডমিন-প্যানেল ওয়েব ফ্রন্ট এবং অন্যটি যা একটি REST এপিআই। এগুলির প্রতিটি হ'ল ডিফল্টলি কনফিগার করতে ইচ্ছুক একটি আলাদা অ্যাপ্লিকেশন। এটি বেশ কয়েকটি পরিবেশ (উত্পাদন, প্রাক-উত্পাদন, টেস্টিং, দেভেল ইত্যাদি) দ্বারা গুণিত হয়। এটি সহজেই একক সংস্থায় 12 বা 15 কনফিগারেশনে উপার্জন করে।
জাভি মন্টেরো

@ জাভিমন্টেরো আমি আপনার নির্দেশ অনুসরণ করলাম দ্বিতীয় প্রক্রিয়ায়: এবং যখন ফাংশন সেটকনফিগ () এ function এই-> পরিচিতি_মিলকে var_dump বা একটি প্রস্থান () যুক্ত করুন তখন এটি প্রস্থান হয় না। দেখে মনে হচ্ছে সেটকনফিগ কল হয় না
user742736

35

আমাকে ডগলাসের উত্তরে যুক্ত করতে হবে, আপনি গ্লোবাল কনফিগারেশন অ্যাক্সেস করতে পারেন, তবে সিমফনি কিছু পরামিতি অনুবাদ করে, উদাহরণস্বরূপ:

# config.yml
... 
framework:
    session:
        domain: 'localhost'
...

হয়

$this->container->parameters['session.storage.options']['domain'];

আপনি একটি নির্দিষ্ট কী বা মান অনুসন্ধান করতে var_dump ব্যবহার করতে পারেন।


17

আপনার বান্ডেলের জন্য কিছু কনফিগারেশন প্যারামিটার প্রকাশ করতে সক্ষম হওয়ার জন্য আপনাকে এটি করার জন্য ডকুমেন্টেশনের পরামর্শ নেওয়া উচিত। এটি করা মোটামুটি সহজ :)

এখানে লিঙ্কটি রয়েছে: একটি বান্ডিলের জন্য কীভাবে একটি অর্থপূর্ণ কনফিগারেশন প্রকাশ করা যায়


সত্য, 2 বছর আগে এই প্রশ্ন জিজ্ঞাসা করা হয়েছিল, ততক্ষণে উপরোক্ত নিবন্ধটির অস্তিত্ব ছিল না।
josef.van.niekerk

10
আমি যে বিবৃতি সাথে সম্মত হন। আজকাল কেউ এই নিবন্ধটি খোলার ক্ষেত্রে উত্তরটি সেট করে রেখেছি। নেতিবাচক রেটিংয়ের জন্য ধন্যবাদ - আপনি আমার দিনটি তৈরি করেছেন।
নিকোলা পেটকানস্কি

আমার ক্ষমাপ্রার্থী, এখন যে আমি এটির কথা ভাবি, আমার ডাউনভোটটি বন্ধ করা হয়নি। আমি আপনার অবদানের প্রশংসা করি, আমি উত্সাহ দেওয়ার চেষ্টা করেছি কিন্তু এসও এটি আর অনুমতি দেয় না। লিঙ্কটি সবচেয়ে সহায়ক, এবং আমি নিশ্চিত যে অন্যান্য লোকেরা এতে উপকৃত হবে! হয়তো অ্যাডমিন আমার ডাউনটোট পরিবর্তন করতে সহায়তা করতে পারে ???
josef.van.niekerk

আমি বিশ্বাস করি আপনি পূর্বাবস্থায় ফিরে আসতে আবার ক্লিক করতে পারেন।
নিকোলা পেটকানস্কি

আপনি নিজের ভোটটি এক্স (5?) এর বেশি করে নেওয়ার পরে আপনি এটি সম্পন্ন করার কয়েক মিনিট পরে বা বার্তাটি সম্পাদনা না করা অবধি করতে পারবেন
পিজারম্যাকফ্লাই

7

এর আগে যেমনটি বলা হয়েছিল - আপনি ইঞ্জেকশন ধারক ব্যবহার করে যে কোনও পরামিতিগুলি অ্যাক্সেস করতে পারেন এবং এর পরামিতি সম্পত্তিটি ব্যবহার করতে পারেন।

"সিমফনি - কনটেইনার পরিষেবা সংজ্ঞা নিয়ে কাজ করা" এটি সম্পর্কে একটি ভাল নিবন্ধ।


3

Http://tutorial.symblog.co.uk/ এর কোড উদাহরণ থেকে আমি একটি সহজ উপায় শিখেছি

1) ZendeskBlueFormBundle এবং ফাইলের অবস্থান লক্ষ্য করুন

# myproject/app/config/config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: @ZendeskBlueFormBundle/Resources/config/config.yml }

framework:

2) Zendesk_BlueForm.emails.contact_email এবং ফাইলের অবস্থানটি লক্ষ্য করুন

# myproject/src/Zendesk/BlueFormBundle/Resources/config/config.yml

parameters:
    # Zendesk contact email address
    Zendesk_BlueForm.emails.contact_email: dunnleaddress@gmail.com

3) আমি কীভাবে এটি ক্লায়েন্ট এবং ফাইলের নিয়ন্ত্রণকারীর ফাইলের মধ্যে পেয়েছি তা লক্ষ্য করুন

# myproject/src/Zendesk/BlueFormBundle/Controller/PageController.php

    public function blueFormAction($name, $arg1, $arg2, $arg3, Request $request)
    {
    $client = new ZendeskAPI($this->container->getParameter("Zendesk_BlueForm.emails.contact_email"));
    ...
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.