2012-09-01 82 views
20

我需要從我的config.yml解析一些配置參數,例如啓用的語言。但是當我嘗試通過使用正常的symfony方法來做到這一點時:$this->container->get('my_params');它失敗了,因爲我的管理員類擴展了Sonata\AdminBundle\Admin\Admin類,該類沒有擴展Symfony\Component\DependencyInjection\ContainerAware類。如何在奏鳴曲管理類中獲取容器實例?

請問,如何獲取容器裏面的奏鳴曲管理員類?

現在我通過重寫奏鳴曲管理類來擴展ContainerAware來解決這個問題。

回答

45

可能已經解決了,因爲它的老問題,但僅供參考,容器已經是vailable在使用配置管理池類...

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

當然,這是更好的做法在管理類注入的服務,但是,像在控制器中。爲什麼有人,如果已經有容器可用,花時間配置setter注入?

1

在您的特定情況下,自定義AdminController類設置您的Admin類的參數可能是明智的做法。這將堅持MVC模式,並讓您免受不斷變化的供應商捆綁。如果你不知道如何做到這一點,請更新你的問題,我會更詳細地解釋。

+0

我解決了這個問題,通過將容器本身注入到我的管理員類中,這是一個糟糕的問題。我使用setter注入來代替構建注入,因爲構造應該具有完全相同的父類原型。 – skonsoft

2

這裏是奏鳴曲管理類使用服務的最佳方式:

只需使用注入二傳手所需要的服務。在這種情況下不允許使用構造函數注入,因爲您必須重寫父類的構造函數。父類的構造函數只接受3個參數,所以不能再添加一個。

解決的辦法是:

<!-- 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> 

然後,只需在你的所謂setEnabledLocales管理類添加一個公共方法。

/* file: MyclassAdmin.php */ 

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

看看:

Service Container documentation

+0

您可以使用構造函數注入,只要確保您的Admin類構造函數以'$ code','$ class'和'$ baseControllerName'作爲前3個參數,然後使用您的自定義依賴項。調用'parent :: __構造($ code,$ class,$ baseControllerName)'。最後,在您的服務中已經配置好的'arguments'部分下面聲明您的自定義依賴關係[yml | xml | whatever]。 – orgasmix

14

添加在您的管理類

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

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

並添加調用服務的配置(配置可以在YAML,XML或PHP來指定):

YAML

calls: 
    - [ setContainer, [ @service_container ] ] 

XML

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

現在你可以使用正常的symfony的方法:$this->container->get()

欲瞭解更多信息,請參見Service Container文檔

+0

這可能無法在自定義CRUD控制器中工作,因爲奏鳴曲管理員想要自行分配。 –

+0

在一般情況下,此方法應適用於任何服務。請參閱[DependencyInjection](http://symfony.com/doc/master/components/dependency_injection/index.html) –

相關問題