我使用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>
}
我提出的方法是作品,但我想知道是否有更优雅的做事方式?
答案 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之外,你发现并不是很好...: - /