Hareketli çözümü iken contact_email
üzere parameters.yml
diğer yanıtlar teklif edildiği üzere, kolay, birçok demetleri ile uğraşmak eğer kolayca parametre dosyalarını karmakarışık edebilir veya konfigürasyonun iç içe bloklar ile uğraşmak durumunda.
- İlk olarak, soruyu kesinlikle cevaplayacağım.
- Daha sonra, bu yapılandırmaları hiç bir ortak alandan parametre olarak geçmeden hizmetlerden almak için bir yaklaşım vereceğim.
İLK YAKLAŞIM: Ayrılmış yapılandırma bloğu, parametre olarak alınıyor
Bir uzantı ile ( buradaki uzantılar hakkında daha fazla bilgi ), bunu kolayca farklı bloklarda "ayrılabilir" config.yml
ve daha sonra denetleyiciden alınabilen bir parametre olarak enjekte edebilirsiniz.
Extension sınıfınızın içindeki DependencyInjection
dizinin içine şunu yazın:
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
}
Sonra config.yml, config_dev.yml ve böylece ayarlayabilirsiniz
my_nice_project:
contact_email: someone@example.com
Bunu config.yml
içinde işlemek için aynı ad alanında MyNiceBundleExtension
bir Configuration
sınıfa da ihtiyacınız olacak :
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Daha sonra yapılandırmayı orijinal sorunuzda istediğiniz gibi kontrol cihazınızdan alabilirsiniz, ancak parameters.yml
temizliği koruyun ve config.yml
ayrı bölümlerde ayarlayın:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
İKİNCİ YAKLAŞIM: Ayrılmış yapılandırma bloğu, yapılandırmayı bir hizmete enjekte eder
Benzer bir şey arayan ancak yapılandırmayı bir hizmetten almak için okuyucular için, "paramaters" ortak alanını asla kesmeyen ve hatta container
hizmete geçirilmesine gerek olmayan daha güzel bir yol bile vardır (tüm kapsayıcıyı geçmek pratiktir önlemek).
Yukarıdaki bu hile hala yapılandırmanızın parametre alanına "enjekte eder".
Bununla birlikte, hizmet tanımınızı yükledikten sonra, örneğin setConfig()
yalnızca hizmeti engelleyen gibi bir yöntem çağrısı ekleyebilirsiniz .
Örneğin, Extension sınıfında:
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' ] ) );
}
}
Ardından, services.yml
mutlak bir değişiklik yapmadan hizmetinizi her zamanki gibi tanımlarsınız:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
Ve sonra SillyManager
sınıfınıza, yöntemi ekleyin:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Bunun skaler değerler yerine diziler için de işe yaradığını unutmayın! Bir tavşan kuyruğu yapılandırdığınızı ve ana bilgisayar, kullanıcı ve şifre gerektiğini düşünün:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Tabii ki Ağacınızı değiştirmeniz gerekiyor, ancak sonra şunları yapabilirsiniz:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
ve sonra hizmette şunları yapın:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Bu yardımcı olur umarım!