使用Zend Framework构建模块化网站:我是否正确?

时间:2010-03-16 22:04:58

标签: zend-framework

通过阅读有关从Zend开始的所有帖子和教程,我有点困惑,因为有很多不同的方法来解决问题。

我只需要一些关于我的代码的反馈,以了解我是否在正确的轨道上。

要简单地为我的网站获取(硬编码)导航(取决于谁登录),我使用postDispatch方法构建一个Controller插件:

 public function postDispatch(Zend_Controller_Request_Abstract $request) 
 {
  $menu = new Menu();

  //Render menu in menu.phtml
  $view = new Zend_View();

  //NEW view -> add View Helper
  $prefix = 'My_View_Helper';
  $dir = dirname(__FILE__).'/../../View/Helper/';
  $view->addHelperPath($dir,$prefix);

  $view->setScriptPath('../application/default/views/scripts/menu');
  $view->menu = $menu->getMenu();

  $this->getResponse()->insert('menu',  $view->render('menu.phtml'));     

 } 

我是否需要再次设置辅助路径? 我是在一个名为ViewSetup的插件控制器中完成的。在那里,我为视图做了一些设置,比如doctype,headlinks和helper路径(这一步来自本书:Zend Framework in Action)。

启动的Menu类如下所示:

class Menu 
{
 protected $_menu = array();

 /**
 * Menu for notloggedin and logged in
 */
 public function getMenu()
 {
  $auth = Zend_Auth::getInstance();
  $view = new Zend_View();

  //check if user is logged in
  if(!$auth->hasIdentity()) {
   $this->_menu = array(
    'page1' => array(
     'label' => 'page1',
     'title' => 'page1',
     'url' => $view->url(array('module' => 'pages','controller' => 'my', 'action' => 'page1'))
    ),
    'page2' => array(
     'label' => 'page2',
     'title' => 'page2',
     'url' => $view->url(array('module' => 'pages','controller' => 'my', 'action' => 'page2'))
    ),
    'page3' => array(
     'label' => 'page3',
     'title' => 'page3',
     'url' => $view->url(array('module' => 'pages','controller' => 'my', 'action' => 'page3'))
    ),
    'page4' => array(
     'label' => 'page4',
     'title' => 'page4',
     'url' => $view->url(array('module' => 'pages','controller' => 'my', 'action' => 'page4'))
    ),
    'page5' => array(
     'label' => 'page5',
     'title' => 'page5',
     'url' => $view->url(array('module' => 'pages','controller' => 'my', 'action' => 'page5'))
    )
   );
  } else {
   //user is vom type 'client'
   //..

  }

  return $this->_menu;
 }
}

这是我的视图脚本:

<ul id="mainmenu">
  <?php echo $this->partialLoop('menuItem.phtml',$this->menu) ?>
</ul>

到目前为止这是有效的。我的问题是:通常这样做吗?还有什么可以改进的吗? 我是Zend的新手,我在网上看到过不常用的教程,这些教程通常并不明显。即使这本书已被弃用,也提到了自动加载器。

2 个答案:

答案 0 :(得分:0)

您不应该创建新视图。由于您已经在Boostrap中创建了View对象(并用它来渲染网站的其余部分),因此您应该获取已创建的视图对象。

如果您使用Zend_Application_Resource在引导程序中设置视图,可以像这样获取它:

$view = Zend_Controller_Front::getInstance()
    ->getParam('bootstrap')
    ->getResource('view');

这样就不需要再次设置视图助手路径并创建另一个视图对象。

如果您没有使用Zend_Application来提升您的应用程序,您可以尝试这样的事情:

$view = Zend_Layout::getMvcInstance()->getView();

答案 1 :(得分:0)

除非你在相对较小的一方工作,否则我不会在控制器中这样做, 因为你必须将它添加到许多控制器。 为什么不检查引导程序,甚至检查你的布局对我来说更有意义,尽管它不合适。