如何在Symfony2表单上动态选择EntityManager以与ManyToMany一起使用

时间:2015-04-14 18:43:33

标签: php symfony orm doctrine

我有一个Symfony2软件包,我在这里使用基于子域的动态选择的EntityManagers以及用于一般设置的固定EM等。例如,用户登陆dev.mydomain.com并显示一个登录屏幕,用于从包含站点标题,颜色等的default数据库中提取信息。但是,登录脚本引用包含该子域的用户和数据的dev数据库。同样,登录other.mydomain.com时,登录会引用other数据库。这一切都很有效,用户可以根据相应的数据库进行验证。

我遇到的问题是当我创建一个"新用户表单"使用Symfony的Form系统。我按照本书的概述,为用户角色使用了“多对多”关系,但无法找到指定使用哪个EntityManager的方法,从而使其查找与default EntityManager的关系。

控制器/ UserController.php

public function addAction(Request $request) {

    $us = new User();

    // ORM Connection name stored in session from the login screen
    $em = $this->getDoctrine()->getManager(
        $request->getSession()->get('database')
    );

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

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

实体/ user.php的

/**
 * @var string
 *
 * @ORM\ManyToMany(targetEntity="Role", inversedBy="users", cascade={"persist"})
 */
private $roles;

config.yml

doctrine:
  dbal:
    connections:
        default:
            driver:   "%database_driver%"
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  UTF8
        dev:
            driver:   "%dev.database_driver%"
            host:     "%dev.database_host%"
            port:     "%dev.database_port%"
            dbname:   "%dev.database_name%"
            user:     "%dev.database_user%"
            password: "%dev.database_password%"
            charset:  UTF8
orm:
  default_entity_manager: default
  auto_generate_proxy_classes: "%kernel.debug%"
  entity_managers:
    default:
        connection: default
        mappings:
            MyBundle: ~
    dev:
        connection: dev
        mappings:
            MyBundle: ~

有没有办法将指定的EntityManager传递给createForm或FormBuilder以供内置的ManyToMany ORM注释使用?要清楚,表单的其余部分可以正常工作,添加用户到期望的EntityManager - 它只是仍在引用default的角色字段。

1 个答案:

答案 0 :(得分:0)

Form / UserType.php文件中使用的FormBuilder具有add()方法,允许添加实体的组件。 add()方法可以将一组选项作为第三个元素。其中一个选项是em

->add('roles', 'entity', array(
         'class'=>'MyBundle:Role',
         'property'=>'name',
         'em'=>$options['em'],
         'multiple'=>true
      ))

我能够通过Controller / User.php中的createForm()方法将动态确定的实体管理器传递到文件中,以便从上面的选项数组中访问:

$form = $this->createForm(
           new UserType($em), $us, array('em'=>$em)
        );

最后,我确保通过在{/ 1}}中将其包含在Form / UserType.php中来确保实体经理:

setDefaultOptions()

在执行此操作时,表单中的ManyToMany Roles字段会从正确的实体管理器中拉出并保留。