BDu*_*elz 5 php model-view-controller multi-tier
我有一个具体的问题,可以使用一个一般性的答案...用PHP构建多层应用程序时,是否必须在业务逻辑层中完成所有工作,或者任何层都可以工作...例如,可以说我正在构建一个在表示层上显示用户信息(来自数据库)的应用程序。我应该使用业务层将数据简单地传递到表示层,还是直接从表示层内的数据库中获取信息。应该仅使用表示层来表示数据,还是使用访问器层来获取数据,并且所有工作都在业务层中完成?
另外,说到不同的层,最好是按程序执行操作,还是使用OOP(例如,使用include来显示模板,使用类来包含模板,通过程序来验证数据还是使用类,或者使用函数vs类来获取数据)数据库中的数据等)
如您所见,我正在尝试了解事物的工作方式以及执行事物的最佳方法。话虽如此,如果您对此主题有任何建议或任何一般性提示,请离开他们。
谢谢
Web 应用程序和 N 层很有趣,主要是因为 N 层的概念随着 JSON 和 AJAX 或 Flash 和 XMLRPC 的广泛采用而扩展。网络百科上的这张图表显示了一条交错的蓝线,很好地表达了这一点。总结一下:您的业务、访问器和表示逻辑不仅可以存在于服务器上,而且在某些情况下也可以存在于浏览器中。然而,N 层的目的是可分离性。如果您需要更改 UI 或数据库,或添加其他 UI,则不应影响您的业务逻辑。这就是决定你的 API 的因素——预计有一天你的 HTML 和 CSS 会被 Flex 抛弃,MySQL 会被 Oracle 取代。
这是确定的要求,并且在我使用的一些 Web 应用程序中,同时使用 N 层的变体。以 LyrisHQ(电子邮件 ASP)为例。他们有一个客户网络应用程序。最近,他们开始推出基于 Flash 的应用程序。这显然将大量数据直接传送到浏览器,并且 Flash UI 中可能存在一些重复的业务逻辑。然而,他们必须维护这两个应用程序,因为其中一个应用程序对于不同(和重叠)的需求是必需的。
大多数常见的 PHP 应用程序都不会考虑向浏览器传送大量未格式化的数据。但如果您是,这会很快告诉您想要如何设计 API。很可能,除了 PHP 演示模板使用的类似内部控制器类之外,您还需要能够使用 XMLRPC、REST 或 SOAP 的控制器。这严格意味着对于一个简单的 Web 登录页面,您将有一个用于与 LoginController 类对话的登录表单的 PHP 模板。XML 接口同样会使用相同的 LoginController 类。正如您认为自己会疯狂地将 SQL 写入 Ajax 请求一样……您将严格避免将查询写入演示模板中。
业务层可以或多或少严格,因为通常不需要切换数据库后端的品牌。在严格的 N 层设计中,业务对象与数据库的通信方式就好像您可以从 MySQL 切换到 MS SQL,而无需重写业务层。有时,这是通过为每个表(表网关)、每行(活动记录)、每个连接或每个事务建模对象来完成的。这就是 PDO 或 PHP-ADO 等有用的地方,但不足以完全隔离。Java 中的 ORM/持久层(例如 Hibernate)通常通过提供对象查询语言 (OQL) 来更好地展示这种隔离。
我自己目前正在进行从基于 MySQL 的 PHP 应用程序到 MS-SQL 应用程序的后端转换。该应用程序仅使用过直接 SQL 查询。想象一下,选择如何在一个类中进行一系列查询,然后对它们进行抽象或子类化,并希望不会改变业务逻辑。至少,您希望所有 SQL 调用都是间接的。(所以关于 PHP ORM 的帖子。)
最后,关于 OOP 的问题:如何使用它来满足您的需求。我个人的技术是从 PHP 演示模板中的逻辑开始,花几分钟来开始工作,很快我就会将其重构为一个类和一个模板。如果我有共同的想法,我会将例程分解为共享类,努力维护 DNRY 原则。(这里有一篇关于这一点的文章。OOP不是 N 层设计的基本要求。DNRY 对于保持代码可维护性非常重要。通常,截止日期和范围转移会破坏 API。重构它,直到获得所需的内容继续前进。我打赌 OOP 将帮助您实现这一目标。