Skip to content

3)Yii

🌱 第 1 题(基础认知)

Q1:什么是 Yii 框架?与 Laravel、ThinkPHP 相比,它有何优势?

📝 标准答案:

Yii(Yes It Is!) 是一个基于 PHP 的高性能、组件化、支持 MVC 架构的框架,适合快速构建大型 Web 应用、后台管理系统与 RESTful API。

主要特点:

  • 强大的 Gii 代码生成器,快速开发;
  • 内置 RBAC 权限控制、表单验证、分页、数据提供器
  • 严格遵循 OOP 和 PSR 规范
  • 性能优于传统 FPM 框架,结构清晰;
  • 支持国际化、多语言项目开发。

对比 Laravel / ThinkPHP:

特性LaravelThinkPHPYii
模式MVC + FacadeMVC + 助手函数MVC + Component
性能中等快(接近原生效率)
学习曲线简洁但有魔法简单易上手稍陡但严谨规范
自动生成工具Artisan命令行/助手函数Gii(图形界面+命令行)
适用场景Web/API 通用后台系统/API 快速开发管理系统、大型项目

🌿 第 2 题(框架机制)

Q2:Yii 是如何实现请求处理的?说说 Yii 的生命周期(请求到响应的完整流程)。

📝 标准答案:

Yii 框架遵循典型的 MVC 请求生命周期:

  1. 入口文件 index.php
    创建 Application 实例,执行 $app->run()
  2. Application 初始化
    加载配置,注册组件、服务容器、别名。
  3. Request 请求派发
    Request 解析路由信息(控制器/方法/参数)。
  4. 路由分发至 Controller
    执行控制器逻辑,调用 Model、Service 处理业务。
  5. View 渲染视图
    将数据传入模板并渲染输出。
  6. 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
  • 自动生成:控制器、增删改查视图、搜索过滤器

🌲 第 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 等平台。