如何在PHP中从头开始实现MVC?

时间:2010-02-25 09:57:55

标签: php model-view-controller

我想在PHP中从头开始实现MVC,因为我想完全控制自己的代码 现有框架没有额外的包装。谁有任何建议?


是的,我看过Lerdorfs的文章,看来它毕竟不是那么多代码。实际上我更希望有一个控制器视图解决方案来构建我的应用程序。我会坚持自己的自制PDO数据访问类。

5 个答案:

答案 0 :(得分:19)

你的问题有点像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也有这篇有趣的文章

答案 1 :(得分:9)

MVC的简单例子实现(只是为了理解原理)

MODEL:lib / Thing.class.php

class Thing
{
//class code ( CRUD, the application logic ...)
}

查看:theme / page_thing.php

<?php require("header.php");?>
//HTML CODE with some echo to show variables and loops to read arrays
<?php require("footer.php");?>

CONTROLLER:application / thing.php

require_once("lib/Thing.class.php");
/*
Some controls between the Model and the View ( if/else ...)
*/
include("theme/page_thing.php");

答案 2 :(得分:7)

我也用PHP编写了一个自行开发的MVC框架。它非常简单,特别是当您从框架中删除任何“ActiveRecord”功能时。我考虑过的一些事情:

您打算如何将URL映射到控制器?

不是通过约定做事(/ foo映射到FooController),而是通过配置完成了所有工作。也就是说,我有一个master 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已经是一个完美的模板系统。在我的框架中,我刚刚在顶级function template()类中创建了Controller。这一切归结为执行include $Template。同样,在我的框架中,没有惯例。每个控制器负责实例化相应的模板,并了解请求是否期望HTML,XML或JSON作为响应。

您可以使用现有框架吗?

我的许多代码都受到着名的PHP MVC框架Cake的启发。在你走向远方之前,我肯定会看一眼。如果您打算自己动手,至少首先要了解所有流行的工作方式。最后,我的应用程序的特殊要求让我走上了自己构建的道路,但是从那里已经存在的所有框架中可以学到很多东西。仔细看看,你可能会发现一些适合你的东西。至少,你可以从你的框架中找出你需要的确切内容。

答案 3 :(得分:6)

我个人使用自己的框架,包括:
1.Mysql接口
2.模板系统(是的家酿造不聪明)
3.Config类(mysql详细信息,调试以及脚本可能需要的任何其他内容)
4.Simple Form创建课程。
5.a请求类(来自$ _SERVER的所有有用详细信息,格式更易读:$ this-&gt; Request-&gt; ip,$ this-&gt; Request-&gt; url,$ this-&gt;请求 - &GT;时间)
6。反黑客攻击(Ip黑名单,来自公共扫描仪等的关键词)
我只称它为框架:)

答案 4 :(得分:0)

如果您只是“回忆”方向盘,您可以查看“流行”框架的源代码。如果你想“重新发明”轮子,我建议你去别处看看。检查特定于域的语言(DSL)。