自动设置一个作者

Blameable behavior允许你自动更新一个或多个作者的字段。它主要用于生成created_byupdate_by字段的数据。和时间戳行为类似,你可以很容易为这个行为指定一些特殊的参数和必要的事件。

回顾上节中的例子。在我们的博客应用中也有帖子。例如,假设我们的博客模型叫做BlogPost。模型有author_id字段,它标明创建这个帖子的人,以及updater_id,它标明更新这个帖子的人。我们希望在创建或者更新模型事件时自动填写这些字段。现在你将学习如何做到这个。

准备

  1. 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
  2. 设置数据库连接并创建一个名叫blog_post的表:
  1. DROP TABLE IF EXISTS 'blog_post';
  2. CREATE TABLE IF NOT EXISTS 'blog_post' (
  3. 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  4. 'author_id' INT(10) UNSIGNED DEFAULT NULL,
  5. 'updater_id' INT(10) UNSIGNED DEFAULT NULL,
  6. 'title' VARCHAR(255) NOT NULL,
  7. 'text' TEXT NOT NULL,
  8. PRIMARY KEY ('id')
  9. );
  1. 使用Gii为blog_post表生成BlogPost模型。

如何做…

  1. 添加如下behaviors方法到models/BlogPost.php
  1. <?php
  2. namespace app\models;
  3. use Yii;
  4. use yii\db\BaseActiveRecord;
  5. /**
  6. * This is the model class for table "blog_post".
  7. *
  8. * @property integer $id
  9. * @property integer $author_id
  10. * @property integer $updater_id
  11. * @property string $title
  12. * @property string $text
  13. */
  14. class BlogPost extends \yii\db\ActiveRecord
  15. {
  16. /**
  17. * @return array
  18. */
  19. public function behaviors()
  20. {
  21. return [
  22. [
  23. 'class' => 'yii\behaviors\BlameableBehavior',
  24. 'attributes' => [
  25. BaseActiveRecord::EVENT_BEFORE_INSERT =>
  26. 'author_id',
  27. BaseActiveRecord::EVENT_BEFORE_UPDATE =>
  28. 'updater_id'
  29. ]
  30. ]
  31. ];
  32. }
  33. }
  1. 创建controllers/TestController.php
  1. <?php
  2. namespace app\controllers;
  3. use app\models\BlogPost;
  4. use app\models\User;
  5. use Yii;
  6. use yii\helpers\Html;
  7. use yii\helpers\VarDumper;
  8. use yii\web\Controller;
  9. /**
  10. * Class TestController.
  11. * @package app\controllers
  12. */
  13. class TestController extends Controller
  14. {
  15. public function actionIndex()
  16. {
  17. $users = new User();
  18. $identity = $users->findIdentity(100);
  19. Yii::$app->user->setIdentity($identity);
  20. $blogPost = new BlogPost();
  21. $blogPost->title = 'Very pretty title';
  22. $blogPost->text = 'Success is not final, failure is not fatal...';
  23. $blogPost->save();
  24. return $this->renderContent(Html::tag('pre',
  25. VarDumper::dumpAsString(
  26. $blogPost->attributes
  27. )));
  28. }
  29. }
  1. 运行test/index,你将会得到如下结果: 自动设置一个作者 - 图1

工作原理…

默认情况下,Blameable行为填充created_byupdated_by字段,但是我们根据需求改变。

我们也指定了模型事件和字段,所以在模型创建时,author_id将会填充。类似地,在模型更新时,我们将会填充updater_id

Blameable所做的就是当创建或者更新模型事件发生时,将当前的用户ID值插入到created_byupdated_by字段。这是非常便利的一个方法。每次创建或者更新模型时,我们将自动填充必要的字段。

这对于一些项目非常有用,例如对于大型系统,当多个用户是管理员,你需要知道谁都做了些什么。你也可以为前端实现使用这个。例如,如果你有一个blog_comment表,你希望使用这个方法来记录评论的作者。此外,你可以在控制器中设置作者的字段,但这个行为帮助你避免写不必要的和额外的代码。这将非常有效并且简单。

更多…

有时我们希望使用一个id填充author_idupdater_id,而不是当前用户。在这种情况下,我们需要拆除这个行为:

  1. $model->detachBehavior('blammable');

参考

欲了解更多信息,参考http://www.yiiframework.com/doc-2.0/yii-behaviorsblameablebehavior.html