3)Yii
🌱 第 1 题(基础认知)
Q1:什么是 Yii 框架?与 Laravel、ThinkPHP 相比,它有何优势?
📝 标准答案:
Yii(Yes It Is!) 是一个基于 PHP 的高性能、组件化、支持 MVC 架构的框架,适合快速构建大型 Web 应用、后台管理系统与 RESTful API。
主要特点:
- 强大的 Gii 代码生成器,快速开发;
- 内置 RBAC 权限控制、表单验证、分页、数据提供器;
- 严格遵循 OOP 和 PSR 规范;
- 性能优于传统 FPM 框架,结构清晰;
- 支持国际化、多语言项目开发。
对比 Laravel / ThinkPHP:
特性 | Laravel | ThinkPHP | Yii |
---|---|---|---|
模式 | MVC + Facade | MVC + 助手函数 | MVC + Component |
性能 | 中等 | 快 | 快(接近原生效率) |
学习曲线 | 简洁但有魔法 | 简单易上手 | 稍陡但严谨规范 |
自动生成工具 | Artisan | 命令行/助手函数 | Gii(图形界面+命令行) |
适用场景 | Web/API 通用 | 后台系统/API 快速开发 | 管理系统、大型项目 |
🌿 第 2 题(框架机制)
Q2:Yii 是如何实现请求处理的?说说 Yii 的生命周期(请求到响应的完整流程)。
📝 标准答案:
Yii 框架遵循典型的 MVC 请求生命周期:
- 入口文件 index.php
创建Application
实例,执行$app->run()
。 - Application 初始化
加载配置,注册组件、服务容器、别名。 - Request 请求派发
由Request
解析路由信息(控制器/方法/参数)。 - 路由分发至 Controller
执行控制器逻辑,调用 Model、Service 处理业务。 - View 渲染视图
将数据传入模板并渲染输出。 - Response 输出结果
最后由Response
输出到浏览器。
示意流程:
入口(index.php)→ Application → Request → Router → Controller → View → Response
这个流程清晰可控,易于调试和扩展。
🌳 第 3 题(依赖注入 & Gii 工具)
Q3:Yii 如何实现依赖注入(DI)机制?如何使用 Gii 快速生成 CURD 模板?
📝 标准答案:
依赖注入机制:
- Yii 使用内置的 服务容器(Service Locator),支持自动解析依赖。
- 可通过构造函数注入,也支持通过
Yii::$container->set()
手动绑定。
php
class MyService {
public function hello() { return 'Hi'; }
}
Yii::$container->set(MyService::class);
class SiteController extends Controller {
public function __construct($id, $module, MyService $service, $config = []) {
parent::__construct($id, $module, $config);
echo $service->hello(); // 输出 Hi
}
}
Gii 自动生成 CURD:
- 安装
gii
模块后,访问http://yourapp/index.php?r=gii
- 选择 CRUD Generator
- 填入:
- Model Class:
app\models\User
- Search Model:
app\models\UserSearch
- Controller ID:
user
- Model Class:
- 自动生成:控制器、增删改查视图、搜索过滤器
🌲 第 4 题(实际场景)
Q4:如何在 Yii 中使用 Redis + MySQL 实现缓存数据优化读取?
📝 标准答案:
Yii 提供原生组件支持 Redis、MySQL,可通过组件配置实现统一调用。
1)配置 Redis 组件(config/web.php)
php
'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
],
2)缓存读取示例:
php
use Yii;
use app\models\User;
class UserService
{
public function getUser($id)
{
$key = "user:$id";
$data = Yii::$app->redis->get($key);
if (!$data) {
$user = User::findOne($id);
$data = json_encode($user);
Yii::$app->redis->set($key, $data);
Yii::$app->redis->expire($key, 600);
}
return json_decode($data, true);
}
}
通过 Redis 缓存热点数据,显著降低数据库压力。
🪵 第 5 题(模块化能力 & 异常日志处理)
Q5:Yii 如何支持大型项目模块化?如何实现统一的异常处理和日志记录?
📝 标准答案:
模块化支持:
- Yii 支持通过
modules
配置多个子系统(如 admin、api、v1 等)。 - 每个模块都有独立的控制器、模型、视图,适合大型项目拆分。
php
'modules' => [
'admin' => [
'class' => 'app\modules\admin\Module',
],
],
访问:/admin/user/index
路由映射到模块内控制器。
统一异常处理:
- 可配置
errorHandler
,统一接管错误输出。
php
'components' => [
'errorHandler' => [
'errorAction' => 'site/error',
],
],
在 SiteController::actionError()
中格式化异常响应内容。
日志记录:
- 使用内建
log
组件,支持按级别输出日志到文件、数据库、邮件等。
php
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
'logFile' => '@runtime/logs/app.log',
],
],
],
],
也支持扩展对接:Sentry、ELK、Graylog、Aliyun SLS 等平台。