ในขณะที่วิธีการย้ายcontact_email
ไปยังparameters.yml
นั้นเป็นเรื่องง่ายตามที่เสนอในคำตอบอื่น ๆ ซึ่งอาจทำให้ไฟล์พารามิเตอร์ของคุณยุ่งเหยิงได้ง่ายหากคุณจัดการกับบันเดิลจำนวนมากหรือหากคุณจัดการกับบล็อกการตั้งค่าที่ซ้อนกัน
- ก่อนอื่นฉันจะตอบคำถามอย่างเคร่งครัด
- หลังจากนั้นฉันจะให้วิธีการรับการกำหนดค่าเหล่านั้นจากบริการโดยไม่ต้องผ่านช่องว่างทั่วไปเป็นพารามิเตอร์
วิธีการแรก: บล็อกการตั้งค่าที่แยกออกมารับมันเป็นพารามิเตอร์
ด้วยส่วนขยาย ( เพิ่มเติมเกี่ยวกับส่วนขยายที่นี่ ) คุณสามารถเก็บ "แยก" นี้ไว้ในบล็อกที่แตกต่างกันได้อย่างง่ายดายในconfig.yml
และจากนั้นฉีดเป็นพารามิเตอร์ gettable จากตัวควบคุม
ภายในคลาส Extension ของคุณภายในไดเรคทอรี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' );
วิธีที่สอง: บล็อกการตั้งค่าที่แยกออกจากกันฉีดการกำหนดค่าลงในบริการ
สำหรับผู้อ่านที่กำลังมองหาสิ่งที่คล้ายกัน แต่สำหรับการปรับแต่งค่าจากการบริการมีวิธีที่ดีกว่าที่ไม่เคยหยุดยั้งพื้นที่ทั่วไป "paramaters" และไม่จำเป็นต้องcontainer
ส่งผ่านไปยังบริการ หลีกเลี่ยง)
เคล็ดลับข้างต้นยังคง "แทรก" เข้าไปในพื้นที่พารามิเตอร์กำหนดค่าของคุณ
อย่างไรก็ตามหลังจากโหลดคำจำกัดความของบริการแล้วคุณสามารถเพิ่มการเรียกใช้เมธอดเช่นตัวอย่างsetConfig()
ที่แทรกบล็อกนั้นลงในบริการเท่านั้น
ตัวอย่างเช่นในคลาส Extension:
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' ];
}
}
หวังว่านี่จะช่วยได้!