2011-10-13 43 views
6

Tôi biết tôi có thể ghi đè lên các mẫu hoặc mở rộng các lớp của các gói khác. Nhưng tôi có thể mở rộng cũng cấu hình? Tôi đã hy vọng để có thể tải không gian tên khác từ cấu hình trong phương pháp tải của DependenyInjection/AcmeExtension.php, nhưng tôi đã không tìm thấy bất cứ điều gì về nó bất cứ nơi nào.Làm cách nào để mở rộng cấu hình của các gói khác nhau trong Symfony2?

Ví dụ:

Tôi có AcmeBundle mà định nghĩa sau đây trong config:

acme: 
    a: 1 

tôi muốn mở rộng gói này (trong bó mới gọi là AwesomeAcmeBundle) và có thể xác định các biến khác hoặc bằng cách thêm chúng vào không gian tên ban đầu:

acme: 
    a: 1 
    b: 2 

hoặc bằng cách thêm không gian tên ban đầu vào thư mục mới nd thêm biến mới có:

awesome_acme: 
    a: 1 
    b: 2 

Trả lời

1

Nếu bạn đang nói về .yml s, bạn có thể nhập AcmeBundle s confing trong AwesomeAcmeBundle cấu hình với

imports: 
    - { resource: path/to/AcmeBundles/config.yml } 

và sau đó ghi đè lên các thông số mà bạn muốn.

Symfony đang thực hiện tương tự trong số config_dev.yml với thông số framework/router.

+0

Không, đó không phải là điều tôi muốn nói. Tôi muốn mở rộng cấu hình (aka 'DependencyInjection/Configuration.php') của một số gói, không chỉ là tập tin cấu hình. –

1
imports: 
- { resource: @YourBundle/Resources/config/services.yml } 
2

Tôi có nhu cầu tương tự và tôi đã giải quyết chúng theo cách sau:

1) Mở rộng của cha mẹ Cấu hình lớp

//FooBundle\DependencyInjection\Configuration.php 

use DerpBundle\DependencyInjection\Configuration as BaseConfiguration; 

class Configuration extends BaseConfiguration 
{ 

    public function getConfigTreeBuilder() 
    { 
     $treeBuilder = parent::getConfigTreeBuilder(); 

     //protected attribute access workaround 
     $reflectedClass = new \ReflectionObject($treeBuilder); 
     $property = $reflectedClass->getProperty("root"); 
     $property->setAccessible(true); 

     $rootNode = $property->getValue($treeBuilder); 

     $rootNode 
      ->children() 
      ... 

     return $treeBuilder; 
    } 
} 

2) Tạo mở rộng riêng mà thực sự có thể xử lý mới các mục nhập cấu hình

class FooExtension extends Extension 
{ 

    public function load(array $configs, ContainerBuilder $container) 
    { 

     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

     //custom parameters 
     $container->setParameter('new_param_container_name', $config['new_param_name']); 

    ... 
    } 
} 

3) trong số app\config\config.yml bạn có thể sử dụng trong 0 mớithuộc tính-thiết lập tất cả các tham số derp (như một gói cha mẹ) có cộng với bất kỳ params mới của bạn mà bạn đã xác định trong Configuration.php.

+0

Tôi phải thêm một số cấu hình bổ sung vào cấu hình gói hiện có. Dưới nút gốc của gói hiện có đó. Nó sẽ không hoạt động theo cách này vì symfony không cho phép bất kỳ tên gốc nào khác so với phiên bản chưa được nhấn mạnh của tên gói của bạn. Bạn có biết một cách để thực sự mở rộng một cây cấu hình hiện có, trong khi ở dưới cùng một nút gốc? – axelvnk

Các vấn đề liên quan