【问题标题】:Custom MVC Framework: How do I propogate data to a view?自定义 MVC 框架:如何将数据传播到视图?
【发布时间】:2011-10-15 21:25:09
【问题描述】:

我正在创建一个自定义 MVC 框架。

我在 codeIgniter 框架之后对其进行了松散的建模,但它在很大程度上是完全自定义的。

我已经将 URL 路由到适当的控制器操作,但我被困在生成可以利用控制器生成的数据的视图的点上。

我已经定义了视图(静态 HTML 和内联 php 准备好填充动态数据),并且我有我的基本控制器的析构函数 require()'ing 视图以便用视图填充浏览器...这里是代码:

public function __destruct()
{
    if ($this->bSuppressView === false)
    {
        require(APP_PATH.'views/layout/header.php');
        require(APP_PATH.'views/'.$this->sController.'/view.'.$this->sController.'.'.$this->sAction.'.php');
        require(APP_PATH.'views/layout/footer.php');
    }
}

基本上,当控制器完成执行时,基本控制器的拆卸过程将包括全局标题视图、控制器的操作视图,然后是全局脚注视图,它应该使用 URL 的所有内容填充网页被请求...

但是,我无法从视图代码中的嵌入式 php 访问任何全局定义的变量。在我的引导类中,我定义了一堆局部变量,例如我的配置变量等,但视图似乎认为这些变量未定义。此外,我不确定如何允许视图访问控制器可能生成的数据。我应该在哪里“粘贴”它以使其对视图可用?

如果不清楚,请告诉我,我会更新。 谢谢!

更新:我发现在这样做的同时,视图的“环境”在控制器对象中,据我所知,这是一件很棒的事情!除了在控制器中,我不必在任何地方传播任何东西,我可以在视图中使用“$this->”来从控制器类中访问任何公共或私有的东西!!!

这就留下了一个问题:这是“通常”在 MVC 中如何完成的吗?传播视图的最佳方式是什么?我认为这将适合我的目的,如果我发现仅将嵌入式视图 php 视为“在调用控制器的范围内”的限制,我会回帖...

【问题讨论】:

    标签: model-view-controller views


    【解决方案1】:

    通常这样做的方式是视图实际上是一个对象。您将那个对象传递给您是变量,并且该视图对象采用您给它的模板,将其包含在当前范围内,然后使用输出缓冲将输出抓取到变量中。

    给你一个基本的想法:

    // controller object
    $this->set('key','val');
    $this->render('mytemplate');
    
    // controller base class
    $view = new View;
    $view->setData($this->getData());
    
    // view class
    class View {
    ....
    function render() {
        ob_start();
        include $this->resolveTemplate();
        $out = ob_get_contents();
    
        ob_end_clean();
    
        return $out;
    }
    

    【讨论】:

    • 好的,我知道这是如何使用输出缓冲完成的,非常酷......如果我错了,请纠正我,但我在上面所做的事情是相同的,但有两个不同:#1 -视图的“上下文”在 CONTROLLER 对象中,而不是它自己的视图对象中,并且#2,它没有首先缓冲,它直接拍摄到屏幕上并实时渲染......这是一个不好的方法,出于任何原因没有让我的视图与控制器完全分开?即,我的方法与下面的方法相比是否存在限制?
    • 另外:View::resolveTemplate() 实际做了什么,只包含视图代码?
    • 如果您“实时”将视图直接渲染到屏幕上,您将错过对其进行“后处理”的能力,例如将输出插入到布局模板中。 View::resolveTemplate 只是找出物理模板文件的位置。
    • 不能在视图中嵌入php进行后期处理吗?
    • 是的,但最好先将响应捕获为字符串。假设您想引入在每个操作后调用的过滤器?您想要这样做的原因有很多,以及为什么几乎每个框架都遵循这种做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多