Skip to main content

Yii2

Yii2 的请求生命周期简述

入口文件 index.php 初始化 Yii 环境,加载配置,创建应用对象。

应用对象 Application 初始化组件(数据库、缓存、日志等)

处理请求 handleRequest 执行路由解析 创建控制器与动作 触发全局事件 如 beforeRequest、afterRequest)

路由解析 Router ->控制器/动作

执行控制前置操作 beforeAction() 钩子方法

执行控制器动作 actionxxx() 钩子方法

执行控制器后置操作 afterAction 钩子方法

返回响应内容 Response 控制器返回的结果,交由 Response 组件处理

发送响应 send()

Gii 工具可以生成什么?如何自定义模板?

1. Model: 根据数据库表结构生成ActivateRecord模型类.
2. CURD: 生成控制器、视图、搜索模型、实现完整的增删改查。
3. Controller: 控制器类
4. Form: 生成基于模型的表单视图代码.
5. Module: 创建可复用的模型结构
6. Extension: 快速搭建Yii2扩展包骨架.
7. Migration: 生成数据库迁移文件.
8. Rest Controller: 基于模型生成的RESTful API控制器。

控制器中的 beforeAction() 方法的作用?

1. 权限控制
2. 日志记录
3. 禁止非法请求方式
4. 行为绑定等前置操作

如何定义表单模型与验证规则(rules)?

public function rules()
{
return [
[['username', 'password'], 'required'],
['rememberMe', 'boolean'],
['password', 'validatePassword'],
];
}
// 自定义验证方法
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) {
if ($this->password !== '123456') { // 示例,实际应查数据库
$this->addError($attribute, '密码不正确。');
}
}
}

Yii2 中的关系查询如 hasOne / hasMany 如何写?

# 比如User模型和Order模型
public function getOrders()
{
return $this->hasMany(Order::class, ['user_id' => 'id'])->inverseOf('user');
}
public function getUser()
{
return $this->hasOne(User::class, ['id' => 'user_id'])->inverseOf('orders');
}

Yii2 如何实现用户登录验证(identityClass、login())

  • 比如存在User模型,然后实现IdentityInterface接口
  • 在config/web.php配置identityClass

如何使用 ActiveDataProvider 实现分页与过滤?

通过配合GridView、ListView小部件使用,实现分页、排序、过滤的核心数据源工具
控制器中使用ActiveDataProvider
视图中使用GridView
搜索与过滤SearchModel

如何配置 URL 重写与伪静态?

  • apache下.htaccess要放在项目根目录或者public下RewriteRule ^(.*)$ index.php [L]
  • nginx在server内,确保try_files写法正确,写法为try_files $uri $uri/ /index.php?$query_string;

常用组件如 Yii::$app->request, Yii::$app->user 的作用?

Yii::$app是一个全局访问点,用于访问实例及其注册的组件。
request: 代表当前http请求
user: 用于管理用户登录、身份验证、权限等

如何通过 behavior 为模型自动记录时间、用户 ID?

通过模型的 behaviors() 方法使用内置行为(TimestampBehavior 和BlameableBehavior)来自动记录 创建时间 / 更新时间 和 创建人 / 更新人 ID
1. TimestampBehavior 默认使用 time() 生成 Unix 时间戳
2. 依赖用户登录状态,需启用 Yii::$app->user->id

yii2 队列启动及检测

# 通过定时任务(Cron)消费队列
php /path/to/yii queue/work --verbose=1 --color=0
* * * * * /usr/bin/php /var/www/myapp/yii queue/work --verbose=1 >> /var/log/queue.log 2>&1
# 丢弃标准输出,但保留错误输出(stderr)
# 忽略正常输出,有错误会显示在控制台
php yii queue/listen > /dev/null
# 同时忽略正常输出和错误输出
php yii queue/listen > /dev/null 2>&1
# 2>&1 表示将错误输出(stderr)也重定向到标准输出(stdout)
# 两者都被重定向到/dev/null
# 查看消费进程是否存在
ps aux | grep "yii queue/listen"

Yii2 数据迁移

迁移文件版本

yii migrate/create **file_name**
  1. 创建数据表迁移
public function safeUp()
{
$this->createTable('{{%evaluation_dream_items}}', [
'id' => $this->primaryKey(),
'item_name' => $this->string(50)->notNull(),
'number' => $this->integer(10)->comment('数字,不超过10位'),
'created_at' => $this->dateTime()->notNull()->defaultExpression('CURRENT_TIMESTAMP'),
'updated_at' => $this->datetime()->notNull()->defaultExpression('CURRENT_TIMESTAMP')->append('ON UPDATE CURRENT_TIMESTAMP')
], 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=Innodb');
$this->addCommentOnTable('{{%evaluation_dream_items}}', '测评dream项目表');

public function safeDown()
{
$this->truncateTable('evaluation_items');
}
  1. 创建数据插入迁移
yii migrate/create insert_evaluation_items_data

迁移文件

public function safeUp()
{
$this->batchInsert('evaluation_items',
['item_name', 'description', 'created_at', 'updated_at'],
[
['整体语言', '请输入数字', date('Y-m-d H:i:s'), date('Y-m-d H:i:s')],
['听力理解', '请输入数字', date('Y-m-d H:i:s'), date('Y-m-d H:i:s')],
['语言表达', '请输入数字', date('Y-m-d H:i:s'), date('Y-m-d H:i:s')],
['语义', '请输入数字', date('Y-m-d H:i:s'), date('Y-m-d H:i:s')],
['句法', '请输入数字', date('Y-m-d H:i:s'), date('Y-m-d H:i:s')],
]
);
}

public function safeDown()
{
$this->truncateTable('evaluation_items');
}
  1. 执行迁移
yii migrate
  1. 执行特定迁移
yii migrate/to m150101_185401_create_news_table
  1. 基本迁移命令
命令描述
yii migrate应用所有新迁移
yii migrate/new显示所有未应用的迁移
yii migrate/history显示已应用的迁移历史
yii migrate/redo重新执行最后一个迁移
yii migrate/down撤销最近应用的迁移(默认1个)
yii migrate/create创建新迁移文件
例如:多数据库迁移

yii migrate --db=db2 --migrationPath=@app/migrations/db2

例如: 回滚迁移

yii migrate/down # 回滚1个迁移 yii migrate/down 3 # 回滚3个迁移

  1. 高级迁移命令
命令描述
yii migrate/to迁移到指定版本(可用格式:m150101_185401、150101_185401、20150101185401)
yii migrate/mark标记迁移为已应用但不实际执行
yii migrate/fresh删除所有表并重新执行所有迁移
yii migrate/up应用指定数量的迁移(默认全部)