【问题标题】:How do I specify the EntityManager used by Symfony2 Form->handleRequest?如何指定 Symfony2 Form->handleRequest 使用的 EntityManager?
【发布时间】:2015-06-01 00:14:44
【问题描述】:

我的 Symfony2 应用程序有多个 EntityManager。我设置了默认值,然后列出了其他一些。除了表单之外,此配置在我的代码中有效且正常。

在尝试处理请求时,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,其中 User 表确实存在。 整个功能如下。此功能在仅使用默认 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: ~

【问题讨论】:

  • 你完成$ php app/console doctrine:schema:update --force了吗?
  • 我有;需要明确的是(这是我第一次在这里发帖,我可能不是),多个 EntityProviders 的使用适用于应用程序的各个方面——登录、选择(用于表等)、获取数据等。问题当我使用 Form Builder 时,我遇到了:handleRequest 的内置功能正在检查 Doctrine 的默认 EntityManager。如果有handleRequest($request, $em) 选项,那就太好了。由于没有,我希望有一种方法来指定我想使用的经理。
  • 对,抱歉,我无法为您提供更多帮助,我在SF 应用程序中从未使用过多个 EntityManager。
  • 你确定是 handleRequest() 造成的吗?也许它是对数据库的持久化?
  • 我是——我通过使用 die() 捕获了“断点”。直接放置在handleRequest()函数之前,之后直接在die()处理之前抛出异常。

标签: php symfony doctrine entitymanager


【解决方案1】:

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

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

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

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

【讨论】:

  • UniqueEntity 有一个 em 属性,您可以将其设置为实体管理器的名称。您还可以将自己的约束设置为服务并注入您的存储库。
【解决方案2】:

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

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

【讨论】:

  • Dre,为我解决的问题是我如何在实体本身中指定约束。利用默认的“唯一”约束导致 handleRequest 针对默认 EM 进行检查。我将自己的服务定义为能够从会话中拉出所需管理器的服务。当我回来时,我会发布更详细的信息。
  • 您好,感谢您的快速回复。我目前没有使用“UniqueEntity”验证器。然而,经过一整天的调试,我终于意识到我的问题出在我前段时间编写的自定义侦听器中,并且完全忘记了。如果其他人有兴趣,您可以使用“em”选项简单地将实体管理器的名称传递给实体字段类型。就我而言,我有一个动态表单,因此我使用了 PRE_SUBMIT 侦听器并在侦听器中重新创建相同的字段。我只需将“em”选项添加到侦听器中重新创建的字段中,一切正常
猜你喜欢
  • 1970-01-01
  • 2016-01-24
  • 2016-04-15
  • 2014-10-07
  • 2014-02-03
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多