Yii

技术栈
后端框架
phphigh-performancegiirbacrestmvc

概览

Yii\n\nYii(Yes, it is!)是高性能 PHP 全栈框架,由 Qiang Xue 于 2008 年创建。它以极快的执行速度和强大的代码生成器 Gii 著称,在性能基准测试中常年名列前茅。\n\n### 核心特性\n\n- 高性能:惰性加载、缓存分层,速度优于大多数框架\n- Gii 代码生成器:可视化生成模型/控制器/CRUD\n- RBAC 权限控制:内置完善的基于角色的访问控制\n- RESTful API:内建 ActiveController,快速构建 API\n- ActiveRecord:直观的 ORM 数据库操作\n- 查询构建器:流畅的链式调用\n- 安全:XSS/CSRF/SQL 注入防御开箱即用\n- 测试友好:Codeception 集成,支持单元/功能/验收测试

安装

1. 环境准备

  • OS:Linux / macOS / Windows
  • PHP:>= 7.4(Yii2),>= 8.1(Yii3)
  • PHP 扩展:PDO, mbstring, JSON, OpenSSL, Intl
  • Composer:最新稳定版
  • 数据库:MySQL 5.7+ / PostgreSQL 9.6+ / SQLite
  • 可选:Node.js(前端资源编译)

2. 安装命令

Yii2 基础模板

composer create-project yiisoft/yii2-app-basic my-app

Yii2 高级模板(前后端分离)

composer create-project yiisoft/yii2-app-advanced my-app
cd my-app
php init

Yii3(新一代)

composer create-project yiisoft/app my-app

启动开发服务器

cd my-app
php yii serve
# 访问 http://localhost:8080

3. 常见安装问题

初始化环境选择

php init
# 选择 0 (Development) 或 1 (Production)

数据库配置

编辑 config/db.php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

Composer asset 插件

composer global require "fxp/composer-asset-plugin:^1.4"

国内镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

示例

Hello World:Yii2 控制器与视图

目标

创建 Yii2 控制器,展示两种响应方式:JSON API 和 HTML 视图。

完整代码

1. 使用 Gii 生成控制器(可选)

访问 http://localhost:8080/gii,使用 Controller Generator。

2. 手动创建 controllers/HelloController.php

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use yii\web\Response;

class HelloController extends Controller
{
    /**
     * JSON API 端点
     */
    public function actionIndex(): array
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        return [
            'message' => 'Hello, Vibe!',
            'framework' => 'Yii2',
            'php_version' => PHP_VERSION,
            'timestamp' => date('c'),
        ];
    }

    /**
     * HTML 视图
     */
    public function actionView(string $name = 'World'): string
    {
        return $this->render('view', [
            'name' => $name,
            'framework' => 'Yii2',
        ]);
    }

    /**
     * 带参数 JSON
     */
    public function actionGreet(string $name): array
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        return [
            'message' => "Hello, {$name}!",
            'powered_by' => 'Yii Framework',
        ];
    }
}

3. 创建视图 views/hello/view.php

<?php

/** @var string $name */
/** @var string $framework */
?>
<h1>Hello, <?= htmlspecialchars($name) ?>!</h1>
<p>Powered by <strong><?= htmlspecialchars($framework) ?></strong></p>
<p>PHP Version: <?= PHP_VERSION ?></p>

运行步骤

php yii serve

预期输出

# JSON 端点
curl http://localhost:8080/index.php?r=hello/index
# {"message":"Hello, Vibe!","framework":"Yii2","php_version":"8.2.0","timestamp":"..."}

# 带参数
curl http://localhost:8080/index.php?r=hello/greet\&name=Vibe
# {"message":"Hello, Vibe!","powered_by":"Yii Framework"}

# HTML 视图
# 浏览器访问 http://localhost:8080/index.php?r=hello/view&name=Vibe
# 渲染 "Hello, Vibe! Powered by Yii2"

提示:Yii2 可用 URL 美化消除 index.php?r=,在 config/web.php 中启用 urlManager 组件。`

教程

Yii2 入门教程:Gii 代码生成器实战

1. 背景

Gii 是 Yii2 最强大的功能之一——可视化/命令行代码生成器。本教程通过 Gii 快速生成完整的 CRUD 模块,展示 Yii 的"少写代码"哲学。

2. 前置概念

概念 说明
Gii Web 代码生成器,自动生成 Model/CRUD/Module
ActiveRecord Yii 的 ORM 实现,一行代码 CRUD
GridView 数据表格 Widget,支持排序/分页/过滤

3. 分步操作

步骤一:创建数据库表

CREATE TABLE product (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(128) NOT NULL,
    price DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    description TEXT,
    category VARCHAR(64),
    stock INT DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

步骤二:配置数据库

config/db.php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii_demo',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

步骤三:启用 Gii 模块(开发环境)

config/web.php

if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

步骤四:使用 Gii 生成代码

访问 http://localhost:8080/index.php?r=gii

a) 生成 Model

  • 点击 "Model Generator"
  • Table Name: product
  • Model Class: Product
  • 点击 Generate

b) 生成 CRUD

  • 点击 "CRUD Generator"
  • Model Class: app\models\Product
  • Controller Class: app\controllers\ProductController
  • 点击 Generate

就这样,完整的增删改查模块已生成!

步骤五:访问 CRUD

php yii serve
# 访问 http://localhost:8080/index.php?r=product

你将看到一个完整的数据表格,支持创建、编辑、删除、排序、分页和搜索。

4. 自定义生成代码

编辑 models/Product.php 添加规则:

public function rules()
{
    return [
        [['name', 'price'], 'required'],
        ['name', 'string', 'max' => 128],
        ['price', 'number', 'min' => 0],
        ['stock', 'integer', 'min' => 0],
        ['category', 'in', 'range' => ['Electronics', 'Clothing', 'Food', 'Books']],
        ['description', 'string', 'max' => 500],
    ];
}

5. 思考题

  1. 如何让 GridView 的 category 列显示为下拉过滤?
  2. 如何使用 Behavior 自动填充 created_at/updated_at?
  3. 如何将 Yii2 的 URL 美化应用到 CRUD 路由?

参考资料

  1. [1] Yii Team. Yii Framework Documentation. 2024. https://www.yiiframework.com/doc
  2. [2] Mark Safronov, Alexander Makarov. Web Application Development with Yii 2. 2014.
  3. [3] Andrew Bogdanov, Dmitry Eliseev, Alexander Makarov. Yii2 Application Development Cookbook. 2016.