使用 AngularJS 和 Symfony 2 进行在线/离线数据同步的最佳实践

     2023-02-19     163

关键词:

【中文标题】使用 AngularJS 和 Symfony 2 进行在线/离线数据同步的最佳实践【英文标题】:Best practice for on/off line data synchronization using AngularJS and Symfony 2 【发布时间】:2014-05-22 09:08:28 【问题描述】:

我正在使用 AngularJS 构建一个相对复杂且数据量大的 Web 应用程序。我打算使用 php 作为 RESTful 后端(使用 symfony2 和 FOSRESTbundle)。我花了数周时间寻找在线/离线同步解决方案的不同解决方案,似乎有很多半解决方案(请参阅下面的列表以获取一些示例)。但它们似乎都不完全适合我的情况。我该如何决定哪种策略适合我?

哪些问题可能决定在 AngularJS 和 symfony 2 中构建在线/离线同步系统的“最佳实践”需要一些研究,但在我的头上,我想考虑诸如速度、易于实施、未来之类的事情证明(持久的解决方案)、可扩展性、客户端的资源使用/要求、让多个离线用户编辑相同的数据、要存储的数据量和类型。

我目前知道的一些要求是:

用户会经常离线,然后需要与数据库同步(本地创建)数据 多个用户共享一些可编辑的数据(需要考虑潜在的合并问题)。 用户可能同时从多个设备登录。 允许离线存储大量数据(最多 1 GB) 我可能希望用户能够决定他想在本地存储什么。 即使用户在线,我也可能希望用户能够选择是使用所有(后端)数据还是仅使用本地可用的数据。

一些潜在的示例解决方案

PouchDB - 用于同步来自多个来源的更改的有趣策略 Racer - 用于实时同步的节点库,基于 ShareJS 构建 Meteor - DDP 和同步策略 ShareJS - 受 Google Wave 启发的 Node.js 操作转型 Restangular - $resource 的替代品 EmberData - EmberJS 的类似 ORM 的数据持久化库 服务工作者 IndexedDB Polyfill - 使用支持 WebSQL (Safari) 的浏览器填充 IndexedDB BreezeJS JayData Lo​​opback 的 ORM 活动记录 主干模型 lawnchair - 来自 Brian Leroux 的轻量级客户端 DB 库 TogetherJS - Mozilla 实验室的多客户端状态同步/协作库。 localForage - Mozilla 的 DOMStorage 改进库。 Orbit.js - 内容同步库

(https://docs.google.com/document/d/1DMacL7iwjSMPP0ytZfugpU4v0PWUK0BT6lhyaVEmlBQ/edit#heading=h.864mpiz510wz)

任何帮助将不胜感激:)

【问题讨论】:

想知道你最后选择了什么?似乎有很多选择,但没有 100% 适合用例.. 我很想知道你最终选择了什么。 【参考方案1】:

另一个建议: Yjs 利用类似 OT 的算法来共享各种受支持的数据类型,并且您可以选择将共享数据存储在 IndexedDB 中(因此可用于离线编辑)。

【讨论】:

【参考方案2】:

要离线处理您的要求,我建议将问题分为两种情况:内容(html、js、css)和数据(API REST)。

内容

将由appcache 离线存储,用于小型应用程序或具有出色serviceworkers 的高级案例。 Chrome 40+。

数据

需要解决存储和同步问题,这成为了一个更棘手的问题。 我建议深入阅读Differential Synchronization 算法,并考虑下一个提示:

前端

将资源和影子(例如使用 url 作为键)存储到小型应用程序的本地存储中或更高级的替代方案(pouchdb、indexdb、...)中。使用该资源,您可以离线工作,并在需要与服务器同步时使用 jsonpath 来获取资源影子之间的差异并将其发送到服务器 PATCH 请求。

后端

在后端考虑将卷影副本存储到 redis 中。

两端(前端/后端)需要识别客户端节点,为此您可以在HTTP标头处使用x- syn-token(在客户端的所有请求中使用角度拦截器发送它)。

【讨论】:

【参考方案3】:

我正在开发的应用程序有许多相同的要求,并且是用 AngularJS 构建的。在未来的证明方面,我发现有两个主要问题,一个是需要加密和可能使用一次性密钥和后端密钥管理器的黑客攻击尝试,另一个是标准联盟优先放弃对 WebSQL 的支持indesedDB。因此,找到一个可以同时支持两者的抽象层很重要。我提出的解决方案集相当简单。离线数据首先加载到 UI 中,如果处于在线状态,则向 REST 服务器发出请求。至于解决多用户环境中的数据冲突,这成为业务规则决策。我的决定是简化问题,而不是深入研究数据合并,而是使用微时间戳比较来确定应该保留哪个版本并将其推送给客户。在离线模式下,将数据存储为脏写,并在返回在线状态时推送到服务器。

