使用响应对象渲染视图
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);
}
我正在 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);
}