जबकि अन्य मामलों में प्रस्तावित के रूप में 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
}
फिर आपके config.yml, config_dev.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' ];
}
}
उम्मीद है की यह मदद करेगा!