hen*_*enk 2 php model-view-controller zend-framework
我目前正在试图弄清楚如何正确实现MVC原则.让我们举一个简单的博客.我有一个包含两个表的数据库:博客和评论.博客表包含标题,内容,日期等字段.评论包含自动名称,日期,内容,类似的东西.
让我们从更简单的项目开始.我有几点看法.喜欢:
控制器对我来说也很清楚:
但随后是模特.我真的不知道应该如何实现这些.Zend Framework快速入门页面推荐了一个非常小的模型,它只包含私有属性以及特定项的getter和setter.他们建议在Mapper中使用数据库逻辑.
但这是我的问题.假设我想要获取最新的博客项目.你会如何实现这个?你在哪里写函数fetchRecentItems()?在映射器中?似乎这应该只包含基本的CRUD语句.在另一个模型中,比如BlogService?在控制器?
有人可以帮帮我吗?我很想看到一个快速的伪代码示例.
(我试图总结我的知识,使我的思考过程更加清晰.如果我理解错误,请纠正我.谢谢!)
这取决于你真正想要走多远.我个人会使用一个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()函数添加一些逻辑,如果没有提供正确的映射器,它将根据类名确定正确的映射器,从而节省您每次都必须传递它.
这里没有"正确"的答案,这些模式作为常见编程问题的解决方案而存在.根据您认为适合您的应用,尽可能多地使用它们.