2012-06-16 77 views
1

我有一个要求的活跃用户领域的实体,所以我需要在configureFormFields()添加活跃用户名:Symfony2的索纳塔管理员访问权限容器

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 

     } 
    } 

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

+1

我找到了解决办法:http://stackoverflow.com/questions/7561013/injecting-securitycontext-services- into-a-listener-class-in-symfony2-causes-circ –

回答

0

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

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

怎么办?

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

这里是注射在snata管理类一个参数的例子:

时宇定义你的管理服务,只需添加一个电话这样的:

<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作为属性。

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

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] 

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

+0

cool !,现在我可以在__construct()中做到这一点 – GusDeCooL

5

您可以使用如下的容器:

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

例如:

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