我已经经历了你清单上的许多问题,所以让我具体说明一下我如何处理它。我也是OOP的瘾君子,发现对象技术非常灵活,强大而优雅(如果做得正确)。
MVC - 是的,放下手来,MVC是Web应用程序的标准。它是有据可查和可理解的模型。此外,它在应用程序级别上与OOP在类级别上的作用相同,也就是说,它使事物保持分离。MVC的不错补充是拦截过滤器模式。它有助于为预处理和后处理请求和响应附加筛选器。常见用途是记录请求、基准测试、访问检查、缓存等。
数据库表/行的 OOP 表示形式也是可能的。我每天使用DAO或ActiveRecord。解决 ORM 问题的另一种方法是行数据网关和表数据网关。下面是 TDG 利用接口的示例实现。ArrayAccess
HTML 模板也可以表示为对象。我将View对象与Smarty模板引擎结合使用。我发现这种技术非常灵活,快速且易于使用。对象表示视图应该实现方法,以便每个属性都传播到Smarty模板中。此外,还应实现方法以支持视图嵌套。请参阅示例:__set
__toString
$s = new View();
$s->template = 'view/status-bar.tpl';
$s->username = "John Doe";
$page = new View();
$page->template = 'view/page.tpl';
$page->statusBar = $s;
echo $page;
内容 :view/status-bar.tpl
<div id="status-bar"> Hello {$username} </div>
内容 :view/page.tpl
<html>
<head>....</head>
<body>
<ul id="main-menu">.....</ul>
{$statusBar}
... rest of the page ...
</body>
</html>
这样,您只需要内部视图(状态栏)将自动转换为HTML。在此处查看完整的实现。顺便说一句,使用拦截过滤器之一,您可以使用HTML页脚和页眉包装返回的视图,因此您不必担心从控制器返回完整的页面。echo $page
在设计时,是否使用Ajax的问题应该不重要。框架应该足够灵活,可以在本地支持Ajax。
表单验证绝对是可以以OO方式完成的事情。使用复合模式构建复杂的验证器对象。复合验证程序应循环访问表单域和分配的简单验证程序,并为您提供“是/否”答案。它还应该返回错误消息,以便您可以更新表单(通过Ajax或页面重新加载)。
另一个方便的元素是自动翻译类,用于更改数据库中的数据以适合用户界面。例如,如果您在 db 中有表示布尔状态的 INT(1) 字段,并在 HTML 中使用复选框,导致空字符串或_POST或_GET数组,则不能只将一个字段赋值到另一个数组中。使用转换服务将数据更改为适合 View 或 db 是清理数据的一种干净方法。此外,翻译类的复杂性即使在非常复杂的转换期间也不会乱扔控制器代码(例如将Wiki语法转换为HTML)。"on"
此外,i18n问题也可以使用面向对象技术解决。我喜欢使用函数(双下划线)来获取本地化消息。该函数不是执行查找并返回消息,而是为我提供一个 Proxy 对象并预先注册消息以供以后查找。一旦代理对象被推送到视图中,视图被转换为HTML,i18n后端就会查找所有预注册的消息。这样,仅运行一个返回所有请求消息的查询。__
访问控制问题可以使用业务代表模式解决。我在我的另一个Stackoverflow答案中描述了它。
最后,如果您想使用完全面向对象的现有代码,请查看Tigermouse框架。页面上有一些UML图可以帮助您了解事情是如何工作的。请随时接管这个项目的进一步发展,因为我没有更多的时间来处理它。
有一个很好的黑客!