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

Yii2中的应用级布局

作者头像
友儿
发布于 2022-09-11 04:11:53
发布于 2022-09-11 04:11:53
1.3K00
代码可运行
举报
文章被收录于专栏:友儿友儿
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
$config = [
//layout config
    'layout' => 'headerfooter',
];

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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
代码运行次数:0
运行
AI代码解释
复制
我是中间内容

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h1>头部</h1>
<?= $content;?>
<h1>尾部</h1>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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
代码运行次数:0
运行
AI代码解释
复制
return [
    ......
    'viewPath' => 'xxx',
];

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//所在文件路径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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
web渗透测试—-33、HttpOnly[通俗易懂]
HttpOnly是微软公司的Internet Explorer 6 SP1引入的一项新特性。这个特性为cookie提供了一个新属性,用以阻止客户端脚本访问Cookie,至今已经称为一个标准,几乎所有的浏览器都会支持HttpOnly。 下面示例显示了HTTP响应标头中HttpOnly使用的语法:
全栈程序员站长
2022/09/07
2.7K0
tomcat源码解读六 tomcat中的session生命历程
     session的作用是在一次会话中(从打开浏览器到关闭浏览器同当前服务器的交流)当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个se
cfs
2018/03/08
1.5K0
tomcat源码解读六  tomcat中的session生命历程
JSP基础--会话跟踪技术、cookie、session
我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在一个会话中。
eadela
2019/09/29
9940
JSP基础--会话跟踪技术、cookie、session
浅谈Session与Cookie的区别与联系
一、Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。 一般情况下,服务器会在一定时间内(默认30
mukekeheart
2018/07/04
3.1K0
Session会话与Cookie简单说明
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。经常有人会疑惑:Session会话与Cookies的区别是什么?用户登录的原理是什么?网站是如何认证的?它怎么知道是哪个用户从哪儿登录进来的?下面将对这些问题进行一一解答。
洗尽了浮华
2022/03/29
1.9K0
Session会话与Cookie简单说明
HttpSession详解「建议收藏」
  需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
全栈程序员站长
2022/09/07
1.4K0
HttpSession详解「建议收藏」
会话跟踪技术-session
javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!
星哥玩云
2022/09/14
4250
会话跟踪技术-session
Session和Cookie和Filter和Listener(最全 最精美)
Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。 <session-config> <session-timeout>30</session-timeout> </session-config>
编程张无忌
2021/01/26
7720
Session和Cookie和Filter和Listener(最全 最精美)
Cookie 和 Session 的那点事!
我曾在HTTP文章中立下过这个flag,现在这篇就是来兑现的!温情提示,本文使用的测试浏览器为Firefox 83.0(64位)。
东边的大西瓜
2022/05/05
3700
Cookie 和 Session 的那点事!
开发中经常碰到的问题cookie和session问题,今天一并解决
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
好好学java
2018/09/21
3K0
开发中经常碰到的问题cookie和session问题,今天一并解决
javaWeb中cookie和session的区别和使用场景
说到cookie和session先从二者的英文单词含义说起,cookie翻译为中文是小饼干的意思,session翻译成中文是会话的意思。从翻译就能看出来,cookie是服务器返回给浏览器的一些断断续续的东西,而session是一种会话机制。那么为什么要用cookie和session呢? 因为Http协议是一种无状态协议,服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session,而session是如何实现状态保持的呢? ---- 这个时候cookie作用就体现出来了! 每次HT
神秘的寇先森
2018/05/30
6410
一文搞明白Cookie、Session与Token
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性
中龙技术
2022/09/30
1.7K0
一文搞明白Cookie、Session与Token
Session、Cookie、Token三者关系理清了吊打面试官
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
淘课之家
2020/04/09
2.2K0
Session、Cookie、Token三者关系理清了吊打面试官
javaWeb核心技术第八篇之Cookie和Session
会话技术: 会话是什么? 浏览器和服务器交互,浏览器打开网页访问服务器,会话开始,正常交互. 浏览器关闭,会话结束. 会话能干什么? 会话可以共享数据. Cook
海仔
2019/08/26
8180
session和cookie的区别和联系
大家都知道,session是存储在服务器端的,cookie是存储在客户端的,session依赖于cookie。
用户2141593
2019/02/20
7720
JavaWeb(二)会话管理之细说cookie与session
前言   前面花了几篇博客介绍了Servlet,讲的非常的详细。这一篇给大家介绍一下cookie和session。 一、会话概述 1.1、什么是会话?   会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。   一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,   其中不管浏览器发送多少请求(就相
用户1195962
2018/01/18
1.4K0
JavaWeb(二)会话管理之细说cookie与session
Java学习之Cookie与Session篇
Cookie 和Session 不同的地方是 cookie是存在于客户端,而session是存在于服务器上。
全栈程序员站长
2022/07/13
1460
Cookie 和 Session 机制原理分析 & 区别对比
Web application servers are generally "stateless":
一个会写诗的程序员
2018/09/12
1.2K0
26. 会话技术-Session的使用
可以通过获取的 session ID 信息,我们可以知道 session 是同一个的。
Devops海洋的渔夫
2021/11/19
1.1K0
26. 会话技术-Session的使用
Spring Mvc boot解决静态url带jsessionid问题
Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。
王念博客
2019/07/24
3.2K0
相关推荐
web渗透测试—-33、HttpOnly[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档