使用响应对象渲染视图

Render view using response object

我正在 symfony 3 中开发一个项目,我有以下代码 returns Response

的一个实例
public function dashboardAction()
{
    return parent::dashboardAction();
}

以上代码的父方法为:

public function dashboardAction()
{
    $blocks = [
        'top' => [],
        'left' => [],
        'center' => [],
        'right' => [],
        'bottom' => [],
    ];

    foreach ($this->container->getParameter('sonata.admin.configuration.dashboard_blocks') as $block) {
        $blocks[$block['position']][] = $block;
    }

    $parameters = [
        'base_template' => $this->getBaseTemplate(),
        'admin_pool' => $this->container->get('sonata.admin.pool'),
        'blocks' => $blocks,
    ];

    if (!$this->getCurrentRequest()->isXmlHttpRequest()) {
        $parameters['breadcrumbs_builder'] = $this->get('sonata.admin.breadcrumbs_builder');
    }

    return $this->render($this->getAdminPool()->getTemplate('dashboard'), $parameters);
}

我想将变量 articles 传递给响应实例中的视图。

我试过这样做

return $this->render(parent::dashboardAction(), array(
        'articles' => $articles,
    ));

但是不行。有帮助吗?

$this->render returns 一个 Response 对象,第一个参数是要呈现的模板的名称(字符串)。您试图再次将 Response 对象作为第一个参数传递给 render,这显然行不通。

$this->render 字面上使用提供的参数呈现模板。这意味着您的父 dashboardAction return 的 return 值是一个包含由 $this->getAdminPool()->getTemplate('dashboard') 编辑的 return 模板呈现的 HTML 的响应对象。如果您不想实际使用完全渲染的 HTML(不,您不想),那么此时您无法更改渲染的 HTML。

总的来说,我不认为直接重用操作方法是个好主意。相反,您可以执行以下操作:

在你的父级 class 中创建一个方法 getDashboardParameters,它只 return 为渲染函数提供参数,但不调用 render

protected function getDashboardParameters()
{
    $blocks = [
        'top' => [],
        'left' => [],
        'center' => [],
        'right' => [],
        'bottom' => [],
    ];

    foreach ($this->container->getParameter('sonata.admin.configuration.dashboard_blocks') as $block) {
        $blocks[$block['position']][] = $block;
    }

    $parameters = [
        'base_template' => $this->getBaseTemplate(),
        'admin_pool' => $this->container->get('sonata.admin.pool'),
        'blocks' => $blocks,
    ];

    if (!$this->getCurrentRequest()->isXmlHttpRequest()) {
        $parameters['breadcrumbs_builder'] = $this->get('sonata.admin.breadcrumbs_builder');
    }

    return $parameters;
}

将您的父 dashboardAction 更改为如下所示:

public function dashboardAction() {
    return $this->render($this->getAdminPool()->getTemplate('dashboard'), $this->getDashboardParameters());
}

将您的子 dashboardAction 更改为如下所示:

public function dashboardAction() {
    $parameters = $this->getDashboardParameters();
    $parameters['articles'] = $articles;
    return $this->render($this->getAdminPool()->getTemplate('dashboard'), $parameters);
}