Yii – Behaviors

  • Post author:
  • Post category:Yii
  • Post comments:1 Comment

Behaviors are instances of the yii\base\Behavior class. A behavior injects its methods and properties to the component it is attached to. Behaviors can also respond to the events triggered by the component.

Step1Ā āˆ’ To define a behavior, extend theĀ yii\base\BehaviorĀ class.

namespace app\components;
use yii\base\Behavior;
class MyBehavior extends Behavior {
   private $_prop1;
   public function getProp1() {
      return $this->_prop1;
   }
   public function setProp1($value) {
      $this->_prop1 = $value;
   }
   public function myFunction() {
      // ...
   }
}

The above code defines the behavior with one property (prop1) and one method (myFunction). When this behavior is attached to a component, that component will also have the prop1 property and the myFunction method.

To access the component the behavior is attached to, you may use the yii\base\Behavior::$owner property.

Step2Ā āˆ’ If you want a behavior to respond to the component events, you should override theĀ yii\base\Behavior::events()Ā method.

namespace app\components;
use yii\db\ActiveRecord;
use yii\base\Behavior;
class MyBehavior extends Behavior {
   public function events() {
      return [
         ActiveRecord::EVENT_AFTER_VALIDATE => 'afterValidate',
      ];
   }
   public function afterValidate($event) {
      // ...
   }
}

Step3Ā āˆ’ To attach a behavior, you should override theĀ behaviors()Ā method of the component class.

namespace app\models;
use yii\db\ActiveRecord;
use app\components\MyBehavior;
class MyUser extends ActiveRecord {
   public function behaviors() {
      return [
         // anonymous behavior, behavior class name only
         MyBehavior::className(),
         // named behavior, behavior class name only
         'myBehavior2' => MyBehavior::className(),
         // anonymous behavior, configuration array
         [
            'class' => MyBehavior::className(),
            'prop1' => 'value1',
            'prop2' => 'value2',
            'prop3' => 'value3',
         ],
         // named behavior, configuration array
         'myBehavior4' => [
            'class' => MyBehavior::className(),
            'prop1' => 'value1'
         ]
      ];
   }
}

Step4Ā āˆ’ To detach a behavior, callĀ the yii\base\Component::detachBehavior()Ā method.

$component->detachBehavior('myBehavior');

To show behaviors in action, we need data.

Preparing the DB

Step1Ā āˆ’ Create a new database. Database can be prepared in the following two ways.

  • In the terminal run mysql -u root ā€“p.
  • Create a new database via CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Step2Ā āˆ’ Configure the database connection in theĀ config/db.phpĀ file. The following configuration is for the system used currently.

<?php
   return [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host = localhost;dbname = helloworld',
      'username' => 'vladimir',
      'password' => '12345',
      'charset' => 'utf8',
   ];
?>

Step3Ā āˆ’ Inside the root folderĀ run ./yii migrate/create test_table. This command will create a database migration for managing our DB. The migration file should appear in theĀ migrationsĀ folder of the project root.

Step4Ā āˆ’ Modify the migration file (m160106_163154_test_table.phpĀ in this case) this way.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160106_163154_test_table extends Migration {
      public function safeUp() {
         $this->createTable("user", [
            "id" => Schema::TYPE_PK,
            "name" => Schema::TYPE_STRING,
            "email" => Schema::TYPE_STRING,
         ]);
         $this->batchInsert("user", ["name", "email"], [
            ["User1", "user1@gmail.com"],
            ["User2", "user2@gmail.com"],
            ["User3", "user3@gmail.com"],
            ["User4", "user4@gmail.com"],
            ["User5", "user5@gmail.com"],
            ["User6", "user6@gmail.com"],
            ["User7", "user7@gmail.com"],
            ["User8", "user8@gmail.com"],
            ["User9", "user9@gmail.com"],
            ["User10", "user10@gmail.com"],
            ["User11", "user11@gmail.com"],
         ]);
      }
      public function safeDown() {
         $this->dropTable('user');
      }
   }
?>

The above migration creates a user table with these fields: id, name, and email. It also adds a few demo users.

Step5Ā āˆ’Inside the project rootĀ run./yii migrateĀ to apply the migration to the database.

Step6Ā āˆ’ Now, we need to create a model for ourĀ user table. For the sake of simplicity, we are going to use theĀ GiiĀ code generation tool. Open up thisĀ url: http://localhost:8080/index.php?r=gii. Then, click the ā€œStartā€ button under the ā€œModel generatorā€ header. Fill in the Table Name (ā€œuserā€) and the Model Class (ā€œMyUserā€), click the ā€œPreviewā€ button and finally, click the ā€œGenerateā€ button.

This Post Has One Comment

Leave a Reply