চলন্ত সমাধান যদিও 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' ];
}
}
আশাকরি এটা সাহায্য করবে!