2012-02-14 8 views
7

Symfony2 के config.yml में आप इस तरह के रूप में एक "आयात" जोड़ सकते हैं:Symfony2: क्या निर्भरता इंजेक्शन के माध्यम से किसी अन्य बंडल के लिए कॉन्फ़िगरेशन जोड़ना संभव है?

imports: 
    - { resource: services.yml } 

मेरी services.yml अंदर मैं तो है:

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

हालांकि एक बंडल के लिए सेवाओं की घोषणा करने के वैकल्पिक तरीका DependencyInjectionExtension का उपयोग करके इस प्रकार कॉन्फ़िगरेशन में कुछ भी आयात करने की आवश्यकता को समाप्त कर देता है मैन्युअल रूप से कोड को डीकॉप्लिंग करना।

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'); 
    } 

} 

प्रश्न यह सेवा घोषणाओं के लिए ठीक काम करता है, लेकिन उदाहरण के लिए मान लीजिए कि आप एक बंडल ऐसे LiipImagineBundle जोड़ने (यह AvalancheImagineBundle की तरह है) फिल्टर के रूप में एक और बंडल कॉन्फ़िगर करना चाहते हैं: तो

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

Symfony शिकायत है कि

कॉन्फ़िगरेशन लोड करने में कोई एक्सटेंशन नहीं है r "liip_imagine"

तो किसी को भी अगर वहाँ config.yml बिना छुए एक और बंडल से तीसरे पक्ष के बंडल के लिए विन्यास को जोड़ने के लिए एक तरीका है पता है?

उत्तर

9

Symfony 2.2 में यह PrependExtensionInterface की मदद से संभव है।

"कई बंडल के विन्यास को आसान बनाने के लिए" रसोई की किताब प्रविष्टि पर एक नज़र डालें:

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

+1

द्वारा मुझे इसे FOSUserBundle के लिए आवश्यक था! अब मैं इस पर अपना विस्तार बना सकता हूं और इसे अपने विन्यास के साथ प्रीलोड कर सकता हूं। उदाहरण: $ कंटेनर-> प्रीपेन्ड एक्सटेंशन कॉन्फिग ('fos_user', सरणी ( 'db_driver' => 'orm' ); –

0

मुझे लगता है कि संभव है, अपने बंडल में DependencyInjection \ YourBundleExtension वर्ग का उपयोग कर, और फिर एक

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

कर लेकिन मैं वास्तव में नहीं जानता कि अगर यह सबसे अच्छा अभ्यास या नहीं है ...

+0

इसका कारण यह है कि मूल पोस्टर ओवरराइड करने के लिए प्रयास कर रहा है एक पैरामीटर नहीं है काम नहीं करेगा। यह केवल तभी काम करेगा यदि आप liip_imagine के डेवलपर को अर्थपूर्ण कॉन्फ़िगरेशन (http://symfony.com/doc/current/cookbook/bundles/extension.html) के बजाय पैरामीटर की श्रृंखला से काम करने के लिए अपने बंडल को दोबारा करने के लिए मना कर सकते हैं। यह लगभग कोई लाभ के लिए काफी काम नहीं करेगा, और शायद liip_imagine के लिए कोई लाभ नहीं होगा। –

+0

मुझे लगता है कि उत्तर यह हो सकता है कि यह संभव नहीं है।अभी के लिए मैं बस मास्टर कॉन्फिगर.इम्ल में एक बंडल स्तर config.yml आयात कर रहा हूं ताकि मेरी liip_imagine कॉन्फ़िगरेशन अभी भी उस बंडल के अंदर encapsulated है जो प्रासंगिक है। – Kasheen

-1

मैं जड़ config.yml में के बजाय बंडल के अंदर फिल्टर डाल करने के लिए एक समाधान पाया

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

AvalancheImagineExtension: लोड इस जोड़ें:

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

AvalancheImagineExtension/संसाधन/config/config.xml

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

अंत में, अपने बंडल में:

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

बहुत बुरा विचार, ImagineBundle की एक्सटेंशन क्लास में लोड() विधि दो बार बुलाई जाएगी - एक बार कंटेनर द्वारा और एक बार आपके कोड – adamziel

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^