Meskipun solusi memindahkan contact_email
ke parameters.yml
mudah, seperti yang diusulkan dalam jawaban lain, itu dapat dengan mudah mengacaukan file parameter Anda jika Anda berurusan dengan banyak bundel atau jika Anda berurusan dengan blok konfigurasi yang bersarang.
- Pertama, saya akan menjawab pertanyaan itu dengan ketat.
- Kemudian, saya akan memberikan pendekatan untuk mendapatkan konfigurasi tersebut dari layanan tanpa pernah melewati ruang umum sebagai parameter.
PENDEKATAN PERTAMA: Blok konfigurasi terpisah, menjadikannya sebagai parameter
Dengan ekstensi ( lebih lanjut tentang ekstensi di sini ) Anda dapat menjaga ini dengan mudah "dipisahkan" ke dalam blok yang berbeda di config.yml
dan kemudian menyuntikkan itu sebagai parameter gettable dari controller.
Di dalam kelas Ekstensi Anda di dalam DependencyInjection
direktori tulis ini:
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
}
Kemudian di config.yml Anda, config_dev.yml dan Anda dapat mengaturnya
my_nice_project:
contact_email: someone@example.com
Untuk dapat memprosesnya config.yml
di dalam Anda, MyNiceBundleExtension
Anda juga memerlukan Configuration
kelas di namespace yang sama:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Kemudian Anda bisa mendapatkan konfigurasi dari controller Anda, seperti yang Anda inginkan dalam pertanyaan awal Anda, tetapi tetap parameters.yml
bersihkan, dan atur config.yml
di bagian yang terpisah:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
PENDEKATAN KEDUA: Blok konfigurasi terpisah, menyuntikkan konfigurasi ke layanan
Untuk pembaca yang mencari sesuatu yang serupa tetapi untuk mendapatkan konfigurasi dari layanan, bahkan ada cara yang lebih baik yang tidak pernah mengacaukan ruang bersama "paramaters" dan bahkan tidak perlu container
dilewatkan ke layanan (melewati seluruh wadah adalah praktik untuk menghindari).
Trik di atas masih "menyuntikkan" ke dalam ruang parameter konfigurasi Anda.
Namun demikian, setelah memuat definisi Anda tentang layanan, Anda dapat menambahkan pemanggilan metode seperti misalnya setConfig()
yang menyuntikkan blok itu hanya ke layanan.
Misalnya, di kelas Ekstensi:
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' ] ) );
}
}
Kemudian di Anda, services.yml
Anda mendefinisikan layanan Anda seperti biasa, tanpa perubahan mutlak:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
Dan kemudian di SillyManager
kelas Anda , cukup tambahkan metode:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Perhatikan bahwa ini juga berfungsi untuk array alih-alih nilai skalar! Bayangkan Anda mengkonfigurasi antrian kelinci dan memerlukan host, pengguna, dan kata sandi:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Tentu saja Anda perlu mengubah Pohon Anda, tetapi kemudian Anda dapat melakukan:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
dan kemudian di layanan lakukan:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Semoga ini membantu!