2009-01-13 47 views
1

我有一个用PHP编写的原型网站。最近我重写了代码,将逻辑从布局和数据库操作中分离出来。所以现在我有一些像MVC代码设计。PHP'widget like'code design

现在困扰我的是,在MVC中,我将有许多文件,并且每个文件都会在与其他模型(模型+视图+控制器)组合时显示某些内容。所以我发现创建类似于我的MVC部件的小部件是非常有用的。

例如,当我有产品视图的MVC比创建一个PHP文件,以这种方式结合MVC部分文件以显示基于GET值的产品时,我传递给这个新的PHP文件。

我会这样做的是,任何小部件,网站的子部分将可单独查看和使用与其他部分分开。所以它会像小部件或Firefox浏览器设计一样。

所以我可以单独测试网站的每个部分,而不是仅将这些部分组合成当前的实际网站页面设计。因此,用户测试也将变得更加容易,演示文件将会非常简短并且易于理解。

我想知道您对此有何看法。我不想陷入设计中的任何漏洞之中,我认为这是将来保持网站代码容易维护的重要时刻。

我正确吗?

+0

一个不错的检查,看看你是否正确使用MVC,是调用标题(“位置:www.google.com”);在你的模型或控制器的某个地方,如果你得到了关于已经发送的头文件的错误,那么你在那里有一个输出。 – 2009-01-13 11:27:19

回答

1

MVC我有很多文件,当与其他(模型+观点+控制器)结合每次都会显示一些

这听起来像是你没有得到的MVC模型权。只有视图有内容或“显示内容”。

基于此,您可以创建仅创建内容的小部件类部分的操作,然后可以在布局中进行组合。我想推荐阅读Zend_Layout Quick Start

1

您的问题的答案是视图组成

我建议你把整个屏幕分成小块:顶栏,二栏导航栏,产品列表,预览区等等。这些可以通过单独的视图,视图助手或控制器中的其他方法提供。然后,一个控制器动作将组成件使用简单的HTML布局到单个屏幕。

例如,对于静态顶部栏,这可能是专门的视图。对于动态的产品列表,它可以是控制器方法getProductsList($categoryId),它提供了复杂的视图。产品预览可以由视图助手提供。请看下面的例子:

// inside class ProductsController 
public function index($categoryId, $productId = null) { 

    // specialised view 
    $topBar = new TopBarView(); 
    $topBar->selected = 'products'; 

    // helper method 
    $list = $this->getProductsList($categoryId); 

    // helper object 
    $previewHelper = new PreviewHelper($productId); 
    $preview = $previewHelper->getView(); 

    // view composition 
    $view = new View('path/to/template.tpl'); 
    $view->add($topBar); 
    $view->add($list); 
    $view->add($preview); 
    return $view; 

} 

这只是一个例子来说明组成如何工作。

具有交付小工具(即产品列表)的方法的隐藏好处是它可以被重用来支持Ajax。更改类别需要使用新类别标识的方法调用getProductsList方法。