Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MVC中处理代码段和视图_Php_Model View Controller_Oop - Fatal编程技术网

Php 在MVC中处理代码段和视图

Php 在MVC中处理代码段和视图,php,model-view-controller,oop,Php,Model View Controller,Oop,如果我在我的站点上有一个页面,其中我必须显示4或5个片段(新闻提要、事件提要等),所有这些片段都与不同的数据(在不同的模型和数据库表中)有关,那么处理片段内容和布局的生成的合理方法是什么?我可以使用单个代码段控制器,它包含静态函数,每个函数返回一个填充了相关数据的视图。但是这个snippet控制器中的每个函数都将与不同的数据/模型交互,所以我不确定这是如何实现的。或者,我可以向处理每个相关数据集的每个控制器添加一个静态函数-例如,在News_控制器中,以及显示所有新闻项、单个新闻项等的函数,我可

如果我在我的站点上有一个页面,其中我必须显示4或5个片段(新闻提要、事件提要等),所有这些片段都与不同的数据(在不同的模型和数据库表中)有关,那么处理片段内容和布局的生成的合理方法是什么?我可以使用单个代码段控制器,它包含静态函数,每个函数返回一个填充了相关数据的视图。但是这个snippet控制器中的每个函数都将与不同的数据/模型交互,所以我不确定这是如何实现的。或者,我可以向处理每个相关数据集的每个控制器添加一个静态函数-例如,在News_控制器中,以及显示所有新闻项、单个新闻项等的函数,我可以添加一个静态函数,通过简单地返回我需要的视图来生成新闻提要。我认为这种方法可能有效,因为我不想为这些简单的代码片段实例化一个对象,所以在相关的控制器中使用静态函数是有意义的。这里有点意识流,但我说得通吗

您可以构建MVC模式,以提供一种机制,允许将已设置的数据作为数组返回。例如,通常对
/news/feed/
的web请求会导致相关数据被设置并随后传递给视图。除web请求外,系统还应允许控制器发出此类请求,即,
$vars=$this->call('/news/feed/')系统将识别内部请求并返回设置变量,而不是调用视图


这使您能够保持控制器和模型的一致性。

您可能需要查看层次模型视图控制器(HMVC)。它特别适合于制作带有片段的页面。我相信科哈纳实现了这一目标


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

许多框架都有一些“partials”的概念,通常用于这种情况

由于这些部分通常是只读的,并且通常显示在每个页面(或一些定义良好的页面集)上,因此您无需像对待页面那样考虑控制器,就可以接近它们

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

我一直在做这样的事情:

layout.php:

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

Model_News::latest()可能会实现一些缓存等功能,因为这是布局代码,我可能不想在每次请求时都访问数据库


无需控制器膨胀

+1:问得好,我认为你应该按照页面的方式来考虑,即在每个页面上放置一个控制器,不管它包含什么。框架在部分的效率上有所不同。我使用了与timdev推荐的方法类似的方法以及缓存,因为我的部分出现在繁忙站点的每个页面上。我发现很难在解决方案的“正确性”与快速完成工作并交付结果的实际性之间取得平衡。我通常会从简单和丑陋的东西开始,当“代码味道”变得太糟糕或者我需要在其他地方使用它时,我会将它重构成更好和更“正确”的东西(咧嘴笑)谢谢Tim,这是我可以陷入困境的类型,尽管它涉及简单的特性,每个代码段只有几行代码。您的方法需要最少的代码和重复,并且不需要我为这样一个简单的任务创建新的控制器或助手。很有道理!任何时候都需要比新闻示例稍微复杂的代码,那么我想我将向最相关的控制器添加一个静态函数。