Mặc dù giải pháp di chuyển contact_email
đến parameters.yml
dễ dàng, như được đề xuất trong các câu trả lời khác, điều đó có thể dễ dàng làm lộn xộn tệp tham số của bạn nếu bạn xử lý nhiều gói hoặc nếu bạn xử lý các khối cấu hình lồng nhau.
- Đầu tiên, tôi sẽ trả lời đúng câu hỏi.
- Sau đó, tôi sẽ đưa ra một cách tiếp cận để nhận các cấu hình đó từ các dịch vụ mà không bao giờ đi qua một không gian chung dưới dạng tham số.
TIẾP CẬN ĐẦU TIÊN: Khối cấu hình tách biệt, lấy nó làm tham số
Với một tiện ích mở rộng ( nhiều hơn về các tiện ích mở rộng tại đây ), bạn có thể giữ phần này dễ dàng "tách" thành các khối khác nhau trong config.yml
và sau đó thêm vào đó như một tham số có thể truy cập được từ bộ điều khiển.
Trong lớp mở rộng của bạn bên trong DependencyInjection
thư mục viết này:
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
}
Sau đó, trong config.yml, config_dev.yml và do đó bạn có thể đặt
my_nice_project:
contact_email: someone@example.com
Để có thể xử lý rằng config.yml
bên trong MyNiceBundleExtension
bạn cũng sẽ cần một Configuration
lớp trong cùng một không gian tên:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Sau đó, bạn có thể nhận cấu hình từ bộ điều khiển của mình, như bạn muốn trong câu hỏi ban đầu của mình, nhưng giữ parameters.yml
sạch sẽ và đặt nó trong các config.yml
phần riêng biệt:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
TIẾP CẬN THỨ HAI: Khối cấu hình tách biệt, đưa cấu hình vào dịch vụ
Đối với những độc giả đang tìm kiếm một cái gì đó tương tự nhưng để có được cấu hình từ một dịch vụ, thậm chí còn có một cách tốt hơn mà không bao giờ làm xáo trộn không gian chung của "paramaters" và thậm chí không cần phải container
chuyển đến dịch vụ (thông qua toàn bộ container tránh).
Thủ thuật trên vẫn "tiêm" vào không gian tham số cấu hình của bạn.
Tuy nhiên, sau khi tải định nghĩa của bạn về dịch vụ, bạn có thể thêm một cuộc gọi phương thức, ví dụ như setConfig()
chỉ tiêm khối đó vào dịch vụ.
Ví dụ: trong lớp Mở rộng:
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' ] ) );
}
}
Sau đó, services.yml
bạn xác định dịch vụ của mình như bình thường, không có bất kỳ thay đổi tuyệt đối nào:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
Và sau đó trong SillyManager
lớp của bạn , chỉ cần thêm phương thức:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Lưu ý rằng điều này cũng hoạt động cho mảng thay vì giá trị vô hướng! Hãy tưởng tượng rằng bạn định cấu hình hàng đợi thỏ và cần máy chủ, người dùng và mật khẩu:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Tất nhiên bạn cần thay đổi Cây của mình, nhưng sau đó bạn có thể làm:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
và sau đó trong dịch vụ làm:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Hi vọng điêu nay co ich!