2012-02-14 24 views
7

Trong config.yml Symfony2 của bạn có thể thêm một "nhập khẩu" như:Symfony2: Có thể thêm cấu hình cho một gói khác qua DependencyInjection không?

imports: 
    - { resource: services.yml } 

Bên services.yml tôi sau đó có:

imports: 
    security_bundle: 
     resource: @AcmeSecurityBundle/Resources/config/services.yml 

Tuy nhiên các cách khác để khai báo các dịch vụ cho một bó bằng cách sử dụng DependencyInjectionExtension do đó loại bỏ nhu cầu nhập bất kỳ thứ gì vào config.yml theo cách thủ công, do đó hãy tách mã.

namespace Acme\Bundle\SecurityBundle\DependencyInjection; 

use Symfony\Component\HttpKernel\DependencyInjection\Extension; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
use Symfony\Component\Config\FileLocator; 

class AcmeSecurityExtension extends Extension { 

    public function load(array $configs, ContainerBuilder $container) { 
     $loader = new YamlFileLoader(
      $container, new FileLocator(__DIR__ . '/../Resources/config') 
     ); 
     $loader->load('services.yml'); 
    } 

} 

Các Câu hỏi này hoạt động tốt cho tờ khai dịch vụ nhưng nói ví dụ bạn muốn có một bó để cấu hình gói khác chẳng hạn như thêm LiipImagineBundle (nó giống như AvalancheImagineBundle) bộ lọc:

liip_imagine: 
    filter_sets: 
     security_avatar_thumbnail: 
     quality: 75 
     filters: 
      thumbnail: { size: [140, 140], mode: inset } 

Symfony sau đó than phiền rằng

Không có tiện ích mở rộng nào có thể tải cấu hình cho r "liip_imagine"

Vậy có ai biết cách thêm cấu hình cho gói của bên thứ ba từ gói khác mà không chạm vào config.yml không?

Trả lời

9

Trong Symfony 2.2 có thể với sự giúp đỡ của PrependExtensionInterface.

Hãy xem mục sách dạy nấu ăn "Làm thế nào để đơn giản hóa cấu hình của nhiều Gói":

http://symfony.com/doc/current/cookbook/bundles/prepend_extension.html

+1

Tôi cần điều này cho FOSUserBundle! Bây giờ tôi có thể tạo tiện ích mở rộng của mình trên đó và tải trước nó bằng cấu hình của tôi. Ví dụ: $ container-> prependExtensionConfig ('fos_user', mảng ( 'db_driver' => 'orm' )); –

0

Tôi nghĩ rằng là có thể, bằng cách sử dụng lớp DependencyInjection \ YourBundleExtension trong nhóm của mình, và sau đó làm một

public function load(array $configs, ContainerBuilder $container) 
{ 
    ... 
    $container->setParameter('the_bundle_parameter.you.want.to.override',$itsValue); 
    ... 
} 

Nhưng tôi thực sự không biết nếu đó là thực hành tốt nhất hay không ...

+0

này sẽ không làm việc vì những gì các poster ban đầu đang nỗ lực để ghi đè không phải là một tham số. Điều này sẽ chỉ hoạt động nếu bạn có thể thuyết phục nhà phát triển của liip_imagine để cấu trúc lại gói của họ để làm việc ra khỏi một loạt các tham số thay vì cấu hình ngữ nghĩa (http://symfony.com/doc/current/cookbook/bundles/extension.html). Đó sẽ là một chút công việc cho hầu như không có lợi ích, và có lẽ không có lợi ích ở tất cả để liip_imagine. –

+0

Tôi nghĩ rằng câu trả lời có thể là không thể.Bây giờ tôi chỉ cần nhập một config.yml cấp gói vào config.yml chính để cấu hình liip_imagine của tôi vẫn được đóng gói bên trong gói mà nó có liên quan đến. – Kasheen

-1

tôi tìm thấy một giải pháp cho đặt các bộ lọc bên trong bó thay vì trong config.yml gốc

avalanche_imagine: 
    web_root:  %kernel.root_dir%/../web 
    cache_prefix: media/cache 
    driver:  gd 
    bundle: PathToYourBundleClass 

AvalancheImagineExtension: tải Thêm này:

012.
$bundleClass = $container->getParameter("imagine.bundle"); 
    if ($bundleClass) 
    { 
     $bundle = new $bundleClass(); 
     $bundle->getContainerExtension()->load(array(), $container); 
    } 

AvalancheImagineExtension/Resources/config/config.xml

<parameter key="imagine.bundle"></parameter> 

Cuối cùng, trong nhóm của mình:

parameters: 
    imagine.filters: 
     image_main: 
      type: thumbnail 
      options: { size: [490, 310], mode: outbound } 
+0

ý tưởng rất xấu, lớp mở rộng của ImagineBundle sẽ có phương thức load() được gọi hai lần - một lần bằng vùng chứa và một lần theo mã của bạn – adamziel

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