0

我正在一个网站上工作,我需要在 Zend Framework 2 的布局中使用类似“小部件”的视图。小部件应显示服务器的操作状态(已完成)。

(如果这是不好的 MVC 风格,请纠正我)我已经用

function viewStatusAction(){ 
   ... 
   return $viewModel(array($vars))
}

然后我想使用 viewHelper 来获取操作的状态。这就是我卡住的地方。我知道如何创建 viewHelper,但不知道从哪里开始从控制器操作中获取返回的视图。那么我该怎么做呢?

4

2 回答 2

3

您可以使用Zend\Mvc\Controller\Plugin\Forward控制器插件从另一个控制器中分派另一个控制器操作。

文档说

有时,您可能希望从匹配的控制器中分派其他控制器 - 例如,您可能使用这种方法来构建“小部件化”内容。Forward 插件有助于实现这一点。

如果您已经拥有这些操作但希望将它们与其他操作结合起来以构建聚合视图,这将非常有用。

use Zend\View\Model\ViewModel;

class AdminController extends AbstractActionController 
{
    public function adminDashboardAction()
    {
        $view = new ViewModel();
        $view->setTemplate('admin/admin/dashboard');

        //..
        $serverStatsWidget = $this->forward()->dispatch('ServiceModule\Controller\Server', array(
            'action' => 'status',
            'foo' => 'bar',
        ));
        if ($serverStatsWidget instanceof ViewModel) {

            $view->addChild($serverStatsWidget, 'serviceStats');
        }

        return $view;
    }

作为$serverStatsWidget分派控制器的结果,您可以将其作为子级添加到“主”视图中,并仅使用echo.

// admin/admin/dashboard.phtml
echo $this->serviceStats;
于 2014-08-27T19:30:12.103 回答
2

这就是我所做的。这也应该是正确的做法

在模块.php

public function getViewHelperConfig()
{
    return array(
        'factories' => array(
            'statusWidget' => function ($sm) {
                -- some service handling --
                $statusWidget = new statusWidget($service);
                return $statusWidget;
            }
        )
    );
}

然后我在 operationStatus\View\Helper 中创建了一个 viewHelper

<?php
namespace operationalStatus\View\Helper;

use Zend\View\Helper\AbstractHelper;

class statusWidget extends AbstractHelper
{

    public function __construct($service){
        $this->service = $service
    }

    public function __invoke()
    {
        -- collect data from the service --

        return $this->getView()->render('operational-status/widget/status', array('operation' => $status));
    }

}
于 2014-08-27T21:37:50.297 回答