PHP:分离业务逻辑和表示逻辑,值得吗?

4

可能是重复的问题:
为什么要在PHP中使用模板系统?

我只是好奇有多少开发人员实际上这样做了?

到目前为止,我还没有这样做过,我只是好奇是否真的有助于使事情看起来更加干净和易于遵循。我听说使用像Smarty这样的模板引擎会有所帮助,但我也听说相反的意见。它们只会产生不必要的开销,本质上就像学习一门新语言。

这里有没有任何人有模板方面的经验?你对它们有什么感觉?它们在大型项目中有用还是浪费时间?

顺便说一下:我工作的公司没有设计师,只有两个开发人员正在负责重新设计/升级此项目。我还使用了一些AJAX,这会对模板引擎产生影响吗?


请参考以下链接:https://dev59.com/eHRC5IYBdhLWcg3wAcbU - Dana the Sane
7个回答

10

这种做法不仅让代码看起来更加清晰,而且还有许多长期和短期的好处。

按部就班地组织代码永远不会错。首先,如果其他人需要接替你的工作,那么代码的维护和阅读会更加容易。我之前使用过Smarty,它很不错,可以使设计师的工作不干扰程序代码。

使用模板系统和框架会让完成任务变得更加容易。有一个经验法则可以遵循,即DRY(不要重复自己)。框架可以帮助你实现这个目标。

您可能想了解一下MVC,这是这些框架基于的模型。但是您可以在不必使用框架的情况下实现此设计结构。这样可以避免学习曲线。对于像Zend这样的框架,学习曲线比其他一些框架要陡峭得多。

我发现Code Igniter相当容易使用,他们的网站上有一些非常有用的视频教程。

祝你好运!


6
实际上需要将业务逻辑与视图分离,您可以在视图中使用php作为“模板语言”。我认为您可以在任何模板引擎上使用ajax。
编辑:
我的原始回答是针对是否使用模板引擎生成html的问题。我认为只要将业务逻辑与展示逻辑分离,php就足够用于模板任务。
即使是简单页面也值得这样做,因为它使您能够:
- 将应用程序的"大脑"代码与"面部"代码隔离开来,因此您可以更改外观而不会影响功能,或者增强功能而不会破坏外观。 - 在20%的代码中隔离80%的错误 - 创建可重用的组件:您可以将不同的呈现代码分配给相同的业务代码,反之亦然; - 将功能请求(业务代码)的关注点与设计请求(展示代码)的关注点分开,这通常涉及客户端的不同人员以及承包方的不同人员。 - 使用不同的人编写业务代码和展示代码;您可以让设计师直接处理展示代码,只需要最少的php知识。
一个简单的解决方案,模仿MVC并且不使用对象可能是:
- 使用单个控制器php文件,通过.httpdaccess文件接收所有请求; - 控制器根据请求决定使用哪些业务和展示代码; - 控制器然后使用include语句包含业务php文件; - 业务代码完成其任务,然后包含展示php文件。

3
差不多就是我要说的。我认为PHP最初是开发成一种模板语言的,所以没有必要添加另一层,但是一定要将非表示层代码分离出来。 - mpen

2

PHP是一个模板引擎(或者如果你喜欢的话,是一个超文本预处理器)。当HTML和PHP逻辑混合在一起时,很难进行维护,这就是为什么你需要将函数单独定义来构建各个部分,并通过嵌入在HTML中的短函数调用来构建页面。像这样完成后,我没有看到Smarty和原始的PHP之间有太大的区别,除了定界符的选择。


2
关注点分离是任何类型的软件开发,甚至是在Web上,都非常重要的原则。我发现很多人只是将所有内容尽可能地放在少量文件中,然后就算完成了。这绝对是错误的做法。正如已经提到的,它将有助于他人维护代码,但更重要的是,它可以帮助你阅读代码。当所有内容被分离出来时,你可以轻松思考。
我发现,Code Ignitor是使用PHP进行开发的最易学习的框架。我几乎是从零开始,通过几天时间就能够使用它,并且使用得相当高效。我根本不认为它是另一种语言。基本上,使用该框架强制我以可管理的方式组织事物,并且增加的功能类似于在jQuery中使用插件等,或者在Java中导入包。认为这就像学习另一种语言似乎有些可笑。
所以,总之,组织、组织、再组织。但是要记住,存在着一定程度的抽象化变得荒谬的情况。一个经验法则是,一个类(或我们的情况下的文件)应该非常好地完成一件事情。这并不意味着它是一个围绕打印的类,但需要一个字符串,使用复杂算法进行格式化,然后打印它(这只是一个例子)。每个类都应该做一些具体的事情,而不需要任何框架即可实现。但MVC之所以伟大,在于它让你进一步组织事物,不仅在单个类级别上,还在“包”级别上,即模型、视图和控制器(至少在这些框架的情况下;有其他方式来打包项目)。因此,现在你有了做好一些事情的单个类,然后将它们与做好其他事情的类组合在一起。这样,一切都保持得非常干净和易管理。
一旦你将事物组织成类,然后是包,最后要考虑的是这些类在包之间如何访问。当使用MVC时,访问通常会是Model<->Controller<->View,从而将模型(通常是数据库内容和PHP世界中的“业务”代码)与视图(通常获取用户信息,并将其传递给控制器,然后从模型获取更多信息(如果必要),或者对输入信息进行其他处理)分离开来。控制器在两个其他包之间充当交换机的角色通常。再次强调,存在其他打包方式等,但这是一种常见的方式。
希望对你有所帮助。

0

Smarty 和其他 PHP 模板框架实际上只是编译为 PHP,并且它们大多数情况下也会缓存其结果,以允许更快的处理。您可以自己完成所有这些,但如果您查看 Smarty 生成的编译模板并将其与您创建的原始 Smarty 模板进行比较,则可以看到一个更易读的模板。


0

我现在主要写mod_perl,并在我们正在进行的项目中开始使用模板(HTML::Template)。如果我再次做出决定,我会从一开始就使用模板 - 事后重写以使用模板有点繁琐,但是回报很大,因为您可以获得更好和更清洁的代码。对于任何大于2-3页的php页面,我也会使用一些模板引擎。


0

像Smarty这样的模板引擎的一个巨大优势是非开发人员也可以使用它来嵌入在前端使用的必要逻辑(除了最简单的网站,真的无法将逻辑和显示分离)。然而,如果开发人员负责维护页面,则在我看来使用PHP会更好。

如果您将大型逻辑块分离出来,并保持循环和for-each流程控制语句的一致模式(即不使用打印语句,或仅对单行语句使用打印语句等),那么应该没问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接