Yii2系列教程七:Behaviors And Validations

这一篇文章的开头就无需多言了,紧接着上一篇的内容和计划,这一篇我们来说说Yii2的Behavior和Validations。

Behavior

首先我们来说说Behavior,在Yii2中Behavior主要是可以用于一些常用的Model字段当中,对其进行自动化操作,比如自动添加一些时间戳字段等,这样我们就不用在每一个需要保存记录的地方分别写生成时间戳的代码了,比如前面我们在Yii2系列教程五:简单的用户权限管理中的controllers/StatusController.phpactionCreate方法实现的

    $model->created_by = Yii::$app->user->getId();//add this line
    $model->created_at = time();
    $model->updated_at = time();

这些其实我们都是可以直接放在Status这个Model的behaviors()方法当中自动完成的。

OK,那既然这样,我们就来实现一下呗。

首先我们需要来喂我们的status表增加一个updated_by字段,用来记录是哪个用户对一条状态进行了更新:

./yii migrate/create extend_status_table_for_updated_by

执行完上面的命令之后,来到相对应的migration文件中,为其up()down()方法增加下面的代码:


public function up()
{
    $this->addColumn(‘{{%status}}‘,‘updated_by‘,Schema::TYPE_INTEGER.‘ NOT NULL‘);
    $this->addForeignKey(‘fk_status_updated_by‘, ‘{{%status}}‘, ‘updated_by‘, ‘{{%user}}‘, ‘id‘, ‘CASCADE‘, ‘CASCADE‘);
}

public function down()
{
    $this->dropForeignKey(‘fk_status_updated_by‘,‘{{%status}}‘);
    $this->dropColumn(‘{{%status}}‘,‘updated_by‘);
}

这个时候先不急着运行./yii migrate/up,因为这时候你运行./yii migrate/up其实是会报错的,因为对于已创建的status来说,它updated_by字段会默认为0,但是这个值在user这张表中并不存在。所以我们首先需要将status表中的几条数据删掉。鉴于这只是一个演示的小应用,为了保险起见,我将stutas这张表删除了,并且将migration这张表的于下面类似的两条记录删掉,以达到Yii2的migration重新创建stutas表的目的:

m150804_035107_create_status_table
m150806_034325_extend_status_table_for_created_by

然后再执行./yii migrate/up

./yii migrate/up

Yii Migration Tool (based on Yii v2.0.6)

Total 3 new migrations to be applied:
    m150804_035107_create_status_table
    m150806_034325_extend_status_table_for_created_by
    m150812_142736_extend_status_table_for_updated_by

Apply the above migrations? (yes|no) [no]:yes
*** applying m150804_035107_create_status_table
    > create table {{%status}} ... done (time: 0.025s)
*** applied m150804_035107_create_status_table (time: 0.033s)

*** applying m150806_034325_extend_status_table_for_created_by
    > add column created_by integer NOT NULL to table {{%status}} ... done (time: 0.036s)
    > add foreign key fk_status_created_by: {{%status}} (created_by) references {{%user}} (id) ... done (time: 0.014s)
*** applied m150806_034325_extend_status_table_for_created_by (time: 0.053s)

*** applying m150812_142736_extend_status_table_for_updated_by
    > add column updated_by integer NOT NULL to table {{%status}} ... done (time: 0.017s)
    > add foreign key fk_status_updated_by: {{%status}} (updated_by) references {{%user}} (id) ... done (time: 0.017s)
*** applied m150812_142736_extend_status_table_for_updated_by (time: 0.037s)

数据表创建完成之后,我们需要在Status这个Model文件中增加我们的behaviors方法:

public function behaviors()
    {
        return [
            [
                ‘class‘ => BlameableBehavior::className(),
                ‘createdByAttribute‘ => ‘created_by‘,
                ‘updatedByAttribute‘ => ‘updated_by‘,
            ],
            ‘timestamp‘ => [
                ‘class‘ => ‘yii\behaviors\TimestampBehavior‘,
                ‘attributes‘ => [
                    ActiveRecord::EVENT_BEFORE_INSERT => [‘created_at‘, ‘updated_at‘],
                    ActiveRecord::EVENT_BEFORE_UPDATE => [‘updated_at‘],
                ],
            ],
        ];
    }

return的数组当中,第一个就是使用Yii2的BlameableBehavior自动完成created_byupdated_by这两个字段,至于timestamp这个数组,就是使用Yii2的TimestampBehavior来自动完成created_at和updated_at字段,并且这会根据数据的BEFORE_INSERTBEFORE_UPDATE两种情况来自动完成添加。

需要注意的是,我们这时候需要在Status中引入下面两个类:

