【问题标题】:General Programming: How to implement model logic in MVC?通用编程:如何在 MVC 中实现模型逻辑?
【发布时间】:2011-06-16 13:55:24
【问题描述】:

我目前正在尝试弄清楚如何正确实施 MVC 原则。让我们以一个简单的博客为例。我有一个包含两个表的数据库:Blogs 和 cmets。博客表由标题、内容、日期等字段组成。评论包含作者姓名、日期、内容等。

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

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

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

  • 管理控制器(将博客项目传输到写入/编辑视图或将它们发回)
  • 博客控制器(将博客项目传输到博客视图,例如摘要页面或仅显示一个的页面。这也会检索 cmets)
  • 评论控制器(从评论创建/删除视图传输数据)

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

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

有人可以帮我吗?我希望看到一个快速的伪代码示例。

(我试着把我的知识总结一下,让我的思考过程更清晰一点。如果我理解错了,请纠正我。谢谢!)

【问题讨论】:

标签: php model-view-controller zend-framework


【解决方案1】:

这取决于你真的想走多远。就我个人而言,我会使用一个服务类,与从控制器调用的映射器类进行交互。所以你的班级可能看起来像:

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);
    }
}

然后在你的控制器中:

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);
    }
}

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

虽然这里没有“正确”的答案,但这些模式作为常见编程问题的解决方案而存在。尽可能多地或尽可能少地使用它们,以适合您的应用。

【讨论】:

  • 这看起来很棒,对我来说真的很有意义。非常感谢!
【解决方案2】:

完全同意服务层的想法,尽管它真的取决于什么对你有用。

我们的方法是使用这样一个层作为底层具体细节的外观 - 它以一种对必须编写代码的人有意义的方式描述我们的应用程序 API。针对此 API 进行编码可以让用户远离他们不关心的事情,例如数据存储和检索。

我们发现这种方法的好处在于它在语义上有意义,正确的关注点分离使控制器保持精简并确保模型的可移植性(不是我曾经必须使用它,但谁知道) ,易于测试,可扩展 - 我们可以轻松地在上面构建其他层(例如 Web 服务)等等。

我听说你来自哪里,因为我不久前在那里。很长一段时间以来,我一直对如何使用 Zend Framework 实现模型感到困惑。我正在寻找一个约定或某人来描述它应该如何完成。

随着时间的推移,我了解到没有正确的答案,而这正是 ZF 绝对正确的地方。当没有“一刀切”的方法时,规定一种机制是没有意义的。

总之,没有“正确”的方式来实现模型。正如我所说,我认为这只是要找到适合自己情况的东西。

我的建议是向 Google 提供“Zend 框架服务层”,并尽可能多地阅读它 - 我认为您可能会感兴趣。很多时候你最终会回到 Stack Overflow,但通常也有指向优秀博客文章和文章的链接。

祝你好运。

【讨论】:

  • 我实现了一个服务层,看到了优势。就我而言,这正是我正在寻找的答案,我完全同意你的看法。它将所有主要组件分开,但它仍然为我提供了让它们相互交谈的所有可能性。您可能是对的,没有一个答案,这就是 ZF 的力量,但这也是它如此令人困惑的原因。我想我仍然需要自己找出答案。
【解决方案3】:

开发 MVC 应用程序的方法不止一种。一般来说,关于控制器、视图和模型是什么、应该是什么或应该做什么,有很多不同的方法。

我想一个好主意是看看别人是怎么做的。

看看 CakePHP: Models / Views/ Controllers

通常,控制器将数据放入模型中(或创建模型),视图使用该模型来呈现页面。

【讨论】:

    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 2011-04-22
    • 2012-02-28
    • 2012-01-29
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多