问题复现: 在某个视图内不需要使用到layout布局,故设置$this->layout = false
, 但是在页面中进行资源注册AppAsset::register($this)
的时候,发现渲染出来的页面中没有加载这些资源。
原因是在书写不使用layout的页面时,漏写了一下布局元素中的一项或者多项。
<?php $this->beginPage() ?>
<?php $this->beginBody() ?>
<?php $this->endBody() ?>
<?php $this->endPage() ?>
从Yii2的视图类View
来看:
/**
* Marks the ending of an HTML body section.
*/
public function endBody()
{
$this->trigger(self::EVENT_END_BODY);
echo self::PH_BODY_END;
foreach (array_keys($this->assetBundles) as $bundle) {
$this->registerAssetFiles($bundle);
}
}
/**
* Marks the ending of an HTML page.
* @param bool $ajaxMode whether the view is rendering in AJAX mode.
* If true, the JS scripts registered at [[POS_READY]] and [[POS_LOAD]] positions
* will be rendered at the end of the view like normal scripts.
*/
public function endPage($ajaxMode = false)
{
$this->trigger(self::EVENT_END_PAGE);
$content = ob_get_clean();
echo strtr($content, [
self::PH_HEAD => $this->renderHeadHtml(),
self::PH_BODY_BEGIN => $this->renderBodyBeginHtml(),
self::PH_BODY_END => $this->renderBodyEndHtml($ajaxMode),
]);
$this->clear();
}
资源需要在这些布局元素中注册。
所以在不使用layout布局文件来编写的单独的页面时,Yii2的页面布局元素还是要保持完整。