如何指定 Symfony2 Form->handleRequest 使用的 EntityManager?

How do I specify the EntityManager used by Symfony2 Form->handleRequest?

我的 Symfony2 应用程序有多个 EntityManagers。我已经设置了默认值,然后列出了其他一些。此配置在我的代码中有效并且功能正常,但 Forms 除外。

尝试处理请求时,handleRequest(mixed $request = null) 出现错误,因为我尝试验证表单所依据的实体类型不存在于默认管理器中,而是存在于另一个管理器中。

有没有办法指定在处理请求时使用哪个实体管理器?

$form = $this->createForm(
    new UserType(), $user
);

$form->handleRequest($request); // $request is coming from form submission

我得到的错误很清楚:

An exception occurred while executing [select statement appears here]

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'DEFAULTENTITY.User' doesn't exist

默认实体中确实不存在用户 table,因此此错误并不意外。我希望能够指定 handleRequest 函数检查 dev EntityManager,其中用户 table 确实存在。 整个功能如下。当仅使用默认的 EntityManager 时,此功能完美运行,但当我实现多管理器环境时出现故障:

public function addAction(Request $request)
{
    $user = new User();

    $form = $this->createForm(new UserType(), $user);

    $form->handleRequest($request);

    // Respond to a form submission
    if ( $form->isValid()) {
            $em = $this->getDoctrine()->getManager( $this->currentManagerID );
            $em->persist($user);
            $em->flush();
            return $this->redirect($this->generateUrl('user_add'));
    }

    // Render the form
    return $this->render(
            'MyBundle:User:create.html.twig',
            array('form' => $form->createView())
    );
}

我的多实体 Doctrine 配置适用于应用程序的所有其他方面。我能够利用默认管理器加载应用程序范围的设置,并使用子域选择一个 EntityManager 来检查登录、选择、机构特定设置等。

orm:
    default_entity_manager: default
    auto_generate_proxy_classes: "%kernel.debug%"
    entity_managers:
        default:
            connection: default
            mappings:
                MyBundle: ~
        dev:
            connection: dev
            mappings:
                MyBundle: ~

事实证明,handleRequest 是一个函数,它会遍历并解析您的 Entity 注释并确保不违反 Constraints。在我的用户 table 中,我确定了一个 UniqueEntity 约束,该约束检查 My\Bundle\Entity\User.php.

中的用户名字段

@UniqueEntity(fields="username", message="Username already taken")

具体来说,正是这个 Constraint 引用了默认的 EntityManager,而不是 handleRequest 的调用。删除此约束允许处理请求并保留表单。

因此,我将此问题标记为已回答。我将做更彻底的研究,看看我是否可以指定在检查约束时使用哪个 EntityManager,并在我仍然卡住的情况下创建一个新线程。

我遇到了完全相同的问题。似乎 handleRequest 方法使用了第一个可用的实体管理器,该管理器具有被持久化的实体的映射,但不一定是正确的。我也想知道如何指定另一个实体管理器。

是否有任何新的解决方案或更新?