如何以表单类型访问 Sonata 管理池

How to access Sonata admin pool in form type

用例

我试图通过在我的实体 FormType 的 buildForm 方法中定义它来在我的网站的前端管理员中重用 sonata_type_model_list:

[...]
->add('position', 'sonata_type_model_list', array(
      'model_manager' => $categoryManager,
))
[...]

但是我不能使用

$categoryAdmin = $this
    ->getConfigurationPool()
    ->getAdminByClass("\Application\Sonata\ClassificationBundle\Entity\Category");

因为我需要在 AdminClass 中才能使用 getConfigurationPool()

如果有人知道如何在 AdminClass 之外使用 getConfigurationPool() 或者您知道如何声明 sonata_type_model_list 以便在管理员之外使用它 class 吗?

写在the doc,也许你可以使用sonata.admin.pool服务。

$configurationPool = $this->container->get('sonata.admin.pool');

您需要在您的表单类型中注入管理池。

这是一个例子:

#services.yml

blast_base_entities.form.type.my:
        class: Blast\BaseEntitiesBundle\Form\Type\MyformType
        tags:
            - { name: form.type, alias: blast_search_index_autocomplete }
        arguments: [@sonata.admin.pool]

并在表格中输入:

use Sonata\AdminBundle\Admin\Pool

Class MyFormType
{
    private $adminPool;

    public function construct(Pool $adminPool)
    {
        $this->adminPool = $adminPool;
    }
}

然后你可以检索管理员

$this->adminPool->getAdminByClass('Foo');

解决方案


感谢@pbenard & @Mawcel他们的回答,我结合他们来实现我的目标如下:


在我的控制器中 我创建了我的表单并像这样注入 $this->container->get('sonata.admin.pool') :

$form = $this->createForm(
    new FormType($this->container->get('sonata.admin.pool')), 
    $entity, 
    $options
);

在我的 formType 中,我添加了 属性 $adminPool && __construct 方法:

private $adminPool;

public function __construct(Pool $adminPool) {
    $this->adminPool = $adminPool;
}

所以我现在可以从 buildForm 方法访问 adminPool

public function buildForm(FormBuilderInterface $builder, array $options)
{
    [...]
    $categoryAdmin = $this
        ->getConfigurationPool()
        ->getAdminByClass("\Application\Sonata\ClassificationBundle\Entity\Category"        );
    [...]
}