0

为了以简单的方式理解 MVC(我正在尝试制作自己的演示应用程序),我遵循了 Symfony2 的Symfony2 与 Flat PHP材料,我在尝试“改进”的过程中改变了一些东西代码添加了一些 OOP 实践,我创建了一个 DB 类并从此更改了他们的模型:

<?php
// model.php
function open_database_connection()
{
    $link = mysql_connect('localhost', 'myuser', 'mypassword');
    mysql_select_db('blog_db', $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;
}

对此(请忽略西班牙语):

<?php
/**
 * @author Me
 * 
 */
/**
 * post.php: clase post, elemento de texto básico del blog
 */
class Post
{
    /**
     * titulo del post
     * @var string
     */
    private $title;

    /**
     * Constructor de la clase Post
     * @param string $title
     */
    function __construct($title)
    {
       $this->title = $title;
    }

    /**
     * Get para titulo del post.
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set para titulo del post.
     * @param  string $title
     * @return self
     */
    public function setTitle($title)
    {
        $this->title = $title;
        return $this;
    }

    public function getAllPosts()
    {
        //Ummm what?
    }
}

我的问题是,这种getAllPosts()方法在我的模型 post.php 中的什么位置?,我做错了什么?唯一想到的是将方法创建为静态的,但这没有任何意义,我知道不应该那样做......

在此先感谢各位,似乎理解整个 MVC,Web 开发中类似 MVC 的结构给我带来了一些麻烦,呵呵...

注意:这与 Symfony 完全无关,我只是想遵循他们简单的类似 MVC 的实现(包括他们创建视图的方式(这显然不是应该实现 MVC 的“纯”方式))。

4

3 回答 3

0

您只需要记住 MVC 是一种架构模式,它将业务层(模型)、UI(视图)、协调器(控制器)分开。请注意,模型是多态的,即它不仅仅是数据库。

MVC 本身就是关注点分离 (SoC) 原则的实现。flat php 所做的(或实际上的任何语言)称为事务脚本,它仅适用于简单的(脚本)任务。

当您想要一个应用程序,一个提供许多(复杂)功能的虚拟产品,并且要求随时间变化时,您需要一个适当的架构来帮助您修改事物而不破坏其他事物。

在您的代码中,getAllPosts 方法违反了关注点分离以及单一责任原则 (SRP),因为 Post 除了建模 Post 还具有处理持久性的任务。

MVC 表示将 Model 和 View 分开,并使用 Controller 来协调这两者。这也意味着控制器应该只做管理工作,即选择模型和选择视图(或其他结果)。除非它是一个琐碎的家庭作业原型应用程序,否则不要将数据访问权限放入 Controller。让你的控制器只做他们需要做的事情。如果你的控制器有超过 10 行代码,那么很可能它做得太多了。

MVC 是一个非常简单的模式,要遵守纪律来尊重它要困难得多。

于 2013-05-17T08:01:59.847 回答
0

你必须制作两个对象。

  • 实体对象 - 您创建的对象,代表数据库中的帖子。
    • 获取标题()
    • 设置标题(标题)
  • 数据访问对象 - 管理数据库中的 Post 实体的类 (createPost)。
    • 获取所有帖子()
    • 保存帖子(帖子)
于 2013-05-17T07:00:57.467 回答
-2

您只实现了 MVC 结构的“M”(模型)部分。涉及多个实体的功能最好留给获取浏览器请求的控制器。所以你可以继续添加这样的类(使用优秀的Doctrine DBAL访问层):

class PostController {
  private $myDb;

  public function __construct(Doctrine\DBAL\Connection $db) {
    $this->myDb = $db;
  }

  public function get() {
    if (!isset($_REQUEST['id'])) {
      $allPosts = $this->myDb->fetchAll('SELECT * FROM Post');
    }
    // pass $allPosts to the view layer...
  }
}

由于 Doctrine 指南明确警告要向控制器添加业务逻辑:在我个人看来,像获取所有记录这样的简单代码可以很好地进入控制器。Post然后,您可以使用接受列值数组的构造函数将数据包装在模型实例中。然后,所有逻辑都可以按照建议使用您的实体。

如果您的数据库访问代码变得更加复杂,并且您发现自己不断地复制相同的代码片段,您可以从 StaNov 的构建单独数据访问层的建议开始。在那之前,我真的推荐

  1. 坚持使用库来进行低级数据库访问
  2. 使用最简单的代码来完成工作。复杂性很快就会困扰你。
于 2013-05-17T07:01:20.587 回答