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

poo*_*poo 18 php model-view-controller

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


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

Gor*_*don 20

你的问题有点像未发明的这里综合症.在这种情况下,我的建议是,当您可以确定它们经过全面测试和支持时,可以使用现有框架的额外包袱.不要重新发明轮子.

另一方面,上述论证将阻止编写新的框架.而从头开始编写一个一个很好的锻炼编码学习和了解MVC模式.

所以,如果你真的决定这样做,我的建议是要了解MVC的每个部分是什么,做什么以及它们如何相互作用.你也不可避免地遇到FrontController模式,所以你也想要了解这个.

请注意,您不是唯一想要这样做的人:

Rasmus Lerdorf也有这篇有趣的文章

  • 对于许多类型的中小型应用程序来说,所有mvc框架看起来都有点过分,所以是的,"重新发明轮子"可能是一个不错的选择. (12认同)
  • 好吧,程序员寻求以有效的方式解决问题.重新发明轮子效率不高.不要误解我的意思:我不是说*不要这样做*.我说是因为错误的原因*不要这样做*.*家庭烹饪感觉更好*带有偏见和误解,自编代码是优越的代码(*所有其他开发人员都是白痴*),这很少是真的.我认为编写自己的MVC用于学习或仅仅是为了它的乐趣是很酷的.如果你可以节省时间,请继续.你会学到很多东西.但除非结果擅长某事,否则就这样做:一项练习. (6认同)

Ami*_*uda 9

一个简单的MVC实现(只是为了理解原理)

MODEL:lib/Thing.class.php

class Thing
{
//class code ( CRUD, the application logic ...)
}
Run Code Online (Sandbox Code Playgroud)

查看: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");?>
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)


Pet*_*acs 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+' ) );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们匹配网址/foo/123/abc.匹配URL时,将调度为MyController::my_method( array( 'Param1' => '123', 'Param2' => 'abc' ) );.

你打算如何产生观点?

那里有很多模板系统.但实际上,PHP已经是一个完美的模板系统.在我的框架中,我刚刚function template()在顶级Controller类中创建了一个.这一切归结为表演include $Template.同样,在我的框架中,没有惯例.每个控制器负责实例化相应的模板,并了解请求是否期望HTML,XML或JSON作为响应.

你能使用现有的框架吗?

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


小智 6

我个人使用自己的框架组成:
1.Mysql接口
2.Template系统(是的家酿造不聪明)
3.Config类(mysql详细信息,调试,以及脚本可能需要的任何其他内容) 4.Simple
Form Creating class.
5.a请求类(来自$ _SERVER的所有有用详细信息,格式更易读:$ this-> Request-> ip,$ this-> Request-> url,$ this-> Request-> time)
6.黑客攻击(Ip黑名单,公共秒扫描仪等关键字)
我只是称它为框架:)