2014-10-29 48 views
0

头文件,我开始使用http://www.php-mvc.net框架的新项目,但从未有过,包括之前不知道如何去它在头文件数据库结果。我需要从数据库中提取当前类别的列表和ID,然后使用它们填充菜单。传递数据库结果到PHP-MVC

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

我能想出是使用包括和包括从家庭控制器视图文件,使用该控制器来获得满意的结果,并将它们传递到的意见/ 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

通常你会这样做一个“组件”的概念,通常来说,这是一种在单个请求或“子请求”的生命周期中将控制器和视图联系在一起的方式,如果您愿意的话。似乎在您选择的框架内缺少这个概念。 – prodigitalson 2014-10-29 17:13:48

+0

我认为我能看到的唯一的其他选择是使用主控制器类获取信息,将数组存储到会话中,然后遍历头文件中的数组,您是否可以看到任何可能的问题? – twigg 2014-10-29 20:35:39

+0

无需存储在会话中,您可以使用Twig全局,以便在所有模板中都可用,并且可以确保基本控制器运行preExceute将所有数据拉到一起,然后添加该全局。 – prodigitalson 2014-10-31 02:42:32

回答

1

正如我说:

无需在会话存储,你可以在所有模板使用一根树枝全球化,所以它的可用,你可以确保你的基本控制器运行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参数。我真的希望你只做这个学习经历,因为你发现这个“框架”对于学习如何实现MVC是没有什么好处的: -/

+0

谢谢你的回答。我使用它来了解不同部分如何相互交互,并了解MVC风格如何使我和我的应用程序受益,而不是程序性,它更像是一种学习工具。我明白,PHP永远不会按照其定义的方式正确地实现MVC模式,但现在我正在认识到代码组织的好处。 – twigg 2014-10-31 09:12:39

+0

好吧,它没有那么多的PHP这个问题,我更多的只是评论这个小框架的设计决策。例如,所有的路由都发生在'Application'构造函数中。在我看来,这里至少有两个缺失的组件 - 一个用于建模HTTP请求的“Request”模型和一个处理从该请求中解析参数以执行控制器的“Router”模型。但快乐的学习! – prodigitalson 2014-10-31 13:21:05

+0

另外我会建议你对此有所了解之后,继续看看一些实际的生产就绪框架是如何工作的。我可能会看看'Silex','Symfony2'或'Zend Framework 2'和'Laravel'。 – prodigitalson 2014-10-31 13:22:47