2010-05-19 79 views
4

如果我在我的站点上有一个页面,我必须显示4或5个片段(新闻源,事件源等),所有这些与不同的数据(在不同的模型和数据库表中)有关,然后什么是处理片段内容和布局生成的明智方式?我可以使用一个包含静态函数的片段控制器,每个静态函数都返回一个填充相关数据的视图。但是这个片段控制器中的每个函数都会与不同的数据/模型进行交互,所以我不确定这是如何OOP的。或者,我可以为每个处理每个相关数据集的控制器添加一个静态函数 - 例如在News_Controller中,以及显示所有新闻项目,单个新闻项等的函数,我可以添加一个静态函数通过简单地返回我需要的视图来生成新闻源。我认为这种方法可能会起作用,因为我不想为这些简单片段实例化一个对象,所以在相关控制器中使用静态函数会有点意义。意识流的一点在这里,但我有什么意义?!在MVC中处理片段和视图

+0

+1:好问题,我认为你应该把它作为每页的方法,即为每个页面放置一个控制器,无论它包含什么。 – Sarfraz 2010-05-19 16:35:07

回答

2

许多框架都有一些“偏好”的概念,通常用于这类事情。

由于这些部分通常是只读的,并且经常在每个页面(或一些定义明确的页面集合)上显示,所以您可以在不考虑页面控制器的情况下对其进行处理。

换句话说 - 记住,如果您的视图/布局代码直接与您的模型对话,那么只要它只是询问它们就可以。

我做这样的事情所有的时间:

layout.php中:

<div id="newsWidget"> 
<?PHP $news = Model_News::latest(); ?> 
<?PHP foreach($news as $newsitem): ?> 
<!-- output some news headlines --> 
<?PHP endforeach; ?> 
</div> 

Model_News ::最新()可能会执行一些缓存,等等,因为这是布局代码,我可能不要每个请求都不想打到分贝。

无需控制器膨胀!

+0

框架在部分效率方面有所不同。我使用了与timdev推荐的缓存类似的方法,因为我的部分出现在繁忙网站的每个页面上。我发现,要平衡解决方案的“正确性”与快速完成工作并提供结果的实用性,这是非常棘手的。我会经常从一些简单而丑陋的事情开始,当“代码味道”变得太糟糕或者我需要在别的地方使用它时,会将它重构成更好的和更“更加直线的”(笑) – Steve 2010-05-19 22:00:51

+0

谢谢蒂姆,这是类型的东西,我可以陷入,即使它涉及简单的功能和只有几行代码的每个片段。你的方法涉及最少量的代码和重复,并且不涉及为这样一个简单的任务创建新的控制器或助手。完美的感觉!任何时候只需要比News例子稍微复杂的代码,那么我想我会为最相关的控制器添加一个静态函数。 – kenny99 2010-05-20 08:52:57

0

您可以架构您的MVC模式,以提供一种机制,允许已将数据设置为数组返回。例如,通常向/news/feed/发送网络请求会导致相关数据被设置并随后传递到视图。除了Web请求之外,系统还应该允许控制器发出这样的请求,即$vars = $this->call('/news/feed/');系统将识别内部请求并返回集合变量而不是调用视图。

这可以让你保持你的控制器和模型的凝聚力。

1

您可能想要查看分层模型 - 视图 - 控制器(HMVC)。它特别适合制作带有片段的网页。我相信Kohana实现它。

基本上,您有多个模型 - 视图 - 控制器三元组,每个负责每个片段。因此,您可以让控制器访问新闻数据库,并为不同类型的新闻显示装载各种小视图。