简介
快速入门指南会对 Yii2 框架做一个基本介绍,包括数据库迁移、gii操作、AR模型、路由、验证、视图等等。如果你是个Yii2新手甚至之前对PHP框架也很陌生,那么这里将会成为你很好的起点。如果你在工作中已经会熟练使用可yii2,可以跳过入门指南,直接进去我们的项目实战。
本篇文章我们将会构建一个简单的博客管理系统,以便帮助大家更好的上手yii2
安装
我们前面写过关于Yii2完整版的安装教程,你可以点击进行参考,下面我们只写步骤,不再做必要的讲解。
composer global require “fxp/composer-asset-plugin:^1.3.1”
composer create-project yiisoft/yii2-app-advanced advanced 2.0.12
cd advanced
php init
#之后构建本地环境,我们配置advanced.dev指向frontend/web目录
准备好数据库
在开发和维护一个数据库驱动的应用程序时,数据库的结构会随代码的改变而改变。例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变,Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。
在本例中,我们使用 yii migrate 命令生成博客 blog 对应的数据表迁移:1
yii migrate/create create_blog_table
该命令生成的迁移文件位于 advanced\console\migrations 目录,可能你已经注意到了,yii migrate 命令已经在迁移文件中为我们添加了主键ID和表名,接下来我们要编辑该文件修改表名以及添加更多的列到数据表blog:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<?php
use yii\db\Migration;
/**
* Handles the creation for table `blog_table`.
*/
class m160525_153315_create_blog_table extends Migration
{
/**
* @inheritdoc
*/
public function up()
{
$this->createTable('blog', [
'id' => $this->primaryKey(),
'title' => $this->string(100)->notNull()->defaultValue(''),
'content' => $this->text(),
'create_time' => $this->datetime(),
]);
}
/**
* @inheritdoc
*/
public function down()
{
$this->dropTable('blog');
}
}
运行迁移之前,我们先把数据库配置一番,打开 common\config\main-local.php 文件,我们看到 components 下面的db配置,参考如下配置就好1
2
3
4
5
6
7
8
9
10
11
12
13'components' => [
'db' => [
'class' => 'yii\db\Connection',
// 修改host 和dbname 之前需要手动创建了dbname才可以
'dsn' => 'mysql:host=localhost;dbname=advanced',
//登录数据库的账号
'username' => 'root',
//登录数据库的密码
'password' => '',
'charset' => 'utf8',
],
// other code
],
数据库配置好了之后,运行执行如下命令运行 migrate1
./yii migrate
期间会让我们确认,yes后回车即可,该命令会为我们创建迁移文件(console\migrations目录)中定义的所有数据表,执行完该命令打开数据库你会发现,我们的blog表已经创建成功了,其中包含了我们在migration中定义的列。
使用gii生成AR模型和CRUD
gii是yii2中的一个强大的组件,是一种高度可定制和可扩展的代码生成工具。使用它可以大幅提高我们的开发效率,后面我会也会讲解如何用gii定制我们需要的模版以及程序代码。如果你在安装的过程中,像我们一样选择的是开发环境,gii默认是开启的。也就是说我们无需再进行配置便可以使用,你也可以打开文件 advanced\frontend\config\main-local.php查看配置代码。1
2
3
4
5
6
7if (!YII_ENV_TEST) {
// other code
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
接着通过地址 http://advanced.dev/index.php?r=gii 访问gii模块(我们已经偷偷的利用虚拟主机配置好了advanced.dev指向frontend/web目录),借助其特性帮助我们生成此次操作所必需的一系列代码。
生成AR模型类
模型是MVC设计模式中的一部分,使用模型不仅能让我们存取数据变得相对简单和方便,更多地协助我们处理复杂的业务和逻辑。关于更多的有关模型的描述,可以参考相关手册或文档,有任何问题你也可以下方留言。
下面我们主要介绍下gii的基本操作。
点击页面上的Model Generator start,像下面这样生成AR模型类。
生成CRUD代码
CRUD是什么?CRUD就是这四个字母分别是Create Read Update Delete,也就是创建、读取、更新和删除的意思,我们简称CRUD。如果你刚刚用gii生成了Model,接着点击左侧菜单CRUD Generator像下面这样生成crud再好不过啦
关于更多gii的操作你可以参考yii2 gii的详细操作步骤。
目前为止,可以说大部分操作都已经完成了。什么,你不信,来,继续往下看。
有好提示:实际开发中,后台管理理应利用gii协助开发,可快速提高开发效率。
按照以上操作,我们会在如下相关目录生成9个文件1
2
3
4
5
6
7
8
9common\models\Blog.php
common\models\BlogSearch.php
frontend\controllers\BlogController.php
frontend\views\blog\_form.php
frontend\views\blog\_search.php
frontend\views\blog\create.php
frontend\views\blog\index.php
frontend\views\blog\update.php
frontend\views\blog\view.php
接着可以通过路由访问http://advanced.dev/index.php?r=blog看到blog具体页面信息。
添加博客
添加前准备
以上通过gii我们便已经完成了博客管理的增删改查。可以看到yii2开发速度之快,简直就是闪电嘛,我们还没做任何事这就完了?很多没反应过来的现在肯定云里雾里的。知道这叫什么吗?太快没感觉!懂了吧,所以平时要注意哦。既然如此,我们也来详细的走一边具体的操作吧
实际开发中,最常见的便是共用一套配置,方法了,比如我们在common\config\main-local.php文件中对数据库配置好,当前项目下所有的应用都可以同数据库交互了。
来看看我们多应用又是如何共用模型类的。
首先我们在common\models下定类模型blog,为了各个应用操作方便,我们仍然会为单个应用(比如我们这里的frontend应用)创建一个继承该基类的模型类,如frontend\models\BlogForm,backend\models\BlogForm,(frontend和backend实属我们两个不同的应用) 如此一来,我们操作前台的BlogForm完全不会影响到后台的模型类,与此同时前后台还可以通过基类common\models\Blog共用的一些方法,岂不妙哉?
为了满足这一想法,还请各位按照下面的步骤进行操作
我们拷贝common\models\Blog.php到frontend\models\BlogForm.php后,打开BlogForm.php文件稍作修改:
命名空间修改为 namespace frontend\models; 因为文件目录变了,自然需要修改
增加需要继承的父类 use common\models\Blog;
类名修改为BlogForm
继承类修改为Blog
打开frontend\controllers\BlogController.php文件,查看actionCreate方法。我们看到$model是common\models\Blog类的一个实例。按照上面所描述的,这并不是我们想要的。为了完善我们添加博客的功能:
在控制器文件BlogController.php文件顶部,namespace下面添加 use frontend\models\BlogForm;
修改actionCreate方法$model实例化的类为BlogForm, 即 $model = new BlogForm();
渲染添加模版
接着我们点击列表页(http://advanced.dev/index.php?r=blog)左上角的Create Blog按钮,正常情况下我们会看到如下图添加博客的页面。
一般情况下,我们想要的是字段title、content显示中文的,而不是英文的。
通过BlogController的create方法我们可以看到,模版文件是通过1
return $this->render('create', ['model' => $model]);
进行渲染的。我们找到跟controllers目录同级别的目录views,这里存放的基本上都是视图文件,找到并打开blog\create.php文件会发现该模版又通过1
2
3<?= $this->render('_form', [
'model' => $model,
]) ?>
引用了一个子视图文件_form,该文件位于create.php同级下,打开该文件后会发现一开始显示的表单原来在这里。
需要说明的是,控制器中渲染视图模版是通过controller的render方法,该方法包括加载布局文件,另一方法renderPartial指仅加载当前文件,不加载布局文件。通俗的说就是render方法加载了views/layouts/main.php文件,该文件包含头尾一般模版需要的头尾部分,也就是起到我们常说的头尾分离的作用。renderPartial不加载布局。模版文件中的render方法非控制器的模版方法,其是视图类\yii\web\View类的方法,这一点先做了解。
为了实现我们想要把字段显示为中文的标题内容,你需要回到我们的BlogForm文件修改attributeLabels方法对应的每一个字段为你想要的label。实际上我们的表单读取的字段对应的label就是这里写的label。而我们这里的label跟我们一开始用gii生成model时是否勾选Generate Labels from DB Comments一项有关。我们修改attributeLabels方法如下:1
2
3
4
5
6
7
8
9public function attributeLabels()
{
return [
'id' => 'ID',
'title' => '标题',
'content' => '内容',
'create_time' => '创建时间',
];
}
此时我们刷新下创建博客的页面可以很清楚的看到,表单字段对应的均显示中文。
如果此刻你手快,什么内容也没填写就提交了表单,你会发现这样是可以提交成功的,很明显我们不想这样。
验证
_form.php文件中,表单的创建借助的是组件 ActiveForm ,表单提交默认的action是当前操作方法。yii2中利用该组件不仅可以快速方便的构建表单,而且还结合model+jquery实现了表单的各种验证,这简直是太方便了!
如此一来,要对用户提交的数据进行验证,需要声明与需验证模型特性相关的验证规则。接下来我们修改BlogForm的rules方法,展示如何对标题设置为必填项,而且长度不能超过100个字符。1
2
3
4
5
6
7
8
9public function rules()
{
return [
[['content'], 'string'],
[['create_time'], 'safe'],
[['title'], 'string', 'max' => 100],
['title', 'required', 'message' => '请填写标题'],
];
}
为了让我们的规则起作用,你还需要调用yii\base\Model::validate()方法。该方法会返回一个布尔值,指明是否通过验证。若没有通过,你能通过 yii\base\Model::errors 属性获取相应的报错信息。为了说的更通俗,我们稍微对actionCreate进行修改, 比如像下面这样:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public function actionCreate()
{
$model = new BlogForm();
// post提交 且 验证有效,执行if里面的代码
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
// 单纯的调用save方法,该方法也会调用validate方法对表单数据进行校验和过滤,
// 因为上面已经调用了validate方法,指定save(false)可避免重复调用validate
if ($model->save(false)) {
return $this->redirect(['index']);
}
}
// 验证失败,可以通过yii\base\Model::errors 属性获取相应的验证失败信息
// 这一步在实际开发中经常用于调试
print_r($model->errors);
return $this->render('create', [
'model' => $model,
]);
}
添加博客
一切都按照我们准备的来,接下来提交表单创建博客即可。
显示已添加的博客
打开博客列表页面,http://advanced.dev/index.php?r=blog, 有些小伙伴不禁会问,刚才我们的字段明明都对应到具体的label了,为什么列表页显示的还是英文呢?
我们看代码列表页数据怎么来的。
原来是通过frontend\models\BlogSearch(该类可以参考上文增加BlogForm步骤自行完善)的search方法提供的。该方法继承的是common\models\Blog而非frontend\models\BlogForm 这就难怪了,毕竟我们刚刚修改的是后者嘛。考虑到后面我们扩展两个应用-前台和后台,但是都会存在blog列表页面,于是乎我们可以修改BlogSearch继承frontend\models\BlogForm类
打开frontend\models\BlogSearch.php文件
增加 use frontend\models\BlogForm;
继承类修改为 BlogForm
search方法中Blog::find()修改为BlogForm::find()
成功后再刷新博客列表页看看。
博客的删除
关于博客数据的删除,可以手动点击右侧按钮直接进行删除即可。该动作会执行 BlogController的actionDelete操作,调用model的delete方法进行数据的删除,该删除属于数据直接从数据库中永久性删除,而非状态性假删除。
总结
在整个博客管理系统的开发过程中,我们发现还是比较轻松的,究其原因,一来是yii2的强大,封装的很好,直接调用即可,二来估计是会感受gii的强大,如果我们可以利用gii扩展我们自己的模版,那这开发效率估计又会是一个很大档次的提升!