Model view controller 我将如何在Zend框架中构建它?

Model view controller 我将如何在Zend框架中构建它?,model-view-controller,zend-framework,codeigniter,Model View Controller,Zend Framework,Codeigniter,我来自CodeIgniter,它和其他MVC框架(特别是Zend)之间的术语重叠给了我某种心理障碍 我希望我的用户访问 我知道“do”是控制器,“this”是控制器中的一个函数(好的,方法) 我的网站将有共同的元素,如标题和边栏;据我所知,这些将被纳入一个布局,并将纳入最终输出 我希望/do/this页面显示三个可视信息块(我故意不使用“模块”一词)。我们把它们叫做BlockA、BlockB和BlockC。也许一个是“新事件”列表,另一个是“新帖子”列表,另一个是其他东西。无论什么诀窍是,这些信

我来自CodeIgniter,它和其他MVC框架(特别是Zend)之间的术语重叠给了我某种心理障碍

我希望我的用户访问

我知道“do”是控制器,“this”是控制器中的一个函数(好的,方法)

我的网站将有共同的元素,如标题和边栏;据我所知,这些将被纳入一个布局,并将纳入最终输出

我希望/do/this页面显示三个可视信息块(我故意不使用“模块”一词)。我们把它们叫做BlockA、BlockB和BlockC。也许一个是“新事件”列表,另一个是“新帖子”列表,另一个是其他东西。无论什么诀窍是,这些信息块也会显示在网站的其他页面上,比如

“did”和“do”控制器(显然还有“这个”和“那个”方法)将以不同的方式排列BlockA、BlockB和BlockC。每个控制器对进入这些块的内容也有不同的标准——一个可能是当前信息,另一个可能是过去的存档信息

我想确保未来的程序员可以轻松地改变BlockA、BlockB和/或BlockC的外观,而无需触摸填充其数据的代码,或在每个页面上排列它们的代码

因此,我的总体感觉是BlockA、BlockB和BlockC需要在视图中定义它们的视觉布局,但该视图不会专门与“do”或“did”控制器关联。填充这些块的代码——也就是从数据库查询信息,选择要显示的位等等——也不应该完全驻留在这些控制器中

我开始将逻辑——也就是说,将每个块中显示的内容组合到模型中。我觉得我在正确的道路上,在那里;因此,“do”和“did”控制器都可以通过模型调用块创建代码。但是,我如何(以及在哪里)提取这些块的视觉元素,从而使视觉元素也可以由这两个控制器共享?模型是否以某种方式加载视图并将HTML输出到控制器(感觉不对)?或者控制器是否有办法运行模型,获取要显示的数据,然后以某种方式将其提供给公共/集中视图


我知道在CodeIgniter里我会怎么做。但是使用Zend框架的正确体系结构是什么?我确信它与CodeIgniter的功能非常不同,我想在编写这个应用程序时考虑到正确的体系结构。

一个小小的命名问题:
/:controller/:action/*
=>
/do/this
=
this
是一个
操作
(虽然也是控制器中的函数和方法,但action是专有名称)

对我来说,你的块听起来像是“局部视图”。有几种方法可以解决这个问题,根据视图的工作方式或它们需要知道的信息,你可以调整你的策略

渲染部分 当您有一些视图代码要由多个视图使用时,您希望使用此方法。有两种不同的方法使用视图帮助程序
Zend\u view\u Helper::render
Zend\u view\u Helper\u Partial*
渲染($phtmlfile)视图帮助程序效率更高,
Partial($phtmlfile、$module、$params)
view-helper克隆新视图,取消设置所有参数,并设置传入的参数。有关如何使用这些参数的示例:

case/list.phtml:

 <?php
    $this->headTitle($this->title);
    // works because our controller set our "cases" property in the view, render
    // keeps our variables
    echo $this->render("case/_caseListTable.phtml");
我倾向于将此方法用于需要来自控制器未提供的模型的附加信息或视图的可重用格式代码块的情况。我使用的一个项目中的一个快速示例:
Olympic\u view\u Helper\u Ontap
抓取生啤酒列表并呈现它:

class Olympic_View_Helper_Ontap extends Zend_View_Helper_Abstract {
  public function Ontap()
  {
    $view = $this->view;

    $box = Olympic_Db::getInstance()->getTable('box')->getBoxFromName('Draught-Beer');
    if ($box) $menu = $box->getMenu(); else $menu = null;
    $content = "";
    if ($menu)
    {
      $content = "<h1>".$view->escape($menu->title)."</h1>";
      $content .= "<ul>";
      foreach($menu->getItems() as $item) {
        $content .= "<li>".$view->escape($item->name)."</li>";
      }
      $content .= "</ul>";
    }

    return $content;

  }
}
class Olympic\u View\u Helper\u Ontap扩展了Zend\u View\u Helper\u抽象{
公共功能Ontap()
{
$view=$this->view;
$box=Olympic_Db::getInstance()->getTable('box')->getBoxFromName('Draft-Beer');
如果($box)$menu=$box->getMenu();否则$menu=null;
$content=“”;
如果($菜单)
{
$content=“”。$view->escape($menu->title)。“”;
$content.=“
    ”; foreach($menu->getItems()作为$item){ $content.=“
  • ”$view->escape($item->name)。“
  • ”; } $content.=“
”; } 返回$content; } }
然后在我的布局中:

<?php echo $this->ontap(); ?>


您的视图帮助器也可以接受参数(当然),可以调用其他视图帮助器(包括部分)。考虑它们的模板函数。我喜欢使用它们来做很多需要的短任务,例如:代码> $-> > Caselink($case)生成一个格式正确的

标记。

太好了。这需要一点思考,看看这是否能为我解决问题-非常感谢。我会在进一步研究和实验后回来。
resources.view.doctype = "XHTML1_STRICT"
resources.view.helperPath.My_View_Helper = APPLICATION_PATH "/../library/My/View/Helper"
class Olympic_View_Helper_Ontap extends Zend_View_Helper_Abstract {
  public function Ontap()
  {
    $view = $this->view;

    $box = Olympic_Db::getInstance()->getTable('box')->getBoxFromName('Draught-Beer');
    if ($box) $menu = $box->getMenu(); else $menu = null;
    $content = "";
    if ($menu)
    {
      $content = "<h1>".$view->escape($menu->title)."</h1>";
      $content .= "<ul>";
      foreach($menu->getItems() as $item) {
        $content .= "<li>".$view->escape($item->name)."</li>";
      }
      $content .= "</ul>";
    }

    return $content;

  }
}
<?php echo $this->ontap(); ?>