如何将实体管理器传递给Symfony中的嵌入表单?

Ger*_*rgő 4 php symfony

我可以$this->createForm(new EntityType(), $entity, array('em' => $em))从控制器做,但我怎么能把它传递给NestedEntityType()?我想我不能只是从里面传递它EntityType->buildForm():

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $entityManager = $options['em'];

    $builder->add('entities', 'collection', array(
        'type' => new NestedEntityType(),
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false
    ));
}
Run Code Online (Sandbox Code Playgroud)

我需要实体管理器来设置数据转换器以检查数据库中是否已存在实体,并在关系中使用该实体而不是创建具有相同名称的新实体.

资源

Joh*_*ann 7

您可以将表单定义为服务,然后将Doctrine实体管理器作为参数注入其中.

http://symfony.com/doc/3.4/form/form_dependencies.html

然后像这样声明服务:

services:
    acme.type.employee:
        class: Acme\AcmeBundle\Form\Type\FormType
        tags:
            - { name: form.type, alias: form_em }
        arguments: [@doctrine]
Run Code Online (Sandbox Code Playgroud)

并在表单类型:

use Doctrine\Bundle\DoctrineBundle\Registry as Doctrine;

/** @var \Doctrine\ORM\EntityManager */
private $em;

/**
 * Constructor
 * 
 * @param Doctrine $doctrine
 */
public function __construct(Doctrine $doctrine)
{
    $this->em = $doctrine->getManager();
}
Run Code Online (Sandbox Code Playgroud)

  • 1.然后删除这一行.2.我不认为将它放在`buildForm()`函数中会起作用,因为服务的参数在创建时会在其构造函数中注入.3.使用Doctrine\Bundle\DoctrineBundle\Registry作为Doctrine;`你可以直接注入实体管理器,就像在另一个答案中一样,没有真正的区别,它只是获得实体管理器的众多不同方式中的两种.我会用这些更正来编辑我的答案. (2认同)

Jov*_*vic 6

您可以使用options将相应的数据传递给子类型:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $entityManager = $options['em'];

    $builder->add('entities', 'collection', array(
        'type' => new NestedEntityType(),
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false
        'options' => array('em' => $entityManager) // <-- THIS
    ));
}
Run Code Online (Sandbox Code Playgroud)

另外,@约翰在书中的解决方案,所以值得花时间去做他提出的建议.我的解决方案更适合传递中间控制器的数据(不是服务)