【发布时间】:2016-09-26 22:20:53
【问题描述】:
随着网络应用程序需求的增长,我发现自己编写的 API 驱动的网络应用程序越来越多。我使用 AngularJS 之类的框架来构建与这些 API 通信的富 Web 客户端。目前我在服务器端/API 上使用 PHP(Lumen 或 Laravel)。
问题是,我发现自己经常在客户端和服务器端之间重复业务逻辑。
当我说业务逻辑时,我指的是订单表单的如下规则:
- 买Y就可以买X。
- 有Z就不能买Y。
- 如果您购买其中 10 件,您将获得 10% 的折扣。
- 高度 x 宽度 x 深度 x 成本 = 最终成本。
- 如果宽度大于 5,高度必须在 10 到 20 之间。
- 等等等等
为了使这个应用程序既响应又快速,计算逻辑(以及其他业务逻辑)在客户端完成。由于我们不应该信任客户端,因此我在服务器端重新验证这些数字。这种逻辑可能会变得非常复杂,在这两个地方编写这种复杂的逻辑感觉很危险。
我想到了三个解决方案:
让所有需要业务逻辑的东西都对 API 进行 ajax 调用。所有的业务逻辑都集中在一个地方,并且可以测试一次。这可能会很慢,因为客户必须等待他们对订单进行的每一次更改才能获得更新的值和结果。拥有一个非常快速的 API 将对此有所帮助。主要缺点是当用户连接不佳(移动设备)时,这可能无法正常工作。
在客户端和服务器端编写业务逻辑。客户在对表单进行更改时会获得即时反馈,一旦他们在服务器上提交,我们就会验证所有数据。这里的缺点是我们必须复制所有的业务逻辑,并测试双方。这肯定是更多的工作,并且会使未来的工作变得脆弱。
相信客户!?!在客户端编写所有业务逻辑并假设它们没有篡改数据。在我目前的情况下,我正在开发一个报价生成器,它总是会被人工审核,所以也许这实际上是可以的。
老实说,我对任何解决方案都不满意,这就是我向社区寻求建议的原因。我很想听听您对此问题的意见或方法!
【问题讨论】:
-
你的问题不就是简单的MVC设计模式作为解决方案吗?
-
在服务器 ajax 上使用 PHP 是最酷的方法,并且不应超过几毫秒,如果确实需要更多时间,您也可以设置加载屏幕或警告。你可以转移到像流星/节点这样的框架,如果你对整个事情进行了一次编码,并且只为服务器或客户端明确了一些细节。您可以对 HTML 表单进行基本验证,然后在服务器上进行大型验证。您可以在 js 中创建可供客户端访问和从服务器访问的库。看看这个php.net/manual/en/v8js.executestring.php
-
愿我发现的另一位导师对您感兴趣:phpied.com/server-side-react-with-php
-
也许你可以使用 websocket?它非常快,您可以使用 javascript。老实说,我不知道它是否使用了很多带宽。您可以考虑在需要时连接到此 websocket,并在事务完成时断开连接。 Websockets 很有趣并且很容易实现。看this。
-
我会同时使用服务器端和客户端验证;但我不喜欢重复代码的想法,所以很可能我会让服务器将验证规则传递给客户端并让客户端使用这些规则,所以它是验证所有案例的 1 个函数(所有更改都将在服务器端完成因此客户端仍然能够正确验证的任何更改)然后我会在保存到服务器端之前进行验证(最终提交)
标签: php angularjs ajax laravel api-design