5

I have a specific question, that could use a general answer... When building Multi-Tier applications in PHP, does everything have to be done in the Business Logic layer, or can any layer do work... Example, Lets say I'm building an application that shows user information (from the database) on the presentation layer. Should I use the business layer to simply pass the data to the presentation layer, or just get the information from the database directly within the presentation layer. Should the presentation layer be used JUST for presenting the data, the accessor layer used JUST to get the data, and all the work be done in the business layer?

Also, speaking of the different layers, is it best to do things procedurally, or using OOP ( like using includes to show the templates vs using a class to include the templates, validating data procedurally vs using a class, or functions vs classes for getting the data from the database, etc. )

As you can see, I'm trying to understand how things work, and the best way to do things. That being said, if you have any advice, or any general tips on the subject... please leave them..

Thanks

4

7 回答 7

3

Web 应用程序和 N 层很有趣,主要是因为 N 层的概念随着 JSON 和 AJAX 或 Flash 和 XMLRPC 的广泛采用而扩展。Webopedia 上的这张图表显示了一条交错的蓝线,很好地表达了这一点。总而言之:您的业务、访问器和表示逻辑不仅可以存在于服务器上,而且在某些情况下,就在浏览器中。然而,N 层的意图是可分离性。如果您需要更改 UI 或数据库,或添加其他 UI,则不应影响您的业务逻辑。这就是决定你的 API 的因素——预计有一天你的 HTML 和 CSS 会被 Flex 抛弃,而 MySQL 会被 Oracle 取代。

这是由需求决定的,在我使用过的一些 Web 应用程序中,同时使用了 N 层的变体。以 LyrisHQ(一个电子邮件 ASP)为例。他们有一个客户 Web 应用程序。最近,他们一直在努力推动他们基于 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/Persistence 层(如 Hibernate)更好地展示了这种隔离,通常通过提供对象查询语言 (OQL)。

我自己,目前正在进行从基于 MySQL 的 PHP 应用程序到 MS-SQL 应用程序的后端转换。该应用程序只使用过直接 SQL 查询。想象一下,选择如何在一个类中获取一系列查询并将它们抽象化或子类化,并希望不会改变业务逻辑。至少,您需要使所有 SQL 调用都是间接的。(所以在 PHP ORM 上发帖。)

最后,关于您关于 OOP 的问题:必须如何使用它来满足您的要求。我个人的技巧是从 PHP 演示模板中的逻辑开始,花几分钟时间让球滚动起来,很快我将把它重构为一个类和一个模板。如果我有共同的想法,我会将例程分解为共享类,努力保持 DNRY 原则。(这里有一篇关于此的帖子。OOP 不是 N 层设计的基本要求。DNRY 对于保持代码的可维护性非常重要。通常,截止日期和范围转移会破坏 API。重构它直到你得到你需要的东西继续前进。我敢打赌 OOP 会帮助你到达那里。

于 2009-11-08T07:25:23.900 回答
2

I once read something saying that big models (business layer) should be preferred over big controllers (accessor layer).

Also: It really depends on the project. In my eyes it doesn't always make sense to use OOP for everything (probably not everyone will agree here), especially in scripting languages like PHP it oftentimes is easier to simply do validators as functions...

于 2009-11-08T00:25:12.347 回答
1

我绝对建议您不要在表示层中进行数据库调用,这会破坏其目的。

多层架构有不同的方法,它们有不同的建议。

我使用过的 Zend 框架通常采用胖模型/瘦控制器变体的形式。

如果找到这篇关于选择 PHP 框架的注意事项,可以很好地比较(在这种情况下)CakePHP 和 Zend 框架。

我认为最大的不同是 CakePHP 采用的约定优于配置的方法,这与 Zend Framework 中的配置重点有很大不同。

通过使用一个框架,如果实现多层架构,这很有意义,你在某种程度上被迫或至少被迫使用 OOP,这不是一件坏事。

你当然可以实现,比如说一个带有纯函数调用的 3 层架构,但根据我的经验,它的扩展性并不好。

对于网站来说,实际上由于层级通信方式而完全不同的 MVC 模式是一个不错的选择。

“正常”的 3 层拱门和 MVC 模式之间的区别在于视图可以访问控制器和模型层,而表示层只能访问 3 层拱门的逻辑层。

于 2009-11-08T01:28:37.163 回答
0

我的世界是这样的:

DB1 <- Model1 为该数据集提供访问器功能、数据完整性、业务规则 DB2 <- Model2 为该数据集提供访问器功能、数据完整性、业务规则

控制器:控制数据流到视图,过滤/组织视图中的数据。实现给定应用程序的业务规则。了解模型之间的业务规则。

视图:只不过是显示控制器提供的数据的模板。将所有数据传递给控制器​​。不了解 Model1 或 Model2 或管理它们的业务逻辑。

于 2009-11-08T04:12:59.950 回答
0

我同意 Franz 所说的,特别是关于更喜欢更大的模型而不是更大的控制器。你也可以使用经验法则来帮助区分代码应该去哪里:如果它与 UI 结构/流程有任何关系,把它放在控制器; 如果它是纯粹的业务逻辑,它会进入模型..

我将补充一点,作为一名在测试 PHP 水域之前有丰富的 Struts 经验的 Java 开发人员,我花了一段时间才了解如何将 MVC 思想应用于脚本语言。我个人发现使用像这样的系统CodeIgnitor帮了很多忙……它提供了框架,很像 Struts,并鼓励良好的 MVC 模式……

于 2009-11-08T00:45:27.827 回答
0

我建议对设计模式进行一些研究,因为这是你拼图中缺失的部分。有许多特定于 PHP 的书籍涵盖了这个主题(来自 APress 的书籍很好)以及设计模式的“圣经”:“设计模式:可重用的面向对象软件的元素”

于 2009-11-08T07:45:41.067 回答
0

让我们等待更稳定的Doctrine2版本。

它是用不了解持久性的域对象哲学来开发的。在这个框架的帮助下开发多层应用程序会容易得多。

于 2009-12-15T11:34:07.393 回答