use yii\behaviors\BlameableBehavior;
use yii\db\ActiveRecord;

这些工作都完成之后,我们就可以将我们原来在controllers/StatusController.phpactionCreate方法的相关那几行注释掉了:

public function actionCreate()
    {
        $model = new Status();

        if ($model->load(Yii::$app->request->post())) {

           /* $model->created_by = Yii::$app->user->getId();
            $model->created_at = time();
            $model->updated_at = time();*/

            if ($model->save()) {
                return $this->redirect([‘view‘, ‘id‘ => $model->id]);
            }
        }
        return $this->render(‘create‘, [
            ‘model‘ => $model,
        ]);
    }

注释掉之后,我们可以访问http://localhost:8999/status/create 来创建一条新的status来看看:

点击创建按钮,你依然可以看到下面这个可爱的页面:

到这里,我们的Behavior在Yii2中就已经实现完毕了。下面来看看Validations

Validations

Yii2的Validation提供多种多样的验证机制,比如常见的email,图片,数字等,更多的验证机制和条件,你可以到这里查看文档:

http://www.yiiframework.com/doc-2.0/yii-validators-validator.html

这里我想说明的一点是,在Yii2之中,Validation通常都是通过validate()来实现的,那么这个`validate()`` 方法的背后其实是怎么样的呢?可以看看下面这个顺序:

1. 首先检测Model当中有没有`scenarios()`方法,如果该方法存在,则首先执行该方法里面对应的场景之下的验证规则

2. 再检测Model当中的`rules()`方法,然后执行验证规则

为了演示方便,我们来创建一个新的Migrations:

./yii migrate/create create_sample_table

然后还是想之前一样,来到相对应的migration文件当中,实现up()down()方法:

public function up()
    {
        $tableOptions = null;
        if ($this->db->driverName === ‘mysql‘) {
            $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB‘;
        }

        $this->createTable(‘{{%sample}}‘, [
            ‘id‘ => Schema::TYPE_PK,
            ‘thought‘ => Schema::TYPE_STRING.‘ NOT NULL DEFAULT ""‘,
            ‘goodness‘ => Schema::TYPE_SMALLINT . ‘ NOT NULL DEFAULT 0‘,
            ‘rank‘ => Schema::TYPE_INTEGER . ‘ NOT NULL‘,
            ‘censorship‘ => Schema::TYPE_STRING . ‘ NOT NULL‘,
            ‘occurred‘ => Schema::TYPE_DATE . ‘ NOT NULL‘,
        ], $tableOptions);
    }

    public function down()
    {
        $this->dropTable(‘{{%sample}}‘);
    }

然后执行之:

./yii migrate/up

Yii Migration Tool (based on Yii v2.0.6)

Total 1 new migration to be applied:
    m150812_153139_create_sample_table

Apply the above migration? (yes|no) [no]:yes
*** applying m150812_153139_create_sample_table
    > create table {{%sample}} ... done (time: 0.026s)
*** applied m150812_153139_create_sample_table (time: 0.037s)

使用Gii生成Model文件:

再生成CRUD文件:

然后打开Sample.php,你就可以看到Yii2为我们生成的rules()了:

 public function rules()
    {
        return [
            [[‘goodness‘, ‘rank‘], ‘integer‘],
            [[‘rank‘, ‘censorship‘, ‘occurred‘], ‘required‘],
            [[‘occurred‘], ‘safe‘],
            [[‘thought‘, ‘censorship‘], ‘string‘, ‘max‘ => 255]
        ];
    }

Default Value验证

我门修改一下rules()方法里面的occurred字段的验证,给它设置一个默认值:

return [
            [[‘goodness‘, ‘rank‘], ‘integer‘],
            [[‘rank‘, ‘censorship‘], ‘required‘],
            // Gii generate this
            //[[‘occurred‘], ‘safe‘],
            [‘occurred‘, ‘default‘, ‘value‘ => date(‘Y-m-d‘)],
            [[‘thought‘, ‘censorship‘], ‘string‘, ‘max‘ => 255]
        ];

然后当我们创建一个新的Sample的时候,如果我们将occurred字段保留为空,那么这个字段就会默认取值为当天的日期。

Rank填入2,然后创建后是这样的:

至于另外的验证规则,你可以自己试着更改一下rules()方法里面的规则,然后进行相应的验证。

时间: 2024-10-19 06:30:18

Yii2系列教程七:Behaviors And Validations的相关文章

ASP.NET 5系列教程(七)完结篇-解读代码

在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]")] 所有符合该模板类型的HTTP 请求都会被路由到该controller.在本例中, 路由的命名规范为对应Controller 的前缀,对于TodoController 类,路由模板为 “api/todo”. HTTP 方法 [HttpGet].[HttpPost]和[HttpDelete] 属性定义为 co

webpack4 系列教程(七): SCSS提取和懒加载

教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)webpack4 系列教程(七): SCSS 提取和懒加载. 个人技术小站: https://godbmw.com 有空就来看看, 我一直都在 本节课讲解在webpack v4中的 SCSS 提取和懒加载.值得一提的是,v4和v3在 Scss 的懒加载上的处理方法有着巨大差别. >>> 本节课源码 >>> 所有课程源码 1. 准备工作 关于 SCSS 处理的基础,请参考w

Influx Sql系列教程七:delete 删除数据

前面介绍了使用insert实现新增和修改记录的使用姿势,接下来我们看一下另外一个简单的使用方式,如何删除数据 1. delete 语句 delete的官方语法如下 DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>] delete语句和我们常见sql语法有点像,但是注意一下上面的where中的条件,只允许根据tag和时间来进行删除操作 下面给出几个

Yii2系列教程五:简单的用户权限管理

上一篇文章讲了用户的注册,验证和登录,这一篇文章按照约定来说说Yii2之中的用户和权限控制. 你可以直接到Github下载源码,以便可以跟上进度,你也可以重头开始,一步一步按照这个教程来做. 鉴于本教材基于Yii2 Basic,所以对RBAC的详细讲解我后面再单独出文章来说说吧,这里主要是简单地说一说权限控制 上一篇文章所实现的功能还比较简单,可以发一条状态,但是不知道你注意到没有,如果是没有注册的用户也可以使用我们的应用(类似小微博)来发状态,这是不符合情理的.正确的做法是在用户没有注册,登录

Yii2系列教程四:实现用户注册,验证,登录

上一篇写了一点点Yii2的数据库相关知识和强大的Gii,这一篇就如上一篇的最后所说的一样:在Yii2中实现用户的注册和登录. 你可以直接到Github下载源码,以便可以跟上进度,你也可以重头开始,一步一步按照这个教程来做.本期的用户注册和登录,我会使用一个很棒的composer package :dektrium/yii2-user,下面就开始我们的故事吧. 用户的注册和登录 在现在的Web应用中,几乎每一个应用都会需要用户注册,不管是使用的第三方还是自建的注册登录系统,我们都需要通过某些表单来

Yii2系列教程三:Database And Gii

上一篇文章我们理了一下Yii2的MVC,Forms和Layouts,这篇文章就直接按照约定来说说Yii2与数据库相关的一些事情,如果你觉得不够的话,不急,更具体的用法我会在后续的教程给出,并且这里也会介绍Yii2的代码生成工具:强大的Gii. 你可以直接到Github下载项目源码:https://github.com/JellyBool/helloYii,这样你就可以直接跟上我的进度了,每一次我写完一个教程,我都会将代码push到Github,所以,你想偷懒的话,这是一个不错的方法. 接着上一篇

Yii2系列教程:安装及Hello World

http://www.yiiframework.com/ 安装Yii2 打算从头开始,所以,连安装Yii2也稍微写一点吧.安装Yii2最好的方式就是使用composer: composer global require "fxp/composer-asset-plugin:~1.0.3" composer create-project --prefer-dist yiisoft/yii2-app-basic helloYii 等待一小段时间之后(如果等太久或直接报错,请使用VPN),在

Yii2系列教程二:MVC,Forms和Layouts

上一篇文章我们简单地实现了Yii2框架安装和Hello World,而在这一篇文章当中,我们会带着好奇之心去探索一下在Yii2中的几个重要的元素组成:MVC,Forms和Layouts. 本文的目标是创建一个小小的表单应用,就是实现一个简单的类似发微博的功能,但是我还不想牵扯到数据库那一块,因为其实数据库和表在Yii2框架之中其实还是有很多东西可以讲的,打算在下一篇的文章中会详细讲到. MVC 模型(Model)对于我个人的简单理解就是一个概念集合,在这个集合里面包含该概念集合的多种数据,比如一

Yii2系列教程六:集成编辑器

上一篇文章我们实现了简单的用户权限管理,至于更先进的RBAC,我后面会单独出一篇文章来说说.在这一篇文章当中,我主要想写的是在Yii2中集成一个编辑器,因为在我们的实际开发当中,一个简单的textarea一般都是不能满足我们的需求的,因为我们需要多种多样的文本样式如标题,表格啦,并且很多时候我们在这些文本当中还需要插入图片和视频.而这些问题目前的最好解决方案就是集成一个编辑器,鉴于大家(这里不是指程序员)都是喜欢所见即所得,所以,这里我主要是演示怎么集成所见即所得的富文本编辑器. Redacto