一般编程:如何在MVC中实现模型逻辑?

hen*_*enk 2 php model-view-controller zend-framework

我目前正在试图弄清楚如何正确实现MVC原则.让我们举一个简单的博客.我有一个包含两个表的数据库:博客和评论.博客表包含标题,内容,日期等字段.评论包含自动名称,日期,内容,类似的东西.

让我们从更简单的项目开始.我有几点看法.喜欢:

  • 编写/编辑博客项目
  • 显示博客项目
  • 显示摘要页面(例如最近的博客,热门话题等)
  • 等等

控制器对我来说也很清楚:

  • 管理员控制器(将博客项目传输到写入/编辑视图或将其发回)
  • 博客控制器(将博客项目转移到博客视图,如摘要页面或只显示一个页面的页面.这也会检索评论)
  • 注释控制器(从注释创建/删除视图传输数据)

但随后是模特.我真的不知道应该如何实现这些.Zend Framework快速入门页面推荐了一个非常小的模型,它只包含私有属性以及特定项的getter和setter.他们建议在Mapper中使用数据库逻辑.

但这是我的问题.假设我想要获取最新的博客项目.你会如何实现这个?你在哪里写函数fetchRecentItems()?在映射器中?似乎这应该只包含基本的CRUD语句.在另一个模型中,比如BlogService?在控制器?

有人可以帮帮我吗?我很想看到一个快速的伪代码示例.

(我试图总结我的知识,使我的思考过程更加清晰.如果我理解错误,请纠正我.谢谢!)

Tim*_*ain 5

这取决于你真正想要走多远.我个人会使用一个Service类,与映射器类交互,从控制器调用.所以你的课可能看起来像:

class Yourapp_Service_Blog
{
    protected $_mapper;

    public function setMapper($mapper)
    {
        $this->_mapper = $mapper; 

        return $this;
    }

    public function getMapper()
    {
        return $this->_mapper;
    }

    public function fetchRecentItems($items)
    {
        $select = $this->getMapper()->getDbTable()->select();
        $select->order('createdAt DESC')
               ->limit($numItems);

        return $this->getMapper()->fetchAll($select);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么在你的控制器中:

class BlogController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $service = new Yourapp_Service_Blog();
        $service->setMapper(new Yourapp_Model_GuestbookMapper());

        $this->view->posts = $service->fetchRecentItems(6);
    }
}
Run Code Online (Sandbox Code Playgroud)

这开始看起来像很多代码做一个简单的事情,但是当你开始看到类之间的共同元素时,你可以重构一点来改进.例如,如果您有多个看起来像这样的服务类,您可以将get/set映射器函数移动到它们扩展的基本服务类中.您可以向getMapper()函数添加一些逻辑,如果没有提供正确的映射器,它将根据类名确定正确的映射器,从而节省您每次都必须传递它.

这里没有"正确"的答案,这些模式作为常见编程问题的解决方案而存在.根据您认为适合您的应用,尽可能多地使用它们.