将数据库结果传递到PHP-MVC中的头文件中

时间:2014-10-29 16:38:48

标签: php

我使用http://www.php-mvc.net框架开始一个新项目,但之前从未在头文件中包含数据库结果,也不确定如何进行。我需要从数据库中提取当前类别列表和ID,并使用它们填充菜单。

header.php文件位于/ views / _templates中。将数据库结果传递给视图的常规方法是在相关模型中运行查询,获取控制器中的数据,将数据从控制器传递到视图,然后在视图中使用foreach循环遍历数据。问题是_template文件没有任何类型的控制器。

我能想到的最好的方法是使用include并包含来自家庭控制器的视图文件,使用该控制器获取结果并将它们传递给views / home文件夹中的menu.php。

/views/_templates/header.php

    <li class="dropdown">
        <?php include 'views/home/menu.php'; ?>
    </li>

/views/home/menu.php

foreach ($links as $link){
    <a href="<?php echo URL . $link->url; ?>"><li><?php echo $link->name; ?></li></a>
}
  • 上面的代码已经缩短了原理,而不是一个工作示例。

我提出的方法是作品,但我想知道是否有更优雅的做事方式?

1 个答案:

答案 0 :(得分:1)

正如我评论的那样:

  

无需在会话中存储您可以使用Twig全局,因此它可用于所有模板,您可以确保您的基本控制器运行preExceute将所有数据拉到一起然后添加全局数据。

这可能看起来像这样:

abstract class MyBaseController extends Controller
{
  private $view = null;

  private prepareView()
  {
      $twig_loader = new Twig_Loader_Filesystem(PATH_VIEWS);
      return new Twig_Environment($twig_loader);
  }

  public function getView()
  {
     if ($this->view === null) {
        $this->view = $this->prepareView();
     }

     return $this->view;
  }

  protected function preRender()
  {
     // whatever logic you need to prepare the menu data as $links
     $this->getView()->addGlobal('links', $links);
  }

  public function render($view, $data_array = array())
  {

    $this->preRender();

    // render a view while passing the to-be-rendered data
    echo $this->getView()->render($view . PATH_VIEW_FILE_TYPE, $data_array);
  }
}

现在,根据您为$links构建内容所需的数据,您可能需要或不需要更详细一些。特别是考虑了如何在Application类中处理url params。我真的希望你只是将这作为一种学习经历,因为这个&#34;框架&#34;除了学习如何实现MVC之外,你发现并不是很好...: - /