yii2 视图(布局)中各类函数总结报告及使用场景

yii2布局文件里有不少函数,你是否研究过他们都是干吗用的?这篇文章告诉你~php

咱们以安装完yii2程序后默认的布局为例说明css

// @app/views/layouts/main.php

/* @var $this \yii\web\View */
/* @var $content string */

use yii\helpers\Html;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;

AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
    <meta charset="<?= Yii::$app->charset ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?= Html::csrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>

<div class="wrap">
    <div class="container">
        <?= $content ?>
    </div>
</div>

<footer class="footer">
    <div class="container">
        <p class="pull-left">© My Company <?= date('Y') ?></p>
        <p class="pull-right"><?= Yii::powered() ?></p>
    </div>
</footer>

<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>复制代码

首先要说的是,布局其实就是视图,一种特殊的视图而已,因此咱们明说布局函数,实质在说视图类View。html

我就是我 $this

既然是一种特殊的视图,因此布局里面的 $this 对象其实就是当前视图自己,这在默认布局的注释里已经说明。web

/* @var $this \yii\web\View */
/* @var $content string */复制代码

因此我建议你在阅读本文的时候,打开yii\web\View源代码同步进行。ajax

写啥是啥 $content

这是在布局文件里除了 $this 外的第二个变量,咱们都知道布局就像一个容器同样将基础架构先画出来,而后想用此结构的视图直接使用就能够了,那么 $content 就是使用此布局的视图本身的内容。微信

开山函数 beginPage 和 endPage

记住,全部的HTML咱们都应该包含在 beginPage 和 endPage 函数之间,它们表明一个页面的开始和结束。yii2

以外它们还分别触发了下面的两个事件架构

View::EVENT_BEGIN_PAGE
View::EVENT_END_PAGE复制代码

若是你想统计视图页面内代码的渲染时间,能够在这两个事件上作作手脚。固然,endPage的做用要更加大,后面会单独拿出来讲明。app

资源在哪我说的算 head()

确切的说,该函数只是告诉了yii要将资源文件(好比js和css)放到页面的哪里,通常它在head标签内,若是你将它移到其余地方,你会发现未来页面的js文件和css文件等也转移了。框架

head有啥我来作 renderHeadHtml()

从名字你就能够知道,它负责将头部的一些代码渲染出来,好比js和css等文件的具体html标签,具体放哪?那必须是放到head()函数里指定的位置了,另外,这是一个protected类型方法,你不要想着能直接->就调用它,没门,它仅仅为View类的其余方法服务。

beginBody 和 endBody

这两个函数和 beginPage 和 endPage 有雷同的地方,就是作了两个标记,表明body的开始和结束,做为位置标签,另外也触发了两个事件

View::EVENT_BEGIN_BODY
View::EVENT_END_BODY复制代码

固然 endBody 和 endPage 同样,还有其余职责,放到最后说,你先了解他们表明开始和结束,同时触发事件便可。

中场总结

上面说了 head、beginBody、endBody 都具备标签的做用,View为其设计了3个常量做为表明,分别以下

PH_HEAD // $this->head()
PH_BODY_BEGIN // $this->beginBody()
PH_BODY_END // $this->endBody复制代码

根据咱们上面的了解,先画一个图出来,看看布局的可视化样子。

// 我是图
$this->beginPage()
- <html>
-- <head>
$this->head() // PH_HEAD
-- </head>
-- <body>
$this->beginBody() // PH_BODY_BEGIN
$content
$this->endBody() // PH_BODY_END
-- </body>
- </html>
$this->endPage()复制代码

renderBodyBeginHtml 和 renderBodyEndHtml 函数

上面咱们知道有一个叫作 renderHeadHtml 方法负责往 PH_HEAD 位置放资源文件,那么PH_BODY_BEGIN和PH_BODY_END 也应该同类待遇,renderBodyBeginHtml和renderBodyEndHtml就是干这个的。

而从代码来看 renderBodyBeginHtml 和 renderBodyEndHtml 作的事情和 renderHeadHtml 差很少,都是资源的具体代码话,你是否记得咱们在兄弟连时候有一节( nai8.me/course-vide… )说过关于asset资源类位置的问题(指定资源在页面的上部仍是下部),对,renderBodyBeginHtml、renderBodyEndHtml 等就是作这个的。

咱们分条说下

  • renderBodyBeginHtml渲染的是位置为 POS_BEGIN 的js文件
  • renderBodyEndHtml渲染的是位置为 POS_END、POS_READY、POS_LOAD的js文件
  • renderHeadHtml渲染的是位置为POS_HEAD的js文件和全部css文件(无位置功能)以及一些head的metaTags。

如今你明白了吧,到此刻,你知道了有三个函数负责三个位置的代码渲染,而这些渲染其实就是资源的代码实现。

再说endPage

到如今,万事俱备,可是东风在哪里?它就是endPage
看一部分endPage的源代码咱们

echo strtr($content, [
    self::PH_HEAD => $this->renderHeadHtml(),
    self::PH_BODY_BEGIN => $this->renderBodyBeginHtml(),
    self::PH_BODY_END => $this->renderBodyEndHtml($ajaxMode),
]);复制代码

endPage活生生的实现了代码和位置之间的替换,说白了就是字符串替换。。。

固然,在View类里还有一些小方法,好比registerJs()、clear()等等,阿北相信当你了解了布局(视图)造成的流程后,这些很容易看懂,若是还不懂,请留言此贴问。

最后一个例子

若是咱们把最后相应给客户的页面比做一栋大楼。那么看看角色的分类

  • 布局 表明大楼图纸(表明着一个框架)
  • 资源类 表明购物清单
  • View的三个render函数 表明具体的建筑工人,采购资源类,并放到大楼里。
  • endPage函数,就是售楼许可证,保证全部资源都到位。
  • 使用布局的视图 就是人,入驻大楼,没有视图的布局都是纸老虎。

(完)

本文原创发布于微信公众号 北哥小报 , 严谨的原创技术文,Q群:171277552。

微信扫码能够关注
相关文章
相关标签/搜索