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

efzxgjgh  于 2023-01-08  发布在  PHP
关注(0)|答案(1)|浏览(100)

我正在使用http://www.php-mvc.net框架启动一个新项目,但以前从未在头文件中包含过数据库结果,也不知道该如何进行。我需要从数据库中提取当前类别和ID的列表,并使用它们来填充菜单。
header.php文件位于/views/_templates中,通常将数据库结果传递给视图的方法是在相关模型中运行查询,在控制器中获取数据,将数据从控制器传递给视图,然后在视图中使用foreach循环遍历数据,问题是_template文件没有任何类型的控制器。
我能想到的最好的方法是使用include并包含来自home控制器的视图文件,使用该控制器获取结果并将其传递到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>
}
  • 上述代码被缩短,这更多是出于原理而不是工作示例。

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

jchrr9hc

jchrr9hc1#

正如我所说:
不需要存储在会话中,您可以使用一个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,你可能需要或者可能不需要变得更详细。特别是考虑到URL参数在Application类中是如何处理的。我真的希望你只是作为一个学习经验来做这件事,因为你发现的这个"框架"除了学习如何实现MVC之外,并没有什么好处。

相关问题