2012-03-12 34 views
5

Kịch bản:Symfony2 - làm thế nào để mở rộng một bó nhà cung cấp (ví dụ của FOSFacebookBundle)

Tôi đang sử dụng một bó (FOSFacebookBundle) cho phép tôi để thiết lập các thông số cho chính xác một ứng dụng facebook trong cấu hình của tôi. Tất cả mọi thứ hoạt động hoàn hảo tốt, nhưng bây giờ tôi cần phải thiết lập không chỉ một ứng dụng, nhưng nhiều.

cách tiếp cận của tôi:

Tôi đã tạo một AcmeFacebookBundle, cho phép nhiều ứng dụng được xác định (cấu hình quy định tại Acme \ FacebookBundle \ DependencyInjection \ Cấu hình) trong một mảng như sau:

acme_facebook: 
    apps: 
     some_competition: 
      server_url: %acme.facebook.some_competition.server_url% 
      file: %kernel.root_dir%/../vendor/facebook/php-sdk/src/base_facebook.php 
      alias: facebook 
      app_id: %acme.facebook.some_competition.app_id% 
      secret: % acme .facebook.some_competition.secret% 
      cookie: true 
      permissions: [email, user_birthday, user_location] 
     some_other_competition: 
      server_url: %acme.facebook. some_other_competition.server_url% 
      file: %kernel.root_dir%/../vendor/facebook/php-sdk/src/base_facebook.php 
      alias: facebook 
      app_id: %acme.facebook. some_other_competition.app_id% 
      secret: % acme .facebook. some_other_competition.secret% 
      cookie: true 
      permissions: [email, user_birthday, user_location] 

Trong Acme \ FacebookBundle \ DependencyInjection \ AcmeFacebookExtension Tôi sau đó lặp qua tất cả các ứng dụng. Ý tưởng là so sánh tham số server_url với URL hiện tại và ghi đè cấu hình fos_facebook với tôi.

class AcmeFacebookExtension extends Extension 
{ 
    ... 
    /** 
    * {@inheritDoc} 
    */ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

     foreach ($config['apps'] as $app) 
     { 
      // check for matching path here? 
      foreach (array('file', 'app_id', 'secret', 'cookie', 'domain', 'logging', 'culture', 'permissions') as $attribute) 
      { 
       $container->setParameter('fos_facebook.' . $attribute, $app[$attribute]); 
      } 
     } 
    } 

Vấn đề:

Nhưng điều này là chính xác nơi tôi bị mắc kẹt. Rõ ràng, tôi không có quyền truy cập vào đối tượng Yêu cầu hoặc DiC từ bên trong AcmeFacebookExtension để thực hiện so sánh này. Tôi có hoàn toàn sai trong cách tiếp cận của mình không? Bạn có ý tưởng nào tốt hơn về cách giải quyết vấn đề này không?

+0

questin khác nhau, cùng một mục tiêu: [Symfony2 cấu hình có điều kiện tải] (http://stackoverflow.com/questions/9603384/symfony2-load-có điều kiện-cấu hình) – leek

+0

Vâng, tôi không chắc chắn nếu thiết lập cấu hình trong bộ điều khiển của bạn là cách tiếp cận đúng mặc dù? Tiêm cấu hình khi phân tích cú pháp cấu hình xảy ra có cảm giác giống như cách đúng để thực hiện ... – Burgi

Trả lời

4

Điều bạn muốn tạo là CompilerPass để bạn có thể thao tác Container sau khi tất cả cấu hình khác đã tải. Những nên giúp bạn bắt đầu:

+0

Nội dung hàng đầu, chính xác những gì tôi cần. Tôi sẽ lấy nó từ đó. Vấn đề duy nhất tôi có thể thấy là FOSUserbundle vẫn yêu cầu tất cả cấu hình fos_user được thiết lập khi phân tích cú pháp ban đầu, vì vậy ngay bây giờ tôi phải giả lập một số cấu hình giả. Bạn có thể thấy bất kỳ cách nào xung quanh điều này? – Burgi

+0

Bạn đã thử tải gói của mình trước chưa? Bằng cách này, bạn có thể đặt các thông số bắt buộc trước khi các gói khác cần chúng. (Tôi không hoàn toàn chắc chắn điều này sẽ làm việc - chỉ là một đoán) – leek

+0

Vâng, tôi đã chơi xung quanh với thứ tự của bó. Các phương thức Extension-> load() dường như được gọi đầu tiên, và các phương thức CompilerPass chỉ khi tất cả các cấu hình mở rộng được xử lý. Ngoài ra, vì tôi vẫn không thể truy cập toàn bộ vùng chứa trong CompilerPass, tôi cũng không thể nhận đối tượng Yêu cầu và phải sử dụng $ _SERVER để lấy URL hiện tại: ( – Burgi

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