我正在开发一个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与其进行交互。我欢迎任何解决方案或帮助我的解决方案。感谢。