【问题标题】:Using output buffering as a template-engine使用输出缓冲作为模板引擎
【发布时间】:2013-11-24 22:19:27
【问题描述】:

所以我正在编写我的 MVC 并且需要显示我的观点。

目前非常简单,只是包装在我的主控制器中的一个函数中。

ob_start();
require_once('views/' . $fileName . '.php');
$output = ob_get_contents();
ob_end_flush();
return $output;

但是,我不太明白如何在我正在渲染的视图中设置所有变量,这是最重要的部分(废话)。

关于执行此操作的任何提示?您想分享任何关于基本 MVC 框架的代码示例吗?

我正在编写我能想到的最基本的东西,只有几个控制器、模型、视图、一个自动加载器和一个 index.php 来路由所有请求。我对使用 IIS 重写模块进行重写不感兴趣,所以我只是运行 _GET 来获取查询字符串。

提前致谢,你们总是能帮上大忙。

【问题讨论】:

标签: php templates output-buffering


【解决方案1】:

这是一个粗略的想法(代码取自我自​​己的一个框架并进行了修改,我很久以前构建的,只是为了澄清我的理解),你可以创建一个View 类并将这个函数作为方法,但是这个函数可以用作

$content = render('view_name', array('name' => 'Heera', 'age' => '101'));

函数render

function render( $filename, $data = array() )
{
    try {

        $file = 'views/' . $filename. '.php';
        if( !is_readable($file) ){
            throw new Exception("View $file not found!", 1);
        }

        $content = file_get_contents( $file );
        ob_start() && extract($data, EXTR_SKIP);
        eval('?>'.$content);
        $content = ob_get_clean();
        ob_flush();
        return $content;

    } catch (Exception $e) {
        return $e->getMessage();
    }
}

你可以想到这样的视图

<div><?php echo $name ?></div>
<div><?php echo $age ?></div>

您可以遵循一些现有的框架(我在开发这个框架时做过,对我帮助很大)并编写自己的框架。

【讨论】:

  • 谢谢,我做了一些非常相似的事情,只是我将渲染函数放在了顶级父控制器中,我相信我会重写它以使用视图类,因为它会是一个更好的区分方式的担忧。谢谢你的回答,真的很有帮助:)
猜你喜欢
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多