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

时间:2015-03-27 15:37:17

标签: php symfony doctrine entitymanager

我的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

确实,User表并不存在于默认实体上,因此该错误并非意外。我希望能够指定handleRequest函数检查用户表存在的dev EntityManager。 整个功能如下。当仅使用默认的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: ~

2 个答案:

答案 0 :(得分:0)

事实证明handleRequest是通过并解析您的实体注释并确保不违反约束的函数。在我的User表中,我确定了一个UniqueEntity约束,该约束检查了My\Bundle\Entity\User.php内的用户名字段。

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

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

因此,我正在回答这个问题。我将进行更深入的研究,看看我是否可以在检查约束时指定使用哪个EntityManager,并在我仍然卡住的情况下创建一个新线程。

答案 1 :(得分:0)

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

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