【问题标题】:Symfony2 Sonata Admin access containerSymfony2 Sonata 管理员访问容器
【发布时间】:2012-06-16 08:58:53
【问题描述】:

我有一个具有必填活动用户字段的实体,因此我需要在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

        }
    }

但我现在不知道如何在这里使用容器对象。

【问题讨论】:

标签: php symfony symfony-sonata


【解决方案1】:

您可以使用如下容器:

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

例如:

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

【讨论】:

    【解决方案2】:

    你可以注入容器:

    尝试以下方法:

    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 到管理员条目。

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

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

    【讨论】:

      【解决方案3】:

      我也有同样的问题。我需要从我的 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 作为属性。

      终于可以使用这个属性了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多