Symfony2 Sonata Admin访问容器

时间:2012-06-16 08:58:53

标签: php symfony symfony-sonata

我有一个具有必需活动用户字段的实体,因此我需要在configureFormFields()中添加活动用户的名称:

class DokumentAdmin extends Admin
{    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
                ->add('email')
                 ...
                ->add('user_name',null,array('required' => true, 'data' => "THIS IS A LOGGED ADMIN NAME"))
        ;
    }

我试图使用一个监听器,

public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        if ($entity instanceof Dokument) {
         //set user name

        }
    }

但我现在不在这里使用容器对象。

3 个答案:

答案 0 :(得分:5)

您可以使用如下容器:

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

例如:

protected function configureFormFields(FormMapper $formMapper)
{
    $container = $this->getConfigurationPool()->getContainer();
    ...
    // Using the container here...
}

答案 1 :(得分:3)

您可以注入容器:

尝试以下方法:

class DokumentAdmin extends Admin {

private $container = null;

/**
 * @param string $code
 * @param string $class
 * @param string $baseControllerName
 */
public function __construct($code, $class, $baseControllerName, $container=null)
{
    parent::__construct($code, $class, $baseControllerName);
    $this->container = $container;  
}
....

输入您的service.yml @service_container到admin条目。

acme.demo.document:
      class: Acme\DemoBundle\Admin\DocumentAdmin
      tags:
      arguments: [null, Acme\Demobundle\Entity\Document, ApplicationAcmeDemoBundle:Default, @service_container]

就是这样。现在您可以访问管理类中的容器了。

答案 2 :(得分:0)

我有同样的问题。我需要从config.yml解析一些参数,但它失败了。

作为解决方案,您可以将容器注入管理类,但不建议这样做。您应该只注入所需的服务或参数。

怎么办?

你应该使用setter注入而不是构造注入。

以下是在snata Admin Class中注入参数的示例:

当您定义管理服务时,只需添加如下调用:

<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 your parameter using setter injection -->
        <call method="setEnabledLocales">
            <argument>%skonsoft_znata.locales%</argument>
        </call>
    </service>

之后,只需在管理类中添加一个名为setEnabledLocales的方法,例如

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

不要忘记在管理类中添加$ enabedLocales作为属性。

最后你可以使用这个属性。