了解MVC中的应用程序逻辑

时间:2013-05-17 06:54:12

标签: php oop design-patterns model-view-controller

我努力以一种简单的方式理解MVC(我正在尝试自己创建一个演示应用程序),我已经按照Symfony2的Symfony2 versus 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,网络开发中类似MVC的结构给我带来了一些麻烦嘿嘿......

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

3 个答案:

答案 0 :(得分:0)

你必须制作两个物品。

  • 实体对象 - 您创建的对象,表示数据库中的Post。
    • 的getTitle()
    • 的setTitle(标题)
  • 数据访问对象 - 管理数据库中的Post实体(createPost)的类。
    • getAllPosts()
    • savePost(后)

答案 1 :(得分:0)

您只需要记住MVC是一种分离业务层(模型),UI(视图),Coordonator(控制器)的架构模式。请注意Model is polymoprhic,即它不仅仅是数据库。

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

如果您想拥有一个应用程序,一个提供许多(复杂)功能的虚拟产品,其中需求会随着时间的推移而发生变化,那么您需要一个适当的架构来帮助您修改内容而不会破坏其他内容。

在你的代码中,getAllPosts方法违反了关注点和单一责任原则(SRP),因为Post除了建模Post之外还有处理持久性的任务。

MVC说要分离模型和视图,并使用Controller来协调这两者。这也意味着控制器应该只管理工作,即选择模型和选择视图(或其他结果)。不要将数据访问权限放入Controller unles这是一个简单的功课,原型应用程序。让控制器变薄只做他们需要做的事情。如果您的控制器有超过10行代码,那么它的可能性就太大了。

MVC是一个非常简单的模式,维护纪律要尊重它是非常困难的。

答案 2 :(得分:-2)

您只实施了&#34; M&#34; (模型)MVC结构的一部分。有关多个实体的功能最好留给控制器获取您的更好的请求。因此,您可以继续添加这样的类(使用优秀的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. 使用最简单的代码来完成工作。复杂性很快就会困扰你。