Yii 2:我可以访问另一个视图呈现的视图中的变量吗?

Yii 2: Can I access a variable in a view that's rendered by another view?

在 Yii 2 中,遵循 MVC 模式,控制器将某些变量传递给视图。但是,有时视图本身会呈现另一个视图。

例如,在默认生成的 CRUD 视图中,create.php 和 update.php 都呈现 _form 视图:

<?= $this->render('_form', [
    'model' => $model,
]) ?>

我可以在 _form 中使用控制器传递给 create.php 的变量吗?

假设控制器是这样渲染的:

return $this->render( 'create', [
    'model' => $model,
    'myVar' => $myValue,
] );

现在我可以在 create.php 中访问 $myVar 但我不能在 _form(由 create.php 呈现)中访问。无论如何我可以访问它吗?或者我是否需要显式传递它像这样形成(在 create.php 中):

return $this->render( '_form', [
    'model' => $model,
    'myVar' => $myValue,
] );

需要不断传下去才能查看要访问的地方

示例:

在控制器中:

return $this->render('view1', ['var' => $value]);

view1中:

<?= $this->render('view2', ['var' => $var]) ?>

然后您可以在视图 view2.

中将变量 var 作为 $var 访问

render 函数使用 extract() 将您的参数转换为局部函数上下文中的常规变量,这是文件的 include 完成的地方。这就是您 "receive" 认为这些价值观的方式。

这意味着,如果您在该视图中再次调用 render(或任何其他变体),它将创建一个新的局部上下文,并且 "above" 中的局部变量不会那里。这就是为什么需要将变量传递给每个调用的原因,正如您自己已经弄清楚的那样。

我用它来将变量从一个视图传递到另一个视图:

视图 1:

<?= $this->render('@app/views/layouts/_view2.php', ['hideCarousel' => TRUE]) ?>

视图 2:

<?php if (!isset($hideCarousel)): ?>
    ...
<?php endif; ?>