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

时间:2017-01-25 17:52:57

标签: symfony sonata-admin sonata

用例

我试图通过在我的实体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以便在管理类之外使用它吗?

3 个答案:

答案 0 :(得分:1)

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

以下是一个例子:

#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');

答案 1 :(得分:0)

the doc中写作时,您可以使用sonata.admin.pool服务。

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

答案 2 :(得分:0)

解决方案

感谢@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"        );
    [...]
}