天下框架一般黑,如果你还不理解什么是MVC

2023-09-05 15:33:15 浏览数 (1)

php mvc 初级

MVC (模型-视图-控制器)

  • MVC是一种编程思想,既模型-视图-控制器,将业务逻辑、数据、显示界面分隔开的一种模式。
  • 假如你想写一段代码,功能是从数据库取出数据,并到前端显示出来,最原始是这样写的:
代码语言:javascript复制
<?php
// index.php
$link = mysql_connect('localhost', 'dbuser', 'dbpassword');

mysql_select_db('blog', $link);
 
$result = mysql_query('SELECT id, title FROM post', $link);
?>
 
<!DOCTYPE html>
<html>
    <head>
        <title>文章列表</title>
    </head>
    <body>
        <h1>文章列表</h1>
        <ul>
            <?php while ($row = mysql_fetch_assoc($result)): ?>
            <li>
                <a href="/show.php?id=<?php echo $row['id'] ?>">
                    <?php echo $row['title'] ?>
                </a>
            </li>
            <?php endwhile; ?>
        </ul>
    </body>
</html>
 
<?php
mysql_close($link);
?>

以上代码建议使用mysqli或者pdo方法

这样一个页面将所有的操作做完,但是维护起来很麻烦,尤其是扩展性十分低。

抽离表现层

  • 接下来你可能注意到这些问题,于是你决定抽离表现层,将html页面单独放在一个页面,然后由“主逻辑”页面引用她,效果与刚才一样:
代码语言:javascript复制
<?php
// index.php
$link = mysql_connect('localhost', 'dbuser', 'dbpassword');

mysql_select_db('blog', $link);
 
$result = mysql_query('SELECT id, title FROM post', $link);
 
$posts = array();

while ($row = mysql_fetch_assoc($result)) {
    $posts[] = $row;
}
 
mysql_close($link);
 
// 包含HTML的代码 
require 'templates/list.php';

下面是单独的html显示界面,文件里嵌套模板风格的php代码:

代码语言:javascript复制
<!--templates/list.php-->

<html>
    <head>
        <title>文章列表</title>
    </head>
    <body>
        <h1>文章列表</h1>
        <ul>
            <?php foreach ($posts as $post): ?>
            <li>
                <a href="/read?id=<?php echo $post['id'] ?>">
                    <?php echo $post['title'] ?>
                </a>
            </li>
            <?php endforeach; ?>
        </ul>
    </body>
</html>
  • 到这里,一个新的问题产生了,现在只有一个页面,如果你的其他页面也需要用到同样的数据库连接,同样的数据的话,你可能还需要重新写一段这样的代码,对代码重构十分不友好,于是MVC产生了。

MVC

从应用程序中将核心行为和数据访问功能分离出来放入新的model.php文件中。

代码语言:javascript复制
<?php
// model.php
function open_database_connection()
{
    $link = mysql_connect('localhost', 'dbuser', 'dbpassword');

    mysql_select_db('blog', $link);
 
    return $link;
}
 
function close_database_connection($link)
{
    mysql_close($link);
}
 
function get_all_posts()
{
    $link = open_database_connection();
 
    $result = mysql_query('SELECT id, title FROM post', $link);

    $posts = array();

    while ($row = mysql_fetch_assoc($result)) {
        $posts[] = $row;
    }
    close_database_connection($link);
 
    return $posts;
}

现在我们的index.php就是一个控制器,她变成了这个样子:

代码语言:javascript复制
//index.php
<?php

require_once 'model.php';
 
$posts = get_all_posts();
 
require 'templates/list.php';

现在控制器的作用仅仅是从model(model.php)层中得到数据,然后调用一个模板来呈现这些数据。一个最简单的MVC诞生了。

0 人点赞