【发布时间】:2011-01-20 22:39:42
【问题描述】:
我想在 PHP 中从头开始实现 MVC,因为我想完全控制自己的代码 并且没有来自现有框架的额外负担。有人有什么建议吗?
是的,我看过 Lerdorfs 的文章,而且似乎它毕竟没有那么多代码。实际上,我更希望有一个控制器视图解决方案来构建我的应用程序。我会坚持使用我自己自制的 PDO 数据访问类。
【问题讨论】:
我想在 PHP 中从头开始实现 MVC,因为我想完全控制自己的代码 并且没有来自现有框架的额外负担。有人有什么建议吗?
是的,我看过 Lerdorfs 的文章,而且似乎它毕竟没有那么多代码。实际上,我更希望有一个控制器视图解决方案来构建我的应用程序。我会坚持使用我自己自制的 PDO 数据访问类。
【问题讨论】:
MVC的简单示例实现(只是为了理解原理)
class Thing
{
//class code ( CRUD, the application logic ...)
}
<?php require("header.php");?>
//HTML CODE with some echo to show variables and loops to read arrays
<?php require("footer.php");?>
require_once("lib/Thing.class.php");
/*
Some controls between the Model and the View ( if/else ...)
*/
include("theme/page_thing.php");
【讨论】:
我也用 PHP 编写了一个自制的 MVC 框架。它非常简单,尤其是当您从框架中删除任何“ActiveRecord”功能时。我考虑的一些事情:
我没有按照惯例做事(/foo 映射到 FooController),而是通过配置完成所有事情。也就是说,我有一个主 routes.php 文件,其中列出了我的应用程序将接受的每个可能的 URL。所以它充满了这样的东西:
Router::add( '/foo/:Param1/:Param2',
array( 'Controller' => 'MyController',
'Action' => 'my_method',
'Method' => 'GET',
'Parameters' => array( 'Param1' => '\d+',
'Param2' => '\S+' ) );
在这种情况下,我们匹配像/foo/123/abc 这样的网址。当 URL 匹配时,它会以MyController::my_method( array( 'Param1' => '123', 'Param2' => 'abc' ) ); 的形式发送。
那里有很多模板系统。但实际上,PHP 已经是一个完美的模板系统。在我的框架中,我刚刚在顶级 Controller 类中创建了一个 function template()。这一切都归结为执行include $Template。同样,在我的框架中,没有约定。每个控制器负责实例化适当的模板,并了解请求是否期望 HTML、XML 或 JSON 作为响应。
我的很多代码都受到了著名的 PHP MVC 框架 Cake 的启发。在你走远之前,我肯定会先看看它。如果你要自己动手,至少要先了解所有流行的方法是如何工作的。最后,我的应用程序的特殊要求使我走上了构建自己的道路,但是从已经存在的所有框架中可以学到很多东西。环顾四周,您可能会找到适合您的东西。最起码,您可以从 您的 框架中准确了解您需要什么。
【讨论】:
我个人使用我自己的框架,包括:
1.Mysql接口
2.模板系统(是家酿不聪明)
3.Config 类(mysql 详细信息、调试以及脚本可能需要的任何其他内容)
4.Simple Form 创建类。
5.a 请求类(来自 $_SERVER 的所有有用详细信息,格式更易读,例如:$this->Request->ip、$this->Request->url、$this->Request->time)
6。反黑客(IP 黑名单、来自公共安全扫描仪的关键字等)
我只是称它为框架:)
【讨论】:
你的问题有点像Not-Invented-Here-Syndrome。在这种情况下,我的建议是在您可以确定现有框架经过全面测试和支持时,忍受这些额外的包袱。 Don't reinvent the wheel.
另一方面,上述论证会阻止编写新框架。从头开始编写一个是学习和理解 MVC 模式的一个很好的编码练习。
所以如果你真的有心去做,我的建议是学习what each part of MVC is, does and how they interact。你也不可避免地会遇到FrontController pattern,所以你也会想了解这个。
请注意,您不是唯一想要这样做的人:
还有一篇 Rasmus Lerdorf 的有趣文章
【讨论】:
如果您只是要“回收”轮子,您可以查看“流行”框架的源代码。如果你想“重新发明”轮子,我建议你去别处看看。检查特定领域的语言 (DSL)。
【讨论】: