4

我使用下面的代码在控制器操作中呈现页面。

public function userinforeceiveAction()
{   
    $renderer = new PhpRenderer();

    $map = new Resolver\TemplateMapResolver(array(
    'userinfo' => __DIR__ . '/userinfo.phtml',
        ));

        $resolver = new Resolver\TemplateMapResolver($map);
        $renderer->setResolver($resolver);
        $model = new ViewModel();
        $model->setTemplate('userinfo');

        return new ViewModel();    
}

我在视图中回显渲染内容。

echo $renderer->render($model);

但它什么也不渲染。请帮我。谢谢。以及这两行与 zf1 的良好合作。

$this->userinfoAction();
$this->$render('userinfo');
4

3 回答 3

9

如果您使用的是 ZF2 MVC 层,您不需要实例化您自己的视图渲染,只需返回一个 ViewModel 实例,它会处理其余的事情:

public function userinforeceiveAction()
{
    $vm = new ViewModel();
    $vm->setTemplate('userinfo');
    return $vm;
}

有关如何使用视图模型的示例,请参见 Akrabat 的 ZF2TestApp:http: //zf2test.akrabat.com/

相关的 ZF2 代码链接在该页面的底部,并且在模块配置文件中配置了模板图

于 2012-06-27T12:41:55.743 回答
2

实际上,您所做的应该适用于以下矿工更改

public function userinforeceiveAction()
{   
    $renderer = new PhpRenderer();

    $map = new Resolver\TemplateMapResolver(array(
    // first mistake
    // __DIR__ is the directory of application controller, not the path of views 
    // second mistake
    // 'userinfo' should be '(controller)/(action)'
    'userinfo' => __DIR__ . '/userinfo.phtml',
        ));

        // third mistake
        // since $map is a resolver instance, this is wrong
        $resolver = new Resolver\TemplateMapResolver($map); // no need
        $renderer->setResolver($resolver);
        // should be $renderer->setResolver($map);
        $model = new ViewModel();
        // 'userinfo' should be changed
        $model->setTemplate('userinfo');

        // big mistake
        // what you are returning here is new instance of view model
        return new ViewModel();
        // instead you should return $model 
}

视图中不需要这条线

echo $renderer->render($model);

但是最好和推荐的方法是通过模块配置文件注入,正如亚当所说

文档将提供更好的解释

于 2012-07-09T17:29:26.523 回答
1

您可能想看看骨架应用程序如何在 MVC 环境中呈现内容。

主要是你做对了。但是为什么要创建渲染器和解析器而不使用它呢?我想设置渲染策略和模板?这不是在控制器中做的,而是在你的应用程序/模块的配置中做的。

另一方面,您不会在视图中回显渲染器的结果 - 渲染器返回您的视图的结果,然后由您的应用程序回显(您不会自己执行此操作)。

于 2012-05-03T08:30:26.277 回答