Yii - 创建行为

  • 简述

    假设我们要创建一个行为,该行为将大写该行为所附加到的组件的“名称”属性。
    第 1 步- 在 components 文件夹中,使用以下代码创建一个名为UppercaseBehavior.php的文件。
    
    <?php
       namespace app\components;
       use yii\base\Behavior;
       use yii\db\ActiveRecord;
       class UppercaseBehavior extends Behavior {
          public function events() {
             return [
                ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
             ];
          }
          public function beforeValidate($event) {
             $this->owner->name = strtoupper($this->owner->name);
         }
       }
    ?>
    
    在上面的代码中,我们创建了UppercaseBehavior,它在触发“beforeValidate”事件时将 name 属性大写。
    第 2 步 - 要将此行为附加到MyUser模型,请以这种方式修改它。
    
    <?php
       namespace app\models;
       use app\components\UppercaseBehavior;
       use Yii;
       /**
       * This is the model class for table "user".
       *
       * @property integer $id
       * @property string $name
       * @property string $email
       */
       class MyUser extends \yii\db\ActiveRecord {
          public function behaviors() {
             return [
                // anonymous behavior, behavior class name only
                UppercaseBehavior::className(),
             ];
          }
          /**
          * @inheritdoc
          */
          public static function tableName() {
             return 'user';
          }
          /**
          * @inheritdoc
          */
          public function rules() {
             return [
                [['name', 'email'], 'string', 'max' => 255]
             ];
          }
          /**
          * @inheritdoc
          */
          public function attributeLabels() {
             return [
                'id' => 'ID',
                'name' => 'Name',
                'email' => 'Email',
             ];
          }
       }
    ?>
    
    现在,每当我们创建或更新用户时,它的 name 属性都将是大写的。
    第 3 步- 将actionTestBehavior函数添加到SiteController
    
    public function actionTestBehavior() {
       //creating a new user
       $model = new MyUser();
       $model->name = "John";
       $model->email = "john@gmail.com";
       if($model->save()){
          var_dump(MyUser::find()->asArray()->all());
       }
    }
    
    第 4 步- 在地址栏中键入http://localhost:8080/index.php?r=site/test-behavior您将看到新创建的MyUser模型的name属性为大写。
    大写行为