Yii框架不仅仅是一个高效的MVC框架,还提供了许多功能,帮助开发者高效地构建Web应用程序。在这一章节中,我们将深入探讨一些核心概念和功能,包括路由与URL管理、控制器与视图、模型与数据库操作、以及表单与用户输入处理。
1. 路由与 URL 管理
路由是Yii框架中处理请求的机制。它将一个URL映射到一个控制器的动作。Yii框架允许你自定义路由规则,并使URL更加简洁、美观。
1.1 路由规则的配置
路由是指URL映射到控制器和动作的路径。在Yii中,默认的路由规则格式为 控制器/动作,例如 site/index 对应 SiteController 的 actionIndex 方法。
配置路由规则:
在 config/web.php 文件中的 urlManager 配置中,你可以自定义路由规则。例如:
'components' => [
'urlManager' => [
'enablePrettyUrl' => true, // 启用美化URL
'showScriptName' => false, // 隐藏index.php
'rules' => [
'post/<id:\d+>' => 'post/view', // 映射到 post/view 动作
],
],
],
在上面的例子中,当请求 URL 为 post/123 时,Yii 会将其映射到 PostController 的 actionView(123) 方法。
1.2 美化 URL 的实现
默认情况下,Yii 的 URL 包含 index.php,如 index.php?r=site/index。要实现美化的 URL,我们可以在 config/web.php 文件中配置 enablePrettyUrl,并通过 .htaccess 文件来去除 index.php:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
此时,URL 会变成类似 site/index,看起来更加简洁和友好。
1.3 RESTful 路由设置
Yii非常适合构建RESTful API。要设置RESTful路由,你可以在 urlManager 的规则中使用“格式化”方法。例如,设置一个资源路由:
'rules' => [
'GET posts' => 'post/index',
'GET post/<id:\d+>' => 'post/view',
'POST post' => 'post/create',
'PUT post/<id:\d+>' => 'post/update',
'DELETE post/<id:\d+>' => 'post/delete',
],
通过这些规则,Yii会自动将HTTP请求方法与相应的动作映射起来。
2. 控制器与视图
控制器和视图是Yii框架MVC模式的核心部分,负责处理请求、业务逻辑和展示数据。
2.1 控制器的生命周期
控制器是处理请求的核心。每个控制器都有自己的生命周期,包括初始化、执行动作、渲染视图等。控制器通常继承自 yii\web\Controller 类。
控制器的初始化:
Yii框架会自动调用 init() 方法,这对于设置控制器的初始化状态非常重要。你可以重写该方法来执行自定义逻辑。
class SiteController extends yii\web\Controller
{
public function init()
{
parent::init();
// 自定义初始化代码
}
}
2.2 动作的创建和使用
控制器中的每个公共方法都称为“动作”。每个动作都可以通过 URL 路由来访问。例如,actionIndex() 方法通常会显示首页内容。
class SiteController extends yii\web\Controller
{
public function actionIndex()
{
return $this->render('index');
}
}
2.3 数据传递与渲染视图
控制器通过 render() 方法将数据传递到视图。render() 方法会将数据传递给视图并返回渲染后的内容。你可以使用以下方式传递数据:
public function actionIndex()
{
return $this->render('index', [
'name' => 'Yii2 Framework',
]);
}
2.4 使用布局文件 (Layouts)
布局文件用于定义页面的公共部分,如头部、底部、导航栏等。在 views/layouts 目录下创建布局文件,并通过 $this->beginLayout() 和 $this->endLayout() 来启用布局。
例如,views/layouts/main.php 文件可以包含:
<html>
<body>
<header>Header content</header>
<div class="content">
<?= $content ?>
</div>
<footer>Footer content</footer>
</body>
</html>
3. 模型与数据库操作
模型(Model)是处理数据的核心,负责与数据库交互。Yii提供了强大的ActiveRecord(AR)和查询构造器(QueryBuilder)来简化数据库操作。
3.1 数据模型 (Model) 的定义
在Yii中,模型类通常继承自 yii\db\ActiveRecord,并与数据库表相对应。你可以在模型中定义验证规则、关系等。
class Post extends yii\db\ActiveRecord
{
public static function tableName()
{
return 'post';
}
public function rules()
{
return [
[['title', 'content'], 'required'],
['title', 'string', 'max' => 255],
];
}
}
3.2 数据库迁移工具
数据库迁移工具用于管理数据库结构的版本控制。你可以通过命令行创建迁移文件并应用它们:
yii migrate/create create_post_table
然后在生成的迁移文件中定义表结构:
public function safeUp()
{
$this->createTable('post', [
'id' => $this->primaryKey(),
'title' => $this->string(),
'content' => $this->text(),
]);
}
3.3 Active Record (AR) 的使用
Active Record 使得数据库的增删改查(CRUD)变得非常简单。以下是使用 AR 进行基本操作的示例:
- 查询所有记录:
$posts = Post::find()->all();
- 插入新记录:
$post = new Post();
$post->title = 'New Post';
$post->content = 'Post content';
$post->save();
- 更新记录:
$post = Post::findOne(1);
$post->title = 'Updated Title';
$post->save();
- 删除记录:
$post = Post::findOne(1);
$post->delete();
3.4 查询构造器(Query Builder)
Query Builder 允许你以更灵活的方式构造查询。例如:
$posts = Yii::$app->db->createCommand()
->select('*')
->from('post')
->where(['status' => 'active'])
->queryAll();
3.5 数据验证与表单输入
在 Yii 中,数据验证通常是在模型类中进行的。例如,验证表单输入:
public function rules()
{
return [
[['username', 'email'], 'required'],
['email', 'email'],
['username', 'string', 'max' => 255],
];
}
4. 表单与用户输入
表单是处理用户输入的常用方式。Yii 提供了多种表单验证规则,确保数据的安全性和正确性。
4.1 创建表单与处理用户输入
你可以通过创建模型来处理表单输入:
$model = new Post();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$model->save();
} else {
return $this->render('create', ['model' => $model]);
}
4.2 表单验证规则
Yii提供了丰富的验证规则,可以根据需求进行设置:
required:验证字段是否为空。email:验证电子邮件格式。string:验证字符串长度。integer:验证是否为整数。
4.3 使用 Yii 提供的 HTML 辅助类
Yii 提供了 yii\helpers\Html 类来帮助生成安全的HTML元素:
<?= Html::encode($post->title) ?>
4.4 防止跨站脚本攻击 (XSS) 和 SQL 注入
Yii 默认使用 Html::encode() 和 Yii::t() 来防止 XSS 攻击。而在数据库操作中,ActiveRecord 和 QueryBuilder 自动使用参数化查询,防止 SQL 注入。
// 防止XSS
<?= Html
::encode($content) ?>
// 防止SQL注入
$posts = Post::find()->where(['status' => 'active'])->all();
通过这些核心概念和功能,你将能够使用 Yii 框架快速构建现代的 Web 应用。