【问题标题】:How to implement MVC from scratch in PHP? [closed]如何在 PHP 中从头开始实现 MVC? [关闭]
【发布时间】:2011-01-20 22:39:42
【问题描述】:

我想在 PHP 中从头开始实现 MVC,因为我想完全控制自己的代码 并且没有来自现有框架的额外负担。有人有什么建议吗?


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

【问题讨论】:

    标签: php model-view-controller


    【解决方案1】:

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

    模型:lib/Thing.class.php

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

    查看:主题/page_thing.php

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

    控制器: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】:

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

      如何将 URL 映射到控制器?

      我没有按照惯例做事(/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' =&gt; '123', 'Param2' =&gt; 'abc' ) ); 的形式发送。

      您将如何生成视图?

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

      你可以使用现有的框架吗?

      我的很多代码都受到了著名的 PHP MVC 框架 Cake 的启发。在你走远之前,我肯定会先看看它。如果你要自己动手,至少要先了解所有流行的方法是如何工作的。最后,我的应用程序的特殊要求使我走上了构建自己的道路,但是从已经存在的所有框架中可以学到很多东西。环顾四周,您可能会找到适合您的东西。最起码,您可以从 您的 框架中准确了解您需要什么。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 干得好,这就是要走的路……
        【解决方案4】:

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

        【讨论】:

        • 所有 mvc 框架对于许多中小型应用程序来说都显得有点矫枉过正,所以是的,“重新发明轮子”可能是一个不错的选择。
        • 嗯,程序员寻求以一种有效的方式解决问题。重新发明轮子效率不高。不过不要误会我的意思:我不是说不要这样做。我是说不要这样做出于错误的原因家常菜感觉更好带有偏见和误解,认为自己编写的代码是优秀的代码(所有其他开发人员都是白痴),这很少是真的。我认为编写自己的 MVC 来学习或只是为了好玩是很酷的。如果您能抽出时间,请继续。你会学到很多东西。但除非结果在某些方面表现出色,否则就这样吧:练习。
        • 如果您重新发明轮子,您应该学习并了解现有轮子的工作原理!如果你走完整个活,从不使用轮子,你永远不会知道你创造的轮子是否比其他人更好。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2011-02-05
          • 2011-01-16
          • 1970-01-01
          • 2021-01-20
          • 2010-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-23
          相关资源
          最近更新 更多