前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Yii2中的应用级布局

Yii2中的应用级布局

作者头像
友儿
发布2022-09-11 12:11:53
1.2K0
发布2022-09-11 12:11:53
举报
文章被收录于专栏:友儿友儿

首先我们介绍一下Controller类的render()方法的执行流程,需要查看vendor\yiisoft\yii2\base\Contorller.php文件中的render()方法源代码。

代码语言:javascript
复制
class Controller extends Component implements ViewContextInterface
{
 ......
  public function render($view, $params = [])
    {
        $content = $this->getView()->render($view, $params, $this);
        return $this->renderContent($content);
    }
 public function renderContent($content)
    {
        $layoutFile = $this->findLayoutFile($this->getView());
        if ($layoutFile !== false) {
            return $this->getView()->renderFile($layoutFile, ['content' => $content], $this);
        }

        return $content;
    }
}

分析render()方法源代码,画一个比较直观的流程图。

当render()方法被调用,首先调用View类的render()方法,该方法返回的内容赋值给变量content,接下来把content作为参数传递给renderController()方法。在renderController()方法中首先调用findLayoutFile()方法,渲染出布局文件,然后调用View类的renderFile()方法,完成局部文件和使徒的渲染。

开始应用级布局

在一个应用中多个控制器使用一个布局文件,那么可以在应用级配置文件config/web.php中设置yii/base/Application的$layout属性,代码如下:

代码语言:javascript
复制
$config = [
//layout config
    'layout' => 'headerfooter',
];

我们要做一个这样的布局页面

首先,创建ArticleController.php文件,代码如下:

代码语言:javascript
复制
<?php
/**
 * Created by ZhengNiu.
 * User: admin
 * Date: 2019/10/12
 * Time: 17:49
 */

namespace app\controllers;

use yii\web\Controller;

class ArticleController extends Controller
{
    public $layout = 'right';

    public function actionIndex()
    {
        return $this->render('article');
    }

}

创建views/article.php,代码如下:

代码语言:javascript
复制
我是中间内容

创建views/layout/headerfooter.php,代码如下:

代码语言:javascript
复制
<h1>头部</h1>
<?= $content;?>
<h1>尾部</h1>

创建views/layout/right.php,代码如下:

代码语言:javascript
复制
<?php
$this->beginContent('@app/views/layouts/headerfooter.php');
?>
<?php
echo $content;
?>

我是left

<?php $this->endContent(); ?>

嵌套布局实现页面渲染流程:

  1. 首先渲染视图文件article.php的内容,存储到布局文件reght.php的$content中。
  2. 因为在布局文件right.php 中使用了另外一个布局文件headerfooter.php,所以又把article.php和right.php两个文件的内容存储到headerfooter.php文件的$content中。
  3. 最后渲染headerfooter.php布局文件,并且结果返回给用户。
视图文件的存储路径

修改配置文件config/web.php,代码如下:

代码语言:javascript
复制
return [
    ......
    'viewPath' => 'xxx',
];

配置文件config/web.php中的“viewPath”是yii\bash\Application类的属性.该类继承了yii\base\Module类,在Module类中定义了getViewPath()和setViewPath()方法,来获取和设置视图文件路径,代码如下所示:

代码语言:javascript
复制
//所在文件路径vendor\yiisoft\yii2\base\Application.php
abstract class Application extends Module
{

}
//所在文件路径vendor\yiisoft\yii2\base\Module.php
class Module extends ServiceLocator
{
  ......
    private $_viewPath;
    public function getViewPath()
    {
        if ($this->_viewPath === null) {
            $this->_viewPath = $this->getBasePath() . DIRECTORY_SEPARATOR . 'views';
        }

        return $this->_viewPath;
    }
    public function setViewPath($path)
    {
        $this->_viewPath = Yii::getAlias($path);
    }
}

在Module中并没有设施成员属性viewPath,但是使用viewPath成员属性时将自动调用_get()魔术方法间接调用getViewPath(),同理在设置viewPath成员属性时将自动调用_get()魔术方法间接调用setViewPath()方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开始应用级布局
  • 视图文件的存储路径
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档