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**
- 创建数据表迁移
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');
}
- 创建数据插入迁移
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');
}
- 执行迁移
yii migrate
- 执行特定迁移
yii migrate/to m150101_185401_create_news_table
- 基本迁移命令
| 命令 | 描述 |
|---|---|
| ✅ 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个迁移
- 高级迁移命令
| 命令 | 描述 |
|---|---|
| ✅ yii migrate/to | 迁移到指定版本(可用格式:m150101_185401、150101_185401、20150101185401) |
| ✅ yii migrate/mark | 标记迁移为已应用但不实际执行 |
| ✅ yii migrate/fresh | 删除所有表并重新执行所有迁移 |
| ✅ yii migrate/up | 应用指定数量的迁移(默认全部) |