2012-09-01 23 views
20

Bazı yapılandırma parametrelerini, config.yml adresinden etkinleştirilmiş diller gibi ayrıştırmam gerekiyor. Ancak, normal symfony yöntemini kullanarak bunu yapmaya çalıştığımda: $this->container->get('my_params');, yönetici sınıfım Symfony\Component\DependencyInjection\ContainerAware sınıfını genişletmeyen Sonata\AdminBundle\Admin\Admin sınıfını genişletmesi nedeniyle başarısız olur.Sonata Yönetici sınıfında kapsayıcı örneği nasıl alınır?

Lütfen, konteyner sonata Admin sınıfının içine nasıl alınır?

Şimdi, ContainerAware'i genişletmek için sonata Yönetici Sınıfını geçersiz kılarak bu sorunu çözüyorum.

cevap

45

zaten çözüldü bkz Service Container belgelerine fazla bilgi için $this->container->get()

, onun eski nedeniyle soru, ama sadece referans için, konteyner zaten bir Tabii

$this->getConfigurationPool()->getContainer(); 

... konfigürasyon havuzu kullanarak yönetici sınıfında ullanılabilir, denetleyicileri olduğu gibi yönetici sınıfında hizmet enjekte etmek daha iyi bir uygulamadır, ancak. Neden birisi varsa, konteynere zaten sahipse setter enjeksiyonu yapılandırmak için zaman ayırın?

1

Özel durumunuzda, AdminController sınıfınızın Admin sınıfınızın parametrelerini ayarlamanız akıllıca olabilir. Bu MVC modeline yapışır ve sizi değişen satıcı paketlerinden kurtarır. Bunu nasıl yapacağınızı bilmiyorsanız, lütfen sorunuzu güncelleyin ve daha ayrıntılı bir şekilde açıklayacağım.

Sadece setter enjeksiyon kullanarak gerekli hizmeti enjekte: Burada

+0

Bunu, kapsayıcıyı, kötü bir bölme olan yönetici sınıfımda enjekte ederek çözdüm. Konstrüksiyon enjeksiyon yerine setter enjeksiyonu kullandım çünkü yapı tamamen aynı ebeveyn prototipine sahip olmalıdır. – skonsoft

2

sonat yönetici sınıflarında hizmetlerini kullanmak için en iyi yoldur. Bu durumda kurucu enjeksiyonlarına izin verilmez, çünkü üst sınıfın yapıcısını geçersiz kılmanız gerekir. Ebeveyn sınıfının kurucusu sadece 3 parametreyi kabul eder, böylece başka bir tane ekleyemezsiniz.

çözümdür:

<!-- file: services.xml --> 

<service id="skonsoft.znata.admin.keyword" class="%skonsoft.znata.admin.keyword.class%"> 
      <tag name="sonata.admin" manager_type="orm" group="Keyword" label="Keyword"/> 
      <argument /> 
      <argument>%skonsoft.znata.admin.keyword.entity.class%</argument> 
      <argument>SonataAdminBundle:CRUD</argument> 
      <call method="setTranslationDomain"> 
       <argument>SkonsoftZnataBundle</argument> 
      </call> 

      <!-- here you inject needed services or parameters --> 
      <call method="setEnabledLocales"> 
       <argument>%skonsoft_znata.locales%</argument> 
      </call> 
     </service> 

Sonra sadece setEnabledLocales denilen yönetici sınıfında bir kamu yöntemini ekleyin. (Yapılandırma YAML, XML veya PHP belirtilebilir hizmetler yapılandırmasında aramaları Yönetici sınıfın

/** @var \Symfony\Component\DependencyInjection\ContainerInterface */ 
private $container; 

public function setContainer (\Symfony\Component\DependencyInjection\ContainerInterface $container) { 
    $this->container = $container; 
} 

ekleyin Ve eklemek

Service Container documentation

+0

Yapıcı enjeksiyonu kullanabilirsiniz, sadece Admin sınıfı kurucunuzun '$ code',' $ class' ve '$ baseControllerName' ilk 3 param ve daha sonra da özel bağımlılıklarınız olduğundan emin olun. "Parent :: __ construct ($ code, $ class, $ baseControllerName)" öğesini çağırın. Son olarak, özel bağımlılıklarınızı hizmetlerinizdeki önceden yapılandırılmış "argümanlar" bölümünün altında bildirin. [Yml | xml | whatever]. – orgasmix

14

:

/* file: MyclassAdmin.php */ 

public function setEnabledLocales($locales){ 
    $this->enabedLocales = $locales; 
} 

bir göz atın):

YAML

calls: 
    - [ setContainer, [ @service_container ] ] 

XML normal symfony yöntemini kullanarak yapabilirsiniz Şimdi

<call method="setContainer"> 
    <argument type="service" id="service_container" /> 
</call> 

: muhtemelen

+0

Sonata yöneticisi kendini ayırmak istediğinden, bu özel bir CRUD denetleyicisinde çalışmayabilir. –

+0

Genel durumda, bu yöntem herhangi bir hizmet ile çalışmalıdır. [DependencyInjection] 'a bakın (http://symfony.com/doc/master/components/dependency_injection/index.html) –

İlgili konular