Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何动态选择EntityManager与Symfony2表单上的多个主机一起使用_Php_Symfony_Orm_Doctrine - Fatal编程技术网

Php 如何动态选择EntityManager与Symfony2表单上的多个主机一起使用

Php 如何动态选择EntityManager与Symfony2表单上的多个主机一起使用,php,symfony,orm,doctrine,Php,Symfony,Orm,Doctrine,我有一个Symfony2捆绑包,其中除了用于常规设置等的固定EM之外,我还基于子域使用EntityManager的动态选择。例如,用户登陆dev.mydomain.com并显示一个登录屏幕,该屏幕从包含站点标题、颜色等的默认数据库中提取信息。登录脚本,但是,将引用包含该子域的用户和数据的dev数据库。类似地,当登录到other.mydomain.com时,登录会引用其他数据库。这一切都非常有效,用户可以根据相应的数据库进行验证 我遇到的问题是当我使用Symfony的表单系统创建一个新的用户表单时

我有一个Symfony2捆绑包,其中除了用于常规设置等的固定EM之外,我还基于子域使用EntityManager的动态选择。例如,用户登陆dev.mydomain.com并显示一个登录屏幕,该屏幕从包含站点标题、颜色等的默认数据库中提取信息。登录脚本,但是,将引用包含该子域的用户和数据的dev数据库。类似地,当登录到other.mydomain.com时,登录会引用其他数据库。这一切都非常有效,用户可以根据相应的数据库进行验证

我遇到的问题是当我使用Symfony的表单系统创建一个新的用户表单时。我使用书中概述的用户角色的多对多关系,但找不到指定使用哪个EntityManager的方法,导致它根据默认EntityManager查找关系

Controller/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() )
    );
}
Entity/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中,以供内置的多个ORM注释使用?需要明确的是,表单的其余部分可以正常工作,将用户添加到所需的EntityManager中-只是角色字段仍然引用默认值。

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

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

$form = $this->createForm(
           new UserType($em), $us, array('em'=>$em)
        );
最后,通过将实体管理器包含在表单/UserType.php中的setDefaultOptions中,我确保了实体管理器是必需的:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setRequired(array('em'));

    $resolver->setDefaults(array(
        'em' => null
    ));
}

在执行此操作时,“我的表单”中的“许多角色”字段将从正确的实体管理器中提取并保存到正确的实体管理器。

请添加您定义实体管理器的配置文件,好吗?你为什么不选择2个或更多的包而不是1个呢?我已经把它包括在问题的底部。我选择使用单个bundle,因为它是一个跨多个机构使用相同代码库的应用程序。我想要一个简单的方法来启动一个新机构,只需将它们包含在配置和默认数据库站点表中,其中包括子域、徽标等,同时维护基于机构的对其不同数据库的权限。目前,您有两个实体经理管理同一件事。因此,如果运行应用程序/控制台原则:模式:验证两个模式都不同步,因为据我所知,一些实体由一个实体管理器管理,仅映射到一个数据库中,而其他实体则由另一个实体管理器管理,映射到另一个数据库中。在配置中写下区别,我认为应该可以。请看:@anegrea感谢您的回复。运行该语句会产生以下结果,这意味着模式中的一切都很好。我还更新了这个问题,使其包含区别,它们从另一个文件中提取参数。多个实体在整个站点上工作,只是不适用于表单上的这个字段。php应用程序/控制台原则:schema:validate[Mapping]OK-映射文件是正确的。[数据库]确定-数据库架构与映射文件同步。
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setRequired(array('em'));

    $resolver->setDefaults(array(
        'em' => null
    ));
}