yii2入门指南-简单博客管理系统
更新于 2017年07月14日 by 白狼 被浏览了 10626 次

1、简介

快速入门指南会对 Yii2 框架做一个基本介绍,包括数据库迁移、gii操作、AR模型、路由、验证、视图等等。如果你是个Yii2新手甚至之前对PHP框架也很陌生,那么这里将会成为你很好的起点。如果你在工作中已经会熟练使用可yii2,可以跳过入门指南,直接进去我们的项目实战

本篇文章我们将会构建一个简单的博客管理系统,以便帮助大家更好的上手yii2

2、安装

我们前面写过关于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目录

3、准备好数据库

在开发和维护一个数据库驱动的应用程序时,数据库的结构会随代码的改变而改变。例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变,Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。

在本例中,我们使用 yii migrate 命令生成博客 blog 对应的数据表迁移:

yii migrate/create create_blog_table

该命令生成的迁移文件位于 advanced\console\migrations 目录,可能你已经注意到了,yii migrate 命令已经在迁移文件中为我们添加了主键ID和表名,接下来我们要编辑该文件修改表名以及添加更多的列到数据表blog:

<?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配置,参考如下配置就好

'components' => [
    'db' => [
        'class' => 'yii\db\Connection',
        // 修改host 和dbname 之前需要手动创建了dbname才可以
        'dsn' => 'mysql:host=localhost;dbname=advanced',
        //登录数据库的账号
        'username' => 'root',
        //登录数据库的密码
        'password' => '',
        'charset' => 'utf8',
    ],
    // other code
],

数据库配置好了之后,运行执行如下命令运行 migrate

./yii migrate

期间会让我们确认,yes后回车即可,该命令会为我们创建迁移文件(console\migrations目录)中定义的所有数据表,执行完该命令打开数据库你会发现,我们的blog表已经创建成功了,其中包含了我们在migration中定义的列。

4、使用gii生成AR模型和CRUD

gii是yii2中的一个强大的组件,是一种高度可定制和可扩展的代码生成工具。使用它可以大幅提高我们的开发效率,后面我会也会讲解如何用gii定制我们需要的模版以及程序代码。如果你在安装的过程中,像我们一样选择的是开发环境,gii默认是开启的。也就是说我们无需再进行配置便可以使用,你也可以打开文件 advanced\frontend\config\main-local.php查看配置代码。

if (!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目录),借助其特性帮助我们生成此次操作所必需的一系列代码。

4.1生成AR模型类

模型是MVC设计模式中的一部分,使用模型不仅能让我们存取数据变得相对简单和方便,更多地协助我们处理复杂的业务和逻辑。关于更多的有关模型的描述,可以参考相关手册或文档,有任何问题你也可以下方留言。

下面我们主要介绍下gii的基本操作。

点击页面上的Model Generator start,像下面这样生成AR模型类。

4086a6b0ad-yii2giigenerate1.png

4.2生成CRUD代码

CRUD是什么?CRUD就是这四个字母分别是Create Read Update Delete,也就是创建、读取、更新和删除的意思,我们简称CRUD。如果你刚刚用gii生成了Model,接着点击左侧菜单CRUD Generator像下面这样生成crud再好不过啦

c02082683e-yii2giigenerate2.png

关于更多gii的操作你可以参考yii2 gii的详细操作步骤

目前为止,可以说大部分操作都已经完成了。什么,你不信,来,继续往下看。

有好提示:实际开发中,后台管理理应利用gii协助开发,可快速提高开发效率。

按照以上操作,我们会在如下相关目录生成9个文件

common\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具体页面信息。

5、添加博客

5.1添加前准备

以上通过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文件稍作修改:

  1. 命名空间修改为 namespace frontend\models; 因为文件目录变了,自然需要修改
  2. 增加需要继承的父类 use common\models\Blog;
  3. 类名修改为BlogForm
  4. 继承类修改为Blog

