Yii 开发实践
Yii 开发实践
最近接触了 Yii 2 —— 一个基于 PHP、遵循 MVC 架构、性能良好、安全友好的全栈框架。
聊聊几个点:MVC 模式、Action 的定义与返回、数据验证、数据库访问方式、以及路由机制。
1. Yii 中的 MVC 模式
MVC 即 Model-View-Controller(模型-视图-控制器):
层 | 在 Yii 中体现 | 职责说明 |
---|---|---|
Model | models/ 下的类(如 Post ) | 处理数据结构、数据库交互、验证规则 |
View | views/ 下的 PHP 文件 | 渲染页面(或返回 JSON 等格式) |
Controller | controllers/ 下的类(如 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') | 渲染模板 |
JSON | response->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.