在会话中将Symfony实体从一个连接复制到另一个/ Store实体以进行实时交互

时间:2016-12-11 02:28:21

标签: php session doctrine symfony

我正在开发一个Symfony项目。该项目是关于生成工作表,并为用户提供编辑工作表的所有方面的功能。例如,问题,文本,变量和系统能够返回包含所有答案和解释的工作表。系统能够生成随机工作表。

所以我在Symfony中创建了几个实体。以Wordsheet为基础。因此,工作表有问题,问题有答案,变量(可由用户更改)和子问题等,答案有解释。

Worksheet->Questions
    Question->Answers
    Question->ChildQuestions
    Question->Variables
        Answer->Explanation

这是基本结构,但还有其他几种深层关系。每个工作表都附带一个处理它的服务。并且工作表的基本默认/原型存储在数据库中,并在用户访问工作表页面时加载。我正在尝试创建一个系统,我可以在会话中安装工作表,以便用户可以通过Ajax / AngularJS / API与它进行交互。

我的解决方案

我认为的第一个解决方案是将工作表实体存储到具有所有关系的会话中。但这几乎是不可能的,因为使用克隆时PHP深度复制问题。由于它的复杂性,我也讨厌序列化工作表实体的想法。

第二个解决方案是创建第二个Smyfony连接,并使用会话ID将工作表实体克隆到另一个连接/数据库。我已经成功地克隆了与第二个连接/数据库的所有关系的实体,但是当我第二次访问实体时,所有关系映射都丢失了,尽管我在第二个数据库中看到非常相同的数据数据库但所有关系都已丢失。即当我使用Worksheets-> GetQuestions()时,我得到一个空数组,尽管数据存在于数据库中。

这是我的Symfony doctrine多连接设置;

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_mysql
                host:     '%database_host%'
                port:     '%database_port%'
                dbname:   '%database_name%'
                user:     '%database_user%'
                password: '%database_password%'
                charset:  UTF8
                mapping_types:
                  enum: string
            session:
                driver:   pdo_mysql
                host:     '%database_host2%'
                port:     '%database_port2%'
                dbname:   '%database_name2%'
                user:     '%database_user2%'
                password: '%database_password2%'
                charset:  UTF8

    orm:
        default_entity_manager: session
        auto_generate_proxy_classes: "%kernel.debug%"
        entity_managers:
            default:
                connection:     default
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: true
                mappings:
                    AppBundle: ~
                filters:
                    softdeleteable:
                        class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                        enabled: true
            session:
                connection: session
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    AppBundle: ~
                filters:
                    softdeleteable:
                        class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                        enabled: true

我在使用此设置时遇到了很多问题。虽然现在数据已正确保存到第二个连接/数据库。例如,我不能使用auto_mapping:对于2个以上的连接,我认为这可以解决我的关系问题。在symfony中,我使用这样的代码将实体克隆到第二个连接/数据库;

$WorksheetClone = $RendererService->GetProcessedCopy ();
$WorksheetClone->setGUID($WorksheetClone->getGUID().'.'.$worksheet_session_key);
$WorksheetClone->setName($WorksheetClone->getName().'.'.$worksheet_session_key);
$WorksheetClone->setSessionReference($worksheet_session_key);

$session_em = $this->getDoctrine()->getManager('session');
$session_em->persist($WorksheetClone);
$session_em->flush();

我正在寻找一种解决方案,可以通过会话或数据库以某种方式保存工作表,以便用户可以通过API与其进行交互。我欢迎任何解决方案或帮助我的解决方案。感谢。

0 个答案:

没有答案