或者使用 ydn-db,我现在正在评估它,因为它内置了对 AWS 和内置 Google 云存储的支持。

【讨论】:

【参考方案4】:

https://www.firebase.com/ 它可靠且经过验证,可用作您所追求的后端和同步库。但是,它成本高,并且需要一些集成编码。https://goinstant.com/ 也是一个不错的托管选项。

在我的一些应用程序中,我更喜欢两者兼有:同步数据库源和另一个主数据库。 (mogno/express、php/mysql 等。)。然后每个数据库处理它最好的功能,以及它的功能(实时与安全等)。无论同步数据库提供者如何(无论是 Racer、Firebase 还是 GoInstant ...),这都是正确的。

【讨论】:

更新:GoInstant 已停止。【参考方案5】:

你似乎想要很多东西,同步的东西很难......我在我正在开发的一个 OSS 库中找到了一些解决方案。这个想法是它对本地数据进行版本控制,因此您可以找出发生了什么变化,从而进行有意义的同步,其中还包括冲突解决等。这有点像离线流星,因为它真的适合离线使用(对于没有移动数据信号的伦敦地铁)。

我还围绕它开发了一个生态系统,其中包括连接管理器和服务器。主要项目位于https://github.com/forbesmyester/SyncIt,并且有很好的文档记录和测试。生态系统的测试应用程序将在 https://github.com/forbesmyester/SyncItTodoMvc,但我几乎还没有为它编写任何文档。

它目前正在使用 LocalStorage,但很容易转移到 localForage,因为它实际上是使用 localStorage 的包装器来使其成为异步 API... 可能是列表中的另一个?

【讨论】:

Angular JS 和 Symfony2

】AngularJS和Symfony2【英文标题】:AngularJSandSymfony2【发布时间】:2015-12-3105:35:03【问题描述】:我目前正在使用Symfony2进行一个项目,并寻求一些建议。我正在考虑以两种(2)不同的方式混合应用程序a)登录页面应使用带有CRF令牌的... 查看详情

使用可翻译的学说和 Symfony 2 形式

】使用可翻译的学说和Symfony2形式【英文标题】:UsingdoctrinetranslatabletogetherwithSymfony2forms【发布时间】:2011-10-0322:41:56【问题描述】:我的应用中有Entity,它有2个可翻译字段,使用DoctrineTranslatableExtension:classPageimplementsTranslatable/... 查看详情

Symfony 2 - 使用资产

】Symfony2-使用资产【英文标题】:Symfony2-Workingwithassets【发布时间】:2012-04-1310:32:36【问题描述】:我需要一些关于如何在Symfony2中使用资产的技巧。例如,我们是否必须始终执行assets:update每次添加图像?我知道Assetic负责管理css... 查看详情

跨域请求被阻止 Symfony/AngularJS

】跨域请求被阻止Symfony/AngularJS【英文标题】:Cross-OriginRequestBlockedSymfony/AngularJS【发布时间】:2017-12-1405:06:40【问题描述】:我目前在尝试使用Angular从返回JSON的SymfonyAPI获取数据时遇到错误:“跨域请求被阻止:同源策略不允许... 查看详情

Symfony 2:手动登录和 Json Web Token

】Symfony2:手动登录和JsonWebToken【英文标题】:Symfony2:manualloginandJsonWebToken【发布时间】:2015-06-2803:30:10【问题描述】:我当前的项目有问题。我一直在使用Symfony2.6这个项目是我的前端调用的API。身份验证和登录流程非常具体,... 查看详情

Symfony 2:会话和存储之间的区别?

】Symfony2:会话和存储之间的区别?【英文标题】:Symfony2:differencebetweensessionandstorage?【发布时间】:2012-10-1819:34:22【问题描述】:谁能向我解释一下Symfony2中“会话”和“存储”之间的区别?我正在使用PdoSessionStorage,但我看不... 查看详情

symfony 2:在css中使用资产作为图像路径[重复]

】symfony2:在css中使用资产作为图像路径[重复]【英文标题】:symfony2:usingassetforimagepathincss[duplicate]【发布时间】:2013-08-0216:59:56【问题描述】:我是php和symfony的新手。我一直在成功地使用以下语法将css和脚本包含到我的页面中... 查看详情

