Post

Yii 开发实践

Yii 开发实践

最近接触了 Yii 2 —— 一个基于 PHP、遵循 MVC 架构、性能良好、安全友好的全栈框架。

聊聊几个点:MVC 模式、Action 的定义与返回、数据验证、数据库访问方式、以及路由机制

1. Yii 中的 MVC 模式

MVCModel-View-Controller(模型-视图-控制器):

在 Yii 中体现职责说明
Modelmodels/ 下的类(如 Post处理数据结构、数据库交互、验证规则
Viewviews/ 下的 PHP 文件渲染页面(或返回 JSON 等格式)
Controllercontrollers/ 下的类(如 PostController处理请求、调度模型与视图逻辑

前端类比

  • Controller 类似前端的“页面控制器”
  • Model 类似数据接口和本地数据模型
  • View 可比作模版引擎或组件输出层

2. 如何创建一个自定义控制器动作(Action)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// controllers/PostController.php
namespace app\controllers;

use yii\web\Controller;

class PostController extends Controller
{
    public function actionView($id)
    {
        return "查看文章 ID:$id";
    }

    public function actionJson()
    {
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        return ['status' => 'ok', 'message' => '你好,前端'];
    }
}

常见返回类型:

类型使用方式场景
字符串return "Hello"渲染文本或 HTML
视图渲染return $this->render('index')渲染模板
JSONresponse->format = JSON + return array构建 API
重定向return $this->redirect(...)登录跳转等

3. Yii 模型支持的验证规则

Model 中定义 rules() 方法可用于输入验证。

1
2
3
4
5
6
7
8
9
// models/ContactForm.php
public function rules()
{
    return [
        [['name', 'email', 'message'], 'required'],
        ['email', 'email'],
        ['name', 'string', 'min' => 2, 'max' => 50],
    ];
}

常用验证器包括:

验证器说明
required必填字段
email检查邮箱格式
string限制字符串长度
integer检查是否为整数
match正则表达式匹配
safe标记字段允许赋值但不验证

使用场景:构建一个表单 POST API,前端传数据过来,Model 会先验证是否合法再保存或返回错误。


4. ActiveRecord vs DAO

ActiveRecord(AR):

ORM 风格,每个模型类代表一个数据表,字段自动映射,操作直观。

1
2
3
$post = Post::findOne(1);  // 查找
$post->title = "新标题";
$post->save();             // 更新

DAO(Database Access Object):

更底层、手写 SQL 语句,适合复杂查询或性能优化。

1
2
3
$rows = Yii::$app->db->createCommand('SELECT * FROM post WHERE id = :id')
    ->bindValue(':id', 1)
    ->queryOne();

选择建议:

场景使用方式
快速开发,数据结构清晰ActiveRecord
性能敏感、大批量查询、跨表复杂联查DAO

5. Yii 如何定义路由?

默认情况下,Yii 的路由遵循格式:

1
/index.php?r=控制器ID/动作ID

例如:

1
/index.php?r=post/view&id=123

映射到:

1
PostController::actionView(123)

你也可以开启“美化 URL”模式:

1
2
3
4
5
6
7
8
9
10
// config/web.php
'components' => [
    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            'post/<id:\d+>' => 'post/view',
        ],
    ],
]

此时请求 /post/123 将路由到 PostController::actionView(123)


前端调用接口的例子

在前端 React/Vue 项目中可以这样调用:

1
2
3
fetch("/post/123")
  .then((res) => res.text())
  .then(console.log);

或者 JSON API:

1
2
3
fetch("/post/json")
  .then((res) => res.json())
  .then((data) => console.log(data));

通过 Yii,可以处理“请求 → 验证 → 数据 → 响应”的完整链条。

This post is licensed under CC BY 4.0 by the author.