在Yii 2中,按照MVC模式,控制器将某些变量传递给视图。但是,有时视图本身会呈现另一个视图。
例如,在默认生成的CRUD视图中,create.php和update.php都呈现_form视图:
<?= $this->render('_form', [
'model' => $model,
]) ?>
我是否可以使用控制器传递的变量来创建_form中的php ?
假设控制器是这样呈现的:
return $this->render( 'create', [
'model' => $model,
'myVar' => $myValue,
] );
现在我可以访问$myVar在create.php,但我不能在_form(这是由create.php呈现。有办法让我拿到这个吗?或者我需要像这样显式地传递它给form(在create.php中):
return $this->render( '_form', [
'model' => $model,
'myVar' => $myValue,
] );
render
-函数使用extract()
将参数转换为本地函数上下文中的常规变量,这是文件的include
完成的地方。这就是你在视图中"接收"这些值的方式。
这意味着如果您在该视图中再次调用render
(或任何其他变体),它将创建一个新的本地上下文,并且来自"上面"的本地变量将不在那里。这就是为什么需要将变量传递给每次调用的原因,正如您自己已经弄清楚的那样。
您需要不断地将它传递给您想要访问它的视图。
例子:
在控制器:return $this->render('view1', ['var' => $value]);
In view1
:
<?= $this->render('view2', ['var' => $var]) ?>
在view2
视图中可以访问变量var
作为$var
。
我用它将一个变量从一个视图传递到另一个视图:
View1:
<?= $this->render('@app/views/layouts/_view2.php', ['hideCarousel' => TRUE]) ?>
View2:
<?php if (!isset($hideCarousel)): ?>
...
<?php endif; ?>