Symfony 2:依赖注入和特征

】Symfony2:依赖注入和特征【英文标题】:Symfony2:dependencyinjectionandtraits【发布时间】:2012-07-1315:25:40【问题描述】:我正在尝试找到一种方法来使用Symfony2DependencyInjectioncomponent和新的PHP5.4traits。长话短说(实际上不是那么短),... 查看详情

Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误

】Symfony2Form+AngularJSforRESTAPI=表单验证额外字段错误【英文标题】:Symfony2Form+AngularJSforRESTAPI=Formvalidationextrafieldserror【发布时间】:2014-03-2707:46:51【问题描述】:我已阅读这篇文章(http://welcometothebundle.com/symfony2-rest-api-the-best-2013-way 查看详情

使用 Symfony 2 CLI 工具,如何为子类生成具有正确类型提示的 getter 和 setter?

】使用Symfony2CLI工具,如何为子类生成具有正确类型提示的getter和setter?【英文标题】:UsingSymfony2CLItools,howcanIgenerategettersandsetterswithcorrecttypehintingforsub-classes?【发布时间】:2013-08-0813:03:43【问题描述】:背景我正在使用Symfony2开... 查看详情

Symfony 2 网络套接字

】Symfony2网络套接字【英文标题】:Symfony2websockets【发布时间】:2012-05-1520:06:46【问题描述】:我正在尝试使用websockets和Symfony2创建一个聊天应用程序。给定聊天室的传入消息应存储在MySQL数据库中,而传出消息应发送给该聊天... 查看详情

SonataUserBundle 和 Symfony 3.4

】SonataUserBundle和Symfony3.4【英文标题】:SonataUserBundleandSymfony3.4【发布时间】:2018-06-1206:52:15【问题描述】:我有一个问题,我应该使用哪个版本?我从需要FOSUserBundle^2.0的Symfony3.4LTS开始。要将SonataUserBundle与FOSUserBundle一起使用,... 查看详情

VueJs 2 和 Symfony 3 补丁休息请求

】VueJs2和Symfony3补丁休息请求【英文标题】:VueJs2andSymfony3PatchRestRequest【发布时间】:2018-05-2617:56:16【问题描述】:我的目标是发出一个事件请求PATCH,使用VueJs2触发以下内容://Linkandbodyisdefinedandfinethis.$http.patch(linkUrl,this.baseTerms... 查看详情

Symfony 2 ACL 与选民

】Symfony2ACL与选民【英文标题】:Symfony2ACLvsVoters【发布时间】:2013-01-0822:08:00【问题描述】:我想使用isGranted(\'EDIT\',$userObject)来允许所有管理员和经理以及那个用户编辑给定的用户数据。我应该使用ACL来控制编辑$userObject吗?我... 查看详情

如何将变量从 twig 传递给 vueJS(symfony 2.8 和 VueJS 2)

】如何将变量从twig传递给vueJS(symfony2.8和VueJS2)【英文标题】:HowtopassavariablefromtwigtovueJS(symfony2.8andVueJS2)【发布时间】:2018-08-2917:25:47【问题描述】:我有一个symfony2.8应用程序,我最近集成了VueJs2作为我的前端框架,因为它提... 查看详情

Symfony 4 Restful API 使用 JWT 和 facebook 登录

】Symfony4RestfulAPI使用JWT和facebook登录【英文标题】:Symfony4RestfulAPIloginwithJWTandfacebook【发布时间】:2020-05-0508:37:17【问题描述】:我有一个关于通过JWT和Facebook进行身份验证的问题。我正在使用Symfony4和身份验证“lexik/jwt-authenticati... 查看详情

在会话中存储对象 Symfony 2

】在会话中存储对象Symfony2【英文标题】:StoreobjectsinsessionsSymfony2【发布时间】:2012-06-1612:36:25【问题描述】:我正在使用Symfony2编写一个小型电子商店应用程序,我需要一些方法将用户的购物车存储在会话中。我认为使用数据... 查看详情

Symfony2:使用 ajax 和验证更改选择

】Symfony2:使用ajax和验证更改选择【英文标题】:Symfony2:Changechoiceswithajaxandvalidation【发布时间】:2012-10-3013:57:20【问题描述】:场景:我有一个包含2个选择的表单。当用户从第一个选择中选择某些内容时,第二个选择会填充新... 查看详情