Yii2 基础:延迟加载,数据、片段、页面、HTTP 的缓存,gii 工具

6 篇文章 0 订阅

1. 延迟加载;

1.1 类的延迟加载;

<?php
// 1. 延时加载原理
function loader($class){
	require('class\\' . $class . '.php');
	// require('class\Class1.php');
}

spl_autoload_register('loader');

if($_GET['tag']){
	$class1 = new Class1;
}else{
	$class2 = new Class2;
}

// 2. 延时加载源代码分析
// 位置:basic/vendor/yiisoft/yii2/Yii.php
// 当 PHP 执行一个不认识的类 Yii::$container = new yii\di\Container(); 时
// 会去执行 spl_autoload_register(['Yii', 'autoload'], true, true); 中的 autoload() 函数
// autoload() 函数属于 Yii 类,继承 \yii\BaseYii

// Yii.php 是在框架启动的最开始时候被运行,也就是入口脚本文件里被执行:basic/web/index.php

1.2 类的映射表机制;

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\Order;

class TestController extends controller{
	
	public function actionIndex(){
		// PHP 执行代码实例化 Order 的时候,它不认识 Order,就会去执行一个自动加载函数 autoload($class)
		// autoload($class) 会根据传过来的 $class(注意这里的 class 是全名,包括命名空间,就是 app\models\Order)
		// 然后根据全名进行转换成在磁盘上的真实路径(\...\models\Order.php),当然这个转换也会花费时间
		$order = new Order;

		// 为了减少转换开销,就引入了“类的映射表”(class map)
		// 就是根据类的名字,去一步到位的直接获得磁盘上的绝对路径
		Yii::$classMap['app\models\Order'] = '/data/project/yii2/basic/models/Order.php';
		// 然后在执行 Order 类的时候,就会根据 class map 的名字加载绝对路径
		$order = new Order;
	}
}

1.3 组件的延迟加载;

  • 一个用户给 Yii2 框架项目发送了一个请求,这个请求最先开始处理的是入口脚本文件 basic/web/index.php
  • 在 index.php 中会把请求交给应用主体 app 来处理。应用主体在处理前会把自己给实例化,实例化过程中就会去加载一堆组件 components,比如 session / request / response 组件等等
  • 应用主体 app 在加载完组件后,会把请求的处理再交给控制器 controller。控制器在处理请求的时候,可以使用应用主体 app 加载过来的组件

那什么是组件的延迟加载?

  • 看起来好像是应用主体 app 预先把组件给加载过来,在控制器里直接拿过来用
  • 实际的情况是应用主体 app 并没有真正的把组件给加载进来,真正的组件加载是在控制器里真的使用到组件的时候,这个组件才会真正的被加载过来,也就是把这个组件的加载过程由 app 的初始化延迟到了在控制器里真正的使用到这个组件

那么组件的延迟加载是怎么实现的?

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\Order;

class TestController extends controller{
	
	public function actionIndex(){
		// 使用静态全局类 Yii 调用应用主体 $app
		// 然后 $app 初始化的时候会去加载一些组件,使用 session 组件
		// session 组件在我们调用代码前是不存在的,只有调用了代码才会加载组件
		
		// 具体的加载流程是,当我们去访问应用主体 $app 里的 session 属性的时候
		// 它会触及 PHP 中的 __get() 的方法,在 __get() 里才会真正的把 session 组件加载进来
		// 加载进来之后,会把 session 组件返回出来,然后通过 $session 变量接收 session 组件
		$session = Yii::$app->session;
	}
}

2. 数据缓存;

2.1 增删改查;

2.2 有效期设置;

2.3 数据缓存依赖关系;

6. gii 工具;

6.1 简介;

  • gii 的作用就是帮助生成一些加强性的重复代码
  • gii 访问地址:http://192.168.2.214/yii2/basic/web/index.php?r=gii
  • 注意点:
<?php
// 1. 如果以上地址无法访问 gii 模块
// 设置 basic/config/web.php
'allowedIPs' => ['*'],

// 2. 关于地址中 r 后面的参数
// 在 Yii2 是用一种**模块化**的思想进行设计的。在 Yii2 中有很多模块,gii 是众多模块之一。
// 然后应用主体也是一种模块,是众多模块中比较主要的模块,所有其它的模块都是挂载在应用主体之上的。
// 当 r 后面写了一个单词之后,应用主体会进行一个处理,它会看 r 后面的单词是模块还是控制器
// 如果是模块的话,就交给模块处理
// 如果是控制器的话,这时候才交给应用主体,应用主体去找合适的控制器去使用

// 对于模块来说,每个模块都是有控制器(controllers)和模型(models)以及视图(views)这三个文件夹
// 因为会先去找模块,然后再去找控制器

// gii 提供了 6 大工具:Model、CRUD、Controller、Form、Module、Extension Generator

6.2 模型生成器的使用及代码实现;

# 1. 由于模型生成器会生成文件到 /data/project/yii2/basic/models/,所以需要文件夹有写权限
chmod -R 777 /data/project/yii2/basic/models/
# 2. 按照页面要求选择表(比如 test 表),填写完成后先按 “Preview”,然后按 “Generate” 生成 model 文件
  • 生成的 /data/project/yii2/basic/models/Test.php 文件如下
<?php

namespace app\models;

// 声明 Yii 是一个全局的类
// 要使用 Yii 里的应用主体:Yii::$app->db
// 如果不声明 Yii 全局类,要使用需要在前面加上斜杠:\Yii::$app->db
use Yii;

/**
 * This is the model class for table "test".
 *
 * @property int $id
 * @property string $title
 */
class Test extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
    	// Test 活动记录可以操控数据库中的 test 表
        return 'test';
    }

    /**
     * {@inheritdoc}
     */
     // 校验数据是否合法
    public function rules()
    {
        return [
            [['title'], 'required'],
            [['title'], 'string', 'max' => 255],
        ];
    }

    /**
     * {@inheritdoc}
     */
    // 
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            // 如果有 comments,显示 comments 内容,没有的话显示字段名称。
            // 用于 model 实例化类后显示报错信息(getErrors())或者提示信息
            'title' => 'Title',
        ];
    }
}

6.3 控制器生成器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值