如何在核心php中实现mvc

ash*_*sha 7 php

如何在没有任何框架的PHP中使用mvc架构?

Mar*_*ing 13

我认为通常使用一个通用框架可能是要走的路.原因是许多优秀的开发人员花了很长时间编写,修复bug,调整和抛光,以创建一些基于网站的可靠内容.最好的办法是找到一个你喜欢的,学习它并坚持下去(除非你找到理由不这样做).当我使用PHP时,我的选择通常是Zend Framework,但也有CodeIgniter,Symfony,CakePHP其他一些.

如果您仍然希望在没有现有框架的情况下使用MVC模式,您可以选择将自己的框架放在一起,或者只是逻辑地将每个问题彼此分开 - 这是MVC的核心原则,框架只是帮助您实现它.

Rasmus Lerdorf 在2006年写了关于他在PHP使用MVC模式的最小方法.可能值得一读.您可能也对F3 :: PHP(仅限PHP 5.3+)这样的迷你框架感兴趣- 看起来很有前途.


Pat*_*ert 12

最简单的PHP MVC方法

成千上万的单词不会与一个干净的例子竞争,所以这是一个简单的用例:

想象一下,您想要显示一个描述来自虚构汽车供应商的"汽车"(给出"汽车ID")的页面:http://example.com/car.php? id = 42)

基本上,您可以使用以下层次结构构建代码:

配置目录(这不是MVC架构模式的一部分):

+ config/
  - database.php
        <?php
        return new PDO("mysql:host=localhost;dbname=database", "user", "password");
        ?>
Run Code Online (Sandbox Code Playgroud)

文档根目录的文件夹(与控制器类似的脚本):

+ htdocs/
  - car.php
        <?php
        require_once 'CarService.php';
        $carService = new CarService(require 'config/database.php');
        $car = $carService->getInformationById($_GET['id']);
        require 'car.tpl';
        ?>
Run Code Online (Sandbox Code Playgroud)

封装整个模型的文件夹(提示:"精简控制器,胖模型"):

+ model/
  - CarService.php
        <?php
        class CarService {
            protected $database;

            public function __construct(PDO $database) {
                $this->database = $database;
            }

            public function getInformationById($id) {
                return $this->database->query(
                    "SELECT model, year, price " .
                    "FROM car " .
                    "WHERE id = " . (int) $id
                )->fetch();
            }
        }
        ?>
Run Code Online (Sandbox Code Playgroud)

包含所有视图的最后一个文件夹(/ templates):

+ views/
  - car.tpl
        <html>
        <head>
            <title>Car - <?php $GLOBALS['car']['model'] ?></title>
        </head>
        <body id="car">
        <h1><?php $GLOBALS['car']['model'] ?></h1>
        Year: <?php $GLOBALS['car']['year'] ?>
        Price: <?php $GLOBALS['car']['price'] ?>
        </table>
        </body>
        </html>
Run Code Online (Sandbox Code Playgroud)

而已.

为了完整起见

您可能会注意到模板中$ GLOBALS的使用,这可能是一个方便的编码标准,用于表示您从"控制器"收到的本地模板变量.

要使上面的代码工作,您需要配置PHP:

include_path="/the/path/to/model:/the/path/to/views"
Run Code Online (Sandbox Code Playgroud)

走得更远

不错的网址

您可能需要不错的URL,如果使用Apache,您可以通过以下方式实现:

RewriteEngine On
RewriteRule ^/car/([0-9]*)$ /car.php?id=$1 [L]
Run Code Online (Sandbox Code Playgroud)

这样就可以编写http://example.com/car/42等网址,这些网址会在内部转换为http://example.com/car.php?id=42

可重复使用的模板

作为PHP文件,没有什么可以阻止您创建headers.tpl,footers.tpl,menu.tpl,...您可以使用include()/ require()重用它们以避免重复的HTML.

结论

这与Rasmus Lerdorf提到的精神非常相似:http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html.

人们不应该忘记MVC仍然是(n)(架构)模式.软件模式是解决常见问题的可重用原则,如果它们是可重用的代码,它们将被命名为"库".

像Zend Framework,Symfony,CakePHP等框架提出了采用MVC方法但不能强制执行的结构,因为MVC是一种需要学习理解的架构模式,无论您是否使用现有框架.

  • 哇 !有人可以给这个人一枚奖牌之类的吗?说真的,优秀的帖子!我想知道为什么总是年轻的、新来的,而且——是的,我真的是这么说的——长得帅的人比书呆子能做出更好的答案。伙计,尊重! (2认同)