打开frontend\controllers\BlogController.php文件,查看actionCreate方法。我们看到$model是common\models\Blog类的一个实例。按照上面所描述的,这并不是我们想要的。为了完善我们添加博客的功能:

  1. 在控制器文件BlogController.php文件顶部,namespace下面添加 use frontend\models\BlogForm;
  2. 修改actionCreate方法$model实例化的类为BlogForm, 即 $model = new BlogForm();

5.2 渲染添加模版

接着我们点击列表页(http://advanced.dev/index.php?r=blog)左上角的Create Blog按钮,正常情况下我们会看到如下图添加博客的页面。

e844e6e7ba-yii2blog1.png

一般情况下,我们想要的是字段title、content显示中文的,而不是英文的。

通过BlogController的create方法我们可以看到,模版文件是通过

return $this->render('create', ['model' => $model]);

进行渲染的。我们找到跟controllers目录同级别的目录views,这里存放的基本上都是视图文件,找到并打开blog\create.php文件会发现该模版又通过

<?= $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方法如下:

public function attributeLabels()
{
    return [
        'id' => 'ID',
        'title' => '标题',
        'content' => '内容',
        'create_time' => '创建时间',
    ];
}

此时我们刷新下创建博客的页面可以很清楚的看到,表单字段对应的均显示中文。

如果此刻你手快,什么内容也没填写就提交了表单,你会发现这样是可以提交成功的,很明显我们不想这样。

5.3 验证

_form.php文件中,表单的创建借助的是组件 ActiveForm ,表单提交默认的action是当前操作方法。yii2中利用该组件不仅可以快速方便的构建表单,而且还结合model+jquery实现了表单的各种验证,这简直是太方便了!

如此一来,要对用户提交的数据进行验证,需要声明与需验证模型特性相关的验证规则。接下来我们修改BlogForm的rules方法,展示如何对标题设置为必填项,而且长度不能超过100个字符。

public function rules()
{
    return [
        [['content'], 'string'],
        [['create_time'], 'safe'],
        [['title'], 'string', 'max' => 100],
        ['title', 'required', 'message' => '请填写标题'],
    ];
}

为了让我们的规则起作用,你还需要调用yii\base\Model::validate()方法。该方法会返回一个布尔值,指明是否通过验证。若没有通过,你能通过 yii\base\Model::errors 属性获取相应的报错信息。为了说的更通俗,我们稍微对actionCreate进行修改, 比如像下面这样:

public 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,
    ]);
}


5.4 添加博客

一切都按照我们准备的来,接下来提交表单创建博客即可。

5.5显示已添加的博客

打开博客列表页面,http://advanced.dev/index.php?r=blog, 有些小伙伴不禁会问,刚才我们的字段明明都对应到具体的label了,为什么列表页显示的还是英文呢?

我们看代码列表页数据怎么来的。

原来是通过frontend\models\BlogSearch(该类可以参考上文增加BlogForm步骤自行完善)的search方法提供的。该方法继承的是common\models\Blog而非frontend\models\BlogForm 这就难怪了,毕竟我们刚刚修改的是后者嘛。考虑到后面我们扩展两个应用-前台和后台,但是都会存在blog列表页面,于是乎我们可以修改BlogSearch继承frontend\models\BlogForm类

  1. 打开frontend\models\BlogSearch.php文件
  2. 增加 use frontend\models\BlogForm;
  3. 继承类修改为 BlogForm
  4. search方法中Blog::find()修改为BlogForm::find()

成功后再刷新博客列表页看看。

5.6 博客的删除

关于博客数据的删除,可以手动点击右侧按钮直接进行删除即可。该动作会执行 BlogController的actionDelete操作,调用model的delete方法进行数据的删除,该删除属于数据直接从数据库中永久性删除,而非状态性假删除。

6.总结

在整个博客管理系统的开发过程中,我们发现还是比较轻松的,究其原因,一来是yii2的强大,封装的很好,直接调用即可,二来估计是会感受gii的强大,如果我们可以利用gii扩展我们自己的模版,那这开发效率估计又会是一个很大档次的提升!

如果你有任何想要吐槽或者拍砖,欢迎留言!